如果你正在学习无人机开发,或者想用ROS2来控制PX4飞控,那么ROS2与PX4的深度集成是一个绕不开的话题。简单来说,这种集成能让ROS2节点直接和PX4的uORB主题通信,省去了中间繁琐的数据转换步骤。
在实际项目中,我经常遇到这样的场景:需要用ROS2开发一个高级算法(比如视觉导航),但底层飞控还是PX4。传统做法是通过MAVLink协议通信,但这种方式需要额外写转换代码,延迟也高。而使用uXRCE-DDS中间件后,ROS2的节点可以直接订阅PX4的传感器数据,就像访问本地话题一样方便。
目前主流的组合是ROS2 Foxy和PX4 v1.14,这个组合最大的变化是用uXRCE-DDS完全替代了之前的FastRTPS。实测下来,新协议在资源占用和通信效率上都有明显提升。不过要注意,v1.13及以下版本不支持这个特性,必须使用v1.14以上。
我强烈推荐使用Ubuntu 20.04作为开发环境,这是ROS2 Foxy的官方支持系统。安装完系统后,第一件事就是换源:
bash复制sudo sed -i "s@http://.*archive.ubuntu.com@https://mirrors.aliyun.com@g" /etc/apt/sources.list
sudo sed -i "s@http://.*security.ubuntu.com@https://mirrors.aliyun.com@g" /etc/apt/sources.list
sudo apt update && sudo apt upgrade -y
换源能显著加快后续的软件下载速度,特别是在国内网络环境下。我曾经因为没换源,一个简单的apt install卡了半小时。
官网的安装指南看起来很简单,但实际操作时会遇到各种坑。最典型的就是网络问题导致子模块下载失败:
bash复制git clone https://github.com/PX4/PX4-Autopilot.git --recursive
cd PX4-Autopilot
bash ./Tools/setup/ubuntu.sh
这里有几个关键点:
--recursive参数必须加,否则会漏掉关键子模块bash复制git config --global url."https://ghproxy.com/https://github.com".insteadOf https://github.com
make px4_sitl -j$(nproc)加速,但首次编译最好不加-j参数,方便排查错误比起官方复杂的安装步骤,我更推荐使用国内开发者"小鱼"的一键安装脚本:
bash复制wget http://fishros.com/install -O fishros && bash fishros
运行后选择"1.安装ROS",然后选择"Foxy"版本即可。这个脚本会自动处理依赖和换源问题,实测比手动安装快很多。
安装完成后,别忘了设置环境变量:
bash复制source /opt/ros/foxy/setup.bash
echo "source /opt/ros/foxy/setup.bash" >> ~/.bashrc
uXRCE-DDS是ROS2和PX4通信的桥梁,需要先在电脑端安装代理:
bash复制git clone https://github.com/eProsima/Micro-XRCE-DDS-Agent.git
cd Micro-XRCE-DDS-Agent
mkdir build && cd build
cmake ..
make
sudo make install
sudo ldconfig /usr/local/lib/
安装完成后,可以用以下命令测试代理是否正常工作:
bash复制MicroXRCEAgent udp4 -p 8888
如果看到"Waiting for clients..."提示,说明代理已经就绪。
在PX4的启动脚本中需要添加uXRCE-DDS客户端配置。以SITL为例,修改PX4-Autopilot/ROMFS/px4fmu_common/init.d-posix/rcS文件,添加:
code复制micrortps_client start -t UDP -i 127.0.0.1 -p 8888
或者在启动命令中直接指定:
bash复制make px4_sitl none_iris
./build/px4_sitl_default/bin/px4 -t udp -h 127.0.0.1 -p 8888
建立一个专门的工作区是个好习惯:
bash复制mkdir -p ~/px4_ros_ws/src
cd ~/px4_ros_ws/src
然后克隆必要的代码库:
bash复制git clone https://github.com/PX4/px4_msgs.git
git clone https://github.com/PX4/px4_ros_com.git
注意这两个仓库的版本要和PX4版本一致,否则会出现接口不匹配的问题。
编译工作区的标准流程:
bash复制cd ~/px4_ros_ws
colcon build
source install/local_setup.bash
运行传感器数据监听示例:
bash复制ros2 launch px4_ros_com sensor_combined_listener.launch.py
如果一切正常,你应该能看到类似这样的输出:
code复制RECEIVED DATA FROM SENSOR COMBINED
================================
ts: 870938190
gyro_rad[0]: 0.00341645
gyro_rad[1]: 0.00626475
gyro_rad[2]: -0.000515705
accelerometer_m_s2[0]: -0.273381
accelerometer_m_s2[1]: 0.0949186
accelerometer_m_s2[2]: -9.76044
如果代理和客户端无法连接,首先检查:
sudo ufw allow 8888/udp)如果订阅的数据长时间不更新:
uorb top命令)ros2 topic list)ros2 topic hz /fmu/sensor_combined/out)最常见的编译错误是依赖缺失:
bash ./PX4-Autopilot/Tools/setup/ubuntu.sh)我在实际项目中发现,90%的问题都是由于环境配置不正确导致的。建议每次启动新终端时,都按顺序执行:
bash复制source /opt/ros/foxy/setup.bash
source ~/px4_ros_ws/install/local_setup.bash
除了使用预定义的sensor_combined消息,你还可以创建自定义uORB消息:
msg/目录下添加新的.msg文件CMakeLists.txt包含新消息在实际无人机系统中,ROS2节点可能运行在不同的计算机上。这时需要:
fastdds.xml中配置)对于高频数据(如IMU):
orb_advertise_queue())我在一次无人机编队项目中,通过调整这些参数将端到端延迟从50ms降到了15ms。关键是要根据实际应用场景找到平衡点,不是所有数据都需要最低延迟。