Problem: Arming denied in Offboard mode. We use Mavros, Mocaps and Ros2

The attempted solution of this issue is also being discussed in the QGroundControl category: Critical: Arming denied: Resolve system health failures first If there is any problem regarding the same problem but in another category, please let me know.

Good morning everyone,
I am working on a project where I need to use Offboard mode. My setup consists of a Raspberry Pi 5 running Ubuntu 24.04.2, a Pixhawk 6X, and ROS2 as the communication protocol. I have connected the Raspberry Pi and the Pixhawk via Ethernet, and have verified that they can successfully ping each other. We have tried using MAVROS with ROS2, and it allows us to do more things, such as viewing many more parameters and the status of the drone, changing the flight mode, and even arming it remotely using manual mode if we have the controller on. However, we have not been able to arm it from offboard mode and launch a program. We also realized that one of the reasons we couldn’t arm the drone in offboard mode was that it required the drone’s position at all times. We do not use GPS because we are indoors, so we had to send the position of the drone captured by the mocaps. We did this by remapping the topic from our mocaps, where we have the drone’s position, to the topic that MAVROS provides for the vision_pose. Then, when we echo the remapped topic, we get the position from the mocaps, but from QGroundControl, it still shows a different position.

Here are the steps to follow to have the same as us. They are put in order:

With this you launch mavros:

ros2 launch mavros apm.launch fcu_url:=udp://:14550@

By doing this you will be able to have the mocaps data. The IP has to be of the computer where you have launched the mocaps program (like Motive in our case):

ros2 launch vrpn_mocap client.launch.yaml server:=192.168.105.104 port:=3883

By doing this you will be able to remap the topics:

ros2 run topic_tools relay /vrpn_mocap/Drone/pose /mavros/vision_pose/pose

By doing this you will see the status of the drone at all times:

ros2 topic echo /mavros/state

With this you can change the flight mode (in this case it is changed to manual):

ros2 service call /mavros/set_mode mavros_msgs/srv/SetMode "{custom_mode: MANUAL}"

This way you can arm the drone from the raspberry:

ros2 service call /mavros/cmd/arming mavros_msgs/srv/CommandBool "{value: true}"

If anyone has the same problem, has any solution or question please post it in the forum so that everyone can have access.

Thanks in advance! :blush:

PX4 doesn’t really “support” MAVROS ROS2 setups. They should work but it will be harder for you to get support.

I only have general PX4 comments on arming and offboard mode. The requirements for arming in offboard mode, or switching to offboard mode when armed are listed here - angular velocity, attitude, and offboard signal.

What that means is that you have to supply velocity and attitude, and stream a proof of life message. That means meet the same requirements as are met in Offboard Mode (Generic/All Frames) | PX4 Guide (main).

If you were using MAVLInk directly you’d just stream the message that set your desired target, and that would do the proof of life and your target in one.

Hope that helps.