Field robotics
Real-time 3D semantic segmentation in ROS 2
ROS 1 → ROS 2 lifecycle-node port with vectorised PointCloud2 parsing: 0.2 FPS to 10 FPS, roughly 50x faster.
ROS 2PythonNumPyPyTorchJetsonCI/CD
Problem
The semantic segmentation node ran at ~0.2 FPS on ROS 1 — far too slow for online use on a moving field robot — and the stack needed to move to ROS 2.
Approach
- Ported the segmentation node to ROS 2 as a managed lifecycle node.
- Replaced per-point Python parsing of PointCloud2 with vectorised NumPy operations.
- Migrated the traversability package (trav_torch) to ROS 2, including launch-time YAML substitution.
- Maintained CI/CD on Jetson edge hardware within a monorepo build pipeline.
Result
- Inference throughput went from ~0.2 FPS to ~10 FPS — approximately 50x faster.
- Deterministic lifecycle bring-up and clean shutdown on device.
System breakdown
Hardware
- NVIDIA Jetson edge compute
- LiDAR sensor stack
Firmware / embedded
- On-device CI/CD runners
- Edge GPU runtime configuration
Software
- ROS 2 lifecycle node architecture
- Vectorised PointCloud2 parsing with NumPy
- Launch-time YAML parameter substitution
- Monorepo build-pipeline debugging
Project demo video slot