robonix.primitive.wheeltec.r550_minitank.chassis

primitive v0.1.0

wheeltec r550_minitank chassis driver wrapper.

README primitive-wheeltec-r550-chassis-rbnx@main

Wheeltec R550 mini_tank — Robonix Deploy Primitives

A full Robonix deployment for the Wheeltec R550 mini_tank: 2D SLAM mapping with N10P LiDAR + Orbbec Astra S RGB-D camera, rtabmap, Nav2 navigation, and VLM pilot. All components boot via rbnx boot from a single robonix_manifest.yaml.

Package inventory

Type Name Path Provider ID Summary
primitive robot_desc ./primitive-wheeltec-r550-chassis-rbnx/robot_description robot_description URDF model + robot_state_publisher
primitive chassis ./primitive-wheeltec-r550-chassis-rbnx/r550_chassis r550_chassis Chassis driver + IMU + EKF
primitive lidar ./primitive-wheeltec-r550-chassis-rbnx/n10p_lslidar n10p_lslidar LSLIDAR N10P 2D laser scanner
primitive camera ./astra_s_camera astra_s_camera Orbbec Astra S RGB-D depth camera
service mapping ./service-map-rbnx mapping rtabmap SLAM — occupancy grid, point cloud, pose, odom
service nav2 ./service-navigation-rbnx nav2 Nav2 goal-based navigation
system scene package_manifest.jetson-native.yaml scene Semantic scene understanding (pins camera)

System layer

Component Port Role
atlas 50051 Capability registry
executor 50061 Tool-call dispatcher
pilot 50071 VLM brain (OpenAI-format upstream)
liaison 50081 External API bridge
soma 50091 Robot body description + health
vitals 50093 Dashboard / system monitoring
scene 50107 Semantic scene graph (camera consumer)

Dependency graph

robot_description                     ← no deps, must boot first
    │  /robot_description (URDF)
    ▼
chassis                               ← needs URDF for joint_state_publisher
    │  publishes: base_footprint → base_link, base_footprint → gyro_link
    │  /odom_combined  /imu_data  /cmd_vel
    │
    ├──► lidar                        ← needs base_link TF
    │       /scan (LaserScan, frame_id=laser)
    │
    └──► camera                       ← needs camera_link TF from URDF
            /camera/color/image_raw   /camera/depth/image_raw
            /camera/color/camera_info
            + snapshot MCP tools
            │
            ├──► mapping              ← lidar2d (n10p_lslidar) + odom (r550_chassis)
            │       /map (OccupancyGrid)  /rtabmap/cloud_map  /rtabmap/odom
            │
            ├──► nav2                 ← map (mapping) + odom (r550_chassis) + scan (n10p_lslidar)
            │       service/navigation/{navigate, status, cancel}
            │
            └──► scene                ← camera (astra_s_camera)
                    system/scene/{list_objects, goal_near}

Primitives

1. robot_description — URDF model

Launch: ros2 launch turn_on_wheeltec_robot robot_mode_description_minibot.launch.py mini_tank:=true

Capability Transport Topic / Notes
robonix/primitive/robot_description/driver gRPC Lifecycle gate

Publishes /robot_description (TRANSIENT_LOCAL) and spawns robot_state_publisher so the full TF tree is available to downstream consumers.

2. chassis — chassis driver + IMU + EKF

Launch: base_serial.launch.py + wheeltec_ekf.launch.py

Capability Transport Topic QoS
robonix/primitive/chassis/driver gRPC
robonix/primitive/chassis/odom topic_out /odom_combined (EKF-fused) reliable
robonix/primitive/chassis/move gRPC
robonix/primitive/chassis/twist_in topic_in /cmd_vel reliable
robonix/primitive/imu/driver gRPC
robonix/primitive/imu/imu topic_out /imu_data (Madgwick-filtered) reliable

TF published: base_footprint → base_link (z=0.03715), base_footprint → gyro_link.

Data flow (internal + external):

/dev/wheeltec_controller
        │
  base_serial.launch.py
        │
        ├── /odom ──────────────────────┐
        │                               │
        └── /imu/data_raw               │
                │                       │
          imu_filter_madgwick           │
                │                       │
          /imu_data ────────────────────┤
                │                       │
                │                 wheeltec_ekf
                │                       │
                ▼                       ▼
      (external) imu/imu    /odom_combined
                                   │
                             (external) chassis/odom

3. lidar — LSLIDAR N10P

Launch: ros2 launch turn_on_wheeltec_robot wheeltec_lidar.launch.py

Capability Transport Topic QoS
robonix/primitive/lidar/driver gRPC
robonix/primitive/lidar/lidar topic_out /scan reliable

Publishes sensor_msgs/LaserScan with frame_id=laser. The base_link → laser TF edge comes from the URDF via robot_state_publisher.

