This was a lighter fortnight. I had university exams, so instead of new features I used the time to lock down the foundations: a proper recorded dataset that the whole pipeline can run from with no simulator and no GPU, plus a round of polish on the dashboard implementation.
TL;DR Exams ate into the last two weeks, so this is a consolidation update. I finalised the recording into a self-contained reproducible bundle: a single ROS 2 bag holding LiDAR plus two cameras plus the simulator's ground-truth object list, recorded through the official carla_ros_bridge. The important outcome is that the entire perception pipeline now runs from this recording alone, with no CARLA and no GPU, which I verified end to end (the detector produces boxes at ~32 Hz straight off the bag). I also polished and committed the box-rendering work into the app repository. Next week: turn this into a clean, reproducible app that can go upstream.
Up to now the demo leaned on a short, LiDAR-only recording, and anything richer meant going back to the live simulator, which needs a GPU box running CARLA. That is a fragile foundation: it ties day-to-day work to one specific machine. So the goal this cycle was to record once, properly, and then never need CARLA or a GPU again for normal development.
The result is a self-contained bundle: the recording itself, a small viewer, the sensor configuration used to capture it, and the helper scripts to replay it. It is deliberately architecture-agnostic, so the same recording will replay on the server today and on the Jetson later without changes.
It is a single ROS 2 bag, about 110 seconds of a car self-driving (scripted autopilot) around a town map, captured through the official carla_ros_bridge rather than the hand-rolled bridge from earlier weeks. Alongside the LiDAR it now carries the camera views and, crucially, the simulator's own ground truth:
One small bug had to be fixed to record the cameras at all: the bridge's camera path crashed inside cv_bridge on this OpenCV/NumPy combination. I bypassed it by building the image message by hand, which is documented in the bundle as a patch for anyone who re-records elsewhere.
The whole point was to prove the pipeline no longer depends on the simulator or a GPU, so I tested exactly that: replay the bag, run the existing PCL detector against it, and watch the detections come out.
/carla/detections publishes at ~32 Hz, on a machine with no GPU and no CARLA running.That confirms the important thing: I can develop the rest of the project, the dashboard, scoring, and eventually the learned detector, entirely from the recording. The only thing that still needs a GPU is training a learned model down the line, and that is a one-off job that can run on any borrowed GPU, not on the recording box.
With exams limiting new feature work, I spent the remaining time cleaning up rather than expanding: the box-rendering added to the Flutter HMI last cycle is now committed into the application repository, the offline demo script launches the detector when it is present, and the README documents both the LiDAR and detection topics and the perception node. Small, but it moves the app from "works on my machine" toward "someone else can run it."
Status: the dataset is finalised and decoupled from CARLA/GPU; the perception pipeline is verified to run from the recording alone; and the dashboard box-rendering is committed and tidied.
A quieter fortnight because of exams, but the groundwork is worth it: the project no longer depends on a simulator or a GPU to move forward.