从零搭建PX4无人机仿真环境:Gazebo场景构建与Offboard模式初探

张开发
2026/4/7 22:57:45 15 分钟阅读

分享文章

从零搭建PX4无人机仿真环境:Gazebo场景构建与Offboard模式初探
1. 环境准备从零搭建PX4开发基础第一次接触PX4无人机开发的朋友往往会被复杂的工具链吓到。其实只要跟着正确的步骤走半小时内就能搭建好完整的仿真环境。我用的是一台装好Ubuntu 20.04的笔记本建议至少预留30GB磁盘空间。关键依赖安装就像盖房子打地基缺一不可。打开终端依次执行sudo apt-get update sudo apt-get install git zip qtcreator cmake build-essential genromfs -y这组命令会安装编译器、构建工具等基础组件。特别提醒如果之前装过ROS记得检查/opt/ros目录下的版本避免与PX4的ROS包冲突。我就曾因为ROS版本不兼容浪费了两小时排查编译错误。接下来要处理Python环境PX4对Python3.8有强依赖sudo apt-get install python3-pip python3 -m pip install --upgrade pip pip3 install pandas jinja2 pyserial pyyaml建议用python3 --version确认版本低于3.8的需要通过ppa升级。有个坑要注意Ubuntu默认可能把python指向Python2而PX4脚本都用python3所以千万别偷懒省略数字3。2. 源码编译PX4固件构建详解获取PX4源码推荐用官方仓库git clone https://github.com/PX4/PX4-Autopilot.git --recursive cd PX4-Autopilot--recursive参数特别重要它能自动下载子模块。我有次忘记加这个参数编译时各种报头文件缺失后来只能删了重下。编译SITL仿真环境用这个命令make px4_sitl_default gazebo第一次编译会下载工具链和模型耗时约15-30分钟取决于网络。如果卡在git submodule update可能是网络问题试试切换手机热点。编译成功后你会看到终端输出[100%] Built target px4_sitl_default同时Gazebo界面会自动弹出带无人机的空场景。常见编译问题排查表错误现象可能原因解决方案CMake Error at ...子模块未完整下载执行git submodule update --init --recursiveImportError: No module named jinja2Python包缺失重新运行pip3 install命令Failed to connect to MAVLink端口占用关闭其他仿真或重启电脑3. Gazebo场景定制让仿真更真实默认的空场景太单调我们可以添加些现实元素。PX4预置了多个场景比如带风场的草原export PX4_SITL_WORLDgrass_plane make px4_sitl_default gazebo要自定义场景也很简单在PX4-Autopilot/Tools/sitl_gazebo/worlds目录下新建.world文件用Gazebo的建模工具设计地形。我曾做过一个带高楼的城市场景测试避障算法关键是要控制模型面数否则会卡顿。提升仿真流畅度的技巧在Gazebo的Physics选项卡中将实时因子(Real Time Factor)调到1.5关闭阴影和抗锯齿使用HEADLESS1 make px4_sitl_default gazebo以无界面模式运行记得测试基础控制指令commander takeoff # 起飞到默认高度 commander land # 自动降落如果无人机在Gazebo中翻跟头通常是质量参数配置错误检查PX4-Autopilot/Tools/sitl_gazebo/models/iris/iris.sdf中的物理参数。4. Offboard模式实战用ROS节点控制飞行先启动MAVROS桥接roslaunch px4 mavros_posix_sitl.launch新建ROS功能包时务必在catkin_ws/src下操作cd ~/catkin_ws/src catkin_create_pkg offboard roscpp mavros geometry_msgsC节点的核心逻辑分三步走先以20Hz频率发送目标位置点即使还没切Offboard模式等待飞控连接后发送模式切换请求解锁电机并持续更新目标点代码中这个细节很重要// 必须先发若干位置点再切模式 for(int i100; ros::ok() i0; --i){ local_pos_pub.publish(pose); ros::spinOnce(); rate.sleep(); }这是因为PX4要求Offboard模式下必须持续接收控制指令如果超时2秒没收到就会自动切回返航模式。我第一次测试时没加这个循环切模式直接失败。5. 避坑指南血泪经验总结路径问题是最常见的坑。有次我的节点死活找不到最后发现是CMakeLists.txt里少写了add_executable(offboard_node src/offboard_node.cpp) target_link_libraries(offboard_node ${catkin_LIBRARIES})权限问题也经常遇到。用ls -l /dev/ttyACM*检查设备权限如果看到crw-rw----需要把用户加入dialout组sudo usermod -a -G dialout $USER最头疼的是版本兼容性问题。有次更新后Gazebo模型全变紫了最后发现是PX4和Gazebo版本不匹配。建议锁定版本git checkout v1.13.0 # PX4稳定版 sudo apt-get install gazebo9 # 对应版本调试时多用rostopic echo /mavros/state查看连接状态rqt_graph检查节点拓扑。当看到armed: True和mode: OFFBOARD时你的无人机就已经准备好接受外部指令了。

更多文章