mirror of
https://github.com/firestar5683/StarPilot.git
synced 2026-06-30 02:52:04 +08:00
Improve focus when using snapshot (#21031)
old-commit-hash: a4571443578d53d414ebc3384414e8502ee3c528
This commit is contained in:
@@ -1,18 +1,21 @@
|
||||
#!/usr/bin/env python3
|
||||
import os
|
||||
import signal
|
||||
import subprocess
|
||||
import time
|
||||
|
||||
import numpy as np
|
||||
from PIL import Image
|
||||
from typing import List
|
||||
|
||||
import cereal.messaging as messaging
|
||||
from common.basedir import BASEDIR
|
||||
from common.params import Params
|
||||
from common.realtime import DT_MDL
|
||||
from common.transformations.camera import eon_f_frame_size, eon_d_frame_size, leon_d_frame_size, tici_f_frame_size
|
||||
from selfdrive.hardware import TICI
|
||||
from selfdrive.controls.lib.alertmanager import set_offroad_alert
|
||||
from selfdrive.manager.process_config import managed_processes
|
||||
|
||||
LM_THRESH = 120 # defined in selfdrive/camerad/imgproc/utils.h
|
||||
|
||||
|
||||
def jpeg_write(fn, dat):
|
||||
@@ -29,7 +32,13 @@ def extract_image(dat, frame_sizes):
|
||||
return np.dstack([r, g, b])
|
||||
|
||||
|
||||
def get_snapshots(frame="roadCameraState", front_frame="driverCameraState"):
|
||||
def rois_in_focus(lapres: List[float]) -> float:
|
||||
sz = len(lapres)
|
||||
return sum([1. / sz for sharpness in
|
||||
lapres if sharpness >= LM_THRESH])
|
||||
|
||||
|
||||
def get_snapshots(frame="roadCameraState", front_frame="driverCameraState", focus_perc_threshold=0.):
|
||||
frame_sizes = [eon_f_frame_size, eon_d_frame_size, leon_d_frame_size, tici_f_frame_size]
|
||||
frame_sizes = {w * h: (w, h) for (w, h) in frame_sizes}
|
||||
|
||||
@@ -39,10 +48,17 @@ def get_snapshots(frame="roadCameraState", front_frame="driverCameraState"):
|
||||
if front_frame is not None:
|
||||
sockets.append(front_frame)
|
||||
|
||||
# wait 4 sec from camerad startup for focus and exposure
|
||||
sm = messaging.SubMaster(sockets)
|
||||
while min(sm.logMonoTime.values()) == 0:
|
||||
while sm[sockets[0]].frameId < int(4. / DT_MDL):
|
||||
sm.update()
|
||||
|
||||
start_t = time.monotonic()
|
||||
while time.monotonic() - start_t < 10:
|
||||
sm.update()
|
||||
if min(sm.rcv_frame.values()) > 1 and rois_in_focus(sm[frame].sharpnessScore) >= focus_perc_threshold:
|
||||
break
|
||||
|
||||
rear = extract_image(sm[frame].image, frame_sizes) if frame is not None else None
|
||||
front = extract_image(sm[front_frame].image, frame_sizes) if front_frame is not None else None
|
||||
return rear, front
|
||||
@@ -63,7 +79,6 @@ def snapshot():
|
||||
# Check if camerad is already started
|
||||
try:
|
||||
subprocess.check_call(["pgrep", "camerad"])
|
||||
|
||||
print("Camerad already running")
|
||||
params.put_bool("IsTakingSnapshot", False)
|
||||
params.delete("Offroad_IsTakingSnapshot")
|
||||
@@ -71,23 +86,19 @@ def snapshot():
|
||||
except subprocess.CalledProcessError:
|
||||
pass
|
||||
|
||||
env = os.environ.copy()
|
||||
env["SEND_ROAD"] = "1"
|
||||
env["SEND_WIDE_ROAD"] = "1"
|
||||
os.environ["SEND_ROAD"] = "1"
|
||||
os.environ["SEND_WIDE_ROAD"] = "1"
|
||||
|
||||
if front_camera_allowed:
|
||||
env["SEND_DRIVER"] = "1"
|
||||
|
||||
proc = subprocess.Popen(os.path.join(BASEDIR, "selfdrive/camerad/camerad"),
|
||||
cwd=os.path.join(BASEDIR, "selfdrive/camerad"), env=env)
|
||||
time.sleep(3.0)
|
||||
os.environ["SEND_DRIVER"] = "1"
|
||||
|
||||
managed_processes['camerad'].start()
|
||||
frame = "wideRoadCameraState" if TICI else "roadCameraState"
|
||||
front_frame = "driverCameraState" if front_camera_allowed else None
|
||||
rear, front = get_snapshots(frame, front_frame)
|
||||
focus_perc_threshold = 0. if TICI else 10 / 12.
|
||||
|
||||
proc.send_signal(signal.SIGINT)
|
||||
proc.communicate()
|
||||
rear, front = get_snapshots(frame, front_frame, focus_perc_threshold)
|
||||
managed_processes['camerad'].stop()
|
||||
|
||||
params.put_bool("IsTakingSnapshot", False)
|
||||
set_offroad_alert("Offroad_IsTakingSnapshot", False)
|
||||
@@ -103,6 +114,7 @@ if __name__ == "__main__":
|
||||
if pic is not None:
|
||||
print(pic.shape)
|
||||
jpeg_write("/tmp/back.jpg", pic)
|
||||
jpeg_write("/tmp/front.jpg", fpic)
|
||||
if fpic is not None:
|
||||
jpeg_write("/tmp/front.jpg", fpic)
|
||||
else:
|
||||
print("Error taking snapshot")
|
||||
|
||||
Reference in New Issue
Block a user