UGV Camera and World Gen Boxes

This commit is contained in:
2026-02-23 16:00:12 -05:00
parent 9eea35ed1d
commit e17f3e67dd
15 changed files with 426 additions and 6 deletions

View File

@@ -81,18 +81,22 @@ class RunRecorder:
self._tracker_writer = None
self._camera_writer = None
self._ugv_camera_writer = None
self._gazebo_writer = None
self._tracker_size = None
self._camera_size = None
self._ugv_camera_size = None
self._gazebo_size = None
self._tracker_frames = 0
self._camera_frames = 0
self._ugv_camera_frames = 0
self._gazebo_frames = 0
self._last_tracker_frame = None
self._last_camera_frame = None
self._last_ugv_camera_frame = None
self._camera_snapshots = []
self._recording = False
@@ -290,6 +294,14 @@ class RunRecorder:
except Exception:
pass
try:
ugv_frame = self._camera_ref.frames.get("ugv_forward")
if ugv_frame is not None:
self._write_ugv_camera_frame(ugv_frame)
self._last_ugv_camera_frame = ugv_frame.copy()
except Exception:
pass
elapsed = time.time() - t0
sleep_time = max(0, interval - elapsed)
time.sleep(sleep_time)
@@ -314,6 +326,16 @@ class RunRecorder:
self._camera_writer.write(frame)
self._camera_frames += 1
def _write_ugv_camera_frame(self, frame):
h, w = frame.shape[:2]
if self._ugv_camera_writer is None:
self._ugv_camera_size = (w, h)
fourcc = cv2.VideoWriter_fourcc(*'XVID')
path = str(self.run_dir / "ugv_camera.avi")
self._ugv_camera_writer = cv2.VideoWriter(path, fourcc, self.fps, (w, h))
self._ugv_camera_writer.write(frame)
self._ugv_camera_frames += 1
def snapshot_camera(self, label="snapshot"):
if self._camera_ref is None:
return
@@ -398,12 +420,21 @@ class RunRecorder:
cv2.imwrite(str(path), self._last_camera_frame)
self._upload_file(path, filename)
if self._last_ugv_camera_frame is not None:
filename = "ugv_camera_final.png"
path = self.run_dir / filename
cv2.imwrite(str(path), self._last_ugv_camera_frame)
self._upload_file(path, filename)
if self._tracker_writer:
self._tracker_writer.release()
self._upload_file(self.run_dir / "flight_path.avi", "flight_path.avi")
if self._camera_writer:
self._camera_writer.release()
self._upload_file(self.run_dir / "camera.avi", "camera.avi")
if self._ugv_camera_writer:
self._ugv_camera_writer.release()
self._upload_file(self.run_dir / "ugv_camera.avi", "ugv_camera.avi")
self.stop_logging()
self._log_file.close()
@@ -427,9 +458,10 @@ class RunRecorder:
f"\n[REC] ═══════════════════════════════════════\n"
f"[REC] Cloud Upload Complete (ID: {self.sim_id})\n"
f"[REC] Duration: {mins}m {secs}s\n"
f"[REC] Tracker: {self._tracker_frames} frames\n"
f"[REC] Camera: {self._camera_frames} frames\n"
f"[REC] Gazebo: via ffmpeg (.mp4)\n"
f"[REC] Tracker: {self._tracker_frames} frames\n"
f"[REC] UAV Camera: {self._camera_frames} frames\n"
f"[REC] UGV Camera: {self._ugv_camera_frames} frames\n"
f"[REC] Gazebo: via ffmpeg (.mp4)\n"
f"[REC] ═══════════════════════════════════════\n"
)