Topics
/hazards/front
Type: sensor_msgs/msg/PointCloud2Publisher:
hazard_detection_nodeSource:
src/lunabot_perception/lunabot_perception/hazard_detection.py:22
Point cloud data representing detected obstacles (boulders, craters, and other hazards) from the front depth camera. The raw depth camera data is processed using Open3D to:
- Downsample the point cloud (5cm voxel size)
- Remove statistical outliers
- Segment ground plane using RANSAC
- Publish obstacle points for navigation costmap integration
/tag_pose
Type: geometry_msgs/msg/PoseWithCovarianceStampedPublisher:
tag_pose_publisherSource:
src/lunabot_localisation/lunabot_localisation/tag_pose_publisher.py:30
Robot pose estimate in the map frame derived from AprilTag detection. This topic provides an independent localization source by combining:
- Static
map->tagtransform (known tag location) - Dynamic
camera->tagtransform (AprilTag detection) - Static
camera->base_footprinttransform (URDF)
- Position covariance:
(distance × 0.1)²with minimum 0.01 - Yaw covariance:
(distance × 0.05)² + 0.01
/camera_front/points
Type: sensor_msgs/msg/PointCloud2Subscriber:
hazard_detection_nodeSource:
src/lunabot_perception/lunabot_perception/hazard_detection.py:25
Raw point cloud data from the front-facing depth camera. This is the input for hazard detection processing.
Actions
/mission/excavate
Type: lunabot_interfaces/action/ExcavateServer:
material_action_serverSource:
src/lunabot_control/lunabot_control/material_action_server.py:31
Controls the excavation mechanism to collect lunar regolith during the digging phase.
Goal Fields:
timeout_s(float64): Maximum duration before aborting (0 = no timeout)
phase(uint8): Current excavation phasePHASE_PRECHECK = 0: Pre-operation safety checksPHASE_SPINUP = 1: Starting excavation motorsPHASE_DIGGING = 2: Active material collectionPHASE_RETRACT = 3: Retracting bucket
elapsed_s(float64): Time since goal acceptancefill_fraction_estimate(float64): Estimated bucket fill level (0.0-1.0)excavation_motor_current_a(float64): Motor current draw in amperesjam_detected(bool): Mechanism jam detection flagestop_active(bool): Emergency stop status
success(bool): Whether excavation completed successfullyreason_code(uint8): Result categoryREASON_SUCCESS = 0: Nominal completionREASON_TIMEOUT = 1: Goal timeout exceededREASON_CANCELED = 2: Client canceled the goalREASON_FORCED_FAILURE = 3: Testing failure modeREASON_SHUTDOWN = 4: Node shutdown during execution
failure_reason(string): Human-readable error descriptioncollected_mass_kg_estimate(float64): Estimated mass collectedduration_s(float64): Total execution time
/mission/deposit
Type: lunabot_interfaces/action/DepositServer:
material_action_serverSource:
src/lunabot_control/lunabot_control/material_action_server.py:40
Controls the deposition mechanism to unload collected material into the collection bin.
Goal Fields:
dump_duration_s(float64): How long to hold dump positiontimeout_s(float64): Maximum duration before aborting (0 = no timeout)
phase(uint8): Current deposition phasePHASE_PRECHECK = 0: Pre-operation safety checksPHASE_OPENING = 1: Opening bin doorPHASE_RAISING = 2: Raising dump bedPHASE_DUMPING = 3: Material flowing outPHASE_CLOSING = 4: Returning to transport configuration
elapsed_s(float64): Time since goal acceptanceactuator_current_a(float64): Actuator current draw in amperesdoor_open(bool): Bin door positionbed_raised(bool): Dump bed positionestop_active(bool): Emergency stop status
success(bool): Whether deposition completed successfullyreason_code(uint8): Result categoryREASON_SUCCESS = 0: Nominal completionREASON_TIMEOUT = 1: Goal timeout exceededREASON_CANCELED = 2: Client canceled the goalREASON_FORCED_FAILURE = 3: Testing failure modeREASON_SHUTDOWN = 4: Node shutdown during execution
failure_reason(string): Human-readable error descriptionresidual_fill_fraction_estimate(float64): Estimated material remaining (0.0-1.0)duration_s(float64): Total execution time
TF Frames
The robot’s coordinate frame tree follows REP-105 conventions for mobile robot localization.Frame Hierarchy
map → odom
Type: EKF TransformPublisher:
ekf_filter_node_mapSource:
src/lunabot_localisation/config/ekf.yaml
The map-to-odom transform corrects for odometry drift using absolute positioning sources (AprilTag detections, GPS). This transform is:
- Discontinuous: Jumps when new absolute measurements are fused
- Globally consistent: Maintains accurate long-term positioning
- Published by the map-frame EKF filter node
odom → base_footprint
Type: EKF TransformPublisher:
ekf_filter_node_odomSource:
src/lunabot_localisation/config/ekf.yaml
The odom-to-base_footprint transform provides smooth, continuous motion estimates by fusing:
- Wheel odometry
- IMU data
- (Optionally) Visual odometry
- Continuous: No sudden jumps, smooth motion
- Locally accurate: Drifts over long distances
- Published by the odom-frame EKF filter node
base_footprint → base_link
Type: Static Transform (URDF Joint)Source:
src/external/leo_common-ros2/leo_description/urdf/macros.xacro
Fixed offset between the ground projection point (base_footprint) and the robot’s physical center (base_link). This accounts for the robot’s chassis height and ensures 2D navigation operates at ground level while 3D sensors reference the physical robot body.
- Static: Never changes
- Purpose: Separates 2D navigation (footprint) from 3D perception (link)
Frame Usage Guidelines
| Frame | Use For |
|---|---|
map | Long-term goals, waypoint navigation, mission planning |
odom | Short-term control, local planning, velocity commands |
base_footprint | Ground-level 2D navigation, costmap obstacles |
base_link | Sensor mounting, 3D perception, robot geometry |
Deferred Topics
The following topics are referenced in the interface contracts but not yet implemented:/mission/state- Current mission state machine phase/mission/autonomy_mode- Manual vs autonomous control mode/mission/time_remaining_s- Competition time remaining/mission/cycle_count- Number of excavation cycles completed/mission/last_failure_reason- Most recent failure diagnostic