← All projects

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

Discuss a similar system