Ubuntu20.04下PX4与Mavros的通信配置及XTDrone仿真环境排错指南

发布时间:2026/6/29 9:45:14
Ubuntu20.04下PX4与Mavros的通信配置及XTDrone仿真环境排错指南 1. 环境准备与基础检查在Ubuntu20.04上搭建PX4与Mavros的通信环境时我遇到过无数次connected: false的报错。这个问题看似简单但背后可能隐藏着十几种不同的原因。我们先从最基础的环节开始排查就像医生问诊一样先检查生命体征。首先确认你的系统环境是否符合要求Ubuntu版本严格使用20.04 LTS其他版本可能会有库依赖冲突ROS版本必须匹配Noetic对应Python3Gazebo版本建议9或11实测7会有兼容性问题打开终端逐条执行以下基础检查命令# 检查ROS环境是否正常 printenv | grep ROS # 应该能看到ROS_ROOT/opt/ros/noetic等关键变量 # 检查PX4环境变量 echo $PX4_HOME # 正常应该显示你的PX4 Firmware路径常见的第一坑是多版本Python混用。由于ROS Noetic默认使用Python3而部分老教程还在用Python2的命令会导致各种import错误。我建议在~/.bashrc里明确指定alias pythonpython3 alias pippip32. Mavros安装与验证Mavros的安装看似简单但细节决定成败。我推荐用以下命令安装完整套件sudo apt-get install ros-noetic-mavros ros-noetic-mavros-extras ros-noetic-mavros-msgs安装完成后必须执行这个关键步骤90%的新手会忽略wget https://raw.githubusercontent.com/mavlink/mavros/master/mavros/scripts/install_geographiclib_datasets.sh sudo ./install_geographiclib_datasets.sh这个地理数据库下载过程可能需要20-30分钟如果中断会导致后续的GPS模拟失效。我曾经因为网络问题重试了5次才成功。验证Mavros是否安装成功roslaunch mavros px4.launch在另一个终端运行rostopic echo /mavros/state如果看到connected: false别慌这时候是正常的因为我们还没启动PX4。3. PX4 SITL配置详解PX4的配置最容易出问题特别是版本兼容性。我强烈建议不要直接clone最新版而是使用与XTDrone兼容的v1.11版本git clone https://github.com/PX4/Firmware.git --branch v1.11.0 --recursive编译前务必安装所有依赖cd Firmware bash ./Tools/setup/ubuntu.sh这个脚本会自动安装gcc、cmake等工具链。我遇到过因为系统自带gcc版本太低导致编译失败的情况建议先运行sudo apt install gcc-9 g-9 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 9环境变量配置是通信失败的重灾区。这是我的~/.bashrc配置模板# PX4环境变量 source ~/Firmware/Tools/setup_gazebo.bash ~/Firmware/ ~/Firmware/build/px4_sitl_default export ROS_PACKAGE_PATH$ROS_PACKAGE_PATH:~/Firmware export ROS_PACKAGE_PATH$ROS_PACKAGE_PATH:~/Firmware/Tools/sitl_gazebo # ROS工作空间 source ~/catkin_ws/devel/setup.bash注意两个关键点source顺序不能错先Gazebo后ROS路径中的Firmware必须与实际目录名完全一致大小写敏感4. 通信排错实战指南当遇到connected: false时按照这个检查清单逐步排查4.1 基础链路测试首先启动PX4仿真cd ~/Firmware make px4_sitl_default gazebo然后在另一个终端启动Mavrosroslaunch mavros px4.launch fcu_url:udp://:14540127.0.0.1:14557关键参数说明14540是QGC默认监听端口14557是PX4 SITL默认发送端口4.2 常见错误解决方案案例1端口冲突如果看到bind: address already in use错误说明端口被占用。解决方法sudo netstat -tulnp | grep 145 kill -9 [占用进程的PID]案例2权限问题当出现Permission denied时需要将用户加入dialout组sudo usermod -a -G dialout $USER newgrp dialout案例3版本不匹配XTDrone对PX4版本有严格要求。如果已经安装了新版可以这样降级cd ~/Firmware git checkout v1.11.0 git submodule update --recursive make distclean make px4_sitl_default gazebo4.3 高级调试技巧如果基础方法都无效可以启用Mavros的debug模式roslaunch mavros px4.launch fcu_url:udp://:14540127.0.0.1:14557 gcs_url: verbose:true然后在另一个终端查看详细日志rostopic echo /mavros/state -n 1 rostopic echo /mavros/statustext/recv5. XTDrone集成特别注意事项XTDrone对环境的特殊要求经常被忽略这里分享几个关键点世界文件拷贝cp -r ~/XTDrone/sitl_config/worlds/* ~/Firmware/Tools/sitl_gazebo/worlds/如果不执行这一步Gazebo会加载默认的空世界。云台插件修改 XTDrone修改了gazebo_gimbal_controller_plugin.cpp必须重新编译cd ~/Firmware make px4_sitl_default gazebo多机通信配置 在~/.bashrc中添加export GAZEBO_MODEL_PATH${GAZEBO_MODEL_PATH}:~/XTDrone/sitl_config/models最后测试通信是否成功roslaunch px4 indoor1.launch rostopic echo /mavros/state | grep connected如果还是false尝试终极解决方案 - 完全清理重建cd ~/Firmware make clean rm -rf build/ git submodule foreach git clean -xdf make px4_sitl_default gazebo在实际项目中我发现通信问题90%源于环境变量配置错误或版本不匹配。建议每次修改.bashrc后都执行source ~/.bashrc并且在新终端中测试。如果所有方法都尝试过仍不成功可以考虑使用Docker容器环境能有效隔离依赖冲突问题。