Back to packages

robonix.primitive.intel.realsense_d435i.camera

Intel RealSense D435i driver wrapper — declares RGB + depth + extrinsics contracts.

README

realsense_camera_rbnx

Robonix package wrapping the Intel RealSense D435i RGBD camera. 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_435i/... paths on the consumer side).

Capability surface

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>/aligned_depth_to_color/image_raw
robonix/primitive/camera/extrinsics topic_out ROS 2 latched TransformStamped (TODO: republish from /tf_static)
robonix/primitive/camera/snapshot rpc MCP one-shot RGB capture (TODO)
robonix/primitive/camera/depth_snapshot rpc MCP one-shot depth capture (TODO)

The D435i's internal IMU is deliberately not registered under primitive/imu/imu — the Ranger Mini's MID-360 IMU is canonical for that contract (better noise, co-located with the lidar for SLAM). The camera IMU is still published to /<cam>/imu for anyone who wants it directly.

Driver-init lifecycle

start.sh only brings up the atlas bridge process. The bridge opens a gRPC server on port REALSENSE_DRIVER_PORT (default 50232), 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, RGB/depth profiles, align_depth, IMU on/off), spawns ros2 launch realsense2_camera rs_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.

Layout

realsense_camera_rbnx/
├── package_manifest.yaml
├── realsense_camera/
│   └── atlas_bridge.py           driver gRPC + lazy Init
├── scripts/
│   ├── build.sh                  colcon build vendored src + rbnx codegen
│   └── start.sh                  source ROS, exec atlas_bridge
├── src/
│   └── realsense-ros/            VENDORED IntelRealSense/realsense-ros
└── .gitignore

Config (passed via Driver(CMD_INIT, config_json))

{
  "camera_name":        "camera_435i",
  "rgb_profile":        "640x480x30",
  "depth_profile":      "848x480x30",
  "align_depth":        true,
  "enable_imu":         true,
  "enable_sync":        true,
  "sentinel_timeout_s": 30.0
}

rgb_topic / depth_topic can be overridden directly if your launch uses a non-default namespace.

Build / run standalone

bash scripts/build.sh
bash scripts/start.sh        # registers driver iface, waits for INIT

To drive Init manually (without rbnx boot): from any robonix gRPC client, call PrimitiveCameraDriver.Driver with command=0 and config_json='{}' against 127.0.0.1:50232.

License

This package: Apache-2.0 (matches realsense-ros upstream).