Package Overview
The Innex1 Rover software is organized into nine specialized ROS 2 packages, each handling a distinct aspect of the robot’s functionality. This modular structure enables parallel development, easier testing, and clear separation of concerns.Core Packages
lunabot_bringup
System Launch and Configuration
System-level launch files and robot bringup orchestration
- Launch file orchestration for complete system startup
- Parameter configuration management
- Node lifecycle coordination
- Integration of navigation, localisation, and perception stacks
robot_localization: EKF state estimationnav2_bringup: Navigation stack launchlunabot_navigation: Path planning integrationlunabot_perception: Vision and sensor nodes
lunabot_control
Motion and Material Control
Robot control algorithms and motion control nodes
- Material action server (excavate and deposit actions)
- Low-level motor control interfaces
- Bucket mechanism control
- Velocity command processing
/mission/excavate(action server):lunabot_interfaces/action/Excavate/mission/deposit(action server):lunabot_interfaces/action/Deposit
lunabot_interfaces: Custom action and message definitionsrclpy: Python ROS 2 client library
- Action servers provide feedback during long-running operations
- State machine for excavation sequence (approach, dig, lift, transport)
- PID control for precise bucket positioning
The material action server (
material_action_server.py:1) coordinates both excavation and deposit operations with real-time feedback.lunabot_description
Robot Physical Model
Robot models, meshes, and physical descriptions
- URDF robot model definition
- 3D mesh files for visualisation
- Joint and link specifications
- Sensor mounting positions
- Inertial parameters for simulation
- URDF/XACRO: Parametric robot description
- Meshes: STL/DAE files for visualisation and collision
- Materials: Visual properties (colors, textures)
- Published to
/robot_descriptiontopic byrobot_state_publisher - Used by simulation (Gazebo) and visualisation (RViz)
- Defines TF tree structure for kinematic chain
lunabot_interfaces
Shared Message Contracts
ROS 2 interface contracts for mission actions and custom messages
- Custom action definitions (Excavate, Deposit)
- Custom message types for mission-specific data
- Interface contract validation (CI enforced)
-
Excavate.action: Autonomous excavation operation- Goal: Target excavation zone
- Result: Material collected (kg estimate)
- Feedback: Current excavation phase
-
Deposit.action: Material deposit operation- Goal: Target deposit location
- Result: Deposit success status
- Feedback: Transport progress
- Mission state messages (deferred to future release)
- Custom sensor data formats
All interfaces are validated against
.github/contracts/interface_contracts.json during CI to prevent breaking changes.lunabot_localisation
Position and Mapping
Localisation nodes, sensor fusion, and SLAM
- Dual EKF state estimation (local and global)
- AprilTag-based absolute localisation
- Visual odometry integration
- RTAB-Map SLAM for environment mapping
ekf_filter_node_odom):
- World Frame:
odom - Published Transform:
odom→base_footprint - Inputs:
- Wheel odometry: Position (X, Y) + Velocity (VX, Vyaw)
- IMU: Orientation (Yaw) + Angular velocity + Linear acceleration
- Visual odometry: Position (X, Y)
- Behavior: Smooth, continuous—never jumps
ekf_filter_node_map):
- World Frame:
map - Published Transform:
map→odom - Inputs:
- Same continuous sources as local EKF
- AprilTag pose corrections (discontinuous)
- Behavior: Jumps when AprilTag detected to correct drift
src/lunabot_localisation/config/ekf.yaml:1
Key Dependencies:
robot_localization: EKF filter implementationrtabmap_ros: Visual SLAMapriltag_ros: Fiducial marker detectiontf2_ros: Transform broadcasting
lunabot_navigation
Path Planning
Path planning and autonomous navigation stack
- Global path planning (excavation zone to deposit bin)
- Local trajectory generation and obstacle avoidance
- Costmap generation from sensor data
- Recovery behaviors for stuck situations
- Optimized for non-holonomic robots
- Respects differential drive constraints
- Considers terrain traversability
- Smooth trajectory following
- Velocity regulation near obstacles
- Adaptive lookahead distance
- Static map layer (known obstacles)
- Obstacle layer (dynamic obstacles from sensors)
- Inflation layer (safety margins)
nav2_smac_planner: State lattice path planningnav2_regulated_pure_pursuit_controller: Trajectory tracking
Navigation parameters are tuned for lunar terrain with low gravity and regolith surface properties.
lunabot_perception
Vision and Sensing
Computer vision and sensor processing pipelines
- Hazard detection from depth camera point clouds
- Obstacle identification and classification
- AprilTag detection integration
- Sensor data preprocessing for navigation
/hazards/front:sensor_msgs/msg/PointCloud2- Front-facing obstacle point cloud
hazard_detection.py:1: Processes depth camera data to identify obstacles- Point cloud filtering and downsampling
- Ground plane removal for obstacle isolation
- Acquire raw camera/LiDAR data
- Filter and preprocess (noise removal, downsampling)
- Detect features (edges, planes, markers)
- Publish processed data for navigation and localisation
lunabot_simulation
Gazebo Environment
Gazebo simulation worlds and launch files
- Moon yard world definition (terrain, obstacles, excavation zones)
- Gazebo sensor plugins (camera, LiDAR, IMU, GPS)
- Physics configuration (gravity, regolith properties)
- ROS-Gazebo bridge configuration
- Headless Mode: Default configuration to reduce GPU load
- Physics: ODE engine with lunar gravity (1.62 m/s²)
- Terrain: Procedurally generated regolith surface
- Obstacles: Rocks and craters matching competition arena
- Gazebo GUI:
gzclient(manual launch) - Gazebo Web:
gzwebalias for browser-based viewing - RViz2: ROS-native sensor and state visualisation
ros_gz_sim: Gazebo Fortress simulationros_gz_bridge: ROS-Gazebo topic/service bridge
The simulation uses vendored Leo Rover Gazebo plugins from
external/leo_simulator-ros2/.lunabot_teleop
Manual Control
Teleoperation and manual control interfaces
- Keyboard teleoperation interface
- Joystick/gamepad support (future)
- Emergency stop functionality
- Manual bucket control for testing
i/j/k/l: Forward/Left/Backward/Rightu/o: Rotate left/right while moving forwardm/,: Rotate left/right while moving backwardq/z: Increase/decrease speedSpace: Emergency stop
External Packages
The rover also depends on vendored third-party packages located insrc/external/:
leo_common-ros2
- Purpose: Base Leo Rover URDF description and message definitions
- Source: https://github.com/LeoRover/leo_common-ros2
- Usage: Provides base robot model extended by
lunabot_description
leo_simulator-ros2
- Purpose: Leo Rover Gazebo simulation plugins and configurations
- Source: https://github.com/LeoRover/leo_simulator-ros2
- Usage: Simulation physics and sensor plugins
External packages are vendored (copied into the repository) to ensure version consistency and enable local modifications.