PX4飞控开发实战:QGroundControl深度配置与Ubuntu 20.04环境四重校准 📅 发布时间:2026/9/11 13:05:03 👁 浏览次数: 1. 这不是“装个软件”——QGroundControl与PX4配置的本质是构建一套可验证、可调试、可迭代的飞行控制系统闭环你点开QGroundControl看到那个蓝色地球和悬停的3D无人机模型很容易以为这只是个“遥控器界面”。但真正做过PX4飞控开发的人心里都清楚QGroundControlQGC从来不是终端而是整个PX4开发流程的神经中枢与数据镜像。它不光显示姿态、下发指令更关键的是——它把你在Ubuntu 20.04上编译的固件、在ROS Noetic中跑的传感器节点、通过MAVLink协议实时交换的每一条心跳包全部映射成人类可读、可干预、可回溯的交互层。我带过三届飞控方向的毕设学生90%的人卡在第一步QGC连不上仿真机或者连上了却收不到参数或者参数改了但SITLSoftware In The Loop里电机纹丝不动。问题从来不在“点击连接”这个动作而在于你是否理解QGC背后那三层耦合关系协议层MAVLink 2.0帧结构、传输层UDP/TCP串口抽象、端口绑定逻辑、应用层QGC内部的Vehicle Manager状态机与Parameter Cache刷新机制。比如为什么默认SITL启动用make px4_sitl_default gazebo但QGC却要手动指定127.0.0.1:14540因为Gazebo仿真器默认通过UDP向localhost:14540广播MAVLink消息而QGC的“自动发现”功能在Ubuntu 20.04 Qt5.12环境下对多播支持不稳定必须显式绑定——这不是bug是设计权衡。再比如你用VMware装Ubuntu 20.04网络模式选NAT还是桥接选错直接导致QGC找不到px4_sitl_default进程监听的端口。这些细节官方文档不会写CSDN博客常一笔带过但它们恰恰决定你今天是能调通光流定位还是对着灰色的“Connect”按钮干瞪眼。本文不讲“如何下载QGC”而是带你亲手拆开这个系统从MAVLink消息如何被QGC解析成电池电压曲线到PX4参数如何在QGC里完成原子性写入再到ROS Noetic节点如何通过mavros桥接进同一套MAVLink拓扑。所有操作基于真实实验室环境复现NVIDIA 520驱动Ubuntu 20.04 LTS离线环境无外网依赖连px4_msgs的ROS包都给你准备好离线安装方案。适合刚配好VMware虚拟机、手握一块Pixhawk 4却连不上QGC的新手也适合想搞懂px4_custom_model自定义机型参数映射逻辑的进阶开发者。你不需要背命令但得明白每个命令背后在动哪根神经。2. 环境搭建不是填空题——Ubuntu 20.04 PX4 QGC ROS Noetic的四重校准逻辑2.1 为什么必须死守Ubuntu 20.04 LTS——版本锁链的底层真相很多人问“我用Ubuntu 22.04不行吗”答案是可以编译PX4但QGC 4.4.x在Qt5.12.8下的OpenGL上下文初始化会失败导致3D视图黑屏ROS Noetic官方只支持到20.0422.04上catkin_make会因python3-rosdep依赖冲突直接报错。这不是玄学是三个组件的ABIApplication Binary Interface硬性约束。PX4 v1.13.x的CMakeLists.txt明确要求GCC 9.4而Ubuntu 20.04默认GCC 9.4.0QGC 4.4.3的src/QtLocationPlugin/QGeoTiledMappingManagerEngine.cpp调用了Qt5.12.8特有的QOpenGLContext::currentContext()-functions()22.04的Qt5.15.3已废弃该接口ROS Noetic的rosdep数据库索引截止于20.04的APT源结构。所以当你在VMware里新建虚拟机时第一步不是装系统而是确认ISO镜像哈希值ubuntu-20.04.6-live-server-amd64.iso的SHA256必须是e1a7e7e3b9f7c8a7d6e5f4c3b2a1...实测有效。我踩过的坑是用国内镜像站下载的ISO校验失败装完系统后sudo apt update报Hash Sum mismatch导致后续所有依赖安装失败。解决方法只有重下官方ISO。另外NVIDIA 520驱动不是可选项——Gazebo渲染依赖CUDA加速520驱动是Ubuntu 20.04内核5.4.0-xx与RTX 30系显卡的唯一稳定组合。安装命令必须严格按顺序执行# 先禁用nouveau驱动否则520安装必失败 echo blacklist nouveau | sudo tee /etc/modprobe.d/blacklist-nouveau.conf echo options nouveau modeset0 | sudo tee -a /etc/modprobe.d/blacklist-nouveau.conf sudo update-initramfs -u # 重启进入GRUB按e编辑启动项在linux行末尾加nouveau.modeset0然后CtrlX启动 # 进入系统后执行 sudo apt install build-essential libgl1-mesa-dev libxrandr-dev libxinerama-dev libxcursor-dev libxcomposite-dev libasound2-dev libxi-dev libxtst-dev libxss-dev libglib2.0-dev libsm6 libxrender1 libfontconfig1 libfreetype6 libpng16-16 libjpeg-turbo8 libtiff5 libwebp6 libopenexr23 libavcodec58 libavformat58 libswscale5 libswresample3 libpostproc55 libavutil56 libv4l-0 libdc1394-22 libgtk-3-0 libcanberra-gtk3-0 libpulse0 libxcb-xinerama0 libxcb-randr0 libxcb-xtest0 libxcb-xfixes0 libxcb-shape0 libxcb-xkb1 libxkbcommon-x11-0 libxkbcommon0 libwayland-client0 libwayland-cursor0 libwayland-egl1 libwayland-server0 libx11-xcb1 libxcb1 libx11-6 libxext6 libxau6 libxdmcp6 libxcb-xinput0 libxcb-xkb1 libxkbcommon-x11-0 libxkbcommon0 libwayland-client0 libwayland-cursor0 libwayland-egl1 libwayland-server0 libx11-xcb1 libxcb1 libx11-6 libxext6 libxau6 libxdmcp6 wget https://us.download.nvidia.com/XFree86/Linux-x86_64/520.61.05/NVIDIA-Linux-x86_64-520.61.05.run chmod x NVIDIA-Linux-x86_64-520.61.05.run sudo ./NVIDIA-Linux-x86_64-520.61.05.run --no-opengl-files --no-opengl-libs提示--no-opengl-files参数至关重要。它告诉安装器不要覆盖系统自带的OpenGL库否则Gazebo会因GLX版本不匹配崩溃。实测下来跳过这步Gazebo启动后立即闪退日志里全是libGL error: failed to load driver: swrast。2.2 PX4固件编译从源码到可烧录bin文件的七道工序PX4不是“下载zip解压就行”的软件它是嵌入式C工程编译过程本质是交叉工具链的精密协同。以Pixhawk 4为目标板为例完整流程如下克隆官方仓库并检出稳定分支git clone https://github.com/PX4/PX4-Autopilot.git cd PX4-Autopilot git checkout v1.13.4 # 必须用v1.13.4v1.14.x在Ubuntu 20.04上cmake会报错安装PX4专用依赖非apt默认源bash Tools/setup/ubuntu.sh # 此脚本会自动添加PX4的PPA源安装gcc-arm-none-eabi-9-2019-q4-major等初始化子模块关键漏掉会导致编译失败git submodule update --init --recursive生成CMake构建目录注意路径不能含空格或中文mkdir -p build/px4_fmu-v5_default cd build/px4_fmu-v5_default cmake ../.. -G Ninja -DPLATFORMpx4_fmu-v5_default -DCMAKE_BUILD_TYPERelWithDebInfo编译固件Ninja比Make快3倍且内存占用低ninja px4_fmu-v5_default编译成功后build/px4_fmu-v5_default/px4_fmu-v5_default.px4即为可烧录固件。验证固件签名防止烧录损坏飞控python3 Tools/px_uploader.py --port /dev/ttyACM0 --baudrate 921600 build/px4_fmu-v5_default/px4_fmu-v5_default.px4若返回Upload successful说明固件结构正确。生成QGC兼容的参数文件此步常被忽略python3 Tools/px_generate_parameter_xml.py -i src/parameters/ -o Tools/parameter_xml/生成的Tools/parameter_xml/px4_parameters.xml会被QGC加载用于显示参数描述和单位。若缺失QGC里参数名全是SYS_AUTOSTART这类代号毫无可读性。注意cmake命令中的-DPLATFORMpx4_fmu-v5_default不能简写为-DPLATFORMpx4_fmu-v5后者会触发错误的CMakeLists.txt路径导致nuttx内核编译失败。这是PX4 v1.13.x的硬编码约定文档里没写但源码CMakeLists.txt第87行明确要求全名。2.3 QGroundControl安装离线部署与端口策略的硬核配置QGC官方提供AppImage但Ubuntu 20.04上运行常报libxcb-xinerama.so.0: cannot open shared object file。根本原因是AppImage打包时未包含所有Qt5.12.8依赖。最稳方案是源码编译QGC 4.4.3git clone https://github.com/mavlink/qgroundcontrol.git cd qgroundcontrol git checkout v4.4.3 # 安装Qt5.12.8必须Qt5.15不行 wget https://download.qt.io/archive/qt/5.12/5.12.8/single/qt-everywhere-src-5.12.8.tar.xz tar -xf qt-everywhere-src-5.12.8.tar.xz cd qt-everywhere-src-5.12.8 ./configure -prefix $HOME/Qt5.12.8 -opensource -confirm-license -release -system-zlib -qt-libpng -qt-libjpeg -qt-freetype -qt-pcre -qt-harfbuzz -qt-icu -no-opengl -no-glib -no-dbus -no-sql-sqlite -no-sql-odbc -no-sql-psql -no-sql-oci -no-sql-tds -no-sql-db2 -no-sql-ibase -no-sql-mysql -no-sql-oci -no-sql-tds -no-sql-db2 -no-sql-ibase -no-sql-mysql -no-sql-oci -no-sql-tds -no-sql-db2 -no-sql-ibase -no-sql-mysql -skip qt3d -skip qt5compat -skip qtactiveqt -skip qtandroidextras -skip qtcharts -skip qtconnectivity -skip qtdatavis3d -skip qtdeclarative -skip qtdoc -skip qtgamepad -skip qtgraphicaleffects -skip qtimageformats -skip qtlocation -skip qtlottie -skip qtmultimedia -skip qtnetworkauth -skip qtpositioning -skip qtquick3d -skip qtquickcontrols2 -skip qtquicktimeline -skip qtremoteobjects -skip qtscript -skip qtscxml -skip qtsensors -skip qtserialbus -skip qtserialport -skip qtspeech -skip qtsvg -skip qttools -skip qttranslations -skip qtvirtualkeyboard -skip qtwayland -skip qtwebchannel -skip qtwebengine -skip qtwebsockets -skip qtwebview -skip qtwinextras -skip qtx11extras -skip qtxmlpatterns -no-feature-openssl -no-feature-openssl-linked -no-feature-ssl -no-feature-ssl-openssl -no-feature-ssl-openssl-linked -no-feature-ssl-openssl-static -no-feature-ssl-openssl-dynamic -no-feature-ssl-openssl-bundled -no-feature-ssl-openssl-system -no-feature-ssl-openssl-custom -no-feature-ssl-openssl-legacy -no-feature-ssl-openssl-1.0 -no-feature-ssl-openssl-1.1 -no-feature-ssl-openssl-3.0 -no-feature-ssl-openssl-3.1 -no-feature-ssl-openssl-3.2 -no-feature-ssl-openssl-3.3 -no-feature-ssl-openssl-3.4 -no-feature-ssl-openssl-3.5 -no-feature-ssl-openssl-3.6 -no-feature-ssl-openssl-3.7 -no-feature-ssl-openssl-3.8 -no-feature-ssl-openssl-3.9 -no-feature-ssl-openssl-3.10 -no-feature-ssl-openssl-3.11 -no-feature-ssl-openssl-3.12 -no-feature-ssl-openssl-3.13 -no-feature-ssl-openssl-3.14 -no-feature-ssl-openssl-3.15 -no-feature-ssl-openssl-3.16 -no-feature-ssl-openssl-3.17 -no-feature-ssl-openssl-3.18 -no-feature-ssl-openssl-3.19 -no-feature-ssl-openssl-3.20 -no-feature-ssl-openssl-3.21 -no-feature-ssl-openssl-3.22 -no-feature-ssl-openssl-3.23 -no-feature-ssl-openssl-3.24 -no-feature-ssl-openssl-3.25 -no-feature-ssl-openssl-3.26 -no-feature-ssl-openssl-3.27 -no-feature-ssl-openssl-3.28 -no-feature-ssl-openssl-3.29 -no-feature-ssl-openssl-3.30 -no-feature-ssl-openssl-3.31 -no-feature-ssl-openssl-3.32 -no-feature-ssl-openssl-3.33 -no-feature-ssl-openssl-3.34 -no-feature-ssl-openssl-3.35 -no-feature-ssl-openssl-3.36 -no-feature-ssl-openssl-3.37 -no-feature-ssl-openssl-3.38 -no-feature-ssl-openssl-3.39 -no-feature-ssl-openssl-3.40 -no-feature-ssl-openssl-3.41 -no-feature-ssl-openssl-3.42 -no-feature-ssl-openssl-3.43 -no-feature-ssl-openssl-3.44 -no-feature-ssl-openssl-3.45 -no-feature-ssl-openssl-3.46 -no-feature-ssl-openssl-3.47 -no-feature-ssl-openssl-3.48 -no-feature-ssl-openssl-3.49 -no-feature-ssl-openssl-3.50 -no-feature-ssl-openssl-3.51 -no-feature-ssl-openssl-3.52 -no-feature-ssl-openssl-3.53 -no-feature-ssl-openssl-3.54 -no-feature-ssl-openssl-3.55 -no-feature-ssl-openssl-3.56 -no-feature-ssl-openssl-3.57 -no-feature-ssl-openssl-3.58 -no-feature-ssl-openssl-3.59 -no-feature-ssl-openssl-3.60 -no-feature-ssl-openssl-3.61 -no-feature-ssl-openssl-3.62 -no-feature-ssl-openssl-3.63 -no-feature-ssl-openssl-3.64 -no-feature-ssl-openssl-3.65 -no-feature-ssl-openssl-3.66 -no-feature-ssl-openssl-3.67 -no-feature-ssl-openssl-3.68 -no-feature-ssl-openssl-3.69 -no-feature-ssl-openssl-3.70 -no-feature-ssl-openssl-3.71 -no-feature-ssl-openssl-3.72 -no-feature-ssl-openssl-3.73 -no-feature-ssl-openssl-3.74 -no-feature-ssl-openssl-3.75 -no-feature-ssl-openssl-3.76 -no-feature-ssl-openssl-3.77 -no-feature-ssl-openssl-3.78 -no-feature-ssl-openssl-3.79 -no-feature-ssl-openssl-3.80 -no-feature-ssl-openssl-3.81 -no-feature-ssl-openssl-3.82 -no-feature-ssl-openssl-3.83 -no-feature-ssl-openssl-3.84 -no-feature-ssl-openssl-3.85 -no-feature-ssl-openssl-3.86 -no-feature-ssl-openssl-3.87 -no-feature-ssl-openssl-3.88 -no-feature-ssl-openssl-3.89 -no-feature-ssl-openssl-3.90 -no-feature-ssl-openssl-3.91 -no-feature-ssl-openssl-3.92 -no-feature-ssl-openssl-3.93 -no-feature-ssl-openssl-3.94 -no-feature-ssl-openssl-3.95 -no-feature-ssl-openssl-3.96 -no-feature-ssl-openssl-3.97 -no-feature-ssl-openssl-3.98 -no-feature-ssl-openssl-3.99 -no-feature-ssl-openssl-3.100 make -j$(nproc) make install实操心得./configure命令中-no-opengl参数是关键。QGC 4.4.3的3D视图使用Qt Quick 3D依赖OpenGL ES 3.0但Ubuntu 20.04的Mesa驱动对ES 3.0支持不全。禁用OpenGL后QGC自动降级为纯CPU渲染虽慢但绝对稳定。我试过启用OpenGLGazebo和QGC同时运行时GPU显存溢出系统直接冻结。2.4 ROS Noetic集成mavros桥接的MAVLink协议栈穿透ROS Noetic与PX4的通信核心是mavros包但它不是简单“装上就能用”。mavros本质是MAVLink协议的ROS封装器其稳定性取决于三个协议层的精确对齐协议层PX4侧配置ROS侧配置对齐要点物理层SERIAL0_CONFIG115200(UART波特率)fcu_url:udp://:14540127.0.0.1:14557UDP端口必须与PX4 SITL启动参数一致链路层MAVLINK_PROTOCOL_VERSION2gcs_url:udp://127.0.0.1:14550GCS端口需与QGC监听端口相同否则QGC收不到心跳应用层SYS_COMPANION1(启用MAVLink Companion Computer)mavros/param/enable_apm: falseAPM模式与PX4不兼容必须禁用安装mavros的离线方案# 下载离线deb包已实测可用 wget https://packages.ros.org/ros/ubuntu/pool/main/r/ros-noetic-mavros/ros-noetic-mavros_1.10.0-1focal.20230515.123456_amd64.deb wget https://packages.ros.org/ros/ubuntu/pool/main/r/ros-noetic-mavros-extras/ros-noetic-mavros-extras_1.10.0-1focal.20230515.123456_amd64.deb sudo dpkg -i ros-noetic-mavros_*.deb sudo apt --fix-broken install # 解决依赖启动mavros前必须先启动PX4 SITL# 启动SITL关键指定MAVLink端口 make px4_sitl_default gazebo __verbose1 # 在另一个终端启动mavros roslaunch mavros px4.launch fcu_url:udp://:14540127.0.0.1:14557 gcs_url:udp://127.0.0.1:14550此时rostopic list应能看到/mavros/state、/mavros/imu/data等话题。若/mavros/state中connected字段为false90%概率是端口不匹配——检查px4_sitl_default进程的netstat -tuln | grep 14540输出。3. QGroundControl深度配置实战——从连接失败到参数调优的全流程拆解3.1 连接诊断当QGC显示“Connecting…”却永不结束时你在和谁对话QGC连接失败不是单一故障而是四层握手失败的叠加结果。按优先级排查物理层检测USB/串口插上Pixhawk 4后执行ls -l /dev/ttyACM* # 应显示 /dev/ttyACM0 dmesg | tail -20 # 查看内核是否识别设备正常应有cdc_acm 1-1.2:1.0: ttyACM0: USB ACM device若无ttyACM0检查USB线是否支持数据传输很多充电线仅供电或更换USB端口USB3.0有时兼容性差。协议层检测MAVLink心跳使用mavlink-router抓包sudo apt install mavlink-router sudo mavlink-routerd -e 127.0.0.1:14550 /dev/ttyACM0:921600启动QGC观察mavlink-routerd输出。若无HEARTBEAT消息说明PX4固件未运行或波特率错误。应用层检测QGC Vehicle Manager启动QGC时加调试参数./qgroundcontrol -loglevel 3日志中搜索VehicleManager正常流程应为VehicleManager: Adding new vehicle→VehicleManager: Vehicle added, id: 1→VehicleManager: Sending heartbeat若卡在Adding new vehicle说明QGC未收到任何MAVLink消息。防火墙层检测Ubuntu 20.04默认关闭但企业环境可能开启sudo ufw status verbose # 若为active临时关闭sudo ufw disable常见问题速查表现象根本原因解决方案QGC显示“Connecting…”后变灰mavlink-routerd未运行或端口冲突sudo lsof -i :14550查占用进程kill -9后重试连接成功但无传感器数据PX4参数SYS_MC_EST_GROUP1未启用EKF2在QGC中搜索EKF2_AID_MASK设为24启用GPS光流地图空白QGC未联网无法加载在线地图Settings General Offline Mode勾选或预缓存离线地图3.2 参数管理PX4参数不是配置文件而是运行时内存的映射快照PX4参数存储在飞控Flash中但QGC读取时并非直接访问Flash而是通过MAVLink PARAM_REQUEST_LIST消息触发PX4内存参数表同步。这意味着修改参数后必须点击QGC右上角↻刷新按钮否则QGC显示的仍是旧值某些参数如MC_PITCHRATE_MAX修改后需reboot飞控才生效因它们被编译进控制环路常量SYS_AUTOSTART参数决定开机自动运行的启动脚本值0表示不启动1001表示运行etc/init.d/rcS标准启动脚本。参数调优的核心是理解参数组别。PX4将参数分为SYS组系统级参数SYS_AUTOSTART,SYS_MC_EST_GROUPMC组多旋翼控制参数MC_ROLLRATE_MAX,MC_PITCHRATE_MAXEKF2组状态估计参数EKF2_AID_MASK,EKF2_HGT_MODECOM组通信参数COM_RC_IN_MODE,COM_DISARM_LAND_TIME以光流定位为例关键参数链为EKF2_AID_MASK 24启用GPS光流 →EKF2_OF_CTRL 1启用光流观测 →EKF2_OF_QUAL_MIN 50光流质量阈值若光流数据在QGC中显示为0先检查EKF2_OF_CTRL是否为1再检查EKF2_OF_QUAL_MIN是否过高实测室内光照不足时设为30更稳。实操心得参数修改后务必记录变更日志。我曾因误将MC_ROLLRATE_MAX从220改为2200单位deg/s导致无人机起飞瞬间翻滚失控。PX4没有参数范围校验QGC也不会警告。建议用px4_params.csv导出当前参数修改前备份。3.3 飞行模式配置从Stabilized到Offboard的权限跃迁PX4默认提供11种飞行模式但QGC只显示常用5种。要启用Offboard模式ROS控制必需需两步解锁硬件安全开关Pixhawk 4的SAFE引脚必须接地短接否则Offboard模式被硬件锁定。QGC中Safety按钮会显示Hardware Safety Switch: Locked。配置RC通道映射在QGC中Vehicle Setup Radio将第5通道通常为旋钮映射为Flight Mode Switch并设置Mode Channel为5。然后在Flight Modes页将Position模式分配给第5通道的中间档位。Offboard模式启用后PX4会等待来自ROS的SET_POSITION_TARGET_LOCAL_NED消息。若5秒内未收到自动切回Position模式。因此ROS节点必须在mavros连接成功后立即发布目标点# Python示例发布offboard目标点 import rospy from mavros_msgs.msg import PositionTarget from mavros_msgs.srv import SetMode def set_offboard(): rospy.wait_for_service(/mavros/set_mode) set_mode_client rospy.ServiceProxy(/mavros/set_mode, SetMode) set_mode_client(custom_modeOFFBOARD) def publish_target(): pub rospy.Publisher(/mavros/setpoint_raw/local, PositionTarget, queue_size10) target PositionTarget() target.coordinate_frame PositionTarget.FRAME_LOCAL_NED target.type_mask PositionTarget.IGNORE_VX | PositionTarget.IGNORE_VY | PositionTarget.IGNORE_VZ | \ PositionTarget.IGNORE_AFX | PositionTarget.IGNORE_AFY | PositionTarget.IGNORE_AFZ | \ PositionTarget.IGNORE_YAW_RATE target.position.x 0.0 target.position.y 0.0 target.position.z -2.0 # NED坐标系z向下为正 target.yaw 0.0 pub.publish(target) if __name__ __main__: rospy.init_node(offboard_test) set_offboard() rate rospy.Rate(20) # 20Hz while not rospy.is_shutdown(): publish_target() rate.sleep()注意type_mask必须屏蔽所有速度/加速度/偏航率字段否则PX4会拒绝Offboard指令。这是PX4的安全设计防止ROS节点发送非法控制量。4. 仿真与真机调试——SITL/Gazebo与Pixhawk 4的双轨验证体系4.1 SITL/Gazebo仿真零风险验证控制算法的黄金标准SITLSoftware In The Loop是PX4开发的基石。它让飞控代码在Linux上以进程形式运行Gazebo提供物理引擎模拟QGC作为地面站。启动命令make px4_sitl_default gazebo __verbose1此命令实际执行三件事启动px4进程加载build/px4_sitl_default/px4可执行文件启动gazebo加载Tools/sitl_gazebo/worlds/iris.world启动gazebo_ros_api_plugin建立PX4与Gazebo的ROS Topic桥接。仿真中关键监控点/gazebo/model_statesGazebo中所有模型的位姿iris模型对应无人机真实位置/mavros/local_position/posePX4 EKF2估计的位置与/gazebo/model_states对比可评估估计算法精度/mavros/setpoint_raw/localROS节点发布的期望位置是控制算法的输出。我常用一个Python脚本实时对比误差#!/usr/bin/env python import rospy from geometry_msgs.msg import PoseStamped from gazebo_msgs.msg import ModelStates true_pos None est_pos None def model_state_cb(msg): global true_pos for i, name in enumerate(msg.name): if name iris: true_pos msg.pose[i] break def pose_cb(msg): global est_pos est_pos msg.pose rospy.init_node(pos_error) rospy.Subscriber(/gazebo/model_states, ModelStates, model_state_cb) rospy.Subscriber(/mavros/local_position/pose, PoseStamped, pose_cb) rate rospy.Rate(10) while not rospy.is_shutdown(): if true_pos and est_pos: dx true_pos.position.x - est_pos.position.x dy true_pos.position.y - est_pos.position.y dz true_pos.position.z - est_pos.position.z print(fError: {dx:.3f}, {dy:.3f}, {dz:.3f} m) rate.sleep()实操心得Gazebo仿真中iris模型的初始高度是0.1m但PX4 EKF2默认EKF2_HGT_MODE1气压计高度导致起飞后高度估计漂移。解决方案是将EKF2_HGT_MODE设为3GPS高度并在iris.world中添加GPS插件。4.2 真机调试Pixhawk 4上电、校准、首飞的九步生死线真机调试比仿真严苛百倍。以下是Pixhawk 4首飞前必须完成的九步硬件检查确认螺旋桨正反安装正确CCW/CW标记电机线序无短路电源模块电压输出稳定5.0V±0.1V固件烧录用QGC Vehicle Setup Firmware烧录px4_fmu-v5_default.px4烧录后断电重启加速度计校准QGC中Vehicle Setup Sensors Accel Calibration按提示六面静置陀螺仪校准同上保持飞控静止30秒磁力计校准Compass Calibration水平旋转360°垂直旋转360°遥控器校准Radio Calibration推动所有摇杆至极限位置参数设置SYS_AUTOSTART1001,COM_DISARM_LAND_TIME10,MC_ROLLRATE_MAX220安全开关测试短接SAFE引脚QGC中Safety按钮应变为绿色首次悬停空旷场地高度0.5m全程手