camera names that make sense (#38585)

This commit is contained in:
Adeeb Shihadeh
2026-08-08 09:44:21 -07:00
committed by GitHub
parent 9738db0e39
commit fedea9fe8d
92 changed files with 502 additions and 496 deletions
+1 -1
View File
@@ -58,7 +58,7 @@ A good pull request has all of the following:
* Report bugs in GitHub issues.
* Report driving issues in the `#driving-feedback` Discord channel.
* Consider opting into driver camera uploads to improve the driver monitoring model.
* Consider opting into cabin camera uploads to improve the driver monitoring model.
* Connect your device to Wi-Fi regularly, so that we can pull data for training better driving models.
* Run the `nightly` branch and report issues. This branch is like `master` but it's built just like a release.
* Annotate images in the [comma10k dataset](https://github.com/commaai/comma10k).
+2 -2
View File
@@ -52,7 +52,7 @@ Many factors can impact the performance of openpilot DM, causing it to be unable
* Low light conditions, such as driving at night or in dark tunnels.
* Bright light (due to oncoming headlights, direct sunlight, etc.).
* The driver's face is partially or completely outside field of view of the driver facing camera.
* The driver facing camera is obstructed, covered, or damaged.
* The driver's face is partially or completely outside field of view of the cabin camera.
* The cabin camera is obstructed, covered, or damaged.
The list above does not represent an exhaustive list of situations that may interfere with proper operation of openpilot components. A driver should not rely on openpilot DM to assess their level of attention.
+3 -3
View File
@@ -10,13 +10,13 @@ For each segment, openpilot records the following log types:
rlogs contain all the messages passed amongst openpilot's processes. See [openpilot/cereal/services.py](https://github.com/commaai/openpilot/blob/master/openpilot/cereal/services.py) for a list of all the logged services. They're a zstd archive of the serialized [Capn Proto](https://capnproto.org/) messages.
## {f,e,d}camera.hevc
## camera video files
Each camera stream is H.265 encoded and written to its respective file.
* `fcamera.hevc` is the road camera
* `fcamera.hevc` is the narrow road camera (the main forward camera)
* `ecamera.hevc` is the wide road camera
* `dcamera.hevc` is the driver camera
* `dcamera.hevc` is the cabin camera
## qlog.zst & qcamera.ts
+3 -3
View File
@@ -21,14 +21,14 @@ In general, driver monitoring feedback is very actionable, and we can fix your c
To post your feedback:
1. Join the [community Discord](https://discord.comma.ai).
2. If driver camera recording is toggled off, temporarily enable driver camera recording in the settings until you reproduce the issue.
3. Using comma connect, identify the relevant segment and upload the segment's logs and driver camera.
2. If cabin camera recording is toggled off, temporarily enable cabin camera recording in the settings until you reproduce the issue.
3. Using comma connect, identify the relevant segment and upload the segment's logs and cabin camera.
4. Post the segment in the `#openpilot-experience` channel on Discord with a good description.
Before posting feedback, please ensure:
- **openpilot is up to date** you should be on the latest openpilot release or nightly
- **the driver camera has a clear view of the driver** ensure nothing blocks view of the driver (e.g. a cable), the lens is clean, etc.
- **the cabin camera has a clear view of the driver** ensure nothing blocks view of the driver (e.g. a cable), the lens is clean, etc.
- **your device is mounted properly** your device must be mounted horizontally center and relatively high on the windshield
## Other bugs
+12 -12
View File
@@ -2562,17 +2562,17 @@ struct Event {
driverStateV2 @92 :DriverStateV2;
# camera stuff, each camera state has a matching encode idx
roadCameraState @2 :FrameData;
driverCameraState @70: FrameData;
narrowRoadCameraState @2 :FrameData;
cabinCameraState @70: FrameData;
wideRoadCameraState @74: FrameData;
roadEncodeIdx @15 :EncodeIndex;
driverEncodeIdx @76 :EncodeIndex;
narrowRoadEncodeIdx @15 :EncodeIndex;
cabinEncodeIdx @76 :EncodeIndex;
wideRoadEncodeIdx @77 :EncodeIndex;
qRoadEncodeIdx @90 :EncodeIndex;
qNarrowRoadEncodeIdx @90 :EncodeIndex;
livestreamRoadEncodeIdx @117 :EncodeIndex;
livestreamNarrowRoadEncodeIdx @117 :EncodeIndex;
livestreamWideRoadEncodeIdx @118 :EncodeIndex;
livestreamDriverEncodeIdx @119 :EncodeIndex;
livestreamCabinEncodeIdx @119 :EncodeIndex;
# microphone data
soundPressure @103 :SoundPressure;
@@ -2602,15 +2602,15 @@ struct Event {
# *********** debug ***********
testJoystick @52 :Joystick;
roadEncodeData @86 :EncodeData;
driverEncodeData @87 :EncodeData;
narrowRoadEncodeData @86 :EncodeData;
cabinEncodeData @87 :EncodeData;
wideRoadEncodeData @88 :EncodeData;
qRoadEncodeData @89 :EncodeData;
qNarrowRoadEncodeData @89 :EncodeData;
alertDebug @133 :DebugAlert;
livestreamRoadEncodeData @120 :EncodeData;
livestreamNarrowRoadEncodeData @120 :EncodeData;
livestreamWideRoadEncodeData @121 :EncodeData;
livestreamDriverEncodeData @122 :EncodeData;
livestreamCabinEncodeData @122 :EncodeData;
# *********** Custom: reserved for forks ***********
+12 -12
View File
@@ -33,7 +33,7 @@ _services: dict[str, tuple] = {
"pandaStates": (True, 10., 1),
"peripheralState": (True, 2., 1),
"radarState": (True, 20., 5),
"roadEncodeIdx": (False, 20., 1),
"narrowRoadEncodeIdx": (False, 20., 1),
"liveTracks": (True, 20.),
"sendcan": (True, 100., 139, QueueSize.MEDIUM),
"logMessage": (True, 0., None, QueueSize.BIG),
@@ -61,9 +61,9 @@ _services: dict[str, tuple] = {
"thumbnail": (True, 1 / 60., 1),
"onroadEvents": (True, 1., 1),
"carParams": (True, 0.02, 1),
"roadCameraState": (True, 20., 20),
"driverCameraState": (True, 20., 20),
"driverEncodeIdx": (False, 20., 1),
"narrowRoadCameraState": (True, 20., 20),
"cabinCameraState": (True, 20., 20),
"cabinEncodeIdx": (False, 20., 1),
"driverStateV2": (True, 20., 10),
"driverMonitoringState": (True, 20., 10),
"wideRoadEncodeIdx": (False, 20., 1),
@@ -71,26 +71,26 @@ _services: dict[str, tuple] = {
"drivingModelData": (True, 20., 10),
"modelV2": (True, 20., None, QueueSize.BIG),
"managerState": (True, 2., 1),
"qRoadEncodeIdx": (False, 20.),
"qNarrowRoadEncodeIdx": (False, 20.),
"userBookmark": (True, 0., 1),
"soundPressure": (True, 10., 10),
"rawAudioData": (False, 20.),
"bookmarkButton": (True, 0., 1),
"roadEncodeData": (False, 20., None, QueueSize.BIG),
"driverEncodeData": (False, 20., None, QueueSize.BIG),
"narrowRoadEncodeData": (False, 20., None, QueueSize.BIG),
"cabinEncodeData": (False, 20., None, QueueSize.BIG),
"wideRoadEncodeData": (False, 20., None, QueueSize.BIG),
"qRoadEncodeData": (False, 20., None, QueueSize.BIG),
"qNarrowRoadEncodeData": (False, 20., None, QueueSize.BIG),
# debug
"uiDebug": (True, 0., 1),
"testJoystick": (True, 0.),
"alertDebug": (True, 20., 5),
"livestreamWideRoadEncodeIdx": (False, 20.),
"livestreamRoadEncodeIdx": (False, 20.),
"livestreamDriverEncodeIdx": (False, 20.),
"livestreamNarrowRoadEncodeIdx": (False, 20.),
"livestreamCabinEncodeIdx": (False, 20.),
"livestreamWideRoadEncodeData": (False, 20., None, QueueSize.MEDIUM),
"livestreamRoadEncodeData": (False, 20., None, QueueSize.MEDIUM),
"livestreamDriverEncodeData": (False, 20., None, QueueSize.MEDIUM),
"livestreamNarrowRoadEncodeData": (False, 20., None, QueueSize.MEDIUM),
"livestreamCabinEncodeData": (False, 20., None, QueueSize.MEDIUM),
"customReservedRawData0": (True, 0.),
}
SERVICE_LIST = {name: Service(*vals) for
+2 -2
View File
@@ -2,7 +2,7 @@ from enum import IntEnum
class VisionStreamType(IntEnum):
VISION_STREAM_ROAD = 0
VISION_STREAM_DRIVER = 1
VISION_STREAM_NARROW_ROAD = 0
VISION_STREAM_CABIN = 1
VISION_STREAM_WIDE_ROAD = 2
VISION_STREAM_MAP = 3
+2 -2
View File
@@ -3,8 +3,8 @@
#include "msgq/visionipc/visionbuf.h"
enum VisionStreamValues : VisionStreamType {
VISION_STREAM_ROAD = 0,
VISION_STREAM_DRIVER = 1,
VISION_STREAM_NARROW_ROAD = 0,
VISION_STREAM_CABIN = 1,
VISION_STREAM_WIDE_ROAD = 2,
VISION_STREAM_MAP = 3,
};
+4 -4
View File
@@ -37,12 +37,12 @@ class _NoneCameraConfig(CameraConfig):
@dataclass(frozen=True)
class DeviceCameraConfig:
fcam: CameraConfig
dcam: CameraConfig
ecam: CameraConfig
narrow_road: CameraConfig
cabin: CameraConfig
wide_road: CameraConfig
def all_cams(self):
for cam in ['fcam', 'dcam', 'ecam']:
for cam in ['narrow_road', 'cabin', 'wide_road']:
if not isinstance(getattr(self, cam), _NoneCameraConfig):
yield cam, getattr(self, cam)
@@ -110,8 +110,8 @@ def get_driverstate_packet(model_output, frame_id: int, location_ts: int, exec_t
def main():
config_realtime_process(7, 5)
cloudlog.warning("connecting to driver stream")
vipc_client = VisionIpcClient("camerad", VisionStreamType.VISION_STREAM_DRIVER, True)
cloudlog.warning("connecting to cabin stream")
vipc_client = VisionIpcClient("camerad", VisionStreamType.VISION_STREAM_CABIN, True)
while not vipc_client.connect(False):
time.sleep(0.1)
assert vipc_client.is_connected()
+11 -9
View File
@@ -215,12 +215,12 @@ def main(demo=False):
while True:
available_streams = VisionIpcClient.available_streams("camerad", block=False)
if available_streams:
use_extra_client = VisionStreamType.VISION_STREAM_WIDE_ROAD in available_streams and VisionStreamType.VISION_STREAM_ROAD in available_streams
main_wide_camera = VisionStreamType.VISION_STREAM_ROAD not in available_streams
use_extra_client = VisionStreamType.VISION_STREAM_WIDE_ROAD in available_streams and VisionStreamType.VISION_STREAM_NARROW_ROAD in available_streams
main_wide_camera = VisionStreamType.VISION_STREAM_NARROW_ROAD not in available_streams
break
time.sleep(.1)
vipc_client_main_stream = VisionStreamType.VISION_STREAM_WIDE_ROAD if main_wide_camera else VisionStreamType.VISION_STREAM_ROAD
vipc_client_main_stream = VisionStreamType.VISION_STREAM_WIDE_ROAD if main_wide_camera else VisionStreamType.VISION_STREAM_NARROW_ROAD
vipc_client_main = VisionIpcClient("camerad", vipc_client_main_stream, True)
vipc_client_extra = VisionIpcClient("camerad", VisionStreamType.VISION_STREAM_WIDE_ROAD, False)
cloudlog.warning(f"vision stream set up, main_wide_camera: {main_wide_camera}, use_extra_client: {use_extra_client}")
@@ -262,7 +262,7 @@ def main(demo=False):
# messaging
pub_socks = ["modelV2", "drivingModelData", "cameraOdometry"] + (["chestnutState"] if USBGPU else [])
pm = PubMaster(pub_socks)
sm = SubMaster(["deviceState", "carState", "roadCameraState", "liveCalibration", "driverMonitoringState", "carControl", "liveDelay"])
sm = SubMaster(["deviceState", "carState", "narrowRoadCameraState", "liveCalibration", "driverMonitoringState", "carControl", "liveDelay"])
publish_state = PublishState()
params = Params()
@@ -330,15 +330,17 @@ def main(demo=False):
sm.update(0)
desire = DH.desire
is_rhd = sm["driverMonitoringState"].isRHD
frame_id = sm["roadCameraState"].frameId
frame_id = sm["narrowRoadCameraState"].frameId
v_ego = max(sm["carState"].vEgo, 0.)
lat_delay = sm["liveDelay"].lateralDelay + LAT_SMOOTH_SECONDS
if sm.updated["liveCalibration"] and sm.seen['roadCameraState'] and sm.seen['deviceState']:
if sm.updated["liveCalibration"] and sm.seen['narrowRoadCameraState'] and sm.seen['deviceState']:
device_from_calib_euler = np.array(sm["liveCalibration"].rpyCalib, dtype=np.float32)
dc = DEVICE_CAMERAS[(str(sm['deviceState'].deviceType), str(sm['roadCameraState'].sensor))]
model_transform_main = get_warp_matrix(device_from_calib_euler, dc.ecam.intrinsics if main_wide_camera else dc.fcam.intrinsics, False).astype(np.float32)
dc = DEVICE_CAMERAS[(str(sm['deviceState'].deviceType), str(sm['narrowRoadCameraState'].sensor))]
main_intrinsics = dc.wide_road.intrinsics if main_wide_camera else dc.narrow_road.intrinsics
model_transform_main = get_warp_matrix(device_from_calib_euler, main_intrinsics, False).astype(np.float32)
has_wide_camera = use_extra_client or main_wide_camera
model_transform_extra = get_warp_matrix(device_from_calib_euler, dc.ecam.intrinsics if has_wide_camera else dc.fcam.intrinsics, True).astype(np.float32)
extra_intrinsics = dc.wide_road.intrinsics if has_wide_camera else dc.narrow_road.intrinsics
model_transform_extra = get_warp_matrix(device_from_calib_euler, extra_intrinsics, True).astype(np.float32)
live_calib_seen = True
traffic_convention = np.zeros(2)
+6 -6
View File
@@ -107,17 +107,17 @@ class DriverBlink:
self.right = 0.
# model output refers to center of undistorted+leveled image
ref_undistorted_cam = DEVICE_CAMERAS[("tici", "ar0231")].dcam
dcam_undistorted_FL = 598.0
dcam_undistorted_W, dcam_undistorted_H = (ref_undistorted_cam.width, ref_undistorted_cam.height)
ref_undistorted_cam = DEVICE_CAMERAS[("tici", "ar0231")].cabin
cabin_undistorted_FL = 598.0
cabin_undistorted_W, cabin_undistorted_H = (ref_undistorted_cam.width, ref_undistorted_cam.height)
def face_orientation_from_model(orient_model, pos_model, rpy_calib):
pitch_model = orient_model[0]
yaw_model = orient_model[1]
face_pixel_position = ((pos_model[0]+0.5)*dcam_undistorted_W, (pos_model[1]+0.5)*dcam_undistorted_H)
yaw_focal_angle = atan2(face_pixel_position[0] - dcam_undistorted_W//2, dcam_undistorted_FL)
pitch_focal_angle = atan2(face_pixel_position[1] - dcam_undistorted_H//2, dcam_undistorted_FL)
face_pixel_position = ((pos_model[0]+0.5)*cabin_undistorted_W, (pos_model[1]+0.5)*cabin_undistorted_H)
yaw_focal_angle = atan2(face_pixel_position[0] - cabin_undistorted_W//2, cabin_undistorted_FL)
pitch_focal_angle = atan2(face_pixel_position[1] - cabin_undistorted_H//2, cabin_undistorted_FL)
pitch = pitch_model + pitch_focal_angle
yaw = -yaw_model + yaw_focal_angle
+9 -9
View File
@@ -278,9 +278,9 @@ void process_panda_state(Panda *panda, PubMaster *pm, bool engaged, bool is_onro
void process_peripheral_state(Panda *panda, PubMaster *pm, bool no_fan_control, bool is_onroad) {
static Params params;
static SubMaster sm({"deviceState", "driverCameraState"});
static SubMaster sm({"deviceState", "cabinCameraState"});
static uint64_t last_driver_camera_t = 0;
static uint64_t last_cabin_camera_t = 0;
static uint16_t prev_fan_speed = 999;
static int ir_pwr = 0;
static int prev_ir_pwr = 999;
@@ -304,20 +304,20 @@ void process_peripheral_state(Panda *panda, PubMaster *pm, bool no_fan_control,
}
}
if (sm.updated("driverCameraState")) {
auto event = sm["driverCameraState"];
int cur_integ_lines = event.getDriverCameraState().getIntegLines();
if (sm.updated("cabinCameraState")) {
auto event = sm["cabinCameraState"];
int cur_integ_lines = event.getCabinCameraState().getIntegLines();
// reset the filter when camerad restarts
if (event.getDriverCameraState().getFrameId() < prev_frame_id) {
if (event.getCabinCameraState().getFrameId() < prev_frame_id) {
integ_lines_filter.reset(0);
integ_lines_filter_driver_view.reset(0);
driver_view = params.getBool("IsDriverViewEnabled");
}
prev_frame_id = event.getDriverCameraState().getFrameId();
prev_frame_id = event.getCabinCameraState().getFrameId();
cur_integ_lines = (driver_view ? integ_lines_filter_driver_view : integ_lines_filter).update(cur_integ_lines);
last_driver_camera_t = event.getLogMonoTime();
last_cabin_camera_t = event.getLogMonoTime();
if (cur_integ_lines <= CUTOFF_IL) {
ir_pwr = 0;
@@ -329,7 +329,7 @@ void process_peripheral_state(Panda *panda, PubMaster *pm, bool no_fan_control,
}
// Disable IR on input timeout
if (nanos_since_boot() - last_driver_camera_t > 1e9) {
if (nanos_since_boot() - last_cabin_camera_t > 1e9) {
ir_pwr = 0;
}
+1 -1
View File
@@ -297,7 +297,7 @@ def comm_issue_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaste
def camera_malfunction_alert(CP: car.CarParams, CS: car.CarState, sm: messaging.SubMaster, metric: bool, soft_disable_time: int, personality) -> Alert:
all_cams = ('roadCameraState', 'driverCameraState', 'wideRoadCameraState')
all_cams = ('narrowRoadCameraState', 'cabinCameraState', 'wideRoadCameraState')
bad_cams = [s.replace('State', '') for s in all_cams if s in sm.data.keys() and not sm.all_checks([s, ])]
return NormalPermanentAlert("Camera Malfunction", ', '.join(bad_cams))
+6 -6
View File
@@ -77,17 +77,17 @@ class SelfdriveD:
self.gps_location_service = get_gps_location_service(self.params)
self.gps_packets = [self.gps_location_service]
self.sensor_packets = ["accelerometer", "gyroscope"]
self.camera_packets = ["roadCameraState", "driverCameraState", "wideRoadCameraState"]
self.camera_packets = ["narrowRoadCameraState", "cabinCameraState", "wideRoadCameraState"]
# TODO: de-couple selfdrived with card/conflate on carState without introducing controls mismatches
self.car_state_sock = messaging.sub_sock('carState', timeout=20)
ignore = self.sensor_packets + self.gps_packets + ['alertDebug', 'lateralManeuverPlan']
if SIMULATION:
ignore += ['driverCameraState', 'managerState']
ignore += ['cabinCameraState', 'managerState']
if REPLAY:
# no vipc in replay will make them ignored anyways
ignore += ['roadCameraState', 'wideRoadCameraState']
ignore += ['narrowRoadCameraState', 'wideRoadCameraState']
self.sm = messaging.SubMaster(['deviceState', 'pandaStates', 'peripheralState', 'modelV2', 'liveCalibration',
'carOutput', 'driverMonitoringState', 'longitudinalPlan', 'livePose', 'liveDelay',
'managerState', 'liveParameters', 'radarState', 'liveTorqueParameters',
@@ -467,9 +467,9 @@ class SelfdriveD:
timed_out = self.sm.frame * DT_CTRL > 6.
if all_valid or timed_out or (SIMULATION and not REPLAY):
available_streams = VisionIpcClient.available_streams("camerad", block=False)
if VisionStreamType.VISION_STREAM_ROAD not in available_streams:
self.sm.ignore_alive.append('roadCameraState')
self.sm.ignore_valid.append('roadCameraState')
if VisionStreamType.VISION_STREAM_NARROW_ROAD not in available_streams:
self.sm.ignore_alive.append('narrowRoadCameraState')
self.sm.ignore_valid.append('narrowRoadCameraState')
if VisionStreamType.VISION_STREAM_WIDE_ROAD not in available_streams:
self.sm.ignore_alive.append('wideRoadCameraState')
self.sm.ignore_valid.append('wideRoadCameraState')
@@ -104,9 +104,9 @@ Replaying processes that use VisionIPC (e.g. modeld, dmonitoringmodeld) require
from openpilot.tools.lib.framereader import FrameReader
frs = {
'roadCameraState': FrameReader(...),
'narrowRoadCameraState': FrameReader(...),
'wideRoadCameraState': FrameReader(...),
'driverCameraState': FrameReader(...),
'cabinCameraState': FrameReader(...),
}
output_logs = replay_process_with_name(['modeld', 'dmonitoringmodeld'], lr, frs=frs)
@@ -361,7 +361,7 @@ def migrate_peripheralState(msgs):
return [], add_ops, []
@migration(inputs=["roadEncodeIdx", "wideRoadEncodeIdx", "driverEncodeIdx", "roadCameraState", "wideRoadCameraState", "driverCameraState"])
@migration(inputs=["narrowRoadEncodeIdx", "wideRoadEncodeIdx", "cabinEncodeIdx", "narrowRoadCameraState", "wideRoadCameraState", "cabinCameraState"])
def migrate_cameraStates(msgs):
add_ops, del_ops = [], []
frame_to_encode_id = defaultdict(dict)
@@ -369,7 +369,7 @@ def migrate_cameraStates(msgs):
min_frame_id = defaultdict(lambda: float('inf'))
for _, msg in msgs:
if msg.which() not in ["roadEncodeIdx", "wideRoadEncodeIdx", "driverEncodeIdx"]:
if msg.which() not in ["narrowRoadEncodeIdx", "wideRoadEncodeIdx", "cabinEncodeIdx"]:
continue
encode_index = getattr(msg, msg.which())
@@ -379,7 +379,7 @@ def migrate_cameraStates(msgs):
frame_to_encode_id[meta.camera_state][encode_index.frameId] = encode_index.segmentId
for index, msg in msgs:
if msg.which() not in ["roadCameraState", "wideRoadCameraState", "driverCameraState"]:
if msg.which() not in ["narrowRoadCameraState", "wideRoadCameraState", "cabinCameraState"]:
continue
camera_state = getattr(msg, msg.which())
@@ -392,7 +392,7 @@ def migrate_cameraStates(msgs):
del_ops.append(index)
continue
# fallback mechanism for logs without encodeIdx (e.g. logs from before 2022 with dcamera recording disabled)
# fallback mechanism for logs without encodeIdx (e.g. logs from before 2022 with driver recording disabled)
# try to fake encode_id by subtracting lowest frameId
encode_id = camera_state.frameId - min_frame_id[msg.which()]
print(f"Faking encodeId to {encode_id} for camera feed {msg.which()} with frameId: {camera_state.frameId}")
@@ -146,9 +146,10 @@ def trim_logs(logs, start_frame, end_frame, frs_types, include_all_types):
def model_replay(lr, frs):
# modeld is using frame pairs
modeld_logs = trim_logs(lr, START_FRAME, END_FRAME, {"roadCameraState", "wideRoadCameraState"},
{"roadEncodeIdx", "wideRoadEncodeIdx", "carParams", "carState", "carControl", "can"})
dmodeld_logs = trim_logs(lr, START_FRAME, END_FRAME, {"driverCameraState"}, {"driverEncodeIdx", "carParams", "can"})
camera_states = {"narrowRoadCameraState", "wideRoadCameraState"}
modeld_logs = trim_logs(lr, START_FRAME, END_FRAME, camera_states,
{"narrowRoadEncodeIdx", "wideRoadEncodeIdx", "carParams", "carState", "carControl", "can"})
dmodeld_logs = trim_logs(lr, START_FRAME, END_FRAME, {"cabinCameraState"}, {"cabinEncodeIdx", "carParams", "can"})
if not SEND_EXTRA_INPUTS:
modeld_logs = [msg for msg in modeld_logs if msg.which() != 'liveCalibration']
@@ -209,8 +210,8 @@ def get_frames():
print(f"Failed to load frames from cache {cache_name}: {e}")
frs = {
'roadCameraState': FrameReader(get_url(TEST_ROUTE, SEGMENT, "fcamera.hevc"), pix_fmt='nv12', cache_size=END_FRAME - START_FRAME),
'driverCameraState': FrameReader(get_url(TEST_ROUTE, SEGMENT, "dcamera.hevc"), pix_fmt='nv12', cache_size=END_FRAME - START_FRAME),
'narrowRoadCameraState': FrameReader(get_url(TEST_ROUTE, SEGMENT, "fcamera.hevc"), pix_fmt='nv12', cache_size=END_FRAME - START_FRAME),
'cabinCameraState': FrameReader(get_url(TEST_ROUTE, SEGMENT, "dcamera.hevc"), pix_fmt='nv12', cache_size=END_FRAME - START_FRAME),
'wideRoadCameraState': FrameReader(get_url(TEST_ROUTE, SEGMENT, "ecamera.hevc"), pix_fmt='nv12', cache_size=END_FRAME - START_FRAME),
}
for fr in frs.values():
@@ -396,7 +396,7 @@ class ModeldCameraSyncRcvCallback:
def __call__(self, msg, cfg, frame):
self.is_dual_camera = len(cfg.vision_pubs) == 2
if msg.which() == "roadCameraState":
if msg.which() == "narrowRoadCameraState":
self.road_present = True
elif msg.which() == "wideRoadCameraState":
self.wide_road_present = True
@@ -434,7 +434,7 @@ CONFIGS = [
pubs=[
"carState", "deviceState", "pandaStates", "peripheralState", "liveCalibration", "driverMonitoringState",
"longitudinalPlan", "livePose", "liveDelay", "liveParameters", "radarState", "modelV2",
"driverCameraState", "roadCameraState", "wideRoadCameraState", "managerState", "liveTorqueParameters",
"cabinCameraState", "narrowRoadCameraState", "wideRoadCameraState", "managerState", "liveTorqueParameters",
"accelerometer", "gyroscope", "carOutput", "gpsLocationExternal", "gpsLocation", "controlsState",
"carControl", "driverAssistance", "alertDebug",
],
@@ -549,28 +549,28 @@ CONFIGS = [
),
ProcessConfig(
proc_name="modeld",
pubs=["deviceState", "roadCameraState", "wideRoadCameraState", "liveCalibration", "liveDelay", "driverMonitoringState", "carState", "carControl"],
pubs=["deviceState", "narrowRoadCameraState", "wideRoadCameraState", "liveCalibration", "liveDelay", "driverMonitoringState", "carState", "carControl"],
subs=["modelV2", "drivingModelData", "cameraOdometry"],
ignore=["logMonoTime", "modelV2.frameDropPerc", "modelV2.modelExecutionTime", "drivingModelData.frameDropPerc", "drivingModelData.modelExecutionTime"],
should_recv_callback=ModeldCameraSyncRcvCallback(),
tolerance=NUMPY_TOLERANCE,
processing_time=0.020,
main_pub=vipc_get_endpoint_name("camerad", meta_from_camera_state("roadCameraState").stream),
vision_pubs=["roadCameraState", "wideRoadCameraState"],
main_pub=vipc_get_endpoint_name("camerad", meta_from_camera_state("narrowRoadCameraState").stream),
vision_pubs=["narrowRoadCameraState", "wideRoadCameraState"],
ignore_alive_pubs=["wideRoadCameraState"],
init_callback=get_car_params_callback,
),
ProcessConfig(
proc_name="dmonitoringmodeld",
pubs=["liveCalibration", "driverCameraState"],
pubs=["liveCalibration", "cabinCameraState"],
subs=["driverStateV2"],
ignore=["logMonoTime", "driverStateV2.modelExecutionTime", "driverStateV2.gpuExecutionTime"],
should_recv_callback=MessageBasedRcvCallback("driverCameraState"),
should_recv_callback=MessageBasedRcvCallback("cabinCameraState"),
tolerance=NUMPY_TOLERANCE,
processing_time=0.020,
main_pub=vipc_get_endpoint_name("camerad", meta_from_camera_state("driverCameraState").stream),
vision_pubs=["driverCameraState"],
ignore_alive_pubs=["driverCameraState"],
main_pub=vipc_get_endpoint_name("camerad", meta_from_camera_state("cabinCameraState").stream),
vision_pubs=["cabinCameraState"],
ignore_alive_pubs=["cabinCameraState"],
),
]
@@ -4,14 +4,14 @@ from openpilot.common.realtime import DT_MDL, DT_DMON
from openpilot.common.transformations.camera import DEVICE_CAMERAS
VideoStreamMeta = namedtuple("VideoStreamMeta", ["camera_state", "encode_index", "stream", "dt", "frame_sizes"])
ROAD_CAMERA_FRAME_SIZES = {k: (v.dcam.width, v.dcam.height) for k, v in DEVICE_CAMERAS.items()}
WIDE_ROAD_CAMERA_FRAME_SIZES = {k: (v.ecam.width, v.ecam.height) for k, v in DEVICE_CAMERAS.items() if v.ecam is not None}
DRIVER_CAMERA_FRAME_SIZES = {k: (v.dcam.width, v.dcam.height) for k, v in DEVICE_CAMERAS.items()}
NARROW_ROAD_CAMERA_FRAME_SIZES = {k: (v.narrow_road.width, v.narrow_road.height) for k, v in DEVICE_CAMERAS.items()}
WIDE_ROAD_CAMERA_FRAME_SIZES = {k: (v.wide_road.width, v.wide_road.height) for k, v in DEVICE_CAMERAS.items() if v.wide_road is not None}
CABIN_CAMERA_FRAME_SIZES = {k: (v.cabin.width, v.cabin.height) for k, v in DEVICE_CAMERAS.items()}
VIPC_STREAM_METADATA = [
# metadata: (state_msg_type, encode_msg_type, stream_type, dt, frame_sizes)
("roadCameraState", "roadEncodeIdx", VisionStreamType.VISION_STREAM_ROAD, DT_MDL, ROAD_CAMERA_FRAME_SIZES),
("narrowRoadCameraState", "narrowRoadEncodeIdx", VisionStreamType.VISION_STREAM_NARROW_ROAD, DT_MDL, NARROW_ROAD_CAMERA_FRAME_SIZES),
("wideRoadCameraState", "wideRoadEncodeIdx", VisionStreamType.VISION_STREAM_WIDE_ROAD, DT_MDL, WIDE_ROAD_CAMERA_FRAME_SIZES),
("driverCameraState", "driverEncodeIdx", VisionStreamType.VISION_STREAM_DRIVER, DT_DMON, DRIVER_CAMERA_FRAME_SIZES),
("cabinCameraState", "cabinEncodeIdx", VisionStreamType.VISION_STREAM_CABIN, DT_DMON, CABIN_CAMERA_FRAME_SIZES),
]
+9 -9
View File
@@ -83,8 +83,8 @@ TIMINGS = {
"controlsState": [2.5, 0.35],
"longitudinalPlan": [2.5, 0.5],
"driverAssistance": [2.5, 0.5],
"roadCameraState": [2.5, 0.35],
"driverCameraState": [2.5, 0.35],
"narrowRoadCameraState": [2.5, 0.35],
"cabinCameraState": [2.5, 0.35],
"modelV2": [2.5, 0.35],
"driverStateV2": [2.5, 0.40],
"livePose": [2.5, 0.35],
@@ -304,7 +304,7 @@ class TestOnroad(OpenpilotTestCase):
result += "------------------------------------------------\n"
result += "----------------- SOF Timing ------------------\n"
result += "------------------------------------------------\n"
for name in ['roadCameraState', 'wideRoadCameraState', 'driverCameraState']:
for name in ['narrowRoadCameraState', 'wideRoadCameraState', 'cabinCameraState']:
ts = self.ts[name]['timestampSof']
d_ms = np.diff(ts) / 1e6
d50 = np.abs(d_ms-50)
@@ -317,8 +317,8 @@ class TestOnroad(OpenpilotTestCase):
print(result)
def test_camera_sync(self, subtests):
cam_states = ['roadCameraState', 'wideRoadCameraState', 'driverCameraState']
encode_cams = ['roadEncodeIdx', 'wideRoadEncodeIdx', 'driverEncodeIdx']
cam_states = ['narrowRoadCameraState', 'wideRoadCameraState', 'cabinCameraState']
encode_cams = ['narrowRoadEncodeIdx', 'wideRoadEncodeIdx', 'cabinEncodeIdx']
for cams in (cam_states, encode_cams):
with subtests.test(cams=cams):
# sanity checks within a single cam
@@ -349,15 +349,15 @@ class TestOnroad(OpenpilotTestCase):
diff = (max(ts.values()) - min(ts.values()))
assert diff < 2, f"Cameras not synced properly: frame_id={start+i}, {diff=:.1f}ms, {ts=}"
# driver camera should be staggered ~25ms from road camera
# cabin camera should be staggered ~25ms from road camera
offset_ms = abs(self.ts[cams[2]]['timestampSof'][i] - self.ts[cams[0]]['timestampSof'][i]) / 1e6
assert 20 < offset_ms < 30, f"driver camera stagger out of range at frame {start+i}: {offset_ms:.1f}ms"
assert 20 < offset_ms < 30, f"cabin camera stagger out of range at frame {start+i}: {offset_ms:.1f}ms"
def test_camera_encoder_matches(self, subtests):
# sanity check that the frame metadata is consistent with the encoded frames
pairs = [('roadCameraState', 'roadEncodeIdx'),
pairs = [('narrowRoadCameraState', 'narrowRoadEncodeIdx'),
('wideRoadCameraState', 'wideRoadEncodeIdx'),
('driverCameraState', 'driverEncodeIdx')]
('cabinCameraState', 'cabinEncodeIdx')]
for cam, enc in pairs:
with subtests.test(camera=cam, encoder=enc):
cam_frames = {fid: (sof, eof) for fid, sof, eof in zip(
+1 -1
View File
@@ -34,7 +34,7 @@ class Proc:
PROCS = [
Proc(['camerad'], 1.65, atol=0.4, msgs=['roadCameraState', 'wideRoadCameraState', 'driverCameraState']),
Proc(['camerad'], 1.65, atol=0.4, msgs=['narrowRoadCameraState', 'wideRoadCameraState', 'cabinCameraState']),
Proc(['modeld'], 1.5, atol=0.2, msgs=['modelV2']),
Proc(['dmonitoringmodeld'], 0.65, atol=0.35, msgs=['driverStateV2']),
Proc(['encoderd'], 0.23, msgs=[]),
@@ -5,7 +5,7 @@ from openpilot.cereal import messaging, log
from openpilot.common.basedir import BASEDIR
from openpilot.common.params import Params
from openpilot.common.swaglog import cloudlog
from openpilot.selfdrive.ui.onroad.driver_camera_dialog import DriverCameraDialog
from openpilot.selfdrive.ui.onroad.cabin_camera_dialog import CabinCameraDialog
from openpilot.selfdrive.ui.ui_state import ui_state
from openpilot.selfdrive.ui.layouts.onboarding import TrainingGuide
from openpilot.selfdrive.ui.widgets.pairing_dialog import PairingDialog
@@ -21,7 +21,7 @@ from openpilot.system.ui.widgets.scroller_tici import Scroller
# Description constants
DESCRIPTIONS = {
'pair_device': tr_noop("Pair your device with comma connect (connect.comma.ai) and claim your comma prime offer."),
'driver_camera': tr_noop("Preview the driver facing camera to ensure that driver monitoring has good visibility. (vehicle must be off)"),
'cabin_camera': tr_noop("Preview the cabin camera to ensure that driver monitoring has good visibility. (vehicle must be off)"),
'reset_calibration': tr_noop("openpilot requires the device to be mounted within 4° left or right and within 5° up or 9° down."),
'review_guide': tr_noop("Review the rules, features, and limitations of openpilot"),
}
@@ -57,8 +57,8 @@ class DeviceLayout(Widget):
text_item(lambda: tr("Dongle ID"), self._params.get("DongleId") or (lambda: tr("N/A"))),
text_item(lambda: tr("Serial"), self._params.get("HardwareSerial") or (lambda: tr("N/A"))),
self._pair_device_btn,
button_item(lambda: tr("Driver Camera"), lambda: tr("PREVIEW"), lambda: tr(DESCRIPTIONS['driver_camera']),
callback=lambda: gui_app.push_widget(DriverCameraDialog()), enabled=ui_state.is_offroad),
button_item(lambda: tr("Cabin Camera"), lambda: tr("PREVIEW"), lambda: tr(DESCRIPTIONS['cabin_camera']),
callback=lambda: gui_app.push_widget(CabinCameraDialog()), enabled=ui_state.is_offroad),
self._reset_calib_btn,
button_item(lambda: tr("Review Training Guide"), lambda: tr("REVIEW"), lambda: tr(DESCRIPTIONS['review_guide']),
self._on_review_training_guide, enabled=ui_state.is_offroad),
@@ -28,7 +28,7 @@ DESCRIPTIONS = {
"without a turn signal activated while driving over 31 mph (50 km/h)."
),
"AlwaysOnDM": tr_noop("Enable driver monitoring even when openpilot is not engaged."),
'RecordFront': tr_noop("Upload data from the driver facing camera and help improve the driver monitoring algorithm."),
'RecordFront': tr_noop("Upload data from the cabin camera and help improve the driver monitoring algorithm."),
"IsMetric": tr_noop("Display speed in km/h instead of mph."),
"RecordAudio": tr_noop("Record and store microphone audio while driving. The audio will be included in the dashcam video in comma connect."),
}
@@ -73,7 +73,7 @@ class TogglesLayout(Widget):
False,
),
"RecordFront": (
lambda: tr("Record and Upload Driver Camera"),
lambda: tr("Record and Upload Cabin Camera"),
DESCRIPTIONS["RecordFront"],
"monitoring.png",
True,
@@ -16,10 +16,10 @@ from openpilot.common.version import terms_version, training_version
from openpilot.selfdrive.ui.ui_state import ui_state, device
from openpilot.selfdrive.ui.mici.widgets.dialog import BigConfirmationCircleButton
from openpilot.selfdrive.ui.mici.onroad.driver_state import DriverStateRenderer
from openpilot.selfdrive.ui.mici.onroad.driver_camera_dialog import BaseDriverCameraDialog
from openpilot.selfdrive.ui.mici.onroad.cabin_camera_dialog import BaseCabinCameraDialog
class DriverCameraSetupDialog(BaseDriverCameraDialog):
class CabinCameraSetupDialog(BaseCabinCameraDialog):
def __init__(self):
super().__init__()
self.driver_state_renderer = DriverStateRenderer(inset=True)
@@ -104,7 +104,7 @@ class TrainingGuideDMTutorial(NavWidget):
self._good_button.set_enabled(False)
self._progress = FirstOrderFilter(0.0, 0.5, 1 / gui_app.target_fps)
self._dialog = DriverCameraSetupDialog()
self._dialog = CabinCameraSetupDialog()
self._bad_face_page = DMBadFaceDetected()
# Disable driver monitoring model when device times out for inactivity
@@ -231,7 +231,7 @@ class TrainingGuideRecordFront(NavScroller):
exit_on_confirm=False)
self._scroller.add_widgets([
GreyBigButton("driver camera data", "do you want to share video data for training?",
GreyBigButton("cabin camera data", "do you want to share video data for training?",
gui_app.texture("icons_mici/setup/green_dm.png", 64, 64)),
GreyBigButton("", "Sharing your data with comma helps improve openpilot for everyone."),
self._accept_button,
@@ -9,7 +9,7 @@ from openpilot.system.ui.widgets.scroller import NavRawScrollPanel, NavScroller
from openpilot.selfdrive.ui.mici.widgets.button import BigButton, BigCircleButton
from openpilot.selfdrive.ui.mici.widgets.dialog import BigDialog, BigConfirmationDialog
from openpilot.selfdrive.ui.mici.widgets.pairing_dialog import PairingDialog
from openpilot.selfdrive.ui.mici.onroad.driver_camera_dialog import DriverCameraDialog
from openpilot.selfdrive.ui.mici.onroad.cabin_camera_dialog import CabinCameraDialog
from openpilot.selfdrive.ui.mici.layouts.onboarding import TrainingGuide, TermsPage
from openpilot.system.ui.lib.application import gui_app, FontWeight, MousePos
from openpilot.system.ui.lib.multilang import tr
@@ -189,9 +189,9 @@ class DeviceLayoutMici(NavScroller):
regulatory_btn = BigButton("regulatory info", "", gui_app.texture("icons_mici/settings/device/info.png", 64, 64))
regulatory_btn.set_click_callback(self._on_regulatory)
driver_cam_btn = BigButton("driver\ncamera preview", "", gui_app.texture("icons_mici/settings/device/cameras.png", 64, 64))
driver_cam_btn.set_click_callback(lambda: gui_app.push_widget(DriverCameraDialog()))
driver_cam_btn.set_enabled(lambda: ui_state.is_offroad())
cabin_cam_btn = BigButton("driver\ncamera preview", "", gui_app.texture("icons_mici/settings/device/cameras.png", 64, 64))
cabin_cam_btn.set_click_callback(lambda: gui_app.push_widget(CabinCameraDialog()))
cabin_cam_btn.set_enabled(lambda: ui_state.is_offroad())
review_training_guide_btn = BigButton("review\ntraining guide", "", gui_app.texture("icons_mici/settings/device/info.png", 64, 64))
review_training_guide_btn.set_click_callback(lambda: gui_app.push_widget(ReviewTrainingGuide(completed_callback=lambda: gui_app.pop_widgets_to(self))))
@@ -204,7 +204,7 @@ class DeviceLayoutMici(NavScroller):
DeviceInfoLayoutMici(),
PairBigButton(),
review_training_guide_btn,
driver_cam_btn,
cabin_cam_btn,
terms_btn,
regulatory_btn,
reset_calibration_btn,
@@ -47,7 +47,7 @@ class TogglesLayoutMici(NavScroller):
is_metric_toggle = BigParamControl("use metric units", "IsMetric")
ldw_toggle = BigParamControl("lane departure warnings", "IsLdwEnabled")
always_on_dm_toggle = BigParamControl("always-on driver monitor", "AlwaysOnDM")
record_front = BigParamControl("record & upload driver camera", "RecordFront", toggle_callback=restart_needed_callback)
record_front = BigParamControl("record & upload cabin camera", "RecordFront", toggle_callback=restart_needed_callback)
record_mic = BigParamControl("record & upload mic audio", "RecordAudio", toggle_callback=restart_needed_callback)
enable_openpilot = BigParamControl("enable openpilot", "OpenpilotEnabledToggle", toggle_callback=restart_needed_callback)
@@ -21,7 +21,7 @@ from enum import IntEnum
OpState = log.SelfdriveState.OpenpilotState
CALIBRATED = log.LiveCalibrationData.Status.calibrated
ROAD_CAM = VisionStreamType.VISION_STREAM_ROAD
NARROW_ROAD_CAM = VisionStreamType.VISION_STREAM_NARROW_ROAD
WIDE_CAM = VisionStreamType.VISION_STREAM_WIDE_ROAD
DEFAULT_DEVICE_CAMERA = DEVICE_CAMERAS["tici", "ar0231"]
@@ -130,7 +130,7 @@ class BookmarkIcon(Widget):
class AugmentedRoadView(CameraView):
def __init__(self, bookmark_callback=None, stream_type: VisionStreamType = VisionStreamType.VISION_STREAM_ROAD):
def __init__(self, bookmark_callback=None, stream_type: VisionStreamType = VisionStreamType.VISION_STREAM_NARROW_ROAD):
super().__init__("camerad", stream_type)
self._bookmark_callback = bookmark_callback
self._set_placeholder_color(rl.BLACK)
@@ -250,12 +250,12 @@ class AugmentedRoadView(CameraView):
if v_ego < WIDE_CAM_MAX_SPEED:
target = WIDE_CAM
elif v_ego > ROAD_CAM_MIN_SPEED:
target = ROAD_CAM
target = NARROW_ROAD_CAM
else:
# Hysteresis zone - keep current stream
target = self.stream_type
else:
target = ROAD_CAM
target = NARROW_ROAD_CAM
if self.stream_type != target:
self.switch_stream(target)
@@ -263,8 +263,8 @@ class AugmentedRoadView(CameraView):
def _update_calibration(self):
# Update device camera if not already set
sm = ui_state.sm
if not self.device_camera and sm.seen['roadCameraState'] and sm.seen['deviceState']:
self.device_camera = DEVICE_CAMERAS[(str(sm['deviceState'].deviceType), str(sm['roadCameraState'].sensor))]
if not self.device_camera and sm.seen['narrowRoadCameraState'] and sm.seen['deviceState']:
self.device_camera = DEVICE_CAMERAS[(str(sm['deviceState'].deviceType), str(sm['narrowRoadCameraState'].sensor))]
# Check if live calibration data is available and valid
if not (sm.updated["liveCalibration"] and sm.valid['liveCalibration']):
@@ -298,7 +298,7 @@ class AugmentedRoadView(CameraView):
# Get camera configuration
device_camera = self.device_camera or DEFAULT_DEVICE_CAMERA
is_wide_camera = self.stream_type == WIDE_CAM
intrinsic = device_camera.ecam.intrinsics if is_wide_camera else device_camera.fcam.intrinsics
intrinsic = device_camera.wide_road.intrinsics if is_wide_camera else device_camera.narrow_road.intrinsics
calibration = self.view_from_wide_calib if is_wide_camera else self.view_from_calib
if is_wide_camera:
zoom = 0.7 * 1.5
@@ -353,14 +353,14 @@ class AugmentedRoadView(CameraView):
if __name__ == "__main__":
gui_app.init_window("OnRoad Camera View")
road_camera_view = AugmentedRoadView(lambda: None, stream_type=ROAD_CAM)
road_camera_view = AugmentedRoadView(lambda: None, stream_type=NARROW_ROAD_CAM)
print("***press space to switch camera view***")
try:
for _ in gui_app.render():
ui_state.update()
if rl.is_key_released(rl.KeyboardKey.KEY_SPACE):
if WIDE_CAM in road_camera_view.available_streams:
stream = ROAD_CAM if road_camera_view.stream_type == WIDE_CAM else WIDE_CAM
stream = NARROW_ROAD_CAM if road_camera_view.stream_type == WIDE_CAM else WIDE_CAM
road_camera_view.switch_stream(stream)
road_camera_view.render(rl.Rectangle(0, 0, gui_app.width, gui_app.height))
finally:
@@ -11,7 +11,7 @@ from openpilot.system.ui.widgets.nav_widget import NavWidget
from openpilot.system.ui.widgets.label import gui_label
class DriverCameraView(CameraView):
class CabinCameraView(CameraView):
def _calc_frame_matrix(self, rect: rl.Rectangle):
base = super()._calc_frame_matrix(rect)
driver_view_ratio = 1.5
@@ -20,11 +20,11 @@ class DriverCameraView(CameraView):
return base
class BaseDriverCameraDialog(Widget):
class BaseCabinCameraDialog(Widget):
# Not a NavWidget so training guide can use this without back navigation
def __init__(self):
super().__init__()
self._camera_view = DriverCameraView("camerad", VisionStreamType.VISION_STREAM_DRIVER)
self._camera_view = CabinCameraView("camerad", VisionStreamType.VISION_STREAM_CABIN)
self.driver_state_renderer = DriverStateRenderer(lines=True)
self.driver_state_renderer.set_rect(rl.Rectangle(0, 0, 200, 200))
self.driver_state_renderer.load_icons()
@@ -229,7 +229,7 @@ class BaseDriverCameraDialog(Widget):
rl.draw_texture_v(self._glasses_texture, glasses_pos, rl.Color(70, 80, 161, int(255 * glasses_prob)))
class DriverCameraDialog(NavWidget, BaseDriverCameraDialog):
class CabinCameraDialog(NavWidget, BaseCabinCameraDialog):
def __init__(self):
super().__init__()
# TODO: this can grow unbounded, should be given some thought
@@ -237,12 +237,12 @@ class DriverCameraDialog(NavWidget, BaseDriverCameraDialog):
if __name__ == "__main__":
gui_app.init_window("Driver Camera View (mici)")
gui_app.init_window("Cabin Camera View (mici)")
driver_camera_view = DriverCameraDialog()
gui_app.push_widget(driver_camera_view)
cabin_camera_view = CabinCameraDialog()
gui_app.push_widget(cabin_camera_view)
try:
for _ in gui_app.render():
ui_state.update()
finally:
driver_camera_view.close()
cabin_camera_view.close()
@@ -126,7 +126,7 @@ class CameraView(Widget):
self._engaged_loc = rl.get_shader_location(self.shader, "engaged")
self._engaged_val = rl.ffi.new("int[1]", [1])
self._enhance_driver_loc = rl.get_shader_location(self.shader, "enhance_driver")
self._enhance_driver_val = rl.ffi.new("int[1]", [1 if stream_type == VisionStreamType.VISION_STREAM_DRIVER else 0])
self._enhance_driver_val = rl.ffi.new("int[1]", [1 if stream_type == VisionStreamType.VISION_STREAM_CABIN else 0])
self.frame: VisionBuf | None = None
self.texture_y: rl.Texture | None = None
@@ -243,8 +243,8 @@ class CameraView(Widget):
transform = self._calc_frame_matrix(rect)
src_rect = rl.Rectangle(0, 0, float(self.frame.width), float(self.frame.height))
# Flip driver camera horizontally
if self._stream_type == VisionStreamType.VISION_STREAM_DRIVER:
# Flip cabin camera horizontally
if self._stream_type == VisionStreamType.VISION_STREAM_CABIN:
src_rect.width = -src_rect.width
# Calculate scale
@@ -410,6 +410,6 @@ class CameraView(Widget):
if __name__ == "__main__":
gui_app.init_window("camera view")
road = CameraView("camerad", VisionStreamType.VISION_STREAM_ROAD)
road = CameraView("camerad", VisionStreamType.VISION_STREAM_NARROW_ROAD)
for _ in gui_app.render():
road.render(rl.Rectangle(0, 0, gui_app.width, gui_app.height))
@@ -4,13 +4,13 @@ import unittest
# FIXME: known small leaks not worth worrying about at the moment
KNOWN_LEAKS = {
"openpilot.selfdrive.ui.mici.onroad.driver_camera_dialog.DriverCameraView",
"openpilot.selfdrive.ui.mici.onroad.cabin_camera_dialog.CabinCameraView",
"openpilot.selfdrive.ui.mici.layouts.onboarding.TermsPage",
"openpilot.selfdrive.ui.mici.layouts.onboarding.TrainingGuide",
"openpilot.selfdrive.ui.mici.layouts.onboarding.DeclinePage",
"openpilot.selfdrive.ui.mici.layouts.onboarding.OnboardingWindow",
"openpilot.selfdrive.ui.onroad.driver_state.DriverStateRenderer",
"openpilot.selfdrive.ui.onroad.driver_camera_dialog.DriverCameraDialog",
"openpilot.selfdrive.ui.onroad.cabin_camera_dialog.CabinCameraDialog",
"openpilot.selfdrive.ui.layouts.onboarding.TermsPage",
"openpilot.selfdrive.ui.layouts.onboarding.DeclinePage",
"openpilot.selfdrive.ui.layouts.onboarding.OnboardingWindow",
@@ -51,13 +51,13 @@ class TestWidgetLeaks(OpenpilotTestCase):
# mici dialogs
from openpilot.selfdrive.ui.mici.layouts.onboarding import TrainingGuide as MiciTrainingGuide, OnboardingWindow as MiciOnboardingWindow
from openpilot.selfdrive.ui.mici.onroad.driver_camera_dialog import DriverCameraDialog as MiciDriverCameraDialog
from openpilot.selfdrive.ui.mici.onroad.cabin_camera_dialog import CabinCameraDialog as MiciCabinCameraDialog
from openpilot.selfdrive.ui.mici.widgets.pairing_dialog import PairingDialog as MiciPairingDialog
from openpilot.selfdrive.ui.mici.widgets.dialog import BigDialog, BigConfirmationDialog, BigInputDialog
from openpilot.selfdrive.ui.mici.layouts.settings.device import MiciFccModal
# tici dialogs
from openpilot.selfdrive.ui.onroad.driver_camera_dialog import DriverCameraDialog as TiciDriverCameraDialog
from openpilot.selfdrive.ui.onroad.cabin_camera_dialog import CabinCameraDialog as TiciCabinCameraDialog
from openpilot.selfdrive.ui.layouts.onboarding import OnboardingWindow as TiciOnboardingWindow
from openpilot.selfdrive.ui.widgets.pairing_dialog import PairingDialog as TiciPairingDialog
from openpilot.system.ui.widgets.confirm_dialog import ConfirmDialog
@@ -71,7 +71,7 @@ class TestWidgetLeaks(OpenpilotTestCase):
for ctor in (
# mici
MiciDriverCameraDialog, MiciPairingDialog,
MiciCabinCameraDialog, MiciPairingDialog,
lambda: MiciTrainingGuide(lambda: None),
lambda: MiciOnboardingWindow(lambda: None),
lambda: BigDialog("test", "test"),
@@ -79,7 +79,7 @@ class TestWidgetLeaks(OpenpilotTestCase):
lambda: BigInputDialog("test"),
lambda: MiciFccModal(text="test"),
# tici
TiciDriverCameraDialog, TiciOnboardingWindow, TiciPairingDialog, Keyboard,
TiciCabinCameraDialog, TiciOnboardingWindow, TiciPairingDialog, Keyboard,
lambda: ConfirmDialog("test", "ok"),
lambda: MultiOptionDialog("test", ["a", "b"]),
lambda: HtmlModal(text="test"),
@@ -15,7 +15,7 @@ from openpilot.common.transformations.orientation import rot_from_euler
OpState = log.SelfdriveState.OpenpilotState
CALIBRATED = log.LiveCalibrationData.Status.calibrated
ROAD_CAM = VisionStreamType.VISION_STREAM_ROAD
NARROW_ROAD_CAM = VisionStreamType.VISION_STREAM_NARROW_ROAD
WIDE_CAM = VisionStreamType.VISION_STREAM_WIDE_ROAD
DEFAULT_DEVICE_CAMERA = DEVICE_CAMERAS["tici", "ar0231"]
@@ -31,7 +31,7 @@ INF_POINT = np.array([1000.0, 0.0, 0.0])
class AugmentedRoadView(CameraView):
def __init__(self, stream_type: VisionStreamType = VisionStreamType.VISION_STREAM_ROAD):
def __init__(self, stream_type: VisionStreamType = VisionStreamType.VISION_STREAM_NARROW_ROAD):
super().__init__("camerad", stream_type)
self._set_placeholder_color(BORDER_COLORS[UIStatus.DISENGAGED])
@@ -115,12 +115,12 @@ class AugmentedRoadView(CameraView):
if v_ego < WIDE_CAM_MAX_SPEED:
target = WIDE_CAM
elif v_ego > ROAD_CAM_MIN_SPEED:
target = ROAD_CAM
target = NARROW_ROAD_CAM
else:
# Hysteresis zone - keep current stream
target = self.stream_type
else:
target = ROAD_CAM
target = NARROW_ROAD_CAM
if self.stream_type != target:
self.switch_stream(target)
@@ -128,8 +128,8 @@ class AugmentedRoadView(CameraView):
def _update_calibration(self):
# Update device camera if not already set
sm = ui_state.sm
if not self.device_camera and sm.seen['roadCameraState'] and sm.seen['deviceState']:
self.device_camera = DEVICE_CAMERAS[(str(sm['deviceState'].deviceType), str(sm['roadCameraState'].sensor))]
if not self.device_camera and sm.seen['narrowRoadCameraState'] and sm.seen['deviceState']:
self.device_camera = DEVICE_CAMERAS[(str(sm['deviceState'].deviceType), str(sm['narrowRoadCameraState'].sensor))]
# Check if live calibration data is available and valid
if not (sm.updated["liveCalibration"] and sm.valid['liveCalibration']):
@@ -162,7 +162,7 @@ class AugmentedRoadView(CameraView):
# Get camera configuration
device_camera = self.device_camera or DEFAULT_DEVICE_CAMERA
is_wide_camera = self.stream_type == WIDE_CAM
intrinsic = device_camera.ecam.intrinsics if is_wide_camera else device_camera.fcam.intrinsics
intrinsic = device_camera.wide_road.intrinsics if is_wide_camera else device_camera.narrow_road.intrinsics
calibration = self.view_from_wide_calib if is_wide_camera else self.view_from_calib
zoom = 2.0 if is_wide_camera else 1.1
@@ -213,7 +213,7 @@ class AugmentedRoadView(CameraView):
if __name__ == "__main__":
gui_app.init_window("OnRoad Camera View")
road_camera_view = AugmentedRoadView(ROAD_CAM)
road_camera_view = AugmentedRoadView(NARROW_ROAD_CAM)
gui_app.push_widget(road_camera_view)
print("***press space to switch camera view***")
try:
@@ -221,7 +221,7 @@ if __name__ == "__main__":
ui_state.update()
if rl.is_key_released(rl.KeyboardKey.KEY_SPACE):
if WIDE_CAM in road_camera_view.available_streams:
stream = ROAD_CAM if road_camera_view.stream_type == WIDE_CAM else WIDE_CAM
stream = NARROW_ROAD_CAM if road_camera_view.stream_type == WIDE_CAM else WIDE_CAM
road_camera_view.switch_stream(stream)
finally:
road_camera_view.close()
@@ -9,9 +9,9 @@ from openpilot.system.ui.lib.multilang import tr
from openpilot.system.ui.widgets.label import gui_label
class DriverCameraDialog(CameraView):
class CabinCameraDialog(CameraView):
def __init__(self):
super().__init__("camerad", VisionStreamType.VISION_STREAM_DRIVER)
super().__init__("camerad", VisionStreamType.VISION_STREAM_CABIN)
self.driver_state_renderer = DriverStateRenderer()
# TODO: this can grow unbounded, should be given some thought
device.add_interactive_timeout_callback(gui_app.pop_widget)
@@ -100,12 +100,12 @@ class DriverCameraDialog(CameraView):
if __name__ == "__main__":
gui_app.init_window("Driver Camera View")
gui_app.init_window("Cabin Camera View")
driver_camera_view = DriverCameraDialog()
gui_app.push_widget(driver_camera_view)
cabin_camera_view = CabinCameraDialog()
gui_app.push_widget(cabin_camera_view)
try:
for _ in gui_app.render():
ui_state.update()
finally:
driver_camera_view.close()
cabin_camera_view.close()
+3 -3
View File
@@ -203,8 +203,8 @@ class CameraView(Widget):
transform = self._calc_frame_matrix(rect)
src_rect = rl.Rectangle(0, 0, float(self.frame.width), float(self.frame.height))
# Flip driver camera horizontally
if self._stream_type == VisionStreamType.VISION_STREAM_DRIVER:
# Flip cabin camera horizontally
if self._stream_type == VisionStreamType.VISION_STREAM_CABIN:
src_rect.width = -src_rect.width
# Calculate scale
@@ -363,6 +363,6 @@ class CameraView(Widget):
if __name__ == "__main__":
gui_app.init_window("camera view")
road = CameraView("camerad", VisionStreamType.VISION_STREAM_ROAD)
road = CameraView("camerad", VisionStreamType.VISION_STREAM_NARROW_ROAD)
for _ in gui_app.render():
road.render(rl.Rectangle(0, 0, gui_app.width, gui_app.height))
@@ -321,7 +321,7 @@ def build_mici_script(pm: PubMaster, main_layout, script: Script) -> None:
lambda: swipe_left(width * 2), click, # first page, click next
lambda: swipe_left(width * 2), swipe_down # second page, go back (TODO: make driver cam preview work)
),
None, # TODO: preview driver camera; enabling this causes MultiplePublishersError later in onroad alert tests
None, # TODO: preview cabin camera; enabling this causes MultiplePublishersError later in onroad alert tests
lambda: explore_setting(swipe_left), # terms & conditions (swipe to view QR code)
lambda: explore_setting(lambda: swipe_up(height * 3), lambda: swipe_down(height * 3)), # regulatory info
lambda: run_actions(click, lambda: swipe_left(width)), # reset calibration confirm (goes back automatically)
@@ -90,7 +90,7 @@ if __name__ == "__main__":
W, H = 2048, 1216
vipc = VisionIpcServer("camerad")
vipc.create_buffers(VisionStreamType.VISION_STREAM_ROAD, 5, W, H)
vipc.create_buffers(VisionStreamType.VISION_STREAM_NARROW_ROAD, 5, W, H)
vipc.start_listener()
yuv_buffer_size = W * H + (W // 2) * (H // 2) * 2
yuv_data = np.random.default_rng().integers(0, 256, yuv_buffer_size, dtype=np.uint8).tobytes()
@@ -100,7 +100,7 @@ if __name__ == "__main__":
break
if ui_state.sm.frame % 3 == 0:
eof = int((ui_state.sm.frame % 3) * 0.05 * 1e9)
vipc.send(VisionStreamType.VISION_STREAM_ROAD, yuv_data, ui_state.sm.frame % 3, eof, eof)
vipc.send(VisionStreamType.VISION_STREAM_NARROW_ROAD, yuv_data, ui_state.sm.frame % 3, eof, eof)
ui_state.update()
pr.dump_stats(f'{args.output}_deterministic.stats')
+8 -8
View File
@@ -381,7 +381,7 @@ msgid "ERROR"
msgstr ""
#: openpilot/selfdrive/ui/layouts/settings/device.py
msgid "Preview the driver facing camera to ensure that driver monitoring has good visibility. (vehicle must be off)"
msgid "Preview the cabin camera to ensure that driver monitoring has good visibility. (vehicle must be off)"
msgstr ""
#: openpilot/selfdrive/ui/layouts/settings/device.py
@@ -449,7 +449,7 @@ msgid "Serial"
msgstr ""
#: openpilot/selfdrive/ui/layouts/settings/device.py
msgid "Driver Camera"
msgid "Cabin Camera"
msgstr ""
#: openpilot/selfdrive/ui/layouts/settings/device.py
@@ -704,7 +704,7 @@ msgid "Enable driver monitoring even when openpilot is not engaged."
msgstr ""
#: openpilot/selfdrive/ui/layouts/settings/toggles.py
msgid "Upload data from the driver facing camera and help improve the driver monitoring algorithm."
msgid "Upload data from the cabin camera and help improve the driver monitoring algorithm."
msgstr ""
#: openpilot/selfdrive/ui/layouts/settings/toggles.py
@@ -748,7 +748,7 @@ msgid "Always-On Driver Monitoring"
msgstr ""
#: openpilot/selfdrive/ui/layouts/settings/toggles.py
msgid "Record and Upload Driver Camera"
msgid "Record and Upload Cabin Camera"
msgstr ""
#: openpilot/selfdrive/ui/layouts/settings/toggles.py
@@ -779,10 +779,6 @@ msgstr ""
msgid "Enable the openpilot longitudinal control (alpha) toggle to allow Experimental mode."
msgstr ""
#: openpilot/selfdrive/ui/onroad/driver_camera_dialog.py
msgid "camera starting"
msgstr ""
#: openpilot/selfdrive/ui/onroad/hud_renderer.py
msgid "MAX"
msgstr ""
@@ -795,6 +791,10 @@ msgstr ""
msgid "mph"
msgstr ""
#: openpilot/selfdrive/ui/onroad/cabin_camera_dialog.py
msgid "camera starting"
msgstr ""
#: openpilot/selfdrive/ui/onroad/alert_renderer.py
msgid "openpilot Unavailable"
msgstr ""
+11 -11
View File
@@ -126,6 +126,10 @@ msgstr "VERBINDUNG"
msgid "CONNECTING..."
msgstr "VERBINDUNG"
#: openpilot/selfdrive/ui/layouts/settings/device.py
msgid "Cabin Camera"
msgstr ""
#: openpilot/system/ui/widgets/confirm_dialog.py
#: openpilot/system/ui/widgets/keyboard.py
#: openpilot/system/ui/widgets/network.py
@@ -205,10 +209,6 @@ msgstr "Dongle-ID"
msgid "Download"
msgstr "Herunterladen"
#: openpilot/selfdrive/ui/layouts/settings/device.py
msgid "Driver Camera"
msgstr "Fahrerkamera"
#: openpilot/selfdrive/ui/layouts/settings/toggles.py
msgid "Driving Personality"
msgstr "Fahrstil"
@@ -466,8 +466,8 @@ msgid "Prevent large data uploads when on a metered cellular connection"
msgstr "Verhindern Sie das Hochladen großer Datenmengen bei einer getakteten Mobilfunkverbindung"
#: openpilot/selfdrive/ui/layouts/settings/device.py
msgid "Preview the driver facing camera to ensure that driver monitoring has good visibility. (vehicle must be off)"
msgstr "Vorschau der FahrerKamera, um sicherzustellen, dass die Fahrerüberwachung gute Sicht hat. (Fahrzeug muss ausgeschaltet sein)"
msgid "Preview the cabin camera to ensure that driver monitoring has good visibility. (vehicle must be off)"
msgstr ""
#: openpilot/selfdrive/ui/widgets/pairing_dialog.py
msgid "QR Code Error"
@@ -498,8 +498,8 @@ msgid "Reboot and Update"
msgstr "Neustarten und aktualisieren"
#: openpilot/selfdrive/ui/layouts/settings/toggles.py
msgid "Record and Upload Driver Camera"
msgstr "Fahrerkamera aufzeichnen und hochladen"
msgid "Record and Upload Cabin Camera"
msgstr ""
#: openpilot/selfdrive/ui/layouts/settings/toggles.py
msgid "Record and Upload Microphone Audio"
@@ -638,8 +638,8 @@ msgid "Upgrade Now"
msgstr "Jetzt abonnieren"
#: openpilot/selfdrive/ui/layouts/settings/toggles.py
msgid "Upload data from the driver facing camera and help improve the driver monitoring algorithm."
msgstr "Daten von der FahrerKamera hochladen und den FahrerüberwachungsAlgorithmus verbessern."
msgid "Upload data from the cabin camera and help improve the driver monitoring algorithm."
msgstr ""
#: openpilot/selfdrive/ui/layouts/settings/toggles.py
msgid "Use Metric System"
@@ -685,7 +685,7 @@ msgstr "Sie müssen die Nutzungsbedingungen akzeptieren, um openpilot zu verwend
msgid "You must accept the Terms and Conditions to use openpilot. Read the latest terms at https://comma.ai/terms before continuing."
msgstr "Sie müssen die Nutzungsbedingungen akzeptieren, um openpilot zu verwenden. Lesen Sie die aktuellen Bedingungen unter https://comma.ai/terms, bevor Sie fortfahren."
#: openpilot/selfdrive/ui/onroad/driver_camera_dialog.py
#: openpilot/selfdrive/ui/onroad/cabin_camera_dialog.py
msgid "camera starting"
msgstr "Kamera startet"
+11 -11
View File
@@ -126,6 +126,10 @@ msgstr "CONNECT"
msgid "CONNECTING..."
msgstr "CONNECTING..."
#: openpilot/selfdrive/ui/layouts/settings/device.py
msgid "Cabin Camera"
msgstr ""
#: openpilot/system/ui/widgets/confirm_dialog.py
#: openpilot/system/ui/widgets/keyboard.py
#: openpilot/system/ui/widgets/network.py
@@ -205,10 +209,6 @@ msgstr "Dongle ID"
msgid "Download"
msgstr "Download"
#: openpilot/selfdrive/ui/layouts/settings/device.py
msgid "Driver Camera"
msgstr "Driver Camera"
#: openpilot/selfdrive/ui/layouts/settings/toggles.py
msgid "Driving Personality"
msgstr "Driving Personality"
@@ -466,8 +466,8 @@ msgid "Prevent large data uploads when on a metered cellular connection"
msgstr "Prevent large data uploads when on a metered cellular connection"
#: openpilot/selfdrive/ui/layouts/settings/device.py
msgid "Preview the driver facing camera to ensure that driver monitoring has good visibility. (vehicle must be off)"
msgstr "Preview the driver facing camera to ensure that driver monitoring has good visibility. (vehicle must be off)"
msgid "Preview the cabin camera to ensure that driver monitoring has good visibility. (vehicle must be off)"
msgstr ""
#: openpilot/selfdrive/ui/widgets/pairing_dialog.py
msgid "QR Code Error"
@@ -498,8 +498,8 @@ msgid "Reboot and Update"
msgstr "Reboot and Update"
#: openpilot/selfdrive/ui/layouts/settings/toggles.py
msgid "Record and Upload Driver Camera"
msgstr "Record and Upload Driver Camera"
msgid "Record and Upload Cabin Camera"
msgstr ""
#: openpilot/selfdrive/ui/layouts/settings/toggles.py
msgid "Record and Upload Microphone Audio"
@@ -638,8 +638,8 @@ msgid "Upgrade Now"
msgstr "Upgrade Now"
#: openpilot/selfdrive/ui/layouts/settings/toggles.py
msgid "Upload data from the driver facing camera and help improve the driver monitoring algorithm."
msgstr "Upload data from the driver facing camera and help improve the driver monitoring algorithm."
msgid "Upload data from the cabin camera and help improve the driver monitoring algorithm."
msgstr ""
#: openpilot/selfdrive/ui/layouts/settings/toggles.py
msgid "Use Metric System"
@@ -685,7 +685,7 @@ msgstr "You must accept the Terms and Conditions in order to use openpilot."
msgid "You must accept the Terms and Conditions to use openpilot. Read the latest terms at https://comma.ai/terms before continuing."
msgstr "You must accept the Terms and Conditions to use openpilot. Read the latest terms at https://comma.ai/terms before continuing."
#: openpilot/selfdrive/ui/onroad/driver_camera_dialog.py
#: openpilot/selfdrive/ui/onroad/cabin_camera_dialog.py
msgid "camera starting"
msgstr "camera starting"
+11 -11
View File
@@ -126,6 +126,10 @@ msgstr "CONECTAR"
msgid "CONNECTING..."
msgstr "CONECTAR"
#: openpilot/selfdrive/ui/layouts/settings/device.py
msgid "Cabin Camera"
msgstr ""
#: openpilot/system/ui/widgets/confirm_dialog.py
#: openpilot/system/ui/widgets/keyboard.py
#: openpilot/system/ui/widgets/network.py
@@ -205,10 +209,6 @@ msgstr "ID del dongle"
msgid "Download"
msgstr "Descargar"
#: openpilot/selfdrive/ui/layouts/settings/device.py
msgid "Driver Camera"
msgstr "Cámara del conductor"
#: openpilot/selfdrive/ui/layouts/settings/toggles.py
msgid "Driving Personality"
msgstr "Estilo de conducción"
@@ -466,8 +466,8 @@ msgid "Prevent large data uploads when on a metered cellular connection"
msgstr "Evite grandes cargas de datos cuando esté en una conexión celular medida"
#: openpilot/selfdrive/ui/layouts/settings/device.py
msgid "Preview the driver facing camera to ensure that driver monitoring has good visibility. (vehicle must be off)"
msgstr "Previsualiza la cámara hacia el conductor para asegurarte de que la supervisión del conductor tenga buena visibilidad. (el vehículo debe estar apagado)"
msgid "Preview the cabin camera to ensure that driver monitoring has good visibility. (vehicle must be off)"
msgstr ""
#: openpilot/selfdrive/ui/widgets/pairing_dialog.py
msgid "QR Code Error"
@@ -498,8 +498,8 @@ msgid "Reboot and Update"
msgstr "Reiniciar y actualizar"
#: openpilot/selfdrive/ui/layouts/settings/toggles.py
msgid "Record and Upload Driver Camera"
msgstr "Grabar y subir cámara del conductor"
msgid "Record and Upload Cabin Camera"
msgstr ""
#: openpilot/selfdrive/ui/layouts/settings/toggles.py
msgid "Record and Upload Microphone Audio"
@@ -638,8 +638,8 @@ msgid "Upgrade Now"
msgstr "Mejorar ahora"
#: openpilot/selfdrive/ui/layouts/settings/toggles.py
msgid "Upload data from the driver facing camera and help improve the driver monitoring algorithm."
msgstr "Sube datos de la cámara orientada al conductor y ayuda a mejorar el algoritmo de supervisión del conductor."
msgid "Upload data from the cabin camera and help improve the driver monitoring algorithm."
msgstr ""
#: openpilot/selfdrive/ui/layouts/settings/toggles.py
msgid "Use Metric System"
@@ -685,7 +685,7 @@ msgstr "Debes aceptar los Términos y Condiciones para poder usar openpilot."
msgid "You must accept the Terms and Conditions to use openpilot. Read the latest terms at https://comma.ai/terms before continuing."
msgstr "Debes aceptar los Términos y Condiciones para usar openpilot. Lee los términos más recientes en https://comma.ai/terms antes de continuar."
#: openpilot/selfdrive/ui/onroad/driver_camera_dialog.py
#: openpilot/selfdrive/ui/onroad/cabin_camera_dialog.py
msgid "camera starting"
msgstr "iniciando cámara"
+11 -11
View File
@@ -126,6 +126,10 @@ msgstr "CONNECTER"
msgid "CONNECTING..."
msgstr "CONNECTER..."
#: openpilot/selfdrive/ui/layouts/settings/device.py
msgid "Cabin Camera"
msgstr ""
#: openpilot/system/ui/widgets/confirm_dialog.py
#: openpilot/system/ui/widgets/keyboard.py
#: openpilot/system/ui/widgets/network.py
@@ -205,10 +209,6 @@ msgstr "ID du dongle"
msgid "Download"
msgstr "Télécharger"
#: openpilot/selfdrive/ui/layouts/settings/device.py
msgid "Driver Camera"
msgstr "Caméra conducteur"
#: openpilot/selfdrive/ui/layouts/settings/toggles.py
msgid "Driving Personality"
msgstr "Personnalité de conduite"
@@ -466,8 +466,8 @@ msgid "Prevent large data uploads when on a metered cellular connection"
msgstr "Eviter les transferts de données volumineux lors d'une connexion à un réseau cellulaire limité"
#: openpilot/selfdrive/ui/layouts/settings/device.py
msgid "Preview the driver facing camera to ensure that driver monitoring has good visibility. (vehicle must be off)"
msgstr "Prévisualisez la caméra orientée conducteur pour vous assurer que la surveillance du conducteur a une bonne visibilité. (le véhicule doit être éteint)"
msgid "Preview the cabin camera to ensure that driver monitoring has good visibility. (vehicle must be off)"
msgstr ""
#: openpilot/selfdrive/ui/widgets/pairing_dialog.py
msgid "QR Code Error"
@@ -498,8 +498,8 @@ msgid "Reboot and Update"
msgstr "Redémarrer et mettre à jour"
#: openpilot/selfdrive/ui/layouts/settings/toggles.py
msgid "Record and Upload Driver Camera"
msgstr "Enregistrer et téléverser la caméra conducteur"
msgid "Record and Upload Cabin Camera"
msgstr ""
#: openpilot/selfdrive/ui/layouts/settings/toggles.py
msgid "Record and Upload Microphone Audio"
@@ -638,8 +638,8 @@ msgid "Upgrade Now"
msgstr "Mettre à niveau maintenant"
#: openpilot/selfdrive/ui/layouts/settings/toggles.py
msgid "Upload data from the driver facing camera and help improve the driver monitoring algorithm."
msgstr "Téléverser les données de la caméra orientée conducteur et aider à améliorer l'algorithme de surveillance du conducteur."
msgid "Upload data from the cabin camera and help improve the driver monitoring algorithm."
msgstr ""
#: openpilot/selfdrive/ui/layouts/settings/toggles.py
msgid "Use Metric System"
@@ -685,7 +685,7 @@ msgstr "Vous devez accepter les conditions générales pour utiliser openpilot."
msgid "You must accept the Terms and Conditions to use openpilot. Read the latest terms at https://comma.ai/terms before continuing."
msgstr "Vous devez accepter les conditions générales pour utiliser openpilot. Lisez les dernières conditions sur https://comma.ai/terms avant de continuer."
#: openpilot/selfdrive/ui/onroad/driver_camera_dialog.py
#: openpilot/selfdrive/ui/onroad/cabin_camera_dialog.py
msgid "camera starting"
msgstr "démarrage de la caméra"
+11 -11
View File
@@ -126,6 +126,10 @@ msgstr "接続"
msgid "CONNECTING..."
msgstr "接続中..."
#: openpilot/selfdrive/ui/layouts/settings/device.py
msgid "Cabin Camera"
msgstr ""
#: openpilot/system/ui/widgets/confirm_dialog.py
#: openpilot/system/ui/widgets/keyboard.py
#: openpilot/system/ui/widgets/network.py
@@ -205,10 +209,6 @@ msgstr "ドングルID"
msgid "Download"
msgstr "ダウンロード"
#: openpilot/selfdrive/ui/layouts/settings/device.py
msgid "Driver Camera"
msgstr "ドライバーカメラ"
#: openpilot/selfdrive/ui/layouts/settings/toggles.py
msgid "Driving Personality"
msgstr "走行性格"
@@ -466,8 +466,8 @@ msgid "Prevent large data uploads when on a metered cellular connection"
msgstr "従量課金の携帯回線接続時は大きなデータのアップロードを抑制"
#: openpilot/selfdrive/ui/layouts/settings/device.py
msgid "Preview the driver facing camera to ensure that driver monitoring has good visibility. (vehicle must be off)"
msgstr "ドライバー向きカメラのプレビューでモニタリングの視界を確認します。(車両は停止状態である必要があります)"
msgid "Preview the cabin camera to ensure that driver monitoring has good visibility. (vehicle must be off)"
msgstr ""
#: openpilot/selfdrive/ui/widgets/pairing_dialog.py
msgid "QR Code Error"
@@ -498,8 +498,8 @@ msgid "Reboot and Update"
msgstr "再起動して更新"
#: openpilot/selfdrive/ui/layouts/settings/toggles.py
msgid "Record and Upload Driver Camera"
msgstr "ドライバーカメラを記録してアップロード"
msgid "Record and Upload Cabin Camera"
msgstr ""
#: openpilot/selfdrive/ui/layouts/settings/toggles.py
msgid "Record and Upload Microphone Audio"
@@ -638,8 +638,8 @@ msgid "Upgrade Now"
msgstr "今すぐアップグレード"
#: openpilot/selfdrive/ui/layouts/settings/toggles.py
msgid "Upload data from the driver facing camera and help improve the driver monitoring algorithm."
msgstr "ドライバー向きカメラのデータをアップロードしてモニタリングアルゴリズムの改善に協力してください。"
msgid "Upload data from the cabin camera and help improve the driver monitoring algorithm."
msgstr ""
#: openpilot/selfdrive/ui/layouts/settings/toggles.py
msgid "Use Metric System"
@@ -685,7 +685,7 @@ msgstr "openpilotを使用するには、利用規約に同意する必要があ
msgid "You must accept the Terms and Conditions to use openpilot. Read the latest terms at https://comma.ai/terms before continuing."
msgstr "openpilotを使用するには利用規約に同意する必要があります。続行する前に https://comma.ai/terms の最新の規約をお読みください。"
#: openpilot/selfdrive/ui/onroad/driver_camera_dialog.py
#: openpilot/selfdrive/ui/onroad/cabin_camera_dialog.py
msgid "camera starting"
msgstr "カメラを起動中"
+11 -11
View File
@@ -126,6 +126,10 @@ msgstr "연결"
msgid "CONNECTING..."
msgstr "연결 중..."
#: openpilot/selfdrive/ui/layouts/settings/device.py
msgid "Cabin Camera"
msgstr ""
#: openpilot/system/ui/widgets/confirm_dialog.py
#: openpilot/system/ui/widgets/keyboard.py
#: openpilot/system/ui/widgets/network.py
@@ -205,10 +209,6 @@ msgstr "동글 ID"
msgid "Download"
msgstr "다운로드"
#: openpilot/selfdrive/ui/layouts/settings/device.py
msgid "Driver Camera"
msgstr "운전자 카메라"
#: openpilot/selfdrive/ui/layouts/settings/toggles.py
msgid "Driving Personality"
msgstr "주행 성향"
@@ -466,8 +466,8 @@ msgid "Prevent large data uploads when on a metered cellular connection"
msgstr "종량제 셀룰러 연결 시 대용량 업로드 방지"
#: openpilot/selfdrive/ui/layouts/settings/device.py
msgid "Preview the driver facing camera to ensure that driver monitoring has good visibility. (vehicle must be off)"
msgstr "운전자 모니터링의 가시성을 확인하기 위해 운전자 카메라를 미리 봅니다. (차량은 꺼져 있어야 합니다)"
msgid "Preview the cabin camera to ensure that driver monitoring has good visibility. (vehicle must be off)"
msgstr ""
#: openpilot/selfdrive/ui/widgets/pairing_dialog.py
msgid "QR Code Error"
@@ -498,8 +498,8 @@ msgid "Reboot and Update"
msgstr "재시작 및 업데이트"
#: openpilot/selfdrive/ui/layouts/settings/toggles.py
msgid "Record and Upload Driver Camera"
msgstr "운전자 카메라 기록 및 업로드"
msgid "Record and Upload Cabin Camera"
msgstr ""
#: openpilot/selfdrive/ui/layouts/settings/toggles.py
msgid "Record and Upload Microphone Audio"
@@ -638,8 +638,8 @@ msgid "Upgrade Now"
msgstr "지금 업그레이드"
#: openpilot/selfdrive/ui/layouts/settings/toggles.py
msgid "Upload data from the driver facing camera and help improve the driver monitoring algorithm."
msgstr "운전자 방향 카메라 데이터를 업로드하여 운전자 모니터링 알고리즘 개선에 도움을 주세요."
msgid "Upload data from the cabin camera and help improve the driver monitoring algorithm."
msgstr ""
#: openpilot/selfdrive/ui/layouts/settings/toggles.py
msgid "Use Metric System"
@@ -685,7 +685,7 @@ msgstr "openpilot을 사용하려면 약관에 동의해야 합니다."
msgid "You must accept the Terms and Conditions to use openpilot. Read the latest terms at https://comma.ai/terms before continuing."
msgstr "openpilot을 사용하려면 약관에 동의해야 합니다. 계속하기 전에 https://comma.ai/terms 에서 최신 약관을 읽어주세요."
#: openpilot/selfdrive/ui/onroad/driver_camera_dialog.py
#: openpilot/selfdrive/ui/onroad/cabin_camera_dialog.py
msgid "camera starting"
msgstr "카메라 시작 중"
@@ -126,6 +126,10 @@ msgstr "CONECTAR"
msgid "CONNECTING..."
msgstr "CONECTANDO..."
#: openpilot/selfdrive/ui/layouts/settings/device.py
msgid "Cabin Camera"
msgstr ""
#: openpilot/system/ui/widgets/confirm_dialog.py
#: openpilot/system/ui/widgets/keyboard.py
#: openpilot/system/ui/widgets/network.py
@@ -205,10 +209,6 @@ msgstr "ID do Dongle"
msgid "Download"
msgstr "Baixar"
#: openpilot/selfdrive/ui/layouts/settings/device.py
msgid "Driver Camera"
msgstr "Câmera do Motorista"
#: openpilot/selfdrive/ui/layouts/settings/toggles.py
msgid "Driving Personality"
msgstr "Personalidade"
@@ -466,8 +466,8 @@ msgid "Prevent large data uploads when on a metered cellular connection"
msgstr "Evitar uploads grandes de dados em conexões móveis limitadas"
#: openpilot/selfdrive/ui/layouts/settings/device.py
msgid "Preview the driver facing camera to ensure that driver monitoring has good visibility. (vehicle must be off)"
msgstr "Pré-visualize a câmera voltada para o motorista para garantir que o monitoramento do motorista tenha boa visibilidade. (veículo deve estar desligado)"
msgid "Preview the cabin camera to ensure that driver monitoring has good visibility. (vehicle must be off)"
msgstr ""
#: openpilot/selfdrive/ui/widgets/pairing_dialog.py
msgid "QR Code Error"
@@ -498,8 +498,8 @@ msgid "Reboot and Update"
msgstr "Reiniciar e Atualizar"
#: openpilot/selfdrive/ui/layouts/settings/toggles.py
msgid "Record and Upload Driver Camera"
msgstr "Gravar e Enviar Câmera do Motorista"
msgid "Record and Upload Cabin Camera"
msgstr ""
#: openpilot/selfdrive/ui/layouts/settings/toggles.py
msgid "Record and Upload Microphone Audio"
@@ -638,8 +638,8 @@ msgid "Upgrade Now"
msgstr "Atualizar Agora"
#: openpilot/selfdrive/ui/layouts/settings/toggles.py
msgid "Upload data from the driver facing camera and help improve the driver monitoring algorithm."
msgstr "Envie dados da câmera voltada para o motorista e ajude a melhorar o algoritmo de monitoramento do motorista."
msgid "Upload data from the cabin camera and help improve the driver monitoring algorithm."
msgstr ""
#: openpilot/selfdrive/ui/layouts/settings/toggles.py
msgid "Use Metric System"
@@ -685,7 +685,7 @@ msgstr "Você deve aceitar os Termos e Condições para usar o openpilot."
msgid "You must accept the Terms and Conditions to use openpilot. Read the latest terms at https://comma.ai/terms before continuing."
msgstr "Você deve aceitar os Termos e Condições para usar o openpilot. Leia os termos mais recentes em https://comma.ai/terms antes de continuar."
#: openpilot/selfdrive/ui/onroad/driver_camera_dialog.py
#: openpilot/selfdrive/ui/onroad/cabin_camera_dialog.py
msgid "camera starting"
msgstr "câmera iniciando"
+11 -11
View File
@@ -126,6 +126,10 @@ msgstr "เชื่อมต่อ"
msgid "CONNECTING..."
msgstr "กำลังเชื่อมต่อ..."
#: openpilot/selfdrive/ui/layouts/settings/device.py
msgid "Cabin Camera"
msgstr ""
#: openpilot/system/ui/widgets/confirm_dialog.py
#: openpilot/system/ui/widgets/keyboard.py
#: openpilot/system/ui/widgets/network.py
@@ -205,10 +209,6 @@ msgstr "รหัสดองเกิล"
msgid "Download"
msgstr "ดาวน์โหลด"
#: openpilot/selfdrive/ui/layouts/settings/device.py
msgid "Driver Camera"
msgstr "กล้องไดร์เวอร์"
#: openpilot/selfdrive/ui/layouts/settings/toggles.py
msgid "Driving Personality"
msgstr "บุคลิกภาพในการขับขี่"
@@ -466,8 +466,8 @@ msgid "Prevent large data uploads when on a metered cellular connection"
msgstr "ป้องกันการอัพโหลดข้อมูลขนาดใหญ่เมื่อใช้การเชื่อมต่อมือถือแบบคิดค่าบริการตามปริมาณข้อมูล"
#: openpilot/selfdrive/ui/layouts/settings/device.py
msgid "Preview the driver facing camera to ensure that driver monitoring has good visibility. (vehicle must be off)"
msgstr "ดูตัวอย่างกล้องที่หันหน้าไปทางคนขับเพื่อให้แน่ใจว่าการตรวจสอบผู้ขับขี่มีทัศนวิสัยที่ดี (รถจะต้องถูกปิด)"
msgid "Preview the cabin camera to ensure that driver monitoring has good visibility. (vehicle must be off)"
msgstr ""
#: openpilot/selfdrive/ui/widgets/pairing_dialog.py
msgid "QR Code Error"
@@ -498,8 +498,8 @@ msgid "Reboot and Update"
msgstr "รีบูตและอัปเดต"
#: openpilot/selfdrive/ui/layouts/settings/toggles.py
msgid "Record and Upload Driver Camera"
msgstr "บันทึกและอัพโหลดกล้องไดร์เวอร์"
msgid "Record and Upload Cabin Camera"
msgstr ""
#: openpilot/selfdrive/ui/layouts/settings/toggles.py
msgid "Record and Upload Microphone Audio"
@@ -638,8 +638,8 @@ msgid "Upgrade Now"
msgstr "อัพเกรดทันที"
#: openpilot/selfdrive/ui/layouts/settings/toggles.py
msgid "Upload data from the driver facing camera and help improve the driver monitoring algorithm."
msgstr "อัปโหลดข้อมูลจากกล้องที่หันเข้าหาคนขับและช่วยปรับปรุงอัลกอริธึมการตรวจสอบผู้ขับขี่"
msgid "Upload data from the cabin camera and help improve the driver monitoring algorithm."
msgstr ""
#: openpilot/selfdrive/ui/layouts/settings/toggles.py
msgid "Use Metric System"
@@ -685,7 +685,7 @@ msgstr "คุณต้องยอมรับข้อกำหนดและ
msgid "You must accept the Terms and Conditions to use openpilot. Read the latest terms at https://comma.ai/terms before continuing."
msgstr "คุณต้องยอมรับข้อกำหนดและเงื่อนไขเพื่อใช้ openpilot อ่านข้อกำหนดล่าสุดได้ที่ https://comma.ai/terms ก่อนดำเนินการต่อ"
#: openpilot/selfdrive/ui/onroad/driver_camera_dialog.py
#: openpilot/selfdrive/ui/onroad/cabin_camera_dialog.py
msgid "camera starting"
msgstr "กำลังเริ่มกล้อง"
+11 -11
View File
@@ -126,6 +126,10 @@ msgstr "BAĞLAN"
msgid "CONNECTING..."
msgstr "BAĞLAN"
#: openpilot/selfdrive/ui/layouts/settings/device.py
msgid "Cabin Camera"
msgstr ""
#: openpilot/system/ui/widgets/confirm_dialog.py
#: openpilot/system/ui/widgets/keyboard.py
#: openpilot/system/ui/widgets/network.py
@@ -205,10 +209,6 @@ msgstr "Dongle kimliği"
msgid "Download"
msgstr "İndir"
#: openpilot/selfdrive/ui/layouts/settings/device.py
msgid "Driver Camera"
msgstr "Sürücü Kamerası"
#: openpilot/selfdrive/ui/layouts/settings/toggles.py
msgid "Driving Personality"
msgstr "Sürüş Kişiliği"
@@ -466,8 +466,8 @@ msgid "Prevent large data uploads when on a metered cellular connection"
msgstr "Ölçülü bir hücresel bağlantıdayken büyük veri yüklemelerini engelle"
#: openpilot/selfdrive/ui/layouts/settings/device.py
msgid "Preview the driver facing camera to ensure that driver monitoring has good visibility. (vehicle must be off)"
msgstr "Sürücü izleme görünürlüğünün iyi olduğundan emin olmak için sürücüye bakan kamerayı önizleyin. (araç kapalı olmalıdır)"
msgid "Preview the cabin camera to ensure that driver monitoring has good visibility. (vehicle must be off)"
msgstr ""
#: openpilot/selfdrive/ui/widgets/pairing_dialog.py
msgid "QR Code Error"
@@ -498,8 +498,8 @@ msgid "Reboot and Update"
msgstr "Yeniden Başlat ve Güncelle"
#: openpilot/selfdrive/ui/layouts/settings/toggles.py
msgid "Record and Upload Driver Camera"
msgstr "Sürücü Kamerasını Kaydet ve Yükle"
msgid "Record and Upload Cabin Camera"
msgstr ""
#: openpilot/selfdrive/ui/layouts/settings/toggles.py
msgid "Record and Upload Microphone Audio"
@@ -638,8 +638,8 @@ msgid "Upgrade Now"
msgstr "Şimdi Yükselt"
#: openpilot/selfdrive/ui/layouts/settings/toggles.py
msgid "Upload data from the driver facing camera and help improve the driver monitoring algorithm."
msgstr "Sürücüye bakan kameradan veri yükleyin ve sürücü izleme algoritmasını geliştirmeye yardımcı olun."
msgid "Upload data from the cabin camera and help improve the driver monitoring algorithm."
msgstr ""
#: openpilot/selfdrive/ui/layouts/settings/toggles.py
msgid "Use Metric System"
@@ -685,7 +685,7 @@ msgstr "openpilot'u kullanmak için Şartlar ve Koşulları kabul etmelisiniz."
msgid "You must accept the Terms and Conditions to use openpilot. Read the latest terms at https://comma.ai/terms before continuing."
msgstr "openpilot'u kullanmak için Şartlar ve Koşulları kabul etmelisiniz. Devam etmeden önce en güncel şartları https://comma.ai/terms adresinde okuyun."
#: openpilot/selfdrive/ui/onroad/driver_camera_dialog.py
#: openpilot/selfdrive/ui/onroad/cabin_camera_dialog.py
msgid "camera starting"
msgstr "kamera başlatılıyor"
+11 -11
View File
@@ -126,6 +126,10 @@ msgstr "ПІДКЛЮЧИТИ"
msgid "CONNECTING..."
msgstr "ПІДКЛЮЧА..."
#: openpilot/selfdrive/ui/layouts/settings/device.py
msgid "Cabin Camera"
msgstr ""
#: openpilot/system/ui/widgets/confirm_dialog.py
#: openpilot/system/ui/widgets/keyboard.py
#: openpilot/system/ui/widgets/network.py
@@ -205,10 +209,6 @@ msgstr "ID ключа"
msgid "Download"
msgstr "Завантажити"
#: openpilot/selfdrive/ui/layouts/settings/device.py
msgid "Driver Camera"
msgstr "Камера водія"
#: openpilot/selfdrive/ui/layouts/settings/toggles.py
msgid "Driving Personality"
msgstr "Стиль водіння"
@@ -466,8 +466,8 @@ msgid "Prevent large data uploads when on a metered cellular connection"
msgstr "Запобігати великим завантаженням даних під час лімітного стільникового з'єднання"
#: openpilot/selfdrive/ui/layouts/settings/device.py
msgid "Preview the driver facing camera to ensure that driver monitoring has good visibility. (vehicle must be off)"
msgstr "Попередньо перегляньте камеру, спрямовану на водія, щоб переконатися, що система моніторингу водія має добру видимість. (автомобіль повинен бути вимкнений)"
msgid "Preview the cabin camera to ensure that driver monitoring has good visibility. (vehicle must be off)"
msgstr ""
#: openpilot/selfdrive/ui/widgets/pairing_dialog.py
msgid "QR Code Error"
@@ -498,8 +498,8 @@ msgid "Reboot and Update"
msgstr "Перезавантажити та оновити"
#: openpilot/selfdrive/ui/layouts/settings/toggles.py
msgid "Record and Upload Driver Camera"
msgstr "Писати та вантажити відео з камери водія"
msgid "Record and Upload Cabin Camera"
msgstr ""
#: openpilot/selfdrive/ui/layouts/settings/toggles.py
msgid "Record and Upload Microphone Audio"
@@ -638,8 +638,8 @@ msgid "Upgrade Now"
msgstr "Оновити зараз"
#: openpilot/selfdrive/ui/layouts/settings/toggles.py
msgid "Upload data from the driver facing camera and help improve the driver monitoring algorithm."
msgstr "Завантажуйте дані з камери, спрямованої на водія, та допоможіть покращити алгоритм моніторингу водія."
msgid "Upload data from the cabin camera and help improve the driver monitoring algorithm."
msgstr ""
#: openpilot/selfdrive/ui/layouts/settings/toggles.py
msgid "Use Metric System"
@@ -685,7 +685,7 @@ msgstr "Ви повинні прийняти Умови та положення,
msgid "You must accept the Terms and Conditions to use openpilot. Read the latest terms at https://comma.ai/terms before continuing."
msgstr "Ви повинні прийняти Умови використання, щоб користуватися openpilot. Перед тим, як продовжити, ознайомтеся з останніми умовами на сайті https://comma.ai/terms."
#: openpilot/selfdrive/ui/onroad/driver_camera_dialog.py
#: openpilot/selfdrive/ui/onroad/cabin_camera_dialog.py
msgid "camera starting"
msgstr "запуск камери"
@@ -126,6 +126,10 @@ msgstr "连接"
msgid "CONNECTING..."
msgstr "连接中..."
#: openpilot/selfdrive/ui/layouts/settings/device.py
msgid "Cabin Camera"
msgstr ""
#: openpilot/system/ui/widgets/confirm_dialog.py
#: openpilot/system/ui/widgets/keyboard.py
#: openpilot/system/ui/widgets/network.py
@@ -205,10 +209,6 @@ msgstr "设备 ID"
msgid "Download"
msgstr "下载"
#: openpilot/selfdrive/ui/layouts/settings/device.py
msgid "Driver Camera"
msgstr "车内摄像头"
#: openpilot/selfdrive/ui/layouts/settings/toggles.py
msgid "Driving Personality"
msgstr "驾驶风格"
@@ -466,8 +466,8 @@ msgid "Prevent large data uploads when on a metered cellular connection"
msgstr "在计量制蜂窝网络时避免大量上传"
#: openpilot/selfdrive/ui/layouts/settings/device.py
msgid "Preview the driver facing camera to ensure that driver monitoring has good visibility. (vehicle must be off)"
msgstr "预览车内摄像头以确保驾驶员监控视野良好。(车辆必须熄火)"
msgid "Preview the cabin camera to ensure that driver monitoring has good visibility. (vehicle must be off)"
msgstr ""
#: openpilot/selfdrive/ui/widgets/pairing_dialog.py
msgid "QR Code Error"
@@ -498,8 +498,8 @@ msgid "Reboot and Update"
msgstr "重启并更新"
#: openpilot/selfdrive/ui/layouts/settings/toggles.py
msgid "Record and Upload Driver Camera"
msgstr "录制并上传车内摄像头"
msgid "Record and Upload Cabin Camera"
msgstr ""
#: openpilot/selfdrive/ui/layouts/settings/toggles.py
msgid "Record and Upload Microphone Audio"
@@ -638,8 +638,8 @@ msgid "Upgrade Now"
msgstr "立即升级"
#: openpilot/selfdrive/ui/layouts/settings/toggles.py
msgid "Upload data from the driver facing camera and help improve the driver monitoring algorithm."
msgstr "上传车内摄像头数据,帮助改进驾驶员监控算法。"
msgid "Upload data from the cabin camera and help improve the driver monitoring algorithm."
msgstr ""
#: openpilot/selfdrive/ui/layouts/settings/toggles.py
msgid "Use Metric System"
@@ -685,7 +685,7 @@ msgstr "您必须接受条款与条件才能使用 openpilot。"
msgid "You must accept the Terms and Conditions to use openpilot. Read the latest terms at https://comma.ai/terms before continuing."
msgstr "您必须接受条款与条件才能使用 openpilot。继续前请阅读 https://comma.ai/terms 上的最新条款。"
#: openpilot/selfdrive/ui/onroad/driver_camera_dialog.py
#: openpilot/selfdrive/ui/onroad/cabin_camera_dialog.py
msgid "camera starting"
msgstr "相机启动中"
@@ -126,6 +126,10 @@ msgstr "連線"
msgid "CONNECTING..."
msgstr "連線中..."
#: openpilot/selfdrive/ui/layouts/settings/device.py
msgid "Cabin Camera"
msgstr ""
#: openpilot/system/ui/widgets/confirm_dialog.py
#: openpilot/system/ui/widgets/keyboard.py
#: openpilot/system/ui/widgets/network.py
@@ -205,10 +209,6 @@ msgstr "裝置 ID"
msgid "Download"
msgstr "下載"
#: openpilot/selfdrive/ui/layouts/settings/device.py
msgid "Driver Camera"
msgstr "車內鏡頭"
#: openpilot/selfdrive/ui/layouts/settings/toggles.py
msgid "Driving Personality"
msgstr "駕駛風格"
@@ -466,8 +466,8 @@ msgid "Prevent large data uploads when on a metered cellular connection"
msgstr "在計量制行動網路時避免大量上傳"
#: openpilot/selfdrive/ui/layouts/settings/device.py
msgid "Preview the driver facing camera to ensure that driver monitoring has good visibility. (vehicle must be off)"
msgstr "預覽車內鏡頭以確保駕駛監控視野良好。(車輛須熄火)"
msgid "Preview the cabin camera to ensure that driver monitoring has good visibility. (vehicle must be off)"
msgstr ""
#: openpilot/selfdrive/ui/widgets/pairing_dialog.py
msgid "QR Code Error"
@@ -498,8 +498,8 @@ msgid "Reboot and Update"
msgstr "重新啟動並更新"
#: openpilot/selfdrive/ui/layouts/settings/toggles.py
msgid "Record and Upload Driver Camera"
msgstr "錄製並上傳車內鏡頭"
msgid "Record and Upload Cabin Camera"
msgstr ""
#: openpilot/selfdrive/ui/layouts/settings/toggles.py
msgid "Record and Upload Microphone Audio"
@@ -638,8 +638,8 @@ msgid "Upgrade Now"
msgstr "立即升級"
#: openpilot/selfdrive/ui/layouts/settings/toggles.py
msgid "Upload data from the driver facing camera and help improve the driver monitoring algorithm."
msgstr "上傳車內鏡頭資料,協助改善駕駛監控演算法。"
msgid "Upload data from the cabin camera and help improve the driver monitoring algorithm."
msgstr ""
#: openpilot/selfdrive/ui/layouts/settings/toggles.py
msgid "Use Metric System"
@@ -685,7 +685,7 @@ msgstr "您必須接受條款與細則才能使用 openpilot。"
msgid "You must accept the Terms and Conditions to use openpilot. Read the latest terms at https://comma.ai/terms before continuing."
msgstr "您必須接受條款與細則才能使用 openpilot。繼續前請閱讀 https://comma.ai/terms 上的最新條款。"
#: openpilot/selfdrive/ui/onroad/driver_camera_dialog.py
#: openpilot/selfdrive/ui/onroad/cabin_camera_dialog.py
msgid "camera starting"
msgstr "相機啟動中"
+1 -1
View File
@@ -48,7 +48,7 @@ class UIState:
"driverMonitoringState",
"carState",
"driverStateV2",
"roadCameraState",
"narrowRoadCameraState",
"wideRoadCameraState",
"managerState",
"selfdriveState",
+2 -2
View File
@@ -8,8 +8,8 @@ from openpilot.selfdrive.ui.onroad.cameraview import CameraView
if __name__ == "__main__":
gui_app.init_window("watch3")
road = CameraView("camerad", VisionStreamType.VISION_STREAM_ROAD)
driver = CameraView("camerad", VisionStreamType.VISION_STREAM_DRIVER)
road = CameraView("camerad", VisionStreamType.VISION_STREAM_NARROW_ROAD)
driver = CameraView("camerad", VisionStreamType.VISION_STREAM_CABIN)
wide = CameraView("camerad", VisionStreamType.VISION_STREAM_WIDE_ROAD)
for _ in gui_app.render():
road.render(rl.Rectangle(gui_app.width // 4, 0, gui_app.width // 2, gui_app.height // 2))
@@ -234,11 +234,11 @@ void CameraState::sendState() {
framed.setSensor(camera.sensor->image_sensor);
// Log raw frames for road camera
if (env_log_raw_frames && camera.cc.stream_type == VISION_STREAM_ROAD && meta.frame_id % 100 == 5) { // no overlap with qlog decimation
if (env_log_raw_frames && camera.cc.stream_type == VISION_STREAM_NARROW_ROAD && meta.frame_id % 100 == 5) { // no overlap with qlog decimation
framed.setImage(get_raw_frame_image(&camera.buf));
}
set_camera_exposure(calculate_exposure_value(&camera.buf, ae_xywh, 2, camera.cc.stream_type != VISION_STREAM_DRIVER ? 2 : 4));
set_camera_exposure(calculate_exposure_value(&camera.buf, ae_xywh, 2, camera.cc.stream_type != VISION_STREAM_CABIN ? 2 : 4));
// Send the message
pm->send(camera.cc.publish_name, msg);
+9 -9
View File
@@ -44,12 +44,12 @@ const CameraConfig WIDE_ROAD_CAMERA_CONFIG = {
.staggered_sof = false,
};
const CameraConfig ROAD_CAMERA_CONFIG = {
const CameraConfig NARROW_ROAD_CAMERA_CONFIG = {
.camera_num = 1,
.stream_type = VISION_STREAM_ROAD,
.stream_type = VISION_STREAM_NARROW_ROAD,
.focal_len = 8.0,
.publish_name = "roadCameraState",
.init_camera_state = &cereal::Event::Builder::initRoadCameraState,
.publish_name = "narrowRoadCameraState",
.init_camera_state = &cereal::Event::Builder::initNarrowRoadCameraState,
.enabled = !getenv("DISABLE_ROAD"),
.phy = CAM_ISP_IFE_IN_RES_PHY_1,
.vignetting_correction = true,
@@ -57,12 +57,12 @@ const CameraConfig ROAD_CAMERA_CONFIG = {
.staggered_sof = false,
};
const CameraConfig DRIVER_CAMERA_CONFIG = {
const CameraConfig CABIN_CAMERA_CONFIG = {
.camera_num = 2,
.stream_type = VISION_STREAM_DRIVER,
.stream_type = VISION_STREAM_CABIN,
.focal_len = 1.71,
.publish_name = "driverCameraState",
.init_camera_state = &cereal::Event::Builder::initDriverCameraState,
.publish_name = "cabinCameraState",
.init_camera_state = &cereal::Event::Builder::initCabinCameraState,
.enabled = !getenv("DISABLE_DRIVER"),
.phy = CAM_ISP_IFE_IN_RES_PHY_2,
.vignetting_correction = false,
@@ -70,4 +70,4 @@ const CameraConfig DRIVER_CAMERA_CONFIG = {
.staggered_sof = true,
};
const CameraConfig ALL_CAMERA_CONFIGS[] = {WIDE_ROAD_CAMERA_CONFIG, ROAD_CAMERA_CONFIG, DRIVER_CAMERA_CONFIG};
const CameraConfig ALL_CAMERA_CONFIGS[] = {WIDE_ROAD_CAMERA_CONFIG, NARROW_ROAD_CAMERA_CONFIG, CABIN_CAMERA_CONFIG};
+3 -3
View File
@@ -9,8 +9,8 @@ from openpilot.common.realtime import DT_MDL
VISION_STREAMS = {
"roadCameraState": VisionStreamType.VISION_STREAM_ROAD,
"driverCameraState": VisionStreamType.VISION_STREAM_DRIVER,
"narrowRoadCameraState": VisionStreamType.VISION_STREAM_NARROW_ROAD,
"cabinCameraState": VisionStreamType.VISION_STREAM_CABIN,
"wideRoadCameraState": VisionStreamType.VISION_STREAM_WIDE_ROAD,
}
@@ -45,7 +45,7 @@ def extract_image(buf):
return yuv_to_rgb(y, u, v)
def get_snapshots(frame="roadCameraState", front_frame="driverCameraState"):
def get_snapshots(frame="narrowRoadCameraState", front_frame="cabinCameraState"):
sockets = [s for s in (frame, front_frame) if s is not None]
sm = messaging.SubMaster(sockets)
vipc_clients = {s: VisionIpcClient("camerad", VISION_STREAMS[s], True) for s in sockets}
@@ -13,7 +13,7 @@ from openpilot.system.camerad.snapshot import get_snapshots
from openpilot.selfdrive.test.helpers import collect_logs, log_collector, processes_context
TEST_TIMESPAN = 10
CAMERAS = ('roadCameraState', 'driverCameraState', 'wideRoadCameraState')
CAMERAS = ('narrowRoadCameraState', 'cabinCameraState', 'wideRoadCameraState')
EXPOSURE_STABLE_COUNT = 3
EXPOSURE_RANGE = (0.15, 0.35)
MAX_TEST_TIME = 25
@@ -49,7 +49,7 @@ def _camera_session():
exposure = {cam: [] for cam in CAMERAS}
start = time.monotonic()
while time.monotonic() - start < MAX_TEST_TIME:
rpic, dpic = get_snapshots(frame="roadCameraState", front_frame="driverCameraState")
rpic, dpic = get_snapshots(frame="narrowRoadCameraState", front_frame="cabinCameraState")
wpic, _ = get_snapshots(frame="wideRoadCameraState")
for cam, img in zip(CAMERAS, [rpic, dpic, wpic], strict=True):
exposure[cam].append(_exposure_stats(img))
@@ -106,8 +106,8 @@ class TestCamerad(OpenpilotTestCase):
assert set(np.diff(self.logs[c]['frameId'])) == {1, }, f"{c} has frame skips"
def test_frame_sync(self):
SYNCED_CAMS = ('roadCameraState', 'wideRoadCameraState')
n = range(len(self.logs['roadCameraState']['t'][:-10]))
SYNCED_CAMS = ('narrowRoadCameraState', 'wideRoadCameraState')
n = range(len(self.logs['narrowRoadCameraState']['t'][:-10]))
frame_ids = {i: [self.logs[cam]['frameId'][i] for cam in CAMERAS] for i in n}
assert all(len(set(v)) == 1 for v in frame_ids.values()), "frame IDs not aligned"
@@ -118,10 +118,10 @@ class TestCamerad(OpenpilotTestCase):
laggy_frames = {k: v for k, v in diffs.items() if v > 1.1}
assert len(laggy_frames) == 0, f"Frames not synced properly: {laggy_frames=}"
# driver camera should be staggered ~25ms from road camera
# cabin camera should be staggered ~25ms from road camera
for i in n:
offset_ms = abs(self.logs['driverCameraState']['timestampSof'][i] - self.logs['roadCameraState']['timestampSof'][i]) / 1e6
assert 20 < offset_ms < 30, f"driver camera stagger out of range at frame {i}: {offset_ms:.1f}ms (expected ~25ms)"
offset_ms = abs(self.logs['cabinCameraState']['timestampSof'][i] - self.logs['narrowRoadCameraState']['timestampSof'][i]) / 1e6
assert 20 < offset_ms < 30, f"cabin camera stagger out of range at frame {i}: {offset_ms:.1f}ms (expected ~25ms)"
def test_sanity_checks(self):
self._sanity_checks(self.logs)
+3 -3
View File
@@ -11,19 +11,19 @@ from openpilot.cereal import messaging
from openpilot.system.camerad.webcam.camera import Camera
from openpilot.common.realtime import Ratekeeper
ROAD_CAM = os.getenv("ROAD_CAM", "0")
NARROW_ROAD_CAM = os.getenv("NARROW_ROAD_CAM", os.getenv("ROAD_CAM", "0"))
WIDE_CAM = os.getenv("WIDE_CAM")
DRIVER_CAM = os.getenv("DRIVER_CAM")
CameraType = namedtuple("CameraType", ["msg_name", "stream_type", "cam_id"])
CAMERAS = [
CameraType("roadCameraState", VisionStreamType.VISION_STREAM_ROAD, ROAD_CAM)
CameraType("narrowRoadCameraState", VisionStreamType.VISION_STREAM_NARROW_ROAD, NARROW_ROAD_CAM)
]
if WIDE_CAM:
CAMERAS.append(CameraType("wideRoadCameraState", VisionStreamType.VISION_STREAM_WIDE_ROAD, WIDE_CAM))
if DRIVER_CAM:
CAMERAS.append(CameraType("driverCameraState", VisionStreamType.VISION_STREAM_DRIVER, DRIVER_CAM))
CAMERAS.append(CameraType("cabinCameraState", VisionStreamType.VISION_STREAM_CABIN, DRIVER_CAM))
class Camerad:
def __init__(self):
+2 -2
View File
@@ -29,11 +29,11 @@ constexpr int CLIP_FPS = 20;
constexpr double PARALLEL_CLIP_MIN_DURATION = 2 * SEGMENT_DURATION;
const EncoderInfo clip_encoder_info = {
.publish_name = "livestreamRoadEncodeData",
.publish_name = "livestreamNarrowRoadEncodeData",
.record = false,
.fps = CLIP_FPS,
.get_settings = [](int) { return EncoderSettings::StreamEncoderSettings(); },
INIT_ENCODE_FUNCTIONS(LivestreamRoadEncode),
INIT_ENCODE_FUNCTIONS(LivestreamNarrowRoadEncode),
};
bool open_input(const std::string &path, AVFormatContext **ctx, int *stream_index) {
+27 -27
View File
@@ -96,11 +96,11 @@ public:
};
const EncoderInfo main_road_encoder_info = {
.publish_name = "roadEncodeData",
.publish_name = "narrowRoadEncodeData",
.thumbnail_name = "thumbnail",
.filename = "fcamera.hevc",
.get_settings = [](int in_width){return EncoderSettings::MainEncoderSettings(in_width);},
INIT_ENCODE_FUNCTIONS(RoadEncode),
INIT_ENCODE_FUNCTIONS(NarrowRoadEncode),
};
const EncoderInfo main_wide_road_encoder_info = {
@@ -110,23 +110,23 @@ const EncoderInfo main_wide_road_encoder_info = {
INIT_ENCODE_FUNCTIONS(WideRoadEncode),
};
const EncoderInfo main_driver_encoder_info = {
.publish_name = "driverEncodeData",
const EncoderInfo main_cabin_encoder_info = {
.publish_name = "cabinEncodeData",
.filename = "dcamera.hevc",
.record = Params().getBool("RecordFront"),
.get_settings = [](int in_width){return EncoderSettings::MainEncoderSettings(in_width);},
INIT_ENCODE_FUNCTIONS(DriverEncode),
INIT_ENCODE_FUNCTIONS(CabinEncode),
};
const EncoderInfo stream_road_encoder_info = {
.publish_name = "livestreamRoadEncodeData",
.publish_name = "livestreamNarrowRoadEncodeData",
//.thumbnail_name = "thumbnail",
.record = false,
.is_live = true,
.frame_width = livestream_width(),
.frame_height = livestream_height(),
.get_settings = [](int){return EncoderSettings::StreamEncoderSettings();},
INIT_ENCODE_FUNCTIONS(LivestreamRoadEncode),
INIT_ENCODE_FUNCTIONS(LivestreamNarrowRoadEncode),
};
const EncoderInfo stream_wide_road_encoder_info = {
@@ -139,29 +139,29 @@ const EncoderInfo stream_wide_road_encoder_info = {
INIT_ENCODE_FUNCTIONS(LivestreamWideRoadEncode),
};
const EncoderInfo stream_driver_encoder_info = {
.publish_name = "livestreamDriverEncodeData",
const EncoderInfo stream_cabin_encoder_info = {
.publish_name = "livestreamCabinEncodeData",
.record = false,
.is_live = true,
.frame_width = livestream_width(),
.frame_height = livestream_height(),
.get_settings = [](int){return EncoderSettings::StreamEncoderSettings();},
INIT_ENCODE_FUNCTIONS(LivestreamDriverEncode),
INIT_ENCODE_FUNCTIONS(LivestreamCabinEncode),
};
const EncoderInfo qcam_encoder_info = {
.publish_name = "qRoadEncodeData",
.publish_name = "qNarrowRoadEncodeData",
.filename = "qcamera.ts",
.include_audio = Params().getBool("RecordAudio"),
.frame_width = 526,
.frame_height = 330,
.get_settings = [](int){return EncoderSettings::QcamEncoderSettings();},
INIT_ENCODE_FUNCTIONS(QRoadEncode),
INIT_ENCODE_FUNCTIONS(QNarrowRoadEncode),
};
const LogCameraInfo road_camera_info{
.thread_name = "road_cam_encoder",
.stream_type = VISION_STREAM_ROAD,
const LogCameraInfo narrow_road_camera_info{
.thread_name = "narrow_road_cam_encoder",
.stream_type = VISION_STREAM_NARROW_ROAD,
.encoder_infos = {main_road_encoder_info, qcam_encoder_info}
};
@@ -171,15 +171,15 @@ const LogCameraInfo wide_road_camera_info{
.encoder_infos = {main_wide_road_encoder_info}
};
const LogCameraInfo driver_camera_info{
.thread_name = "driver_cam_encoder",
.stream_type = VISION_STREAM_DRIVER,
.encoder_infos = {main_driver_encoder_info}
const LogCameraInfo cabin_camera_info{
.thread_name = "cabin_cam_encoder",
.stream_type = VISION_STREAM_CABIN,
.encoder_infos = {main_cabin_encoder_info}
};
const LogCameraInfo stream_road_camera_info{
.thread_name = "road_cam_encoder",
.stream_type = VISION_STREAM_ROAD,
.thread_name = "narrow_road_cam_encoder",
.stream_type = VISION_STREAM_NARROW_ROAD,
.encoder_infos = {stream_road_encoder_info},
};
@@ -189,11 +189,11 @@ const LogCameraInfo stream_wide_road_camera_info{
.encoder_infos = {stream_wide_road_encoder_info},
};
const LogCameraInfo stream_driver_camera_info{
.thread_name = "driver_cam_encoder",
.stream_type = VISION_STREAM_DRIVER,
.encoder_infos = {stream_driver_encoder_info},
const LogCameraInfo stream_cabin_camera_info{
.thread_name = "cabin_cam_encoder",
.stream_type = VISION_STREAM_CABIN,
.encoder_infos = {stream_cabin_encoder_info},
};
const LogCameraInfo cameras_logged[] = {road_camera_info, wide_road_camera_info, driver_camera_info};
const LogCameraInfo stream_cameras_logged[] = {stream_road_camera_info, stream_wide_road_camera_info, stream_driver_camera_info};
const LogCameraInfo cameras_logged[] = {narrow_road_camera_info, wide_road_camera_info, cabin_camera_info};
const LogCameraInfo stream_cameras_logged[] = {stream_road_camera_info, stream_wide_road_camera_info, stream_cabin_camera_info};
@@ -22,8 +22,8 @@ SEGMENT_LENGTH = 2
FULL_SIZE = 2507572
def hevc_size(w): return FULL_SIZE // 2 if w <= 1344 else FULL_SIZE
CAMERAS = [
("fcamera.hevc", 20, hevc_size, "roadEncodeIdx"),
("dcamera.hevc", 20, hevc_size, "driverEncodeIdx"),
("fcamera.hevc", 20, hevc_size, "narrowRoadEncodeIdx"),
("dcamera.hevc", 20, hevc_size, "cabinEncodeIdx"),
("ecamera.hevc", 20, hevc_size, "wideRoadEncodeIdx"),
("qcamera.ts", 20, lambda x: 130000, None),
]
@@ -112,12 +112,12 @@ class TestLoggerd(OpenpilotTestCase):
w, h = 320, 240
frame_spec = (w, h, w * h * 3 // 2, w, w * h)
streams = [
(VisionStreamType.VISION_STREAM_ROAD, frame_spec, "roadCameraState"),
(VisionStreamType.VISION_STREAM_DRIVER, frame_spec, "driverCameraState"),
(VisionStreamType.VISION_STREAM_NARROW_ROAD, frame_spec, "narrowRoadCameraState"),
(VisionStreamType.VISION_STREAM_CABIN, frame_spec, "cabinCameraState"),
(VisionStreamType.VISION_STREAM_WIDE_ROAD, frame_spec, "wideRoadCameraState"),
]
sm = messaging.SubMaster(["roadEncodeData"])
sm = messaging.SubMaster(["narrowRoadEncodeData"])
pm = messaging.PubMaster([s for _, _, s in streams] + ["rawAudioData"])
vipc_server = VisionIpcServer("camerad")
for stream_type, frame_spec, _ in streams:
@@ -128,7 +128,7 @@ class TestLoggerd(OpenpilotTestCase):
os.environ["LOGGERD_SEGMENT_LENGTH"] = str(segment_length)
managed_processes["loggerd"].start()
managed_processes["encoderd"].start()
assert pm.wait_for_readers_to_update("roadCameraState", timeout=5)
assert pm.wait_for_readers_to_update("narrowRoadCameraState", timeout=5)
fps = 20
for n in range(1, int(num_segs * segment_length * fps) + 1):
@@ -322,8 +322,8 @@ class TestLoggerd(OpenpilotTestCase):
self._publish_camera_and_audio_messages()
dcamera_hevc_exists = os.path.exists(os.path.join(self._get_latest_log_dir(), 'dcamera.hevc'))
assert dcamera_hevc_exists == record_front
cabin_hevc_exists = os.path.exists(os.path.join(self._get_latest_log_dir(), 'dcamera.hevc'))
assert cabin_hevc_exists == record_front
@parameterized.expand([True, False])
def test_record_audio(self, record_audio):
+2 -2
View File
@@ -32,9 +32,9 @@ class EncodedVideoFrame:
class LiveStreamVideoStreamTrack(TiciVideoStreamTrack):
camera_to_sock_mapping = {
"driver": "livestreamDriverEncodeData",
"driver": "livestreamCabinEncodeData",
"wideRoad": "livestreamWideRoadEncodeData",
"road": "livestreamRoadEncodeData",
"road": "livestreamNarrowRoadEncodeData",
}
def __init__(self, camera_type: str, video_enabled: bool = True):
@@ -65,7 +65,7 @@ class TestStreamSession(OpenpilotTestCase):
mocked_pubmaster.reset_mock()
def test_livestream_track(self, mocker):
fake_msg = messaging.new_message("livestreamDriverEncodeData")
fake_msg = messaging.new_message("livestreamCabinEncodeData")
config = {"receive.return_value": fake_msg.to_bytes()}
mocker.patch("msgq.SubSocket", spec=True, **config)
+2 -2
View File
@@ -15,7 +15,7 @@ Options:
--auto Auto load the route from the best available source (no video):
internal, openpilotci, comma_api, car_segments, testing_closet
--qcam load qcamera
--ecam load wide road camera
--wide-road load wide road camera
--msgq read can messages from msgq
--panda read can messages from panda
--panda-serial <panda-serial> read can messages from panda with given serial
@@ -55,7 +55,7 @@ Replace "5beb9b58bd12b691/0000010a--a51155e496" with your desired route identifi
To run Cabana with multiple cameras, use the following command:
```shell
cabana "5beb9b58bd12b691/0000010a--a51155e496" --dcam --ecam
cabana "5beb9b58bd12b691/0000010a--a51155e496" --cabin --wide-road
```
### Streaming CAN Messages from a comma Device
+10 -10
View File
@@ -19,8 +19,8 @@ struct CabanaArgs {
bool demo = false;
bool auto_source = false;
bool qcam = false;
bool ecam = false;
bool dcam = false;
bool wide_road = false;
bool cabin = false;
bool msgq = false;
bool panda = false;
bool no_vipc = false;
@@ -44,8 +44,8 @@ void printUsage(const char *argv0) {
" --auto Auto load the route from the best available source (no video):\n"
" internal, openpilotci, comma_api, car_segments, testing_closet\n"
" --qcam load qcamera\n"
" --ecam load wide road camera\n"
" --dcam load driver camera\n"
" --wide-road load wide road camera (alias: --ecam)\n"
" --cabin load cabin camera (alias: --dcam)\n"
" --msgq read can messages from the msgq\n"
" --panda read can messages from panda\n"
" --panda-serial <serial> read can messages from panda with given serial\n"
@@ -83,10 +83,10 @@ int parseArgs(int argc, char *argv[], CabanaArgs &args, bool &ok) {
args.auto_source = true;
} else if (std::strcmp(a, "--qcam") == 0) {
args.qcam = true;
} else if (std::strcmp(a, "--ecam") == 0) {
args.ecam = true;
} else if (std::strcmp(a, "--dcam") == 0) {
args.dcam = true;
} else if (std::strcmp(a, "--wide-road") == 0 || std::strcmp(a, "--ecam") == 0) {
args.wide_road = true;
} else if (std::strcmp(a, "--cabin") == 0 || std::strcmp(a, "--dcam") == 0) {
args.cabin = true;
} else if (std::strcmp(a, "--msgq") == 0) {
args.msgq = true;
} else if (std::strcmp(a, "--panda") == 0) {
@@ -162,9 +162,9 @@ int main(int argc, char *argv[]) {
#endif
} else {
uint32_t replay_flags = REPLAY_FLAG_NONE;
if (args.ecam) replay_flags |= REPLAY_FLAG_ECAM;
if (args.wide_road) replay_flags |= REPLAY_FLAG_WIDE_ROAD;
if (args.qcam) replay_flags |= REPLAY_FLAG_QCAMERA;
if (args.dcam) replay_flags |= REPLAY_FLAG_DCAM;
if (args.cabin) replay_flags |= REPLAY_FLAG_CABIN_CAMERA;
if (args.no_vipc) replay_flags |= REPLAY_FLAG_NO_VIPC;
QString route;
+2 -2
View File
@@ -57,8 +57,8 @@ void CameraWidget::paintEvent(QPaintEvent *event) {
QRect video_rect((width() - w) / 2, (height() - h) / 2, w, h);
p.setRenderHint(QPainter::SmoothPixmapTransform);
if (active_stream_type == VISION_STREAM_DRIVER) {
// mirror driver camera horizontally
if (active_stream_type == VISION_STREAM_CABIN) {
// mirror cabin camera horizontally
const qreal cx = video_rect.x() + video_rect.width() / 2.0;
p.translate(cx, 0);
p.scale(-1, 1);
@@ -46,7 +46,7 @@ void ReplayStream::mergeSegments() {
}
bool ReplayStream::loadRoute(const std::string &route, const std::string &data_dir, uint32_t replay_flags, bool auto_source) {
replay.reset(new Replay(route, {"can", "roadEncodeIdx", "driverEncodeIdx", "wideRoadEncodeIdx", "carParams"},
replay.reset(new Replay(route, {"can", "narrowRoadEncodeIdx", "cabinEncodeIdx", "wideRoadEncodeIdx", "carParams"},
{}, nullptr, replay_flags, data_dir, auto_source));
replay->setSegmentCacheLimit(settings.max_cached_minutes);
replay->installEventFilter([this](const Event *event) { return eventFilter(event); });
@@ -163,8 +163,8 @@ AbstractStream *OpenReplayWidget::open() {
} else {
auto replay_stream = std::make_unique<ReplayStream>(qApp);
uint32_t flags = REPLAY_FLAG_NONE;
if (cameras[1]->isChecked()) flags |= REPLAY_FLAG_DCAM;
if (cameras[2]->isChecked()) flags |= REPLAY_FLAG_ECAM;
if (cameras[1]->isChecked()) flags |= REPLAY_FLAG_CABIN_CAMERA;
if (cameras[2]->isChecked()) flags |= REPLAY_FLAG_WIDE_ROAD;
if (flags == REPLAY_FLAG_NONE && !cameras[0]->isChecked()) flags = REPLAY_FLAG_NO_VIPC;
if (replay_stream->loadRoute(route.toStdString(), data_dir.toStdString(), flags)) {
+3 -3
View File
@@ -14,7 +14,7 @@ RouteInfoDlg::RouteInfoDlg(QWidget *parent) : QDialog(parent) {
table->setEditTriggers(QAbstractItemView::NoEditTriggers);
table->setSelectionBehavior(QAbstractItemView::SelectRows);
table->setSelectionMode(QAbstractItemView::SingleSelection);
table->setHorizontalHeaderLabels({"", "rlog", "fcam", "ecam", "dcam", "qlog", "qcam"});
table->setHorizontalHeaderLabels({"", "rlog", "narrow road", "wide road", "driver", "qlog", "qcam"});
table->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
table->verticalHeader()->setVisible(false);
table->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
@@ -23,9 +23,9 @@ RouteInfoDlg::RouteInfoDlg(QWidget *parent) : QDialog(parent) {
for (const auto &[seg_num, seg] : replay->route().segments()) {
table->setItem(row, 0, new QTableWidgetItem(QString::number(seg_num)));
table->setItem(row, 1, new QTableWidgetItem(seg.rlog.empty() ? "--" : "Yes"));
table->setItem(row, 2, new QTableWidgetItem(seg.road_cam.empty() ? "--" : "Yes"));
table->setItem(row, 2, new QTableWidgetItem(seg.narrow_road_cam.empty() ? "--" : "Yes"));
table->setItem(row, 3, new QTableWidgetItem(seg.wide_road_cam.empty() ? "--" : "Yes"));
table->setItem(row, 4, new QTableWidgetItem(seg.driver_cam.empty() ? "--" : "Yes"));
table->setItem(row, 4, new QTableWidgetItem(seg.cabin_cam.empty() ? "--" : "Yes"));
table->setItem(row, 5, new QTableWidgetItem(seg.qlog.empty() ? "--" : "Yes"));
table->setItem(row, 6, new QTableWidgetItem(seg.qcamera.empty() ? "--" : "Yes"));
++row;
+1 -1
View File
@@ -148,7 +148,7 @@ QWidget *VideoWidget::createCameraWidget() {
camera_tab->setAutoHide(true);
camera_tab->setExpanding(false);
l->addWidget(cam_widget = new StreamCameraView("camerad", VISION_STREAM_ROAD));
l->addWidget(cam_widget = new StreamCameraView("camerad", VISION_STREAM_NARROW_ROAD));
cam_widget->setMinimumHeight(MIN_VIDEO_HEIGHT);
cam_widget->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::MinimumExpanding);
@@ -19,8 +19,8 @@ V4L2_BUF_FLAG_KEYFRAME = 8
# then run this "./compressed_vipc.py <ip>"
ENCODE_SOCKETS = {
VisionStreamType.VISION_STREAM_ROAD: "roadEncodeData",
VisionStreamType.VISION_STREAM_DRIVER: "driverEncodeData",
VisionStreamType.VISION_STREAM_NARROW_ROAD: "narrowRoadEncodeData",
VisionStreamType.VISION_STREAM_CABIN: "cabinEncodeData",
VisionStreamType.VISION_STREAM_WIDE_ROAD: "wideRoadEncodeData",
}
@@ -146,8 +146,8 @@ if __name__ == "__main__":
args = parser.parse_args()
vision_streams = [
VisionStreamType.VISION_STREAM_ROAD,
VisionStreamType.VISION_STREAM_DRIVER,
VisionStreamType.VISION_STREAM_NARROW_ROAD,
VisionStreamType.VISION_STREAM_CABIN,
VisionStreamType.VISION_STREAM_WIDE_ROAD,
]
+2 -2
View File
@@ -320,7 +320,7 @@ def clip(route: Route, output: str, start: int, end: int, headless: bool = True,
wide_frame_queue = FrameQueue(ecamera_paths, start, end, fps=FRAMERATE)
vipc = VisionIpcServer("camerad")
vipc.create_buffers(VisionStreamType.VISION_STREAM_ROAD, 4, frame_queue.frame_w, frame_queue.frame_h)
vipc.create_buffers(VisionStreamType.VISION_STREAM_NARROW_ROAD, 4, frame_queue.frame_w, frame_queue.frame_h)
if wide_frame_queue:
vipc.create_buffers(VisionStreamType.VISION_STREAM_WIDE_ROAD, 4, wide_frame_queue.frame_w, wide_frame_queue.frame_h)
vipc.start_listener()
@@ -339,7 +339,7 @@ def clip(route: Route, output: str, start: int, end: int, headless: bool = True,
if frame_idx >= len(message_chunks):
break
_, frame_bytes = frame_queue.get()
vipc.send(VisionStreamType.VISION_STREAM_ROAD, frame_bytes, frame_idx, int(frame_idx * 5e7), int(frame_idx * 5e7))
vipc.send(VisionStreamType.VISION_STREAM_NARROW_ROAD, frame_bytes, frame_idx, int(frame_idx * 5e7), int(frame_idx * 5e7))
if wide_frame_queue:
_, wide_bytes = wide_frame_queue.get()
vipc.send(VisionStreamType.VISION_STREAM_WIDE_ROAD, wide_bytes, frame_idx, int(frame_idx * 5e7), int(frame_idx * 5e7))
+2 -2
View File
@@ -87,7 +87,7 @@ enum class PaneKind : uint8_t {
enum class CameraViewKind : uint8_t {
Road,
Driver,
Cabin,
WideRoad,
QRoad,
};
@@ -322,7 +322,7 @@ struct RouteData {
std::vector<std::string> roots;
std::vector<CanMessageData> can_messages;
CameraFeedIndex road_camera;
CameraFeedIndex driver_camera;
CameraFeedIndex cabin_camera;
CameraFeedIndex wide_road_camera;
CameraFeedIndex qroad_camera;
std::vector<ThumbnailFrame> thumbnails;
+1 -1
View File
@@ -23,7 +23,7 @@ struct SpecialItemSpec {
inline constexpr std::array<CameraViewSpec, 4> kCameraViewSpecs = {{
{CameraViewKind::Road, "Road Camera", "road", "road", "camera_road", &RouteData::road_camera},
{CameraViewKind::Driver, "Driver Camera", "driver", "driver", "camera_driver", &RouteData::driver_camera},
{CameraViewKind::Cabin, "Cabin Camera", "driver", "driver", "camera_driver", &RouteData::cabin_camera},
{CameraViewKind::WideRoad, "Wide Road Camera", "wide", "wide_road", "camera_wide_road", &RouteData::wide_road_camera},
{CameraViewKind::QRoad, "qRoad Camera", "qroad", "qroad", "camera_qroad", &RouteData::qroad_camera},
}};
@@ -1 +1 @@
{"current_tab_index":0,"tabs":[{"name":"SOF / EOF (encodeIdx)","root":{"split":"vertical","sizes":[0.500885,0.499115],"children":[{"title":"...","range":{"left":0.0,"right":630.006367,"top":65000000.0,"bottom":35000000.0},"curves":[{"name":"/driverEncodeIdx/timestampSof","color":"#1f77b4","transform":"derivative","derivative_dt":1.0},{"name":"/roadEncodeIdx/timestampSof","color":"#d62728","transform":"derivative","derivative_dt":1.0},{"name":"/wideRoadEncodeIdx/timestampSof","color":"#1ac938","transform":"derivative","derivative_dt":1.0}],"y_limits":{"min":35000000.0,"max":65000000.0}},{"title":"...","range":{"left":0.0,"right":630.006367,"top":65000000.0,"bottom":35000000.0},"curves":[{"name":"/driverEncodeIdx/timestampEof","color":"#f14cc1","transform":"derivative","derivative_dt":1.0},{"name":"/roadEncodeIdx/timestampEof","color":"#9467bd","transform":"derivative","derivative_dt":1.0},{"name":"/wideRoadEncodeIdx/timestampEof","color":"#17becf","transform":"derivative","derivative_dt":1.0}],"y_limits":{"min":35000000.0,"max":65000000.0}}]}},{"name":"model timings","root":{"split":"vertical","sizes":[0.5,0.5],"children":[{"title":"...","range":{"left":0.0,"right":630.006367,"top":0.016865,"bottom":0.015143},"curves":[{"name":"/modelV2/modelExecutionTime","color":"#ff7f0e"}]},{"title":"...","range":{"left":0.0,"right":630.006367,"top":0.1,"bottom":-0.1},"curves":[{"name":"/modelV2/frameDropPerc","color":"#f14cc1"}]}]}},{"name":"sensor info","root":{"split":"vertical","sizes":[1.0],"children":[{"title":"...","range":{"left":0.0,"right":630.006367,"top":0.1,"bottom":-0.1},"curves":[{"name":"/driverCameraState/sensor","color":"#bcbd22"},{"name":"/roadCameraState/sensor","color":"#1f77b4"},{"name":"/wideRoadCameraState/sensor","color":"#d62728"}]}]}},{"name":"SOF / EOF (cameraState)","root":{"split":"vertical","sizes":[0.500885,0.499115],"children":[{"title":"...","range":{"left":0.0,"right":630.006367,"top":65000000.0,"bottom":35000000.0},"curves":[{"name":"/driverCameraState/timestampSof","color":"#1f77b4","transform":"derivative","derivative_dt":1.0},{"name":"/roadCameraState/timestampSof","color":"#d62728","transform":"derivative","derivative_dt":1.0},{"name":"/wideRoadCameraState/timestampSof","color":"#1ac938","transform":"derivative","derivative_dt":1.0}],"y_limits":{"min":35000000.0,"max":65000000.0}},{"title":"...","range":{"left":0.0,"right":630.006367,"top":65000000.0,"bottom":35000000.0},"curves":[{"name":"/driverCameraState/timestampEof","color":"#ff7f0e","transform":"derivative","derivative_dt":1.0},{"name":"/roadCameraState/timestampEof","color":"#f14cc1","transform":"derivative","derivative_dt":1.0},{"name":"/wideRoadCameraState/timestampEof","color":"#9467bd","transform":"derivative","derivative_dt":1.0}],"y_limits":{"min":35000000.0,"max":65000000.0}}]}}]}
{"current_tab_index":0,"tabs":[{"name":"SOF / EOF (encodeIdx)","root":{"split":"vertical","sizes":[0.500885,0.499115],"children":[{"title":"...","range":{"left":0.0,"right":630.006367,"top":65000000.0,"bottom":35000000.0},"curves":[{"name":"/cabinEncodeIdx/timestampSof","color":"#1f77b4","transform":"derivative","derivative_dt":1.0},{"name":"/narrowRoadEncodeIdx/timestampSof","color":"#d62728","transform":"derivative","derivative_dt":1.0},{"name":"/wideRoadEncodeIdx/timestampSof","color":"#1ac938","transform":"derivative","derivative_dt":1.0}],"y_limits":{"min":35000000.0,"max":65000000.0}},{"title":"...","range":{"left":0.0,"right":630.006367,"top":65000000.0,"bottom":35000000.0},"curves":[{"name":"/cabinEncodeIdx/timestampEof","color":"#f14cc1","transform":"derivative","derivative_dt":1.0},{"name":"/narrowRoadEncodeIdx/timestampEof","color":"#9467bd","transform":"derivative","derivative_dt":1.0},{"name":"/wideRoadEncodeIdx/timestampEof","color":"#17becf","transform":"derivative","derivative_dt":1.0}],"y_limits":{"min":35000000.0,"max":65000000.0}}]}},{"name":"model timings","root":{"split":"vertical","sizes":[0.5,0.5],"children":[{"title":"...","range":{"left":0.0,"right":630.006367,"top":0.016865,"bottom":0.015143},"curves":[{"name":"/modelV2/modelExecutionTime","color":"#ff7f0e"}]},{"title":"...","range":{"left":0.0,"right":630.006367,"top":0.1,"bottom":-0.1},"curves":[{"name":"/modelV2/frameDropPerc","color":"#f14cc1"}]}]}},{"name":"sensor info","root":{"split":"vertical","sizes":[1.0],"children":[{"title":"...","range":{"left":0.0,"right":630.006367,"top":0.1,"bottom":-0.1},"curves":[{"name":"/cabinCameraState/sensor","color":"#bcbd22"},{"name":"/narrowRoadCameraState/sensor","color":"#1f77b4"},{"name":"/wideRoadCameraState/sensor","color":"#d62728"}]}]}},{"name":"SOF / EOF (cameraState)","root":{"split":"vertical","sizes":[0.500885,0.499115],"children":[{"title":"...","range":{"left":0.0,"right":630.006367,"top":65000000.0,"bottom":35000000.0},"curves":[{"name":"/cabinCameraState/timestampSof","color":"#1f77b4","transform":"derivative","derivative_dt":1.0},{"name":"/narrowRoadCameraState/timestampSof","color":"#d62728","transform":"derivative","derivative_dt":1.0},{"name":"/wideRoadCameraState/timestampSof","color":"#1ac938","transform":"derivative","derivative_dt":1.0}],"y_limits":{"min":35000000.0,"max":65000000.0}},{"title":"...","range":{"left":0.0,"right":630.006367,"top":65000000.0,"bottom":35000000.0},"curves":[{"name":"/cabinCameraState/timestampEof","color":"#ff7f0e","transform":"derivative","derivative_dt":1.0},{"name":"/narrowRoadCameraState/timestampEof","color":"#f14cc1","transform":"derivative","derivative_dt":1.0},{"name":"/wideRoadCameraState/timestampEof","color":"#9467bd","transform":"derivative","derivative_dt":1.0}],"y_limits":{"min":35000000.0,"max":65000000.0}}]}}]}
@@ -1 +1 @@
{"current_tab_index": 0, "tabs": [{"name": "tab1", "root": {"children": [{"children": [{"curves": [], "kind": "map", "title": "Map"}, {"camera_view": "road", "curves": [], "kind": "camera", "title": "Road Camera"}], "sizes": [0.5, 0.5], "split": "horizontal"}, {"children": [{"camera_view": "wide_road", "curves": [], "kind": "camera", "title": "Wide Road Camera"}, {"camera_view": "driver", "curves": [], "kind": "camera", "title": "Driver Camera"}], "sizes": [0.5, 0.5], "split": "horizontal"}], "sizes": [0.5, 0.5], "split": "vertical"}}]}
{"current_tab_index": 0, "tabs": [{"name": "tab1", "root": {"children": [{"children": [{"curves": [], "kind": "map", "title": "Map"}, {"camera_view": "road", "curves": [], "kind": "camera", "title": "Road Camera"}], "sizes": [0.5, 0.5], "split": "horizontal"}, {"children": [{"camera_view": "wide_road", "curves": [], "kind": "camera", "title": "Wide Road Camera"}, {"camera_view": "driver", "curves": [], "kind": "camera", "title": "Cabin Camera"}], "sizes": [0.5, 0.5], "split": "horizontal"}], "sizes": [0.5, 0.5], "split": "vertical"}}]}
@@ -1 +1 @@
{"current_tab_index": 0, "tabs": [{"name": "tab1", "root": {"children": [{"children": [{"camera_view": "driver", "curves": [], "kind": "camera", "title": "Driver Camera"}, {"curves": [{"color": "#236bb4", "name": "/driverMonitoringState/alertLevel"}], "title": "..."}], "sizes": [0.5, 0.5], "split": "vertical"}, {"children": [{"curves": [{"color": "#236bb4", "name": "/driverMonitoringState/activePolicy"}], "title": "..."}, {"curves": [{"color": "#236bb4", "name": "/driverMonitoringState/visionPolicyState/faceDetected"}], "title": "..."}, {"curves": [{"color": "#236bb4", "name": "/driverMonitoringState/visionPolicyState/distractedTypes/eye"}, {"color": "#dc5234", "name": "/driverMonitoringState/visionPolicyState/distractedTypes/phone"}, {"color": "#43a047", "name": "/driverMonitoringState/visionPolicyState/distractedTypes/pose"}], "title": "..."}, {"curves": [{"color": "#236bb4", "name": "/driverMonitoringState/visionPolicyState/awarenessPercent"}], "title": "..."}], "sizes": [0.25, 0.25, 0.25, 0.25], "split": "vertical"}], "sizes": [0.5, 0.5], "split": "horizontal"}}]}
{"current_tab_index": 0, "tabs": [{"name": "tab1", "root": {"children": [{"children": [{"camera_view": "driver", "curves": [], "kind": "camera", "title": "Cabin Camera"}, {"curves": [{"color": "#236bb4", "name": "/driverMonitoringState/alertLevel"}], "title": "..."}], "sizes": [0.5, 0.5], "split": "vertical"}, {"children": [{"curves": [{"color": "#236bb4", "name": "/driverMonitoringState/activePolicy"}], "title": "..."}, {"curves": [{"color": "#236bb4", "name": "/driverMonitoringState/visionPolicyState/faceDetected"}], "title": "..."}, {"curves": [{"color": "#236bb4", "name": "/driverMonitoringState/visionPolicyState/distractedTypes/eye"}, {"color": "#dc5234", "name": "/driverMonitoringState/visionPolicyState/distractedTypes/phone"}, {"color": "#43a047", "name": "/driverMonitoringState/visionPolicyState/distractedTypes/pose"}], "title": "..."}, {"curves": [{"color": "#236bb4", "name": "/driverMonitoringState/visionPolicyState/awarenessPercent"}], "title": "..."}], "sizes": [0.25, 0.25, 0.25, 0.25], "split": "vertical"}], "sizes": [0.5, 0.5], "split": "horizontal"}}]}
+11 -11
View File
@@ -39,11 +39,11 @@ const bool kLogCameraTimings = env_flag_enabled("JOTP_CAMERA_TIMINGS");
CameraType decoder_camera_type(CameraViewKind view) {
switch (view) {
case CameraViewKind::Driver: return DriverCam;
case CameraViewKind::Cabin: return CabinCam;
case CameraViewKind::WideRoad: return WideRoadCam;
case CameraViewKind::QRoad: return RoadCam;
case CameraViewKind::QRoad: return NarrowRoadCam;
case CameraViewKind::Road:
default: return RoadCam;
default: return NarrowRoadCam;
}
}
@@ -59,17 +59,17 @@ bool stream_batch_has_data(const StreamExtractBatch &batch) {
bool should_subscribe_stream_service(const std::string &name) {
static const std::array<std::string_view, 13> kSkippedServices = {{
"roadEncodeIdx",
"driverEncodeIdx",
"narrowRoadEncodeIdx",
"cabinEncodeIdx",
"wideRoadEncodeIdx",
"qRoadEncodeIdx",
"roadEncodeData",
"driverEncodeData",
"qNarrowRoadEncodeIdx",
"narrowRoadEncodeData",
"cabinEncodeData",
"wideRoadEncodeData",
"qRoadEncodeData",
"qNarrowRoadEncodeData",
"livestreamWideRoadEncodeIdx",
"livestreamRoadEncodeIdx",
"livestreamDriverEncodeIdx",
"livestreamNarrowRoadEncodeIdx",
"livestreamCabinEncodeIdx",
"thumbnail",
}};
if (name == "rawAudioData") return false;
+10 -10
View File
@@ -45,9 +45,9 @@ struct RouteSelection {
struct SegmentLogs {
std::string rlog;
std::string qlog;
std::string fcamera;
std::string dcamera;
std::string ecamera;
std::string narrow_road;
std::string cabin;
std::string wide_road;
std::string qcamera;
};
@@ -295,11 +295,11 @@ void add_log_file_to_segments(std::map<int, SegmentLogs> *segments, int segment_
} else if (name == "qlog.bz2" || name == "qlog.zst" || name == "qlog") {
segment.qlog = file;
} else if (name == "fcamera.hevc") {
segment.fcamera = file;
segment.narrow_road = file;
} else if (name == "dcamera.hevc") {
segment.dcamera = file;
segment.cabin = file;
} else if (name == "ecamera.hevc") {
segment.ecamera = file;
segment.wide_road = file;
} else if (name == "qcamera.ts") {
segment.qcamera = file;
}
@@ -1886,10 +1886,10 @@ RouteData load_route_data(const std::string &route_name,
metadata.car_fingerprint,
resolved_dbc);
route_data.route_id = make_route_identifier(route, segments);
build_camera_index(segments, route_data, &SegmentLogs::fcamera, "roadEncodeIdx", &route_data.road_camera);
build_camera_index(segments, route_data, &SegmentLogs::dcamera, "driverEncodeIdx", &route_data.driver_camera);
build_camera_index(segments, route_data, &SegmentLogs::ecamera, "wideRoadEncodeIdx", &route_data.wide_road_camera);
build_camera_index(segments, route_data, &SegmentLogs::qcamera, "qRoadEncodeIdx", &route_data.qroad_camera);
build_camera_index(segments, route_data, &SegmentLogs::narrow_road, "narrowRoadEncodeIdx", &route_data.road_camera);
build_camera_index(segments, route_data, &SegmentLogs::cabin, "cabinEncodeIdx", &route_data.cabin_camera);
build_camera_index(segments, route_data, &SegmentLogs::wide_road, "wideRoadEncodeIdx", &route_data.wide_road_camera);
build_camera_index(segments, route_data, &SegmentLogs::qcamera, "qNarrowRoadEncodeIdx", &route_data.qroad_camera);
stats.load_end = LoadStats::Clock::now();
stats.publish(RouteLoadStage::Finished, segments.size(), {});
stats.print_summary(route_data.series.size());
+2 -2
View File
@@ -80,5 +80,5 @@ if __name__ == "__main__":
import sys
from openpilot.tools.lib.logreader import LogReader
m = msgs_to_time_series(LogReader(sys.argv[1]))
print(m['driverCameraState']['t'])
print(np.diff(m['driverCameraState']['timestampSof']))
print(m['cabinCameraState']['t'])
print(np.diff(m['cabinCameraState']['timestampSof']))
@@ -8,13 +8,13 @@
<plot flip_x="false" mode="TimeSeries" flip_y="false" style="Lines">
<range bottom="35000000.000000" left="0.000000" top="65000000.000000" right="630.006367"/>
<limitY max="6.5e+07" min="3.5e+07"/>
<curve color="#1f77b4" name="/driverEncodeIdx/timestampSof">
<transform name="Derivative" alias="/driverEncodeIdx/timestampSof[Derivative]">
<curve color="#1f77b4" name="/cabinEncodeIdx/timestampSof">
<transform name="Derivative" alias="/cabinEncodeIdx/timestampSof[Derivative]">
<options lineEdit="1.0" radioChecked="radioCustom"/>
</transform>
</curve>
<curve color="#d62728" name="/roadEncodeIdx/timestampSof">
<transform name="Derivative" alias="/roadEncodeIdx/timestampSof[Derivative]">
<curve color="#d62728" name="/narrowRoadEncodeIdx/timestampSof">
<transform name="Derivative" alias="/narrowRoadEncodeIdx/timestampSof[Derivative]">
<options lineEdit="1.0" radioChecked="radioCustom"/>
</transform>
</curve>
@@ -29,13 +29,13 @@
<plot flip_x="false" mode="TimeSeries" flip_y="false" style="Lines">
<range bottom="35000000.000000" left="0.000000" top="65000000.000000" right="630.006367"/>
<limitY max="6.5e+07" min="3.5e+07"/>
<curve color="#f14cc1" name="/driverEncodeIdx/timestampEof">
<transform name="Derivative" alias="/driverEncodeIdx/timestampEof[Derivative]">
<curve color="#f14cc1" name="/cabinEncodeIdx/timestampEof">
<transform name="Derivative" alias="/cabinEncodeIdx/timestampEof[Derivative]">
<options lineEdit="1.0" radioChecked="radioCustom"/>
</transform>
</curve>
<curve color="#9467bd" name="/roadEncodeIdx/timestampEof">
<transform name="Derivative" alias="/roadEncodeIdx/timestampEof[Derivative]">
<curve color="#9467bd" name="/narrowRoadEncodeIdx/timestampEof">
<transform name="Derivative" alias="/narrowRoadEncodeIdx/timestampEof[Derivative]">
<options lineEdit="1.0" radioChecked="radioCustom"/>
</transform>
</curve>
@@ -76,8 +76,8 @@
<plot flip_x="false" mode="TimeSeries" flip_y="false" style="Lines">
<range bottom="-0.100000" left="0.000000" top="0.100000" right="630.006367"/>
<limitY/>
<curve color="#bcbd22" name="/driverCameraState/sensor"/>
<curve color="#1f77b4" name="/roadCameraState/sensor"/>
<curve color="#bcbd22" name="/cabinCameraState/sensor"/>
<curve color="#1f77b4" name="/narrowRoadCameraState/sensor"/>
<curve color="#d62728" name="/wideRoadCameraState/sensor"/>
</plot>
</DockArea>
@@ -91,13 +91,13 @@
<plot flip_x="false" mode="TimeSeries" flip_y="false" style="Lines">
<range bottom="35000000.000000" left="0.000000" top="65000000.000000" right="630.006367"/>
<limitY max="6.5e+07" min="3.5e+07"/>
<curve color="#1f77b4" name="/driverCameraState/timestampSof">
<transform name="Derivative" alias="/driverCameraState/timestampSof[Derivative]">
<curve color="#1f77b4" name="/cabinCameraState/timestampSof">
<transform name="Derivative" alias="/cabinCameraState/timestampSof[Derivative]">
<options lineEdit="1.0" radioChecked="radioCustom"/>
</transform>
</curve>
<curve color="#d62728" name="/roadCameraState/timestampSof">
<transform name="Derivative" alias="/roadCameraState/timestampSof[Derivative]">
<curve color="#d62728" name="/narrowRoadCameraState/timestampSof">
<transform name="Derivative" alias="/narrowRoadCameraState/timestampSof[Derivative]">
<options lineEdit="1.0" radioChecked="radioCustom"/>
</transform>
</curve>
@@ -112,13 +112,13 @@
<plot flip_x="false" mode="TimeSeries" flip_y="false" style="Lines">
<range bottom="35000000.000000" left="0.000000" top="65000000.000000" right="630.006367"/>
<limitY max="6.5e+07" min="3.5e+07"/>
<curve color="#ff7f0e" name="/driverCameraState/timestampEof">
<transform name="Derivative" alias="/driverCameraState/timestampEof[Derivative]">
<curve color="#ff7f0e" name="/cabinCameraState/timestampEof">
<transform name="Derivative" alias="/cabinCameraState/timestampEof[Derivative]">
<options lineEdit="1.0" radioChecked="radioCustom"/>
</transform>
</curve>
<curve color="#f14cc1" name="/roadCameraState/timestampEof">
<transform name="Derivative" alias="/roadCameraState/timestampEof[Derivative]">
<curve color="#f14cc1" name="/narrowRoadCameraState/timestampEof">
<transform name="Derivative" alias="/narrowRoadCameraState/timestampEof[Derivative]">
<options lineEdit="1.0" radioChecked="radioCustom"/>
</transform>
</curve>
@@ -145,4 +145,3 @@
<snippets/>
<!-- - - - - - - - - - - - - - - -->
</root>
+4 -4
View File
@@ -68,8 +68,8 @@ Options:
internal, openpilotci, comma_api, car_segments, testing_closet
--data_dir <data_dir> local directory with routes
--prefix <prefix> set OPENPILOT_PREFIX
--dcam load driver camera
--ecam load wide road camera
--cabin load cabin camera
--wide-road load wide road camera
--no-loop stop at the end of the route
--no-cache turn off local cache
--qcam load qcamera
@@ -103,11 +103,11 @@ openpilot/tools/plotjuggler/juggle.py --stream
watch all three cameras simultaneously from your comma three routes with watch3
simply replay a route using the `--dcam` and `--ecam` flags:
simply replay a route using the `--cabin` and `--wide-road` flags:
```bash
# start a replay
cd openpilot/tools/replay && ./replay --demo --dcam --ecam
cd openpilot/tools/replay && ./replay --demo --cabin --wide-road
# then start watch3
cd openpilot/selfdrive/ui && ./watch3.py
+2 -2
View File
@@ -33,8 +33,8 @@ protected:
VisionBuf *getFrame(Camera &cam, FrameReader *fr, int32_t segment_id, uint32_t frame_id);
Camera cameras_[MAX_CAMERAS] = {
{.type = RoadCam, .stream_type = VISION_STREAM_ROAD},
{.type = DriverCam, .stream_type = VISION_STREAM_DRIVER},
{.type = NarrowRoadCam, .stream_type = VISION_STREAM_NARROW_ROAD},
{.type = CabinCam, .stream_type = VISION_STREAM_CABIN},
{.type = WideRoadCam, .stream_type = VISION_STREAM_WIDE_ROAD},
};
std::atomic<int> publishing_ = 0;
+2 -2
View File
@@ -74,8 +74,8 @@ bool LogReader::load(const char *data, size_t size, std::atomic<bool> *abort,
uint64_t mono_time = event.getLogMonoTime();
const Event &evt = events.emplace_back(which, mono_time, event_data);
// Add encodeIdx packet again as a frame packet for the video stream
if (evt.which == cereal::Event::ROAD_ENCODE_IDX ||
evt.which == cereal::Event::DRIVER_ENCODE_IDX ||
if (evt.which == cereal::Event::NARROW_ROAD_ENCODE_IDX ||
evt.which == cereal::Event::CABIN_ENCODE_IDX ||
evt.which == cereal::Event::WIDE_ROAD_ENCODE_IDX) {
auto idx = capnp::AnyStruct::Reader(event).getPointerSection()[0].getAs<cereal::EncodeIndex>();
if (idx.getType() == cereal::EncodeIndex::Type::FULL_H_E_V_C) {
+1 -1
View File
@@ -8,7 +8,7 @@
#include "openpilot/cereal/gen/cpp/log.capnp.h"
#include "tools/replay/util.h"
const CameraType ALL_CAMERAS[] = {RoadCam, DriverCam, WideRoadCam};
const CameraType ALL_CAMERAS[] = {NarrowRoadCam, CabinCam, WideRoadCam};
const int MAX_CAMERAS = std::size(ALL_CAMERAS);
class Event {
+10 -6
View File
@@ -26,8 +26,8 @@ Options:
internal, openpilotci, comma_api, car_segments, testing_closet
-d, --data_dir Local directory with routes
-p, --prefix Set OPENPILOT_PREFIX
--dcam Load driver camera
--ecam Load wide road camera
--cabin Load cabin camera (alias: --dcam)
--wide-road Load wide road camera (alias: --ecam)
--no-loop Stop at the end of the route
--no-cache Turn off local cache
--qcam Load qcamera
@@ -62,8 +62,10 @@ bool parseArgs(int argc, char *argv[], ReplayConfig &config) {
{"auto", no_argument, nullptr, 0},
{"data_dir", required_argument, nullptr, 'd'},
{"prefix", required_argument, nullptr, 'p'},
{"dcam", no_argument, nullptr, 0},
{"ecam", no_argument, nullptr, 0},
{"cabin", no_argument, nullptr, 0},
{"dcam", no_argument, nullptr, 0}, // deprecated alias
{"wide-road", no_argument, nullptr, 0},
{"ecam", no_argument, nullptr, 0}, // deprecated alias
{"no-loop", no_argument, nullptr, 0},
{"no-cache", no_argument, nullptr, 0},
{"qcam", no_argument, nullptr, 0},
@@ -76,8 +78,10 @@ bool parseArgs(int argc, char *argv[], ReplayConfig &config) {
};
const std::map<std::string, REPLAY_FLAGS> flag_map = {
{"dcam", REPLAY_FLAG_DCAM},
{"ecam", REPLAY_FLAG_ECAM},
{"cabin", REPLAY_FLAG_CABIN_CAMERA},
{"dcam", REPLAY_FLAG_CABIN_CAMERA}, // deprecated alias
{"wide-road", REPLAY_FLAG_WIDE_ROAD},
{"ecam", REPLAY_FLAG_WIDE_ROAD}, // deprecated alias
{"no-loop", REPLAY_FLAG_NO_LOOP},
{"no-cache", REPLAY_FLAG_NO_FILE_CACHE},
{"qcam", REPLAY_FLAG_QCAMERA},
+3 -3
View File
@@ -251,13 +251,13 @@ void Replay::publishMessage(const Event *e) {
void Replay::publishFrame(const Event *e) {
CameraType cam;
switch (e->which) {
case cereal::Event::ROAD_ENCODE_IDX: cam = RoadCam; break;
case cereal::Event::DRIVER_ENCODE_IDX: cam = DriverCam; break;
case cereal::Event::NARROW_ROAD_ENCODE_IDX: cam = NarrowRoadCam; break;
case cereal::Event::CABIN_ENCODE_IDX: cam = CabinCam; break;
case cereal::Event::WIDE_ROAD_ENCODE_IDX: cam = WideRoadCam; break;
default: return; // Invalid event type
}
if ((cam == DriverCam && !hasFlag(REPLAY_FLAG_DCAM)) || (cam == WideRoadCam && !hasFlag(REPLAY_FLAG_ECAM)))
if ((cam == CabinCam && !hasFlag(REPLAY_FLAG_CABIN_CAMERA)) || (cam == WideRoadCam && !hasFlag(REPLAY_FLAG_WIDE_ROAD)))
return; // Camera isdisabled
auto seg_it = event_data_->segments.find(e->eidx_segnum);
+2 -2
View File
@@ -16,8 +16,8 @@
enum REPLAY_FLAGS {
REPLAY_FLAG_NONE = 0x0000,
REPLAY_FLAG_DCAM = 0x0002,
REPLAY_FLAG_ECAM = 0x0004,
REPLAY_FLAG_CABIN_CAMERA = 0x0002,
REPLAY_FLAG_WIDE_ROAD = 0x0004,
REPLAY_FLAG_NO_LOOP = 0x0010,
REPLAY_FLAG_NO_FILE_CACHE = 0x0020,
REPLAY_FLAG_QCAMERA = 0x0040,
+6 -6
View File
@@ -180,9 +180,9 @@ void Route::addFileToSegment(int n, const std::string &file) {
} else if (name == "qlog.bz2" || name == "qlog.zst" || name == "qlog") {
segments_[n].qlog = file;
} else if (name == "fcamera.hevc") {
segments_[n].road_cam = file;
segments_[n].narrow_road_cam = file;
} else if (name == "dcamera.hevc") {
segments_[n].driver_cam = file;
segments_[n].cabin_cam = file;
} else if (name == "ecamera.hevc") {
segments_[n].wide_road_cam = file;
} else if (name == "qcamera.ts") {
@@ -195,11 +195,11 @@ void Route::addFileToSegment(int n, const std::string &file) {
Segment::Segment(int n, const SegmentFile &files, uint32_t flags, const std::vector<bool> &filters,
std::function<void(int, bool)> callback)
: seg_num(n), flags(flags), filters_(filters), on_load_finished_(callback) {
// [RoadCam, DriverCam, WideRoadCam, log]. fallback to qcamera/qlog
// [NarrowRoadCam, CabinCam, WideRoadCam, log]. fallback to qcamera/qlog
const std::array file_list = {
(flags & REPLAY_FLAG_QCAMERA) || files.road_cam.empty() ? files.qcamera : files.road_cam,
flags & REPLAY_FLAG_DCAM ? files.driver_cam : "",
flags & REPLAY_FLAG_ECAM ? files.wide_road_cam : "",
(flags & REPLAY_FLAG_QCAMERA) || files.narrow_road_cam.empty() ? files.qcamera : files.narrow_road_cam,
flags & REPLAY_FLAG_CABIN_CAMERA ? files.cabin_cam : "",
flags & REPLAY_FLAG_WIDE_ROAD ? files.wide_road_cam : "",
files.rlog.empty() ? files.qlog : files.rlog,
};
for (int i = 0; i < file_list.size(); ++i) {
+2 -2
View File
@@ -33,8 +33,8 @@ struct RouteIdentifier {
struct SegmentFile {
std::string rlog;
std::string qlog;
std::string road_cam;
std::string driver_cam;
std::string narrow_road_cam;
std::string cabin_cam;
std::string wide_road_cam;
std::string qcamera;
};
+5 -5
View File
@@ -57,7 +57,7 @@ def ui_thread(addr):
font_path = os.path.join(BASEDIR, "openpilot/selfdrive/assets/fonts/JetBrainsMono-Medium.ttf")
font = rl.load_font_ex(font_path, 32, None, 0)
camera_view = CameraView("camerad", VisionStreamType.VISION_STREAM_ROAD)
camera_view = CameraView("camerad", VisionStreamType.VISION_STREAM_NARROW_ROAD)
# Overlay texture for model/lane line drawing
overlay_img = np.zeros((480, 640, 4), dtype='uint8')
@@ -82,7 +82,7 @@ def ui_thread(addr):
'liveTracks',
'modelV2',
'liveParameters',
'roadCameraState',
'narrowRoadCameraState',
],
addr=addr,
)
@@ -152,13 +152,13 @@ def ui_thread(addr):
sm.update(0)
camera = DEVICE_CAMERAS[("tici", str(sm['roadCameraState'].sensor))]
calib_scale = camera.fcam.width / 640.0
camera = DEVICE_CAMERAS[("tici", str(sm['narrowRoadCameraState'].sensor))]
calib_scale = camera.narrow_road.width / 640.0
if camera_view.frame:
num_px = camera_view.frame.width * camera_view.frame.height
intrinsic_matrix = camera.fcam.intrinsics
intrinsic_matrix = camera.narrow_road.intrinsics
w = sm['controlsState'].lateralControlState.which()
if w == 'lqrStateDEPRECATED':
+2 -2
View File
@@ -10,8 +10,8 @@
#include "openpilot/cereal/messaging/messaging.h"
enum CameraType {
RoadCam = 0,
DriverCam,
NarrowRoadCam = 0,
CabinCam,
WideRoadCam
};
+3 -3
View File
@@ -38,20 +38,20 @@ def rgb_to_nv12(rgb):
class Camerad:
"""Simulates the camerad daemon"""
def __init__(self, dual_camera):
self.pm = messaging.PubMaster(['roadCameraState', 'wideRoadCameraState'])
self.pm = messaging.PubMaster(['narrowRoadCameraState', 'wideRoadCameraState'])
self.frame_road_id = 0
self.frame_wide_id = 0
self.vipc_server = VisionIpcServer("camerad")
self.vipc_server.create_buffers(VisionStreamType.VISION_STREAM_ROAD, 5, W, H)
self.vipc_server.create_buffers(VisionStreamType.VISION_STREAM_NARROW_ROAD, 5, W, H)
if dual_camera:
self.vipc_server.create_buffers(VisionStreamType.VISION_STREAM_WIDE_ROAD, 5, W, H)
self.vipc_server.start_listener()
def cam_send_yuv_road(self, yuv):
self._send_yuv(yuv, self.frame_road_id, 'roadCameraState', VisionStreamType.VISION_STREAM_ROAD)
self._send_yuv(yuv, self.frame_road_id, 'narrowRoadCameraState', VisionStreamType.VISION_STREAM_NARROW_ROAD)
self.frame_road_id += 1
def cam_send_yuv_wide_road(self, yuv):
+2 -2
View File
@@ -50,11 +50,11 @@ def cycle_alerts(duration=200, is_metric=False):
(EventName.cameraFrameRate, ET.PERMANENT),
]
cameras = ['roadCameraState', 'wideRoadCameraState', 'driverCameraState']
cameras = ['narrowRoadCameraState', 'wideRoadCameraState', 'cabinCameraState']
CS = car.CarState.new_message()
CP = CarInterface.get_non_essential_params("HONDA_CIVIC")
sm = messaging.SubMaster(['deviceState', 'pandaStates', 'roadCameraState', 'modelV2', 'liveCalibration',
sm = messaging.SubMaster(['deviceState', 'pandaStates', 'narrowRoadCameraState', 'modelV2', 'liveCalibration',
'driverMonitoringState', 'longitudinalPlan', 'livePose',
'managerState'] + cameras)