diff --git a/server/retarget_bridge.py b/server/retarget_bridge.py index 3448a99..c010fd3 100644 --- a/server/retarget_bridge.py +++ b/server/retarget_bridge.py @@ -624,11 +624,11 @@ def start_camera_relay(server, zmq_port=55555): except Exception: pass - # SHM name -> (camera_id, jpeg_quality) + # SHM name -> (camera_id, jpeg_quality, cv2_rotation or None) CAMERAS = [ - ("head", 0, 85), - ("left", 1, 70), - ("right", 2, 70), + ("head", 0, 85, None), + ("left", 1, 70, cv2.ROTATE_90_COUNTERCLOCKWISE), + ("right", 2, 70, cv2.ROTATE_90_COUNTERCLOCKWISE), ] def _relay_loop(): @@ -640,7 +640,7 @@ def start_camera_relay(server, zmq_port=55555): logger.info("Camera relay: waiting for Isaac Sim shared memory...") # Wait for at least one camera while not active_cameras: - for name, cam_id, quality in CAMERAS: + for name, cam_id, quality, rotation in CAMERAS: img = reader.read_single_image(name) if img is not None: active_cameras.add(name) @@ -654,7 +654,7 @@ def start_camera_relay(server, zmq_port=55555): while True: try: - for name, cam_id, quality in CAMERAS: + for name, cam_id, quality, rotation in CAMERAS: if name not in active_cameras: # Periodically retry missing cameras if frame_counts["head"] % 150 == 0: @@ -671,6 +671,8 @@ def start_camera_relay(server, zmq_port=55555): cur_ts = reader.last_timestamps.get(name, 0) if cur_ts > last_ts[name]: last_ts[name] = cur_ts + if rotation is not None: + img = cv2.rotate(img, rotation) ok, buf = cv2.imencode(".jpg", img, [cv2.IMWRITE_JPEG_QUALITY, quality]) if ok: server.set_webcam_frame(buf.tobytes(), camera_id=cam_id)