ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

零基础搭建无人机仿真环境:ROS 2与PX4+Gazebo Fortress完整指南

零基础搭建无人机仿真环境:ROS 2与PX4+Gazebo Fortress完整指南 把无人机从零飞到天上听起来很酷但一开始就在真机上试钱包和胆量都不太同意。尤其是做环境感知、路径规划这类算法每次调试都可能因为一次炸机让项目停滞好几周。我个人的经验是先在仿真环境里把逻辑跑通、把参数调好再上真机成功率能高出不止一倍。这篇文章就把我现在每天在用的组合——ROS 2、Gazebo Fortress和PX4在Ubuntu 22.04环境下的完整搭建流程讲清楚。文章不会绕弯子我直接按照我自己踩过坑之后的实际操作顺序来写从安装系统依赖开始到Gazebo Fortress里出现一架能飞的x500四旋翼再到用ROS 2订阅仿真数据、完成一次起飞悬停最后补充Micro-ROS和ESP32的半实物仿真拓展思路。适合正在做无人机SLAM、避障、路径规划或者单纯想入门无人机开发的读者。基础弱一点也没关系每一步我都把原理和原因顺带讲明白。1. 环境选型与技术栈解析1.1 为什么是ROS 2 Humble、Gazebo Fortress和PX4先说说我这套组合是怎么定下来的。ROS 2的版本很多Foxy、Galactic、Humble、Iron都在各自的周期里出现过但做无人机仿真这种需要长期维护、反复编译、依赖大量第三方包的项目我强烈建议选长期支持版本。Humble Hawksbill是2022年发布的LTS版本官方支持到2027年社区资料和踩坑记录都沉淀得比较足遇到问题基本一搜就能找到答案。相比之下Foxy虽然也是LTS但偏老很多新包已经不再适配Iron这种非LTS版本更新节奏快今天能编译的代码过两周就可能被依赖改动搞挂不适合作为基础环境。Gazebo家族的情况稍微复杂一点。老牌的Gazebo Classic也就是Gazebo 11目前还在广泛使用PX4官方也一直在维护适配但它的架构偏旧插件机制、传感器模型、渲染性能都到了瓶颈。Gazebo Fortress是Ignition系列改名后的长期支持版本官方代号7.x物理引擎、传感器仿真、分布式仿真能力都比Classic强不少而且在Ubuntu 22.04上有现成的二进制包不需要从源码编译这对新手来说省了很大一块工作量。Fortress这批Ignition改名的版本里Fortress本身的社区资料最丰富和ROS 2 Humble搭配的适配包ros_gz也正好是这个组合官方测试得最多。飞控层面PX4是目前无人机开源飞控里最主流的选择v1.14及以上版本原生支持Gazebo Fortress仿真不需要额外写插件。你只需要把PX4源码克隆下来编译然后用make命令指定仿真目标它就会自动启动对应版本的Gazebo世界。这套组合的兼容性我是实际验证过的Ubuntu 22.04 ROS 2 Humble Gazebo Fortress PX4 v1.14是一条完全走通的路。1.2 整体架构和仿真数据流搭建之前先把仿真环境的整体结构理清楚。整个系统可以拆成三层飞控层PX4 SITL负责运行完整的无人机飞控堆栈包括姿态解算、状态估计、导航和控制逻辑仿真层Gazebo Fortress负责模拟物理世界包括重力、空气阻力、地面碰撞以及IMU、GPS、气压计等传感器数据通信层则负责把这两者和ROS 2连接起来。PX4 SITL和Gazebo Fortress之间的通信走的是仿真内部的MAVLink通道。PX4通过一个名为simulator_mavlink的模块与Gazebo交互Gazebo把传感器测量值发给PX4PX4计算得到的电机转速指令再返回给Gazebo里的模型这样就形成了闭环。与此同时PX4会通过UDP端口向外发送完整的MAVLink数据流QGroundControl地面站可以通过这个数据流看到仿真无人机的姿态、位置、电池电压等所有信息。ROS 2在这个架构里扮演的是数据处理和算法开发的角色。你可以在ROS 2里运行SLAM、避障、路径规划等算法节点通过ros_gz_bridge把Gazebo Fortress里的仿真数据比如里程计、激光雷达、相机图像桥接成ROS 2话题也可以反向把控制指令发给仿真模型。MQTT这类例子先不说你就记住一个核心概念Gazebo Fortress负责“身体”PX4负责“大脑”ROS 2负责“算法和应用”三者之间通过MAVLink和话题通信两条数据链路互相协作。1.3 版本对照表为了节省大家排查兼容性问题的时间我把当前验证过可行的一组版本放在这里。如果你用的是其他版本组合能不能跑通我不敢保证但至少可以参考这个对照关系定位问题。组件推荐版本说明操作系统Ubuntu 22.04.3 LTS兼容性最好的底座ROS 2Humble HawksbillLTS版本支持到2027年GazeboFortressIgnition Fortress 7.x长期支持版本带现代传感器模型PX4v1.14.3原生支持Gazebo Fortress仿真QGroundControl4.3及以上地面站用于飞行监控和指令下发ros_gz桥接包ros-humble-ros-gz官方适配包连接ROS 2和Gazebo这个表看着简单但每一项背后都有讲究。PX4的版本一定要盯紧v1.13以前的版本对Gazebo Fortress的支持不完整v1.15之后配置方式又有调整。所以如果你要严格复现我的过程就用v1.14.3。2. 基础环境安装与验证2.1 系统准备与前置依赖我默认你已经装好了Ubuntu 22.04并且有一个可以正常使用的桌面环境。开始安装之前先做两件事更新软件源和安装基础工具。系统刚装好时软件源可能比较慢你可以根据自己的网络环境选择合适的源这个过程每家网络情况不一样我就不展开了。sudo apt update sudo apt upgrade -y sudo apt install -y curl gnupg lsb-release wget这三个工具是后面安装ROS 2和Gazebo Fortress都要用到的。curl用来下载密钥lsb_release用来识别系统版本号wget在安装Gazebo时会用到。2.2 安装ROS 2 Humble完整流程ROS 2的安装方式推荐用Debian包也就是通过apt直接安装而不是从源码编译。源码编译耗时太久而且对新手不友好除非你后面要改ROS 2核心代码否则没必要。首先添加ROS 2的软件源和密钥sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg echo deb [arch$(dpkg --print-architecture) signed-by/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(source /etc/os-release echo $UBUNTU_CODENAME) main | sudo tee /etc/apt/sources.list.d/ros2.list /dev/null然后更新索引并安装完整桌面版。桌面版包含了ROS 2核心、可视化工具Rviz2、仿真相关的库和示例程序对于做无人机仿真来说基本够用了。sudo apt update sudo apt install -y ros-humble-desktop python3-argcomplete安装完成后把ROS 2的环境变量写入shell配置文件这样每次打开终端就能直接使用ros2命令不用手动source。echo source /opt/ros/humble/setup.bash ~/.bashrc source ~/.bashrc验证安装是否成功可以开两个终端一个运行ros2 talker示例节点另一个运行ros2 listener。能互相收到消息就说明ROS 2工作正常。我实际测试时经常跳过这个步骤直接往下走但如果后面出现节点通信问题回来做这个检查可以帮你快速定位是不是ROS 2本身的问题。2.3 安装Gazebo Fortress与ros_gz桥接包Gazebo Fortress在Ubuntu 22.04上可以通过OSRF官方源直接安装。注意包名还是历史遗留的ignition-fortress虽然项目已经改名但Debian包名没有变。sudo wget https://packages.osrfoundation.org/gazebo.gpg -O /usr/share/keyrings/pkgs-osrf-archive-keyring.gpg echo deb [arch$(dpkg --print-architecture) signed-by/usr/share/keyrings/pkgs-osrf-archive-keyring.gpg] http://packages.osrfoundation.org/gazebo-ubuntu-stable $(lsb_release -cs) main | sudo tee /etc/apt/sources.list.d/gazebo-stable.list /dev/null sudo apt-get update sudo apt-get install -y ignition-fortress安装完成后命令行工具是ign而不是gazebo这一点经常让从Gazebo Classic转过来的朋友犯迷糊。你可以用ign gazebo来启动仿真器用ign topic来查看仿真器内部的话题。验证是否安装成功可以跑一个非常轻量的测试加载空世界并迭代几帧ign gazebo -v 4 --iterations 5 empty.sdf如果终端没有报错并且能看到加载世界和实体的日志说明Gazebo Fortress已经可以用了。这里用--iterations参数指定只迭代5次避免空跑一个图形界面占用资源。接下来安装ROS 2和Gazebo Fortress的桥接包这也是后面打通数据链路的关键sudo apt install -y ros-humble-ros-gzros_humble_ros_gz这个包提供了一套完整的桥接工具可以把Gazebo里的消息转换成ROS 2话题也可以反向把ROS 2话题写入Gazebo。它内部是基于GZ Transport和ROS 2的DDS实现的双向转换后面第四章我会详细讲怎么用。2.4 常见误区Gazebo Classic和Fortress的冲突很多人在这步会遇到一个很头疼的问题系统里可能已经装了Gazebo Classic命令是gazebo然后又装了Gazebo Fortress命令是ign gazebo两个仿真器并存。它们之间不会直接冲突因为命令和资源路径不同但容易让你搞混——明明运行的是gazebo命令却找不到Fortress的新特性方时候启动脚本里写的是ign gazebo但系统却报找不到命令。我建议在纯净环境里就直接装Fortress不要额外装Gazebo Classic除非你有其他项目明确需要它。PX4在v1.14之后支持两种仿真器但Fortress是趋势Classic的功能已经被逐步迁移到新的Gazebo系列里了。如果后面发现PX4编译脚本自动装了Gazebo Classic也别急着卸载很多辅助工具依赖它只要启动仿真时明确用make px4_sitl gz_x500指定Fortress的模型就行。3. PX4飞控接入与首飞3.1 获取PX4源码并编译PX4源码托管在GitHub上体积比较大包含大量子模块。克隆时需要加上--recursive参数这样会把所有子模块一起拉下来避免后面编译时缺胳膊少腿。git clone --recursive https://github.com/PX4/PX4-Autopilot.git cd PX4-Autopilot git checkout v1.14.3 git submodule update --init --recursivecheckout到v1.14.3这个版本是为了和前面的环境匹配。然后运行PX4官方提供的一键配置脚本它会帮你把编译PX4所需的所有工具链和依赖装好bash ./Tools/setup/ubuntu.sh这个脚本会安装很多依赖包包括arm交叉编译工具链、Python包、Gazebo相关组件等。脚本运行时间比较长我建议中途不要中断如果网络不好宁可多等一会儿。脚本执行完会提示你重新登录或者source一些环境按提示操作即可。然后就可以编译仿真目标了。PX4的SITLSoftware In The Loop也就是纯软件仿真不需要任何硬件。指定gz_x500目标意思是编译x500四旋翼模型对应的Gazebo Fortress仿真固件make px4_sitl gz_x500第一次编译会非常久二十分钟到一小时都很正常取决于机器配置。编译过程中会自动下载Gazebo模型资源如果网络环境不佳可能会卡在下载阶段这个后面在常见问题里我再细说。3.2 启动PX4 SITL与Gazebo Fortress编译成功后make px4_sitl gz_x500会自动启动两样东西一个PX4 SITL进程和一个Gazebo Fortress仿真窗口。你会看到一个类似草地地面的默认世界中间停着一架x500四旋翼无人机。同时终端会滚动打印PX4的启动日志包括飞控初始化、传感器校准、EKF状态估计器启动等信息。这个时候PX4已经通过仿真内部通道和Gazebo的模型连接起来了。你可以在PX4的nsh终端里输入 commander takeoff 试试但更直观的方式是用QGroundControl地面站因为可以实时看到姿态仪表和位置变化。有一点要特别注意每次启动make px4_sitl gz_x500它都会先启动PX4进程再自动拉起Gazebo。如果你之前已经手动打开了Gazebo Fortress可能会遇到端口或资源冲突建议先关掉再重新执行命令。实际使用中我会把启动命令封装成一个shell脚本方便一键启动和清理。3.3 用QGroundControl完成第一次起飞QGroundControl是PX4最常用的地面站软件可以从官网下载AppImage格式的安装包赋予执行权限后直接运行chmod x ./QGroundControl.AppImage ./QGroundControl.AppImage打开QGC后它默认会自动搜索本地UDP 14550端口的MAVLink数据流。PX4 SITL启动时会把MAVLink数据发送到这个端口所以正常情况下QGC顶部会显示无人机已连接并且能看到电池电压、GPS状态、飞行模式等实时数据。如果QGC没有自动识别可以手动添加UDP连接监听端口设为14550。在QGC里完成第一次仿真起飞非常简单先确认右上角可以看到无人机图标和电量信息然后点击顶部的“起飞”按钮QGC会通过MAVLink指令让PX4解锁并垂直上升到指定高度。我习惯把起飞高度设在3到5米避免低空地面效应影响判断。看到无人机在仿真世界里稳定悬停整套仿真链路就算真正打通了。到这里整个仿真环境的最小闭环已经建立PX4飞控在运行Gazebo Fortress在模拟物理环境QGC在实时监控飞行状态。接下来就是ROS 2的接入。3.4 PX4和Gazebo内部是怎么配合的这里稍微展开讲一下原理方便你后面排查问题。PX4 SITL本质上是一个完整的飞控固件运行在你的电脑上它认为自己在飞真机。它的传感器数据来自哪里呢来自Gazebo Fortress里x500模型上挂载的IMU、GPS、气压计等仿真传感器。这些传感器的测量值通过仿真内部的MAVLink通道回传给PX4PX4的运行逻辑和真机一模一样包括姿态解算、位置估计、控制器输出。控制器算出来的电机PWM指令再通过同一通道发送给Gazebo里的模型驱动四旋翼在物理仿真中转动。这套机制的巧妙之处在于PX4感知不到自己是在仿真里。所以你在真机上要做的所有流程——校准、解锁、起飞、切换模式——在仿真里都能完整走一遍。这也是为什么仿真环境调试好的代码可以直接迁移到真机因为飞控层面的接口完全没有变化。4. ROS 2与Gazebo Fortress的数据桥接实战4.1 用ros_gz_bridge打通话题通信现在PX4和Gazebo已经在跑了接下来让ROS 2也参与进来。核心工具就是ros_gz_bridge。它的作用是把Gazebo Fortress内部的GZ消息和ROS 2的DDS消息互相转换让ROS 2节点能直接订阅仿真世界里的传感器数据。先打开一个新的终端source ROS 2环境然后运行一个桥接命令把x500模型的里程计数据桥接成ROS 2的Odometry话题source /opt/ros/humble/setup.bash ros2 run ros_gz_bridge parameter_bridge /model/x500/odometrynav_msgs/msg/Odometry[gz.msgs.Odometry这条命令的格式很多人第一次看会懵。简单解释一下表示消息从一个方向单向桥接到另一个方向[表示从GZ到ROS 2的单向箭头]表示从ROS 2到GZ的单向箭头。所以这条命令是把Gazebo里的/model/x500/odometry话题gz.msgs.Odometry类型桥接为ROS 2里的同名话题nav_msgs/msg/Odometry类型。桥接启动后再另一个终端运行ros2 topic list你应该能看到/model/x500/odometry以及其他被桥接出来的话题。运行ros2 topic echo订阅里程计数据就可以实时看到无人机的位置、速度和姿态四元数。这些数据就是你在ROS 2里做SLAM、路径规划、避障算法的输入来源。4.2 摄像头图像和激光雷达的桥接无人机仿真最常见的需求是接入视觉传感器。x500模型的Gazebo配置里默认没有挂摄像头需要手动在模型文件里添加。PX4的仿真模型文件在Tools/simulation/gz/models/目录下以x500为例可以编辑x500/model.sdf在link节点下增加一段camera插件配置。不过我更推荐的做法是克隆一份x500模型改成自己的名字在SDF文件里挂载你要用的传感器。这样既保留了官方模型的原样又方便自己后续扩展。传感器加好后用ros_gz_bridge把图像话题桥接到ROS 2格式是这样ros2 run ros_gz_bridge parameter_bridge /model/x500/camerasensor_msgs/msg/Image[gz.msgs.Image桥接完成之后你可以在ROS 2里用Rviz2可视化图像话题或者直接订阅话题送入深度学习模型做目标检测。对于激光雷达Gazebo Fortress里有专用的gpu_lidar传感器插件性能比CPU版本的雷达插件好很多生成的点云话题同样可以用ros_gz_bridge桥接成sensor_msgs/PointCloud2。4.3 在ROS 2里给无人机下发指令聊一个大家最容易踩坑的地方怎么通过ROS 2控制PX4控制的无人机起飞。很多初学者以为像普通Gazebo机器人那样发布一个/cmd_vel话题就行但在这个架构里不对。Gazebo里的x500模型是受PX4飞控控制的PX4才是最终的指令来源。如果你直接往Gazebo模型的/cmd_vel话题发速度指令会发现飞机完全没反应因为PX4在每一帧都会把电机输出覆盖回来。正确的做法走MAVLink通道。最常用的方式是使用MAVSDK或者MAVROS连接PX4 SITL。以MAVSDK的Python版本为例连接地址设置为udp://:14540这是PX4 SITL启动时监听的MAVLink端口之一具体端口以启动日志为准我环境里看到的是这个。连接后发送起飞指令import asyncio from mavsdk import System async def run(): drone System() await drone.connect(system_addressudp://:14540) async for state in drone.core.connection_state(): if state.is_connected: print(connected) break await drone.action.arm() await drone.action.takeoff() asyncio.run(run())这个脚本连接后会对PX4 SITL发送解锁和起飞指令效果和QGC里点起飞按钮一样。跑起来后你会看到仿真里的x500缓缓升空。这属于MAVLink路线的控制。如果你确实想通过ROS 2话题的方式控制可以再启用MAVROS把ROS 2话题转换成MAVLink指令这样就能在ROS 2里用/mavros/setpoint_position/local等话题控制飞机适合做offboard模式下的复杂算法验证。4.4 仿真调试的小技巧ROS 2和Gazebo Fortress联动调试时有几个工具很好用。第一个是ros2 topic hz可以查看话题的发布频率。Gazebo里程计一般稳定在100Hz左右如果频率忽高忽低或者明显偏低说明物理仿真计算压力过大需要考虑降低渲染画质或者减少传感器负担。第二个是ign topic工具Gazebo Fortress自己的话题工具在ign命名空间下比如ign topic -l列出仿真器内部所有话题ign topic -e -t gz.msgs.Odometry /model/x500/odometry查看消息内容。当ROS 2侧看不到数据时先用ign工具确认Gazebo内部话题本身有没有数据这样能快速定位问题出在仿真器还是桥接环节。第三个是时钟同步。Gazebo Fortress仿真有自己的时钟如果要让ROS 2和仿真保持时间一致建议额外桥接/clock话题。在SLAM等对时间敏感的算法里时间不同步会引发非常隐蔽的漂移问题排查起来很痛苦。不要问我怎么知道的我花了两天才定位到这个坑。5. 进阶玩法多模型、视觉传感器与Micro-ROS拓展5.1 世界文件和模型文件的定制默认的Gazebo Fortress世界比较简单一片草地加一架x500。实际做算法验证时你需要自定义场景比如加入建筑物、障碍物、不同地形。Gazebo Fortress的世界文件是SDF格式存放在PX4源码的Tools/simulation/gz/worlds/目录下。你可以自己写一个新的world文件在里面添加模型、灯光、物理属性然后用PX4的环境变量指定加载你自定义的世界。启动时指定世界的常用命令是PX4_GZ_WORLDmy_world make px4_sitl gz_x500这里的my_world对应Tools/simulation/gz/worlds/my_world.sdf。推荐用这种方式而不是直接改默认世界方便切换场景。模型同理通过PX4_GZ_MODEL环境变量可以切换不同的无人机模型比如x500、r1_rover轮式机器人等。如果你自己建模了一个新机型把模型文件夹放到Tools/simulation/gz/models/下SDF文件写规范就能直接被PX4加载。5.2 视觉仿真在避障算法里的实际应用挂载了摄像头之后可以做很多有意思的事情。最常见的场景是在Gazebo世界里放置几个障碍物然后在ROS 2里跑一个YOLO目标检测节点实时识别障碍物再结合深度信息生成避障指令。Gazebo Fortress的渲染质量足够支持这种视觉算法的开发和验证。要注意的是仿真摄像头的内参和畸变模型需要在SDF配置里设置否则图像质量会过于理想真机上根本对不上。我踩过的坑是仿真里摄像头FOV设得太大目标检测表现很好一到真机就发现视野窄了很多。建议在仿真阶段就把摄像头的FOV、分辨率、噪声参数尽量往真机规格上靠这样算法迁移才能顺利。5.3 结合Micro-ROS与ESP32做半实物仿真这里说一下热词里提到的Micro-ROS和ESP32的玩法。Micro-ROS是ROS 2在MCU上的实现可以让ESP32这类微控制器直接以ROS 2节点的身份接入ROS 2图通过串口或者WiFi与ROS 2网络通信。在无人机仿真里一个典型的应用场景是把障碍物检测算法跑在ESP32上ESP32作为ROS 2节点订阅Gazebo里的仿真图像或距离数据经过算法处理后把避障决策指令发布出去。要跑通这个链路你需要做两件事一是在电脑上启动Micro-ROS Agent它负责把ESP32的DDS数据转换成ROS 2话题二是在ESP32上烧录Micro-ROS固件。Micro-ROS Agent的启动命令是这样的ros2 run micro_ros_agent micro_ros_agent udp4 --port 8888ESP32端可以用Arduino IDE或者PlatformIO引入micro_ros_arduino库配置好WiFi或串口参数然后实现订阅和发布的回调逻辑。这个方案的价值在于它把算法运行环境从仿真机拉到了真实的MCU上等于在仿真环境里做半实物验证。算法在ESP32上的运行效果比如推理耗时、内存占用能提前暴露出来不用等到整机集成时才手忙脚乱。6. 常见问题与排查技巧实录6.1 编译PX4时卡住或下载慢这个问题最让人头疼编译到一半卡在某个下载环节终端半天没动静。PX4编译过程中会自动拉取一些子模块和依赖包对网络环境比较敏感。我遇到最多的是Gazebo模型库下载慢卡在类似“Downloading models”的提示上。解决办法是提前手动下载模型文件放到~/.gz/gazebo/目录下或者检查你的网络环境对GitHub的连通性。如果确实是网络问题多试几次一般能过也可以用可靠的方式进行中转下载但一定要确保下载的文件完整。另一个常见原因是子模块没有拉全。如果你git clone时没有加--recursive或者中途中断过编译时会出现找不到头文件或者模块不存在的问题。解决方案是先进入PX4目录运行git submodule update --init --recursive把子模块补全再重新编译。6.2 Gazebo窗口黑屏或画面空白Gazebo Fortress对OpenGL渲染有要求。如果你用的是虚拟机或者电脑没有独立显卡启动仿真后可能看到窗口是黑的或者只显示地面网格但看不到无人机。这通常是渲染能力不足导致的。几个排查方向确认显卡驱动已经正确安装确认Qt和OpenGL相关库没有缺失。虚拟机环境建议开启3D加速。如果实在无法解决硬件限制还有一个workaround是使用headless模式运行Gazebo只跑物理仿真不渲染画面然后把图像数据通过bridge发出来用Rviz2来可视化。这样虽然看不到漂亮的仿真画面但数据链路完全不受影响。6.3 QGroundControl连接不上仿真无人机QGC打开后显示未连接这在SITL里经常出现。先看PX4启动日志里有没有打印MAVLink端口信息默认情况下SITL的MAVLink数据发送到本机UDP 14550端口。QGC会自动监听这个端口但如果你的QGC版本较老或者系统里已经有其他程序占用了14550端口连接就会失败。排查步骤很简单先关闭QGC在终端运行make px4_sitl gz_x500启动SITL等飞机出现在Gazebo里后再打开QGC并且确认QGC顶部没有红色的通信断开图标。如果还是不行检查有没有其他PX4进程残留用ps aux | grep px4查一下有的话kill掉再重启。6.4 ros_gz_bridge桥接后ROS 2侧看不到话题桥接命令执行了但ros2 topic list里没有对应话题这是我最常被问到的问题。首先要确认桥接命令本身没有报错。其次注意话题名称一定要写全Gazebo模型的话题通常在模型名称前面比如/model/x500/odometry不是/odometry。还有一个隐蔽的问题是命名空间。如果你用launch文件同时启动了多个模型或者设置了ROS 2的namespace话题会被重映射。这时候ros2 topic list看不到全局话题是正常的需要在命令里加上对应的namespace前缀。建议先用ign topic -l看Gazebo内部的话题全名再对照着写桥接命令基本不会出错。6.5 仿真性能优化建议整套环境跑起来后如果你发现画面卡顿、话题频率不稳性能优化可以从几个方向入手。一是降低Gazebo渲染分辨率这个可以在SDF文件里的scene节点调整二是在不需要视觉仿真时关闭摄像头渲染用传感器频率控制插件减少不必要的计算三是关闭多机仿真中用不到的模型比如默认世界里的一些装饰性模型。另外物理引擎的更新频率也影响性能。PX4 SITL默认物理仿真步长是1毫秒到2毫秒如果你只是做算法验证不需要那么精细的物理效果可以在Gazebo的world文件里把physics节点的max_step_size适当调大CPU占用会明显下降。代价是物理精度降低所以要根据你的具体需求做取舍。最后再说一个我踩过几次坑之后的习惯性操作每次启动PX4 SITL前先检查并清理残留的gz进程和px4进程。这个环境组件多端口多多开几次之后很容易留下僵尸进程占用端口导致新启动的实例行为诡异。养成好习惯能避免很多让人抓狂的“灵异事件”。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进