Self-heal: 3 retry attempts if no LaserScan appears within the sentinel timeout — recovers from N10P stream-start failures without a manual power cycle.

4. camera — Orbbec Astra S RGB-D

Launch: ros2 launch turn_on_wheeltec_robot wheeltec_camera.launch.py

Capability Transport Topic QoS
robonix/primitive/camera/driver gRPC
robonix/primitive/camera/rgb topic_out /camera/color/image_raw reliable
robonix/primitive/camera/depth topic_out /camera/depth/image_raw reliable
robonix/primitive/camera/intrinsics topic_out /camera/color/camera_info reliable
robonix/primitive/camera/snapshot MCP one-shot RGB JPEG
robonix/primitive/camera/depth_snapshot MCP one-shot depth JPEG
robonix/primitive/camera/extrinsics declared only (URDF-sourced)

The camera subscribes to RGB and depth topics with permanent subscriptions (no transient ROS nodes at call time). snapshot / depth_snapshot return the latest cached frame as a JPEG-encoded sensor_msgs/Image.

Intrinsics binds directly to the Astra S native CameraInfo topic — no relay needed. Extrinsics are declared in package_manifest.yaml but not implemented: the URDF + robot_state_publisher already provide the base_link → camera_link TF edge.

Astra S native topics (published by wheeltec_camera.launch.py):

Topic Type
/camera/color/image_raw sensor_msgs/Image
/camera/color/camera_info sensor_msgs/CameraInfo
/camera/depth/image_raw sensor_msgs/Image
/camera/depth/camera_info sensor_msgs/CameraInfo
/camera/depth/points sensor_msgs/PointCloud2
/camera/ir/image_raw sensor_msgs/Image
/camera/ir/camera_info sensor_msgs/CameraInfo

Services

mapping — rtabmap SLAM

Capability Transport Topic / Notes
robonix/service/map/driver gRPC Lifecycle
robonix/service/map/occupancy_grid topic_out /map (OccupancyGrid)
robonix/service/map/pointcloud topic_out /rtabmap/cloud_map
robonix/service/map/pose topic_out /robonix/map/pose
robonix/service/map/odom topic_out /rtabmap/odom

Sensor providers: lidar2d → n10p_lslidar, odom → r550_chassis. Web UI at http://<robot-ip>:8091.

nav2 — goal-based navigation

Capability Transport Topic / Notes
robonix/service/navigation/driver gRPC Lifecycle
robonix/service/navigation/navigate gRPC + MCP Start a NavigateToPose run
robonix/service/navigation/navigate/status gRPC + MCP Poll run state
robonix/service/navigation/navigate/cancel gRPC + MCP Cancel active run

Provider pins: map → mapping, odom → r550_chassis, scan → n10p_lslidar. At Driver(CMD_INIT): resolves Atlas providers, materializes the deploy-owned Nav2 YAML, spawns nav2_bringup, waits for navigate_to_pose action server, then declares capabilities. Missing required providers return deferred.

The deploy-owned config/nav2_params.yaml must be created next to robonix_manifest.yaml — copy and tune service-navigation-rbnx/config/nav2_params.example.yml.

TF tree (full runtime)

base_footprint
    ├── base_link                          (chassis: base_to_link, z=0.03715)
    │       ├── laser                      (URDF via robot_state_publisher)
    │       └── camera_link                (URDF via robot_state_publisher)
    └── gyro_link                          (chassis: base_to_gyro)

Boot order

system:    atlas → soma → executor → pilot → liaison → vitals → scene
primitive: robot_desc → chassis → lidar → camera
service:   mapping → nav2

Primitives boot in dependency order. Services use the Atlas defer-queue: nav2 waits for mapping, which waits for lidar + chassis.

Environment

Propagated by rbnx boot from the env: block in robonix_manifest.yaml:

Variable Used by Notes
VLM_BASE_URL pilot LLM upstream endpoint
VLM_API_KEY pilot LLM API key
VLM_MODEL pilot Model name
LOG all Log level (default INFO)
ROS_DISTRO primitives ROS 2 distro (default humble)

Pre-export these in your shell or replace ${VLM_*} with literal values in the manifest.

Host prerequisites

  • ROS 2 Humble sourced at /opt/ros/humble/setup.bash
  • turn_on_wheeltec_robot workspace on the ROS package path
  • Nav2 packages (ros-humble-nav2-bringup + plugins)
  • rbnx CLI on PATH
  • Python 3.10+ with numpy, PIL (Pillow), grpcio

Quickstart

# 1. Build all packages
rbnx build

# 2. Boot the full stack
rbnx boot

# 3. Open the mapping web UI
# http://<robot-ip>:8091

License

Apache-2.0 (matches robonix upstream).