Firmware Version: 2.02
- Introduction
- System Overview
- Powering On & Boot Sequence
- LCD Display Reference
- LED Indicator Reference
- Buzzer Reference
- Connecting to ROS 2
- ROS Topic Reference
- Velocity Control
- Motor & PID Control
- Wheel Encoders
- IMU Sensor
- Battery Management
- Navigation States
- Emergency Stop
- RC Control (Optional)
- Network Status Display
- Domain ID & Networking
- ROS Namespace Configuration
- Safety Warnings
- Troubleshooting
The RBL Standard Firmware is the embedded software that runs on all Rigbetel Labs research robots — Diadem, Cepheus, and Acrux. It runs on an ESP32 microcontroller using the micro-ROS framework, which allows the robot to communicate directly with a standard ROS 2 network over USB serial.
This guide covers everything you need to operate your robot: from first power-on, through velocity control and PID tuning, to configuration of the namespace and domain ID.
Throughout this guide, ROS topic examples use the /acrux namespace. Replace acrux with your robot's namespace (diadem, cepheus, or any custom name you have configured).
Cross-reference: For quick answers to common questions, see the FAQ.
Understanding how the robot communicates with your computer helps you get it running quickly and debug problems when they arise.
┌──────────────────────────────────────────────────────┐
│ Your ROS 2 System │
│ (navigation, perception, planning, etc.) │
└────────────────────────┬─────────────────────────────┘
│ ROS 2 topics
│
┌────────────────────────▼─────────────────────────────┐
│ micro-ROS Agent (on your PC) │
│ ros2 run micro_ros_agent micro_ros_agent ... │
└────────────────────────┬─────────────────────────────┘
│ Serial (USB)
│
┌────────────────────────▼─────────────────────────────┐
│ ESP32 Microcontroller (on robot) │
│ RBL Standard Firmware │
│ • Motor control with encoder feedback │
│ • IMU data publishing (older versions only) │
│ • Battery monitoring │
│ • LED animations & status indicators │
│ • LCD display │
│ • Buzzer feedback │
│ • RC receiver input (if equipped) │
│ • micro-ROS communication │
└──────────────────────────────────────────────────────┘
The micro-ROS agent is a bridge process that runs on your computer. The robot connects to it automatically on startup. Once connected, all ROS 2 topics become available on your network.
Note: IMU data publishing via the microcontroller applies to older robot versions only. On newer versions, the IMU is connected directly to the companion PC via USB for better performance and is not part of the firmware communication stack above.
Motor control, encoder reading, and battery monitoring run continuously on the robot — they do not depend on the ROS 2 connection being active. If the connection drops, motors stop safely and the robot waits to reconnect on its own.
When you turn on the robot, it goes through a fixed startup sequence. Knowing this sequence lets you confirm that everything is working correctly before you start driving.
| Step | What You See / Hear |
|---|---|
| 1 | All LEDs light up solid purple briefly |
| 2 | LCD displays "Rigbetel Labs" on the top row and the robot model name (e.g., Acrux) on the bottom row |
| 3 | Rigbetel Classic tone plays from the buzzer — 7 beeps in a signature rhythm |
| 4 | LCD transitions to "Booting..." |
| 5 | A short initialization period runs (~15 seconds) |
| 6 | LEDs switch to a pulsing orange breathing animation — the robot is now searching for a micro-ROS agent |
Once you see the pulsing orange LEDs, the robot is fully booted and ready for you to start the micro-ROS agent on your computer. See Section 7.
The robot uses a 16×2 I2C LCD display that shows live status at all times. It works without any ROS 2 connection.
┌──────────────────┐
│ Primary message │ ← Row 0 (top): Status, navigation messages, SSID, IP
├──────────────────┤
│▓ 85% 22.4V ⚠ 025│ ← Row 1 (bottom): Battery, voltage, emergency icon, domain ID
└──────────────────┘
The top row shows a context-sensitive message depending on what the robot is doing:
| Robot State | Top Row Content |
|---|---|
| Searching for ROS agent | "No Input / Retrying..." |
| Connected — idle | Alternates every 3 seconds between WiFi SSID and IP address |
| RC mode active (no ROS) | "RC Connected" |
| Moving to goal | "Way to goal" |
| Goal reached | "Reached Goal" |
| Goal cancelled | "Goal Cancelled" |
| Costmap cleared | "Costmap Cleared" |
| Goal stored | "Goal Stored" |
Navigation messages are displayed for 3 seconds, then the top row reverts to its previous idle content automatically.
| Position | Content | Example |
|---|---|---|
| 0 | Battery icon (fills with charge level) | ▓ |
| 1–3 | Battery percentage | 85% |
| 6–10 | Battery voltage | 22.4V |
| 12 | Emergency icon — visible only when e-stop is active | ⚠ |
| 13–15 | Current ROS 2 domain ID (3 digits) | 025, 0 |
The battery icon changes in 8 increments to visually represent the current charge level — useful for a quick glance without reading numbers.
FAQ Cross-reference: Q6–Q10 — Display & Status Indicators
The robot has 50 RGB LEDs arranged in segments: headlights, tail/brake lights, side strips, and status indicators at each corner. Each group conveys different information.
These states take priority over all other LED behavior:
| LED State | Meaning |
|---|---|
| All LEDs solid purple | Boot initialization in progress |
| All LEDs pulsing orange (breathing effect) | Waiting for micro-ROS agent — not yet connected |
| All LEDs solid red | Emergency stop is active |
Once the robot is connected and operational:
| LED Segment | Color | Meaning |
|---|---|---|
| Headlights (front) | White | Robot is on and connected |
| Tail / brake lights (rear) | Red | Indicates rear of robot |
| Side strips | Blue | Idle and ready |
| Status indicators (corners) | Blue | Idle and ready |
When your navigation system reports a state change via /nav_status, the status indicator LEDs at the corners change temporarily (3 seconds, then revert):
| Navigation Event | LED Color | Pattern |
|---|---|---|
| Moving to goal | Yellow | Solid |
| Goal reached | Green | Blinks 3× |
| Goal cancelled | Red | Blinks 1× |
| Costmap cleared | Orange | Blinks |
| Goal stored | Purple | Blinks |
The firmware automatically detects motion direction from cmd_vel and controls turn indicators — no extra topic needed:
| Motion | Indicator Behavior |
|---|---|
| Turning left | Left-side LEDs blink orange |
| Turning right | Right-side LEDs blink orange |
| Reversing | Rear brake lights blink yellow |
| Stationary or moving straight | No blinking |
Low battery override: When battery drops below 15%, turn indicators switch to red as an additional alert.
When RC mode is active, the robot signals this clearly:
| LED Segment | Color |
|---|---|
| All status indicators | Solid blue |
| Headlights | White |
| Brake lights | Red |
| Turn indicators | Disabled |
FAQ Cross-reference: Q2 — What do the LED colors mean?
The buzzer provides audio feedback for all major system events. Patterns are queued — multiple events can stack without interfering with each other. If you hear no beeps at all, the buzzer may have been disabled via ROS (see Section 8.1).
The Rigbetel Classic Tone plays once on every startup:
Beep — pause — Beep — Beep — Beep — pause — Beep · · · Beep — Beep — Beep
7 beeps total in a distinctive rhythmic signature.
| Pattern | Event |
|---|---|
| 2 beeps — 200 ms on / 100 ms off | micro-ROS agent connected |
| 4 rapid beeps — 100 ms on / 100 ms off | micro-ROS agent disconnected |
| Pattern | Event |
|---|---|
| 1 beep — 500 ms | Robot is moving to goal |
| 3 beeps — 200 ms on / 200 ms off | Goal reached |
| 1 long beep — 1000 ms | Goal cancelled |
| 4 rapid beeps — 100 ms on / 100 ms off | Costmap cleared |
| 1 beep — 700 ms | Goal stored |
| Pattern | Frequency | Event |
|---|---|---|
| 5 rapid beeps — 100 ms on / 100 ms off | Every 15 seconds | Battery below 15% — recharge immediately |
| Pattern | Event |
|---|---|
| 1 long beep — 1000 ms | PID disabled (open-loop mode activated) |
| 1 short beep — 200 ms | Adaptive PID mode activated |
| 2 short beeps | Custom PID mode activated |
| Pattern | Event |
|---|---|
| 1 beep — 500 ms, repeating | Encoder fault detected — stop and inspect the robot |
FAQ Cross-reference: Q45 — Complete buzzer patterns
# Disable buzzer
ros2 topic pub -1 /acrux/buzzer/enable std_msgs/msg/Bool "{data: false}"
# Re-enable buzzer
ros2 topic pub -1 /acrux/buzzer/enable std_msgs/msg/Bool "{data: true}"Note: The buzzer state resets to enabled on every reboot. Disabling is a runtime-only setting.
WARNING: Disabling the buzzer is not recommended. The buzzer is the primary alert mechanism for critical events — low battery, encoder faults, and connection changes. Disabling it means you will miss these alerts, which can result in battery damage, unexpected robot behavior, or safety hazards.
The robot communicates via micro-ROS. You need to run the micro-ROS agent on your computer for the robot's topics to appear on ROS 2.
- ROS 2 Humble or later installed on your computer.
- The
micro_ros_agentpackage:sudo apt install ros-humble-micro-ros-agent
The robot connects to the micro-ROS agent via USB serial. Connect the robot to your computer using a USB cable, then start the agent:
ros2 run micro_ros_agent micro_ros_agent serial --dev /dev/ttyUSB0 --baudrate 921600Replace /dev/ttyUSB0 with your robot's actual serial port (e.g., /dev/ttyUSB1, /dev/ttyACM0). The baud rate must be 921600.
Tip: To find the correct port, run
ls /dev/tty*before and after plugging in the robot and compare the output.
Once the agent is detected (within ~500 ms):
- 2 short beeps confirm the connection.
- LEDs switch from pulsing orange → normal runtime colors (white headlights, blue sides, red tail).
- All ROS topics become available on your network.
- The display top row begins cycling between SSID and IP address (after you publish network status — see Section 17).
# Should show all /acrux/... topics
ros2 topic list
# Check firmware version
ros2 param get /acrux/microros_node versionThe robot continuously manages the agent connection. Understanding these states helps diagnose issues:
WAITING_AGENT ──(agent found)──► AGENT_AVAILABLE ──(ready)──► AGENT_CONNECTED
▲ │
│ (connection lost)
│ ▼
└───────────────────── AGENT_DISCONNECTED ◄────────────────────
| State | LED | Behavior |
|---|---|---|
WAITING_AGENT |
Pulsing orange | Searching for agent every 500 ms |
AGENT_AVAILABLE |
— | Setting up ROS publishers, subscribers, and parameters |
AGENT_CONNECTED |
Normal runtime | Fully operational |
AGENT_DISCONNECTED |
Pulsing orange | Motors stopped; 4-beep alert; auto-reconnecting |
FAQ Cross-reference: Q3, Q5, Q44, Q46, Q47, Q56
All topics are prefixed with the robot's namespace. This section uses /acrux as the example — replace it with your robot's namespace.
These are topics the robot listens to. Send messages here from your terminal or software.
-
Type:
geometry_msgs/Twist -
Description: The primary motion control topic. Sends velocity commands to drive the robot. The robot applies closed-loop PID control to match the commanded speed on each wheel.
Field Unit Description linear.xm/s Forward (+) / backward (−) speed angular.zrad/s Counter-clockwise (+) / clockwise (−) rotation linear.ym/s Lateral movement (Cepheus mecanum configuration only) -
Example — move forward at 0.3 m/s:
ros2 topic pub /acrux/cmd_vel geometry_msgs/msg/Twist \ "{linear: {x: 0.3, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 0.0}}" -
Example — stop:
ros2 topic pub /acrux/cmd_vel geometry_msgs/msg/Twist \ "{linear: {x: 0.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 0.0}}"
Important: The robot stops automatically if the micro-ROS agent disconnects while it is moving.
-
Type:
std_msgs/Int32 -
Description: Tells the robot's display, LEDs, and buzzer what your navigation system is doing. This topic controls feedback only — it does not move the robot.
Value State Display LEDs Buzzer 0Idle SSID / IP Normal colors — 1Moving to goal "Way to goal"Yellow 1 beep (500 ms) 2Goal reached "Reached Goal"Green blink 3× 3 beeps 3Goal cancelled "Goal Cancelled"Red blink 1 long beep 4Costmap cleared "Costmap Cleared"Orange blink 4 beeps 5Goal stored "Goal Stored"Purple blink 1 beep -
Example:
ros2 topic pub -1 /acrux/nav_status std_msgs/msg/Int32 "{data: 1}"
After states 2–5, the display and LEDs automatically revert to idle after 3 seconds.
-
Type:
std_msgs/Int8 -
Description: Switches the motor controller between three operating modes.
Value Mode When to use 0PID Off Bench testing only — no encoder feedback, robot will drift 1Adaptive (default) All normal use — factory-tuned for your robot model 2Custom When you have saved your own tuned PID values -
Example:
ros2 topic pub -1 /acrux/pid/mode std_msgs/msg/Int8 "{data: 1}"
- Type:
std_msgs/Float32MultiArray - Description: Updates the PID gains immediately. Array format:
[Kp, Ki, Kd]. Applies to all wheels simultaneously. - Example:
ros2 topic pub -1 /acrux/pid/constants std_msgs/msg/Float32MultiArray \ "{data: [0.5, 40.0, 0.0]}"
Safety: Always lift the robot off the ground before sending custom PID values. See Section 20.
- Type:
std_msgs/Empty - Description: Saves the current Kp, Ki, Kd values to non-volatile storage on the robot. They are automatically loaded on the next boot when Custom PID mode is selected.
- Example:
ros2 topic pub -1 /acrux/pid/custom/save std_msgs/msg/Empty "{}"
- Type:
std_msgs/Empty - Description: Resets the wheel encoder tick counters to zero. Use this before starting an odometry-tracked session.
- Example:
ros2 topic pub -1 /acrux/wheel/ticks_reset std_msgs/msg/Empty "{}"
-
Type:
std_msgs/String -
Description: Sends your companion PC's network information to the robot's LCD. Publish this once after each connection. The message is a JSON string.
JSON Field Description "mode"Network type (e.g., "WiFi")"status"Connection status (e.g., "Connected")"info"WiFi SSID or network name "ip"IP address -
Example:
ros2 topic pub -1 /acrux/network_status std_msgs/msg/String \ "{data: '{\"mode\": \"WiFi\", \"status\": \"Connected\", \"info\": \"MyNetwork\", \"ip\": \"192.168.1.100\"}'}"
- Type:
std_msgs/Bool - Description: Enables (
true) or disables (false) the buzzer. Default is enabled. Resets to enabled on reboot. - Example:
ros2 topic pub -1 /acrux/buzzer/enable std_msgs/msg/Bool "{data: false}"
- Type:
std_msgs/Int8 - Description: Changes the robot's ROS 2 domain ID, saves it permanently, and automatically reboots the robot. Valid range: 0–101.
- Example:
ros2 topic pub -1 /acrux/microros_domain_id std_msgs/msg/Int8 "{data: 25}"
- Type:
std_msgs/String - Description: Changes the robot's ROS namespace, saves it permanently, and automatically reboots. All topics then appear under the new namespace.
- Namespace rules: Maximum 15 characters; lowercase letters and
/only; no digits, uppercase, or special characters. - Example:
ros2 topic pub -1 /acrux/microros_namespace std_msgs/msg/String "{data: 'my_robot'}"
These topics carry live data from the robot. Subscribe to them from your software.
- Type:
geometry_msgs/Twist| Rate: ~10 Hz - Description: The robot echoes back the velocity command currently being executed. Use this to confirm commands are being received and acted upon.
- Type:
std_msgs/Float32MultiArray| Rate: ~10 Hz - Description: Current RPM of each wheel, measured from encoders.
- 2WD (Acrux, Cepheus 2WD):
[left, right] - 4WD (Diadem, Cepheus 4WD):
[left_front, left_back, right_front, right_back]
- 2WD (Acrux, Cepheus 2WD):
- Type:
std_msgs/Float64MultiArray| Rate: ~10 Hz - Description: Current velocity of each wheel in m/s, derived from encoder readings. Same array order as
wheel/rpm.
- Type:
std_msgs/Int64MultiArray| Rate: ~500 Hz - Description: Cumulative encoder tick count since last reset. Used for odometry. Same array order as above.
Note: The robot publishes raw tick data. Your ROS stack is responsible for computing
/odomand TF transforms from these ticks.
- Type:
sensor_msgs/Imu| Rate: ~500 Hz - Description: Sensor data from the onboard IMU. Contains:
- Orientation (quaternion):
orientation.x/y/z/w - Angular velocity (rad/s):
angular_velocity.x/y/z - Linear acceleration (m/s²):
linear_acceleration.x/y/z - All timestamps are synchronized to ROS time
- Orientation (quaternion):
Note (older versions only): On robots manufactured before 2026, the IMU is connected to the ESP32 and data is published over this topic. On newer versions, the IMU is connected directly to the companion PC via USB for better performance — this topic will not be active on those robots. Refer to your robot's hardware documentation.
- Type:
std_msgs/Int8| Rate: ~1 Hz - Description: Estimated battery charge (0–100%). Based on a linear voltage estimate.
Note: This is a voltage-based approximation. It may be less accurate as the battery ages. For reliable monitoring, prefer watching the voltage topic directly. If your robot includes a smart BMS, use the BMS topics instead.
-
Type:
std_msgs/Float32| Rate: ~1 Hz -
Description: Real-time battery voltage in volts (accuracy ±0.2 V).
Voltage State 25.2 V Fully charged 19.8 V Minimum safe — stop and recharge now Below 19.8 V Risk of permanent battery damage
-
Type:
std_msgs/Bool| Rate: ~5 Hz -
Description: Current state of the physical emergency stop button.
true→ E-stop is active; motors are halted.false→ Normal operation.
ros2 topic echo /acrux/estop/status
| Parameter | Value | Description |
|---|---|---|
version |
2.02 |
Firmware version |
ros2 param get /acrux/microros_node versionWhen you publish to /acrux/cmd_vel:
- The robot receives the
(linear.x, angular.z)command. - It converts these into individual per-wheel velocity targets:
- Left wheel =
linear.x − (angular.z × wheel_separation / 2) - Right wheel =
linear.x + (angular.z × wheel_separation / 2)
- Left wheel =
- Each wheel has its own independent closed-loop controller that matches the actual wheel speed to the target.
Each robot has a maximum speed based on its motors and wheel size. Commands beyond the maximum are automatically clamped — not rejected.
The values below are standard defaults. Actual maximum velocity may differ depending on the specific hardware configuration ordered.
| Platform | Standard Max Linear Velocity |
|---|---|
| Diadem | ~1.58 m/s |
| Cepheus | ~0.835 m/s |
| Acrux | ~0.628 m/s |
Start with low velocities (0.1–0.2 m/s) and increase gradually, especially in new environments.
If your robot is equipped with an RC receiver and RC mode is active, all cmd_vel messages from ROS 2 are ignored until RC mode is disengaged. This is intentional for safety. See Section 16.
FAQ Cross-reference: Q17, Q18 — Velocity commands
Without closed-loop feedback, small mechanical differences between motors cause the robot to drift even when commanded to go straight. The firmware runs an independent controller per wheel that continuously adjusts motor power to keep each wheel at the commanded speed.
Factory-tuned values optimized for your specific robot model. Use this for all normal operation, including autonomous navigation.
ros2 topic pub -1 /acrux/pid/mode std_msgs/msg/Int8 "{data: 1}"Confirmed by: 1 short beep
Use your own Kp, Ki, Kd values. Only use this mode if you have carefully tuned and tested your values with the robot lifted off the ground.
# Switch to Custom mode
ros2 topic pub -1 /acrux/pid/mode std_msgs/msg/Int8 "{data: 2}"
# Send your constants
ros2 topic pub -1 /acrux/pid/constants std_msgs/msg/Float32MultiArray \
"{data: [0.5, 40.0, 0.0]}"Confirmed by: 2 short beeps
Disables feedback control. Motors respond to commands without any encoder correction. For bench testing only — the robot will drift noticeably in real use.
ros2 topic pub -1 /acrux/pid/mode std_msgs/msg/Int8 "{data: 0}"Confirmed by: 1 long beep (1000 ms)
After tuning, save your values so they persist across reboots:
# Save current custom values to flash
ros2 topic pub -1 /acrux/pid/custom/save std_msgs/msg/Empty "{}"
# On next boot, select Custom mode to load them
ros2 topic pub -1 /acrux/pid/mode std_msgs/msg/Int8 "{data: 2}"The firmware periodically verifies that each encoder is responding correctly during motion. If an encoder is not detected as working:
- All motors halt immediately.
- A 500 ms single beep repeats on every health check until the robot is rebooted.
- The robot will not accept motion commands until the encoder is repaired and the robot is restarted.
If you hear repeated single medium-length beeps during operation, stop immediately and inspect the wheel encoders and their connections.
FAQ Cross-reference: Q31–Q35 — PID Control
Three topics give you full wheel motion information:
# Cumulative tick counts (highest rate, ~500 Hz)
ros2 topic echo /acrux/wheel/ticks
# Wheel velocities in m/s (~10 Hz)
ros2 topic echo /acrux/wheel/vel
# Wheel RPM (~10 Hz)
ros2 topic echo /acrux/wheel/rpmArray order:
- 2WD (Acrux, Cepheus 2WD):
[left, right] - 4WD (Diadem, Cepheus 4WD):
[left_front, left_back, right_front, right_back]
ros2 topic pub -1 /acrux/wheel/ticks_reset std_msgs/msg/Empty "{}"The firmware publishes raw tick data — it does not compute or publish /odom or TF transforms. Your ROS stack must integrate tick counts using the robot's wheel diameter and encoder resolution to compute position. A standard differential drive odometry node (e.g., from nav2_bringup or robot_localization) handles this.
FAQ Cross-reference: Q19, Q50 — Encoder topics and reset
Note (older versions only): This section applies to robots manufactured before 2026, where the IMU is connected to the ESP32 microcontroller. On newer versions, the IMU is connected directly to the companion PC via USB for better performance and is published by a separate driver — not through this micro-ROS topic. Refer to your robot's hardware documentation to confirm which applies to your robot.
ros2 topic echo /acrux/imu/raw_dataThe message (sensor_msgs/Imu) contains:
| Field | Unit | Description |
|---|---|---|
orientation |
quaternion | Absolute orientation with onboard sensor fusion |
angular_velocity.x/y/z |
rad/s | Gyroscope data |
linear_acceleration.x/y/z |
m/s² | Accelerometer data |
All IMU messages carry timestamps synchronized to ROS time, which is essential for TF transforms and sensor fusion in your navigation stack.
Note (older versions only): On robots manufactured 2026 or later, the IMU is connected directly to the companion PC via USB. This micro-ROS topic will not be active on those robots.
FAQ Cross-reference: Q20 — IMU data
The robot continuously monitors battery voltage and publishes it at ~1 Hz:
ros2 topic echo /acrux/battery/voltage
ros2 topic echo /acrux/battery/percentageThe LCD bottom row shows both the battery percentage and live voltage at all times, even without ROS connected.
| Voltage | State |
|---|---|
| 25.2 V | Fully charged |
| ~22 V | Mid charge |
| 19.8 V | Minimum safe level — stop and recharge |
| Below 19.8 V | Risk of permanent battery cell damage |
Note: Battery percentage is a linear voltage estimate. It may become less accurate as the battery ages. Monitor voltage directly for reliable readings.
When battery drops below 15%:
- 5 rapid beeps sound every 15 seconds.
- Turn indicator LEDs switch to red.
- The display continues to show percentage and voltage.
- The robot remains operational — it will not auto-shutdown.
Stop operation and recharge the robot when this alert triggers. Do not drain below 10% — doing so can permanently damage the battery cells.
FAQ Cross-reference: Q11–Q14 — Battery
The firmware does not perform path planning — that is your ROS 2 navigation stack's job (e.g., Nav2). The firmware's role is to display and announce navigation events through the LCD, LEDs, and buzzer, giving clear feedback to anyone observing the robot.
Publish an integer to /acrux/nav_status from your navigation node:
ros2 topic pub -1 /acrux/nav_status std_msgs/msg/Int32 "{data: 1}"The default state after connection. The display cycles between SSID and IP address. LEDs show normal runtime colors. No buzzer.
Display: "Way to goal" · LEDs: yellow · Buzzer: 1 beep (500 ms).
Publish this when your navigation stack begins driving toward a goal.
Display: "Reached Goal" · LEDs: green blink 3× · Buzzer: 3 beeps.
Publish this when the robot arrives at its destination. Returns to idle after 3 seconds.
Display: "Goal Cancelled" · LEDs: red blink · Buzzer: 1 long beep.
Publish this when a goal is aborted. Check your navigation system for the reason. Returns to idle after 3 seconds.
Display: "Costmap Cleared" · LEDs: orange blink · Buzzer: 4 beeps.
Publish this when your navigation stack clears a costmap to re-plan. Motion continues uninterrupted. Returns to previous state after 3 seconds.
Display: "Goal Stored" · LEDs: purple blink · Buzzer: 1 beep.
Publish this when a goal location has been saved for later. Returns to idle after 3 seconds.
Navigation state updates are processed only when:
- The micro-ROS agent is connected
- The emergency stop is released
- RC control mode is not active
FAQ Cross-reference: Q22–Q26 — Navigation & States
The physical emergency stop button on the robot is wired directly to the microcontroller and is always active — even without a ROS 2 connection. It cannot be disabled via software.
- All motors halt immediately.
- All LEDs turn solid red.
- An emergency icon (⚠) appears on the LCD bottom row.
- The robot ignores all velocity commands.
/acrux/estop/statuspublishestrue.
Release the button. The robot detects the release and:
- Removes the emergency icon from the LCD.
- Returns LEDs to normal runtime colors.
- Accepts
cmd_velcommands again.
The robot does not resume motion automatically on release. It waits for a new velocity command from ROS 2.
ros2 topic echo /acrux/estop/statusIntegrate this into your safety-critical nodes to detect e-stop activation and respond (pause goal execution, alert the operator, log an event).
FAQ Cross-reference: Q27–Q30 — Emergency Stop
RC control is only available on robots ordered with an RC receiver. If your robot was not configured with RC support, this entire section does not apply.
| Channel | Function | Range |
|---|---|---|
| Channel 1 | Steering / angular velocity | 200 – 1800 |
| Channel 3 | Throttle / linear velocity | 200 – 1800 |
| Channel 5 | RC / ROS mode switch | 1800 = RC mode active; other = ROS mode |
| Channel 7 | PID mode selector | 200=Off · 1000=Adaptive · 1800=Custom |
| Channel 8 | Speed throttle scaler | 200–1800 → 20%–100% of max speed |
Flip Channel 5 to position 1800 on the transmitter to enter RC mode. Flip back to return to ROS mode.
| Mode | Status LED Color | ROS cmd_vel |
|---|---|---|
| RC mode active | Solid blue | Ignored |
| ROS mode | Normal runtime colors | Active |
RC input is automatically processed before reaching the motors:
- A rolling average smooths rapid stick movements.
- A center deadband prevents drift when sticks are at rest.
- The throttle channel scales final speed between 20% and 100% of maximum.
Flip Channel 7 to switch PID mode without needing ROS 2:
- Position
200→ PID Off (1 long beep) - Position
1000→ Adaptive PID (1 short beep) - Position
1800→ Custom PID (2 short beeps)
Motors stop briefly during mode transitions before resuming.
FAQ Cross-reference: Q36–Q40 — RC Control
By default, after connecting to ROS, the LCD top row shows "SSID: XX" and "IP Address: XX" — placeholder text, because the firmware does not know your PC's network details.
To show the actual SSID and IP address, publish this once after each connection:
ros2 topic pub -1 /acrux/network_status std_msgs/msg/String \
"{data: '{\"mode\": \"WiFi\", \"status\": \"Connected\", \"info\": \"YourSSID\", \"ip\": \"192.168.1.100\"}'}"After this, the display cycles between the SSID and IP every 3 seconds while idle. You only need to republish if the robot reboots or reconnects.
FAQ Cross-reference: Q21 — Network status display
The Domain ID is a number (0–101) that isolates ROS 2 networks. Only devices with the same domain ID can see each other's topics — think of it as a channel number. The robot's current domain ID is always shown in the bottom-right corner of the LCD (e.g., 025, 0).
export ROS_DOMAIN_ID=25Add this to ~/.bashrc to make it permanent, or set it in your ROS 2 launch files.
ros2 topic pub -1 /acrux/microros_domain_id std_msgs/msg/Int8 "{data: 25}"The robot saves the new ID and automatically reboots. After reboot:
- Confirm the new ID appears on the LCD.
- Update
ROS_DOMAIN_IDon your computer. - Restart the micro-ROS agent.
The domain ID is stored permanently and survives all reboots and power cycles. The factory default is 0.
FAQ Cross-reference: Q41–Q44 — Domain ID & Networking
Every ROS topic from this robot is prefixed with a namespace (e.g., /acrux/cmd_vel). The namespace uniquely identifies your robot on the network and allows multiple robots to run simultaneously without topic collisions.
| Robot | Default Namespace |
|---|---|
| Diadem | /diadem |
| Cepheus | /cepheus |
| Acrux | /acrux |
ros2 topic pub -1 /acrux/microros_namespace std_msgs/msg/String "{data: 'lab_robot_one'}"The robot validates the name, saves it, and automatically reboots. All topics then appear as /lab_robot_one/....
| Rule | Detail |
|---|---|
| Maximum length | 15 characters |
| Allowed characters | Lowercase a–z and / only |
| Invalid characters | Digits, uppercase, spaces, symbols — silently stripped |
| Persists across reboots | Yes |
FAQ Cross-reference: Q15, Q54 — Namespace
Read and follow these warnings before operating or configuring the robot.
WARNING: Do not allow the battery to drain below 10% (approximately 20.5 V). Discharging lithium cells below their minimum voltage causes permanent, irreversible damage to the battery pack. The firmware alerts you at 15% — this is your signal to stop and recharge.
WARNING: Do not charge the battery while the robot is operating autonomously and unattended.
WARNING: Before publishing custom PID values or switching to PID Off mode, physically lift the robot so its wheels are completely off the ground. Incorrect values can cause sudden, uncontrolled wheel spin at full speed, which can launch the robot across the floor, damage gearboxes, or injure people nearby.
NOTICE: Any damage to gearboxes, motors, or wheels from improper PID tuning is not covered under warranty.
WARNING: The physical emergency stop button is your primary safety mechanism. Keep it accessible at all times when the robot is operating near people. Never block or disable it.
WARNING: Always verify your
cmd_velpublisher before running in open space. Start at low velocities (0.1–0.2 m/s) and increase gradually. An errant high-speed command can cause collisions or injury.
NOTICE: Repeated single medium-length beeps during operation indicate an encoder fault. The robot will halt and refuse motion commands. Stop operation immediately, inspect the wheel encoders and wiring, then reboot the robot before resuming.
- Confirm the micro-ROS agent is running on your computer.
- Check that
ROS_DOMAIN_IDon your computer matches the value shown on the robot's LCD. - Verify the USB cable is properly connected and the correct serial port is specified.
- Observe the LEDs — pulsing orange means the robot is still searching for the agent.
- Restart the micro-ROS agent.
ros2 topic list # Should show /acrux/... topicsThe robot is waiting for the micro-ROS agent. Start or restart the agent on your computer. See Section 7.
The emergency stop is active. Release the physical e-stop button. LEDs and motors return to normal automatically.
- Confirm PID mode is Adaptive:
ros2 topic pub -1 /acrux/pid/mode std_msgs/msg/Int8 "{data: 1}" - Listen for repeated medium-length beeps — these indicate an encoder fault. Stop and inspect encoders.
- Check battery voltage. Low voltage degrades motor performance.
Battery is below 15%. Stop operation and recharge the robot immediately.
- Confirm the LCD bottom-right shows the new domain ID.
- Update your terminal:
export ROS_DOMAIN_ID=25 - Restart the micro-ROS agent.
- Restart any ROS 2 nodes (they must pick up the new domain ID).
- Run
ros2 topic listto verify.
Publish the network status once after connecting:
ros2 topic pub -1 /acrux/network_status std_msgs/msg/String \
"{data: '{\"mode\": \"WiFi\", \"status\": \"Connected\", \"info\": \"MySSID\", \"ip\": \"192.168.1.100\"}'}"Check these conditions in order:
- Are LEDs pulsing orange? → micro-ROS agent not connected.
- Does
/acrux/estop/statusreturntrue? → Release the physical e-stop. - Are status LEDs solid blue? → RC mode is active; ROS
cmd_velis ignored. - Do you hear repeated single beeps? → Encoder fault; stop and inspect.
Check the physical cable and connector to the LCD display. If connections are secure and the issue persists, contact Rigbetel Labs for support.
FAQ Cross-reference: Q46–Q53 — Troubleshooting
For further assistance, contact Rigbetel Labs or refer to the FAQ for quick answers to common questions.