Robonix package wrapping the Orbbec Gemini 330-series (and other Orbbec) RGBD cameras. Owns the primitive/camera/* namespace. Exposes the camera's RGB + aligned-depth streams under generic contracts so that mapping, scene, and any vision skill can resolve topic names through atlas (no hardcoded /camera/... paths on the consumer side).
Uses the apt-installed ros-humble-orbbec-camera / ros-humble-orbbec-description packages — no source build needed.
| Contract | Mode | Transport | Source / handler |
|---|---|---|---|
robonix/primitive/camera/driver |
rpc | gRPC | Driver(CMD_INIT, config_json) — lifecycle gate |
robonix/primitive/camera/rgb |
topic_out | ROS 2 | /<cam>/color/image_raw (sensor_msgs/Image) |
robonix/primitive/camera/depth |
topic_out | ROS 2 | /<cam>/depth/image_raw (sensor_msgs/Image, 16UC1) |
robonix/primitive/camera/extrinsics |
topic_out | ROS 2 | latched TransformStamped (TODO) |
robonix/primitive/camera/snapshot |
rpc | MCP | one-shot RGB capture |
robonix/primitive/camera/depth_snapshot |
rpc | MCP | one-shot depth capture (8-bit JPEG visualization) |
start.sh only brings up the atlas bridge process. The bridge opens a gRPC server on port ORBBEC_DRIVER_PORT (default 50233), registers the capability and declares only primitive/camera/driver on atlas, then blocks on heartbeat awaiting Driver(CMD_INIT, config_json).
When rbnx boot invokes Init it passes the manifest's config: block as JSON. The handler parses config (camera name, model, profiles, depth_registration, IMU on/off), spawns ros2 launch orbbec_camera orbbec_camera.launch.py …, waits for the first frame on the configured RGB topic, declares primitive/camera/{rgb, depth} on atlas, and returns ok. Atlas only ever advertises endpoints we've confirmed are publishing.
orbbec_camera_rbnx/
├── package_manifest.yaml
├── orbbec_camera/
│ └── main.py driver gRPC + lazy Init
├── scripts/
│ ├── build.sh rbnx codegen only (no colcon — apt-installed)
│ └── start.sh source ROS, exec atlas_bridge
└── .gitignore
{
"camera_name": "camera",
"camera_model": "gemini330_series",
"color_profile": "640x480x30",
"depth_profile": "640x480x30",
"depth_registration": true,
"enable_color": true,
"enable_depth": true,
"enable_point_cloud": false,
"enable_imu": false,
"sentinel_timeout_s": 30.0
}Supported camera_model values (from /opt/ros/humble/share/orbbec_camera/config/):
gemini330_series— default, covers Gemini 335/336/330/335L/336L/330L/335Lg/335Legemini2,gemini2L,gemini210femto_bolt,femto_mega,femtoastra2,astragemini305,gemini345,gemini345_lg,gemini435_lelidar— Pulsar ME450 / SL450
bash scripts/build.sh
bash scripts/start.sh # registers driver iface, waits for INITsudo apt install ros-humble-orbbec-camera ros-humble-orbbec-description
# Register udev rules (required for USB camera access)
sudo cp /opt/ros/humble/share/orbbec_camera/udev/99-obsensor-libusb.rules /etc/udev/rules.d/
sudo udevadm control --reload-rules && sudo udevadm triggerApache-2.0 (matches orbbec_camera upstream).