I’m facing a persistent issue with ArduPilot Copter SITL + MAVROS (ROS 2) where the vehicle arms successfully but disarms automatically within a second, even though I am continuously streaming valid setpoints.
Setup Details
-
Vehicle: ArduCopter SITL
-
ROS 2 distro:bHumble
-
MAVROS: ROS 2 version
-
Companion control: External offboard node (Python, rclpy)
-
Simulation: SITL (Gazebo not involved)
What I am trying to do
-
Fly in GUIDED mode
-
Control the vehicle using local position setpoints
-
Topic used: /mavros/setpoint_position/local (geometry_msgs/PoseStamped)
-
Position feedback confirmed on:
/mavros/local_position/pose
Mission flow:
-
Wait for valid local position
-
Switch to GUIDED mode
-
Stream position setpoints continuously (>20 Hz)
-
Arm the vehicle
-
Command takeoff to ~2 m altitude
Observed Problem
-
Vehicle switches to GUIDED
-
Vehicle arms successfully
-
Immediately after arming:
AP: Arming motors
ARMED
Arming checks disabled
AP: Disarming motors
DISARMED
- This happens consistently
- No RC input is involved
What I have verified
-
Setpoints are published continuously before and after arming
-
Publishing rate is stable (>20 Hz)
-
/mavros/local_position/poseis valid before arming -
QoS for local position subscriber is set to BEST_EFFORT (to match MAVROS)
-
GUIDED mode is active before arming
-
Setpoints are in local frame, not global
-
No explicit mode change or disarm command is sent by my node
My Questions
-
What internal ArduPilot conditions cause an automatic DISARM immediately after ARM in GUIDED mode?
-
Is there a specific failsafe related to:
-
Position estimate validity?
-
GUIDED setpoint type?
-
EKF origin / local frame?
-
-
Is it mandatory to:
- Send a
MAV_CMD_NAV_TAKEOFFcommand instead of only position setpoints?
- Send a
-
Are there parameters (e.g.,
FS_GCS_ENABLE,GUID_TIMEOUT, EKF checks) that typically trigger this behavior in SITL?
Thank you for your time.
I’m trying to understand the correct internal mechanism, not just apply trial-and-error fixes.