In Rust!
- Converted 32-channel RoboSense LiDAR outputs in the form of .pcap or MSOP/DIFOP packets to PointCloud2:
(x, y, z, intensity, cluster_id). Implementation explanation is here. - Implemented Two-Layer-Graph Clustering for 32-channel point cloud segmentation, per frame and without cross-frame matching and consistency. Implementation explanation is here.

- Ported cpp
nav2_costmap_2dpoint cloud to costmap conversion to Rust. Implementation details are contained here.
| Date | Changelog / Update Notes |
|---|---|
| 9/26/26 | - Rewrote ros2-planning costmap_2d implementation in Rust, also integrated costmap construction directly after RangeGraph initialization |
| 9/14/26 | - Integrated Two-Layer-Graph Clustering with the decoding of MSOP/DIFOP packets for optimized segmentation while point cloud are being processed. Specifically during the construction of the range and set graphs. |
| 9/12/26 | - Tested rslidar_sdk_node.rs on online LiDAR and offline .pcap files. Also integrated simple Bevy visualizer for point clouds. |
| 9/8/26 | - Rewrote cpp rslidar_sdk with RSHeliosDecoder for RoboSense 32-channel LiDAR specifically. This is for converting offline .pcap or online MSOP/DIFOP packets to point clouds |
Run Zenoh publisher:
RUSTFLAGS="-C link-arg=-fuse-ld=gold" cargo run --bin rslidar_viz --releaseRun Zenoh subscriber:
RUSTFLAGS="-C link-arg=-fuse-ld=gold" cargo run --bin zenoh_viz --releaseTo run the point cloud conversion and segmentation on the provided offline LiDAR packets, make sure that pcap_path in config.yaml is set to whatever file path points to test_cloud.pcap.
If you want to run rslidar_sdk_node on online LiDAR via MSOP/DIFOP ports, make sure the pcap_path in config.yaml is empty.
A brief overview on the Zenoh pub/sub elements in virtual-rgbd-sensor:
rslidar/points/raw: raw(x, y, z, intensity)point cloud from RoboSense LiDAR MSOP/DIFOP packetsrslidar/points/segmented: segmented(x, y, z, cluster_id)point cloud fromsegmentation.rs's two-layer-graph clusteringrslidar/costmap: occupancy grid containing free space, obstacle regions, and inflation layers from Rust implementation ofros-planning costmap_2din/costmap
In zenoh_test.rs, there are example point cloud and costmap subscribers in _points_subscriber and _costmap_subscriber, respectively.
Our LiDAR is pinged via 192.168.1.102:
sudo ip link set enP8p1s0 up
sudo ip addr ad 192.168.1.102/24 dev enP8p1s0If working in a Docker container, it needs to be able to access IP addresses.
x11 host on Docker so I can GUI on local:
ssh -X mini-dos@cev_jetson0.coecis.cornell.eduin cev_jetson0, to test if GUI working
xclock
sudo docker run -it \
--network host \
-e DISPLAY=$DISPLAY \
-e XAUTHORITY=/root/.Xauthority \
-v ~/.Xauthority:/root/.Xauthority:ro \
--name dbimage-container \
dbimage:lidar-dev \
/bin/bashin docker
rviz2should actually display.