What's inside
Full-rate perception and localization from a single platform. Every sensor — dual ZED 2i stereo (front + rear), Ouster OS0-128 LiDAR, IMU, and u-blox GNSS — publishes into one ROS 2 graph inside limit-robot, so downstream systems consume a single, stable data plane instead of five separate integrations.
Dual ZED 2i stereo
Front + rear stereo pairs — per-eye images, depth, point clouds, and the ZED IMU on a shared GPU-accelerated SDK path.
Ouster OS0-128
128-channel solid-state LiDAR over dedicated 1 GbE — dense point clouds for mapping, obstacle detection, and localization.
IMU + GNSS
ZED IMU for short-term orientation and a u-blox GNSS receiver for absolute position, fused with LiDAR into one state estimate.
How to interact
W / S · A / D
W drives forward, S reverses, A/D yaw left and right. While a key is held, Limit animates its Run 01 gait; release all keys and it stands completely still.
Drag · scroll
Drag to orbit around the model, scroll to zoom in and out. The camera stays free while the robot drives — you can watch it run from any angle.
Command log
Every drive input is logged as the real ROS 2 command it maps to (CTRL_VELOCITY), so the demo doubles as a reference for the actual drive interface.
Under the hood
Raw streams
/zed_pub (per-eye images, depth, point cloud, IMU) · /ouster/os_driver (points, ~10 Hz) · /gnss_pub (fix).
/limitx_*
A canonical bridge composites the two ZED units, multiplexes IMU, forwards LiDAR + GNSS, and publishes source health on limit_msgs types.
Gazebo + Nav2
Simulation and the Nav2 stack share the same graph, so the interface you integrate against in sim is the interface you get on the real robot.
ros2 topic list -t # 100 topics with types ros2 node info /zed_pub # custom limit_msgs types in the graph ros2 topic hz /ouster/os_driver/points # ~10 Hz point cloud stream ros2 topic echo /gnss_pub/fix --once
What's next
INITIALIZING clears and points stream ~10 Hzlimit-robot with --gpus all; SDK backend on both camerasrmem_max → 4194304