ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

PX4 V1.14硬件在环仿真实战:Ubuntu 22.04与ROS2 Humble完整踩坑指南

PX4 V1.14硬件在环仿真实战:Ubuntu 22.04与ROS2 Humble完整踩坑指南 先说结论这套组合确实能跑通但中间要跨的坑比官方文档写的多得多。网上能找到的教程大多停留在“SITL能起飞”的阶段一旦你手里有一块真飞控、想让PX4固件跑在硬件上、传感器数据全部来自仿真器很多默认配置就不灵了。这篇文章基于我实际从零搭完一遍的记录整理目标是让你在Ubuntu 22.04上用PX4 V1.14这个特定版本配合ROS2 Humble把HITL仿真完整跑起来并且让ROS2能实时拿到飞控的状态话题。我不会只贴命令。每个关键步骤后面都会解释为什么这么做、以及我当初在这里卡了多久。如果你是第一次接触HITL建议先花半小时把前两章看完再动手能省下大量的返工时间。1. 为什么偏偏是“Ubuntu 22.04 PX4 V1.14 ROS2 Humble”这个组合1.1 版本配套的底层逻辑ROS2 Humble是Ubuntu 22.04的官方LTS搭配这个不用多说了。真正需要注意的是PX4的版本选型。PX4的main分支迭代非常快在v1.15之后PX4内部对外设驱动、参数系统、DDS接口都做了不少调整。如果你直接拉main分支很多示例代码、串口配置参数、甚至话题命名都可能跟你搜到的教程对不上。PX4 V1.14的优势在于它是最后一个大量教程、博客、开源项目集中适配的版本也是uXRCE-DDS功能相对成熟稳定的阶段。ROS2获取PX4话题所依赖的px4_msgs和px4_ros_com在V1.14上有明确的tag对应不用自己猜版本。另一个实际原因是PX4官方对v1.14提供了Gazebo Classic的完整支持。如果你用更新的v1.15官方默认转到了Gazebo Ignition/Garden系列换了一套仿真接口HITL的启动方式也变了这就意味着你必须依赖大量新文档而这些新文档的坑还没有被足够多的人踩平。1.2 什么是HITL它跟SITL的差别在哪SITLSoftware-In-The-Loop是整条飞控链路全部跑在PC上PX4进程就是一个普通Linux程序它从仿真器读传感器数据计算出控制量再送回仿真器。整个过程不涉及任何真硬件。HITLHardware-In-The-Loop则把“PX4运行环境”这一层替换成了真实飞控硬件。Gazebo依然在PC上跑但它不再跟PC上的PX4进程通信而是把模拟的传感器数据通过MAVLink协议发给真实的飞控板。飞控板上运行的是真正的PX4固件它会执行姿态解算、状态估计、控制律计算把电机指令再通过MAVLink回传给Gazebo。QGroundControl以下简称QGC在这条链路上负责地面站监控和参数设置。借用一句好懂的话SITL是在电脑里“模拟”了一架飞机HITL是把真实的飞控电脑插到了一台飞行模拟器上。1.3 为什么有人需要HITL如果你只做纯算法仿真SITL完全够用。但当你开始关注飞控本身的性能比如传感器噪声特性、GPS丢星时的表现、特定固件参数对控制效果的影响或者你要验证PX4和ROS2之间DDS通信的稳定性SITL就失真了。HITL能让你用真实的PX4固件版本、真实的外设接口、真实的参数系统去跑仿真环境这对做飞控移植、外设驱动开发、机载计算机联调的人来说几乎是必经之路。我这次用的硬件是Pixhawk系列飞控常见的4、6C都可以后面会提到固件选型时的对应关系。2. HITL仿真链路拆解数据是怎么从Gazebo跑到飞控再到ROS2的2.1 一条完整的数据路径HITL仿真不是简单地把几个软件打开就行它的数据流向非常明确理解这条链路是你排查所有问题的前提。整个链路分三层Gazebo仿真层负责模拟传感器数据IMU、GPS、气压计、磁力计和物理环境重力、风、地面同时接收飞控发来的电机PWM指令并计算飞行器响应。飞控硬件层运行PX4 V1.14固件。它通过串口/USB连接到PC从MAVLink通道接收仿真传感器数据PX4内部的EKF2等模块把这些数据当作真实传感器数据处理进而输出控制量。ROS2通信层PX4通过uXRCE-DDS也就是micro-ROS XRCE-DDS协议把内部话题桥接到PC端的MicroXRCEAgent再由Agent把消息发布到ROS2的DDS总线上。所以你在ROS2里订阅到的/fmu/out/vehicle_attitude本质上是PX4飞控里发布的内部话题经过uXRCE-DDS桥接后转发到了ROS2。2.2 物理连接方式我推荐的最小硬件拓扑是PC (Ubuntu 22.04) ├── USB线 ── 飞控的USB口MAVLink通道QGC使用 ├── USB-TTL串口线 ── 飞控的TELEM2口uXRCE-DDS通道 └── 显示器Gazebo可视化之所以需要一根额外的串口线做uXRCE-DDS是因为PX4的USB口通常被MAVLink占用HITL模式下QGC需要这个链路来显示状态和设置参数。uXRCE-DDS如果也走USB口容易出现通道冲突。TELEM2是PX4上标准的第二个串口既不干扰遥测也能稳定跑DDS协议。如果你的飞控支持以太网口并且你有配套的网卡模块uXRCE-DDS也可以用UDP模式但这属于进阶方案新手阶段先用串口最稳。2.3 硬件准备清单项目说明飞控板Pixhawk 4、Pixhawk 6C等需支持PX4 V1.14固件USB数据线必须支持数据传输很多充电线连不上飞控USB-TTL模块CP2102或FTDI芯片均可用于TELEM2接PC杜邦线3根即可TX、RX、GND避雷提醒不要给飞控供电时插拔串口线容易烧接口我最初忽略了USB-TTL这个需求结果ROS2话题一直不通排查了整整两天才意识到通道配置虽然在参数里看起来没问题但物理链路根本没有建立。这个坑后面详细说。3. 基础环境搭建ROS2 Humble和Gazebo Classic的安装细节3.1 安装ROS2 Humble为什么要单独强调安装细节因为ROS2 Humble默认的apt源在国内环境下速度极慢而且ros-humble-desktop包依赖相当多中途任何一个包下载失败你都需要重新跑一遍apt install。先做一个干净的操作sudo apt update sudo apt install -y curl gnupg lsb-release然后添加ROS2官方源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 $(lsb_release -cs) main | sudo tee /etc/apt/sources.list.d/ros2.list /dev/null这里有一个实际经验如果raw.githubusercontent.com访问不稳定可以手动把ros.key下载到本地再拷贝到/usr/share/keyrings/目录效果一样。关键是确保gpg key文件存在否则apt会报错。然后更新并安装完整版sudo apt update sudo apt install -y ros-humble-desktop装完先别急着用把环境变量写进~/.bashrcecho source /opt/ros/humble/setup.bash ~/.bashrc source ~/.bashrc验证一下ros2 --help能正常输出帮助信息就算OK了。3.2 安装Gazebo Classic 11这里有个大坑Ubuntu 22.04的apt里默认的gazebo包是Gazebo 11也就是Gazebo Classic但如果你执行sudo apt install gazebo装的是经典版没问题。然而PX4 v1.14官方文档里推荐的安装方式是同时安装gazebo11和libgazebo11-devsudo apt install -y gazebo11 libgazebo11-dev注意千万不要手贱去装gazebo如果你已经装过先卸载。因为Ubuntu 22.04下gazebo包在某些源里可能指向Gazebo Classic但在新版Ubuntu里已经出现过被替换掉的案例。为了锁死版本直接用gazebo11这个包名。安装完成输入gazebo能打开一个图形窗口就说明OK了。另外需要安装gazebo_ros_pkgs吗不需要PX4的sitl_gazebo自带插件不依赖ROS1的gazebo_ros包这一块可以放心跳过。3.3 安装QGroundControl并处理libfuse缺失问题QGC是HITL仿真的核心地面站工具它负责把PX4固件烧录到飞控、设置HITL参数、显示飞行状态。从官网下载AppImage后Ubuntu 22.04上大概率会遇到打不开的问题报错信息里有libfuse.so.2之类的字样。原因是AppImage依赖libfuse2而Ubuntu 22.04默认只装了libfuse3。解决办法sudo apt install -y libfuse2如果你下载的是QGC的压缩包版本把它解压后直接运行./QGroundControl.AppImage即可。也可以把AppImage放到/usr/local/bin下方便命令行启动。USB权限处理sudo usermod -a -G dialout $USER这一步必须做否则QGC和后面MicroXRCEAgent访问串口都会遇到Permission denied。改完用户组后要注销重新登录或者重启。4. PX4 V1.14源码编译与飞控固件烧录4.1 拉取源码并切换分支HITL仿真需要在PC上编译PX4的仿真资源Gazebo模型、插件所以源码必须要拉。但注意PC上这个PX4源码本身的运行目标不是HITL主程序而是提供sitl_gazebo所需的模型和启动脚本。cd ~ git clone --branch v1.14.0 https://github.com/PX4/PX4-Autopilot.git --recursive如果你已经clone过其他分支记得切到v1.14.0并更新submodulecd PX4-Autopilot git checkout v1.14.0 git submodule update --init --recursive--recursive必须带PX4的Tools/sitl_gazebo和mavlink等子模块都是独立仓库漏了它们后续编译必然报错。4.2 安装PX4依赖环境PX4官方提供了一个自动化脚本在Ubuntu 22.04上可以一键装完大部分依赖cd PX4-Autopilot bash ./Tools/setup/ubuntu.sh这个脚本会安装包括ninja-build、cmake、python3-pip、ros2环境依赖在内的一堆工具。运行过程中可能会提示你安装ROS2相关的东西如果之前已经装好了ROS2 Humble可以跳过部分重复步骤。脚本跑到最后通常会要求重启一次。如果脚本中途报错最常见的是pip源超时建议先给pip换国内源pip3 config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple然后重新跑脚本。4.3 编译仿真资源这一步不是编译飞控固件而是编译Gazebo仿真所需的SITL工具链。执行cd ~/PX4-Autopilot make px4_sitl gazebo-classic第一次编译通常要20-40分钟取决于机器性能。如果编译过程中报缺gstreamer相关依赖安装一下sudo apt install -y libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev编译完成后你会在build/px4_sitl_default/下看到生成的二进制文件。现在可以先验证一下SITL能否正常启动make px4_sitl gazebo-classic窗口里能出现Gazebo界面和一架iris无人机同时终端里出现pxh提示符说明仿真资源编译成功。为什么要先验证SITL因为HITL排错时你首先要排除Gazebo环境是否正常。如果SITL都起不来HITL更不可能正常。4.4 用QGC给飞控烧录V1.14固件飞控固件的烧录方式有两种命令行和高迪QGC。新手强烈建议用QGC因为QGC能自动匹配机型并且在烧录前检查固件版本。把飞控用USB线连接到电脑打开QGC。等待识别后在左上角点击“Q”图标进入Vehicle Setup - Firmware页面。在高级设置里选择对应的PX4版本我们这里选v1.14.0如果QGC版本太新固件列表里可能没有这个旧版本可以手动下载固件文件后用“Custom Firmware”上传。烧录完成之后QGC可能提示你校准传感器先不用管。之后在Vehicle Setup - Airframe里选择机架我用的是Generic Quadcopter对应参数SYS_AUTOSTART4001。HITL模式下机架类型会影响Gazebo机型匹配建议保持一致。这里还涉及一个固件和仿真器匹配的问题v1.14.0的固件烧到飞控上后PC上PX4源码也必须是v1.14.0两者版本不一致时MAVLink消息的语义可能对不上表现就是QGC连接正常但Gazebo启动后飞控没有反应。5. uXRCE-DDS桥接让PX4和ROS2双向通信的关键一跳5.1 理解uXRCE-DDS的角色PX4内部的数据是不直接暴露给ROS2的。PX4社区选用的是eProsima的Micro XRCE-DDS方案在飞控端跑一个“XRCE客户端”在PC端跑一个“MicroXRCEAgent”。客户端通过串口或UDP把数据序列化后发给AgentAgent再把这些数据转成完整的DDS消息发布到ROS2网络上。这个设计的好处是飞控端不需要完整实现DDS协议栈节省了大量内存和CPU资源。代价就是你必须在两端都做好配置。5.2 使用串口方式建立桥接PX4 V1.14固件默认就编译了uXRCE-DDS客户端。硬件连接上我们用USB-TTL模块连接飞控的TELEM2口接线如下串口模块RX - 飞控TELEM2 TX串口模块TX - 飞控TELEM2 RX串口模块GND - 飞控TELEM2 GND在QGC参数界面设置以下关键参数参数名值说明UXRCE_DDS_CFGTELEM2指定uXRCE-DDS走TELEM2串口SER_TEL2_BAUD921600串口波特率两端必须一致SYS_HITL1启用HITL模式设置完后重启飞控。这时PX4会自动在TELEM2上启动uXRCE-DDS客户端等待Agent连接。5.3 编译并启动MicroXRCEAgentPC端需要安装MicroXRCEAgentcd ~ 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启动Agent时使用串口模式MicroXRCEAgent serial --dev /dev/ttyUSB0 -b 921600这里的/dev/ttyUSB0是USB-TTL模块在PC上映射的设备名如果你的PC还插了其他USB串口设备要用ls /dev/ttyUSB*或ls /dev/ttyACM*确认。Agent启动后正常情况下会打印类似Server started的日志并且当PX4连接过来时会看到创建client的提示。如果没反应先用串口助手去听TELEM2口有没有数据流出排除接线和波特率问题。5.4 编译px4_ros_com和px4_msgs为了让ROS2能正确解析PX4的消息需要编译两个关键包mkdir -p ~/ws_px4/src cd ~/ws_px4/src git clone --branch v1.14.0 https://github.com/PX4/px4_msgs.git git clone --branch v1.14.0 https://github.com/PX4/px4_ros_com.git cd ~/ws_px4 colcon build --symlink-install source install/setup.bash把source ~/ws_px4/install/setup.bash也加到~/.bashrc里避免每次新开终端都要手动source。现在可以验证ROS2是否能看到PX4的话题了ros2 topic list如果桥接正常应该能看到/fmu/out/vehicle_attitude、/fmu/out/vehicle_odometry、/fmu/out/vehicle_status等以/fmu/out/开头的话题。你还可以用ros2 topic echo /fmu/out/vehicle_attitude能看到实时姿态数据说明uXRCE-DDS链路完全打通。6. HITL仿真启动实操从QGC设置到Gazebo起飞6.1 QGC中启用HITL模式启动HITL之前要确保飞控当前没有在执行普通飞行模式先把飞控断电再上电。打开QGC并连接飞控后进入Vehicle Setup - Safety页面找到HITL相关选项勾选启用HITL仿真器选择Gazebo然后点击确认。QGC这个操作会更新飞控参数并触发重启。如果QGC版本较老HITL选项的位置可能不一样。我用的QGC版本较新在Safety页面里直接有“HITL”字样。找不到的时候直接在QGC的“Parameters”搜索框里搜SYS_HITL把它改成1效果一样。改完之后飞控会自动重启。6.2 启动Gazebo HITL环境PC端启动HITL配套仿真环境的命令是cd ~/PX4-Autopilot make px4_sitl gazebo-classic_hitl这里说一下原理make会调用PX4构建系统目标gazebo-classic_hitl会加载sitl_gazebo/worlds/hitl_iris.world这个模型专门用于HITL模式它会尝试通过MAVLink连接真实飞控。跟SITL模式不同此时PC上不会运行PX4飞控进程真正在跑的是飞控板上的PX4固件。如果你在QGC里设置了HITL并点击了“Start Simulation”QGC会尝试自动启动Gazebo。但根据我的经验QGC自动拉起Gazebo的成功率不高经常遇到找不到固件路径的问题所以手动执行上面的命令更可靠。启动后Gazebo界面会加载出iris模型等几秒钟QGC上的姿态数据应该会开始变化。这时把Gazebo里的无人机用鼠标拖拽一下QGC和飞控的姿态都会同步变化说明仿真链路已经闭环。6.3 解锁起飞与ROS2数据验证在QGC里点击解锁Arm如果安全开关没有打开解锁可能被拒绝。如果是首次使用先检查遥控器或者安全开关设置。没有遥控器的情况下可以在QGC的Safety页面关闭“Enable Safety Switch”这样就省去了解锁时的物理开关步骤。解锁成功后在Gazebo界面用键盘或手柄给一个油门指令无人机应该会起飞。这时候在另一个终端里运行ros2 topic echo /fmu/out/vehicle_attitude你会看到姿态四元数在实时变化数值跟Gazebo里飞机的姿态完全对应。再跑一下ros2 run rqt_topic rqt_topic可以看到所有可用的PX4话题列表包括加速度计、陀螺仪、GPS位置等。6.4 一个容易忽略的启动顺序HITL启动顺序有讲究。我建议的顺序是先启动MicroXRCEAgent等待飞控的DDS连接上电飞控确认QGC已连接再启动Gazebo HITL环境最后在QGC中解锁起飞如果先启动Gazebo再启动Agent飞控的uXRCE-DDS客户端可能会因为找不到Agent而反复重试虽然PX4自带重连机制但实测中有时会卡在某个状态不如一开始就按顺序来。7. 避坑实录8个最典型的坑及完整排查链路7.1 QGC打不开双击AppImage没有任何反应现象双击下载好的QGroundControl.AppImage光标转了一圈就消失了终端没有任何报错。排查过程先在终端手动运行./QGroundControl.AppImage看到错误提示./QGroundControl.AppImage: error while loading shared libraries: libfuse.so.2: cannot open shared object file。这就定位到了是libfuse2缺失。解决sudo apt install -y libfuse2装完再跑就正常了。这个坑几乎所有Ubuntu 22.04用户都会遇到因为AppImage在22.04上默认缺少libfuse2运行时。7.2 飞控连接电脑没有识别QGC显示未连接现象USB线插上飞控QGC一直显示Connectingls /dev/ttyACM*没有输出。排查过程先用dmesg | tail查看内核日志发现Permission denied。当前用户不在dialout组。解决sudo usermod -a -G dialout $USER注销重新登录再插上飞控ls /dev/ttyACM*能看到设备QGC能识别。另外补充一点如果你的USB线是那种只能充电的线飞控会通上电但没有任何数据通信dmesg里甚至看不到USB设备枚举。换一根数据线基本解决。这是我最初怀疑人生时被老玩家点拨的。7.3 PX4源码拉取v1.14.0后编译失败报缺少mavlink头文件现象执行make px4_sitl gazebo-classic时编译过程报错找不到mavlink/v2.0/common/mavlink.h。排查过程检查~/PX4-Autopilot/mavlink目录是否存在结果目录存在但是空的。原因是clone的时候用了git clone --recursive但子模块没有正确初始化。解决cd ~/PX4-Autopilot rm -rf mavlink git submodule update --init --recursive会重新拉取所有子模块包括mavlink、sitl_gazebo再次编译即可通过。这个坑提醒我们--recursive不能省但即使加了也建议在编译前主动执行一次git submodule update --init --recursive特别是网络不稳定的时候。7.4 编不过提示缺少Fast-DDS相关包现象PX4编译时提示找不到fastdds或fastcdr。排查过程PX4 v1.14的构建依赖Fast-DDS的C库用于uXRCE-DDS相关功能的编译。Ubuntu 22.04的ROS2 Humble环境自带Fast-DDS但PX4源码的构建环境可能没找到。解决sudo apt install -y ros-humble-rmw-fastrtps-cpp sudo apt install -y libfastcdr-dev装完重试。如果还报错检查CMakeLists.txt里的FASTDDS相关选项确认CMake缓存没有残留旧路径。这个问题有一个隐藏前提PX4编译时会尝试自动查找fastdds如果之前装过ROS2的某些包把环境变量搞乱了也会导致找不到。最彻底的办法是用PX4官方提供的ubuntu.sh脚本装完所有依赖后再单独补装上面两个包。7.5 开启HITL模式后QGC提示飞控没有响应现象在QGC里把SYS_HITL改成1后飞控重启QGC提示连接超时过一会儿才能恢复。排查过程这是HITL切换后飞控重新初始化的正常现象不用慌。因为HITL模式下PX4初始化时会等待仿真器的MAVLink连接没有仿真数据时会反复尝试。QGC也会因为串口链路短暂中断而提示超时。解决在QGC连接恢复后不要急着操作先把Gazebo的HITL环境启动起来。一旦仿真数据进来飞控状态就会稳定。如果长时间连不上检查是否错误地让PX4从SD卡里加载了一个旧的、不是HITL模式的启动配置。7.6 ROS2话题列表里看不到任何/fmu/out话题现象MicroXRCEAgent已经启动PX4也设置了UXRCE_DDS_CFG飞控重启过但ros2 topic list里没有/fmu/out/*。排查过程这个坑花了我最多时间一步步拆先确认Agent日志有没有输出新连接。如果没有说明PX4的uXRCE-DDS客户端根本没发出连接。检查接线TELEM2的TX接到了串口模块的RX吗GND共地了吗半路中有一根杜邦线松了这个最隐蔽。检查波特率SER_TEL2_BAUD和MicroXRCEAgent的-b参数必须一致我一开始设了115200两边一样但TELEM2默认的MAVLink遥测也是这个波特率可能存在争用问题后来统一改成921600问题解决。确认设备节点/dev/ttyUSB0是不是USB-TTL模块的节点如果插了多个设备容易搞混。解决改用921600波特率重新插拔串口线确认设备节点重启MicroXRCEAgent然后飞控断电重启。整个过程注意顺序先起Agent再上电飞控话题列表马上就有了。7.7 Gazebo启动后黑屏或者模型加载一半崩溃现象执行make px4_sitl gazebo-classic_hitl后终端有输出但Gazebo窗口一片漆黑或者模型一出现就崩溃退出。排查过程先查是不是电脑显卡驱动问题Ubuntu 22.04在虚拟机里跑Gazebo经常遇到OpenGL渲染问题。在终端里输入echo $DISPLAY确认显示环境如果是远程SSH连接且没有X11转发黑屏是必然的。如果你在实体机上还是黑屏尝试更新显卡驱动。解决实体机上运行正常后如果还崩溃检查模型文件路径。make px4_sitl gazebo-classic_hitl会去加载Tools/sitl_gazebo/worlds/hitl_iris.world如果这个文件不存在说明源码不完整补全submodule即可。7.8 每次启动都要重新配置一堆环境变量现象新开一个终端ros2命令找不到make px4_sitl也找不到。排查过程ROS2和PX4的环境变量没有持久化。解决把以下内容追加到~/.bashrcsource /opt/ros/humble/setup.bash source ~/ws_px4/install/setup.bashPX4源码编译后生成的环境变量可以不用加因为HITL启动用make命令会自动设置。但ROS2的source必须加否则ros2、colcon全都用不了。8. 从HITL到实际开发还可以继续深挖的三个方向到这里HITL仿真的主线已经完整跑通了。但如果你是为了做开发这条链路只是起点后面还有几个值得延伸的方向。8.1 在ROS2里订阅并处理PX4数据上面用的是ros2 topic echo被动观察实际开发中你肯定希望写自己的节点。推荐先跑一下px4_ros_com自带的监听节点ros2 launch px4_ros_com sensor_combined_listener.launch.py这个launch文件会启动一个订阅/fmu/out/sensor_combined并打印数据的节点。你可以基于它改写订阅姿态、位置、速度等话题构建自己的状态监视节点。8.2 从HITL扩展到外部视觉仿真HITL模式下PX4的状态估计器使用的是仿真传感器数据。如果你想接入一个视觉SLAM节点比如ORB-SLAM3给PX4提供视觉位姿你可以直接在Gazebo环境中加载一个真实摄像头传感器模型把图像通过ROS2的image_transport发给SLAM节点SLAM输出的位姿再通过MAVLink或者uORB消息注入PX4。这条链路的搭建就非常接近实际机载计算机的联调场景了。8.3 测试故障注入和失效保护HITL相比SITL在测试失效保护逻辑上有一个巨大优势PX4是真固件参数、传感器失效检测逻辑都是真实运行的。你可以在Gazebo里关掉某个传感器的仿真输出观察飞控是否正确进入着陆模式。这种测试结果比SITL更可信。我在测试GPS丢失场景时就是在Gazebo的world文件里动态停用GPS sensor插件然后看QGC的EKF状态和/fmu/out/vehicle_status里导航状态的变化。这个测试用SITL也能做但HITL下飞控的传感器健康管理逻辑是跑在真实硬件上的延迟和故障表现更接近真机。最后分享一个我自己的使用习惯每次启动HITL仿真我都固定按这个顺序操作先打开终端启动MicroXRCEAgent再给飞控上电等QGC连接稳定然后启动Gazebo HITL环境最后在Gazebo地图里把飞机拖拽几下确认QGC姿态同步后再解锁。这个习惯帮我避免了很多莫名其妙的“第一次启动失败”。特别是MicroXRCEAgent和飞控之间的串口连接一旦出现连接不稳定最直接的解决方法是把两端设备重新上电而不是反复重启Ros2节点。另外如果你打算长期做PX4开发建议把SYS_HITL参数和UXRCE_DDS_CFG参数的配置截图保存好因为飞控固件一更新这些参数很可能会被重置。HITL本身不复杂复杂的是它跟环境的耦合。把版本锁死把链路理清按顺序启动这套环境会非常稳定。
返回列表