sl-firmware created pull request seb/saltylab-firmware#50

sl-firmware
Sat, 28 Feb 2026 22:58:31 -0500

50#feat: Phase 2a URDF robot description + static TF for SLAM/Nav2#

Summary

saltybot_description ROS2 package (ament_python) in jetson/ros2_ws/src/

Full kinematic model in urdf/saltybot.urdf.xacro, dimensions from chassis/chassis_frame.scad Rev A

config/saltybot_properties.yaml — all robot dimensions as a single source of truth

launch/robot_description.launch.py — compiles xacro + runs robot_state_publisher

TF tree published

base_footprint
└── base_link  (z = 0.310m = AXLE_HEIGHT)
    ├── wheel_left_link   (continuous, y = +0.300m)
    ├── wheel_right_link  (continuous, y = −0.300m)
    ├── imu_link          (FC/MPU-6000, x=+0.050m, z=+0.012m)
    ├── stem_link         (visual: 38.1mm EMT, 1.050m)
    └── sensor_head_link  (top of stem)
        ├── laser         (RPLIDAR A1M8 — frame name matches slam_toolbox)
        ├── camera_link   (RealSense D435i — matches realsense2_camera)
        └── camera_{front,left,rear,right}_link  (IMX219, 10° tilt down)

Integration notes

Wheel joints require /joint_states from the motor controller bridge (saltybot_bridge)

saltybot_cameras/launch/camera_tf.launch.py static TFs are superseded — disable when live to avoid TF conflicts

saltybot_bringup/launch/sensors.launch.py placeholder laser/camera TFs should likewise be disabled

Test plan

colcon build --packages-select saltybot_description

ros2 launch saltybot_description robot_description.launch.py

ros2 run tf2_tools view_frames — verify full tree

rviz2 — load robot model, confirm geometry matches hardware

ros2 topic echo /robot_description — confirm URDF published