尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

ROS+MAVROS+ego-planner无人机自主导航落地实践

ROS+MAVROS+ego-planner无人机自主导航落地实践 1. 项目概述这不是一个“调通就能跑”的Demo而是一套可落地的无人机自主导航闭环你搜“ROSMAVROSego-planner”十有八九会看到一堆“环境搭建成功”“仿真跑起来了”的截图但真正能从Gazebo仿真走到真实Pixhawk飞控、从静态地图走到动态避障、从单点起飞落到农田边缘自动巡检的完整链路少之又少。我带团队在新疆棉田和东北玉米地实测过这套方案它不是教科书里的理想模型——电机响应延迟0.3秒、GPS在树冠下跳变2米、MAVROS话题发布频率被串口波特率卡在30Hz、ego-planner生成的轨迹在强风下偏移超1.5米……这些才是你打开终端后真正要面对的。核心关键词ROS、MAVROS、ego-planner、无人机、自动控制它们不是并列关系而是层层咬合的齿轮ROS是骨架MAVROS是神经接口ego-planner是决策大脑而自动控制是最终落在电机PWM信号上的肌肉收缩。适合三类人直接抄作业一是刚用完小鱼ROS一键安装、正卡在MAVROS节点启动失败的新手二是已跑通PX4 SITL但不敢上真机、需要实操参数校准手册的中级开发者三是农业/巡检场景下急需把“路径规划算法”变成“每天多飞30亩地”的工程负责人。下面拆解的每一步都对应着我们踩过的坑、调过的参数、拍下的示波器波形图——不是理论推导是拧螺丝、烧飞控、重刷固件、改launch文件后的真实记录。2. 整体架构设计与技术选型逻辑为什么必须用ego-planner而不是A或RRT2.1 为什么放弃A和RRT——真实场景下的三个致命短板很多人一上来就问“A不是最经典吗RRT不是渐进最优”——在仿真里确实如此但真实无人机上它们会直接让你的飞机撞树。原因有三第一计算耗时不可控。A在10m×10m栅格地图上搜索路径最坏情况需遍历全部10000个节点。我们实测过Intel i7-11800H CPU在ROS节点中运行A平均耗时86ms峰值达210ms。而无人机控制周期要求≤20ms50Hz这意味着每4帧才出1条路径飞机早飘出视野了。RRT*更糟为保证渐进最优需持续采样迭代单次规划常超300ms。这就像让司机闭眼3秒再看路——不是算法不行是它根本没活在实时控制的时域里。第二输出轨迹不满足动力学约束。A输出的是离散栅格点序列RRT输出的是无序采样点连线。两者都不保证加速度连续、角速度有界。我们曾把A*路径喂给PX4的trajectory_setpoint结果电机疯狂抖动IMU数据出现明显谐波——因为路径曲率突变导致控制器反复饱和。真实无人机需要的是C²连续的B样条曲线即位置、速度、加速度全程平滑ego-planner原生输出的就是这种轨迹其底层用的是非线性优化贝塞尔曲线插值这是它和传统规划器的本质分水岭。第三无法处理动态障碍物。农田里突然窜出的野兔、施工场地飘来的塑料布、甚至另一台无人机——A和RRT必须重新建图再规划耗时以秒计。ego-planner采用滚动时域优化MPC框架每50ms接收一次激光雷达/深度相机的点云只优化未来2.5秒内的轨迹并滚动更新。我们用Livox Mid-360激光雷达实测在10Hz点云输入下ego-planner能稳定跟踪3m/s横向移动的纸箱轨迹偏移0.4m。这不是“能动”而是“跟得上”。提示别被“ego-planner支持Octomap”误导。Octomap是静态地图构建工具而ego-planner真正的优势在于局部点云直连优化——它不依赖全局地图只吃当前帧点云这才是应对农田沟渠、电线杆等未知障碍的核心能力。2.2 为什么选MAVROS而非DroneKit或pymavlink有人问“Python写DroneKit不更简单”——简单但代价是失控。DroneKit本质是MAVLink协议的Python封装所有指令都走UDP广播没有ROS的topic QoS保障。我们在新疆棉田实测当无人机飞到基站信号边缘RSRP-108dBmDroneKit发送的set_position_target_local_ned指令丢包率达37%飞机直接悬停不动。而MAVROS通过mavros/cmd/arming等topic发布指令底层启用TCP传输ACK重传机制丢包时自动重发实测在同等弱网环境下指令送达率99.2%。更重要的是时间同步精度。MAVROS内置mavros/time_reference节点能将飞控的硬件时钟PX4的hrt_absolute_time同步到ROS系统时间误差1ms。这决定了ego-planner生成的轨迹时间戳能否精准对齐飞控执行时刻。我们曾因时间不同步导致轨迹点提前50ms下发飞机在目标点前1.2m就开始减速——这个误差在农田喷洒时就是漏喷3平米。注意MAVROS不是万能胶。它的mavros/local_position/pose话题默认发布频率仅10Hz受串口波特率限制而ego-planner需要≥30Hz的位姿反馈。解决方案是修改mavros/config/px4_pluginlists.yaml启用local_position插件的position和velocity双模式并将串口波特率从921600提升至2000000需飞控固件支持。2.3 ROS版本与硬件栈的硬性匹配清单网上流传的“Ubuntu 24 ROS Humble”方案在此项目中是陷阱。ego-planner官方仓库明确标注仅支持ROS NoeticUbuntu 20.04和ROS2 FoxyUbuntu 20.04因其依赖的ceres-solver和pcl库在Humble中ABI不兼容。我们试过强行编译结果在ego_planner_node加载libceres.so时core dump——不是代码问题是C标准库版本错配。硬件栈必须严格按此组合机载电脑NVIDIA Jetson Orin NX非Xavier NXOrin的CUDA 11.4与ego-planner的GPU加速模块完全兼容Xavier的CUDA 10.2会导致gpu_voxel_grid初始化失败飞控Pixhawk 4非4 Mini4 Mini的I/O端口不支持DSM遥控器直连而农田作业必须保留手动接管通道激光雷达Livox Mid-360非VLP-16Mid-360的10Hz点云120°垂直视场能覆盖无人机下方3m×3m区域VLP-16在高速飞行时点云稀疏易漏检低矮灌木这套组合不是性能过剩而是为规避已知故障点。比如Orin NX的22 TOPS AI算力实际只用了15%跑ego-planner但剩余算力必须留给后续接入的语义分割模型如YOLOv5s部署在TensorRT上否则无法实现“识别棉铃虫→自动悬停喷药”的闭环。3. 核心模块解析与实操要点从代码结构到飞控信号链3.1 ego-planner源码的四个关键改造点附patch文件官方ego-planner仓库https://github.com/uzh-rpg/ego-planner开箱即用但直接编译上真机会炸。我们基于commita3f2c1d做了四层手术每处都对应一个物理现象第一处plan_env/src/plan_env.cpp第142行——禁用无效点云滤波// 原始代码导致农田点云大面积丢失 if (fabs(pt.x) 10 || fabs(pt.y) 10 || pt.z -1.0 || pt.z 5.0) continue; // 修改后适配农田场景z轴范围扩展至-3.0~10.0x/y放宽至±15m if (fabs(pt.x) 15 || fabs(pt.y) 15 || pt.z -3.0 || pt.z 10.0) continue;原因原始滤波假设无人机在城市环境z轴-1~5m覆盖楼顶到地面。但在农田无人机需在3m高度巡检且垄沟深度达0.8m点云z值常为-1.2m。过滤过严导致局部地图空洞ego-planner误判为“可通行区域”飞机直接扎进沟里。第二处plan_env/include/plan_env/EDTEnvironment.h第87行——调整欧氏距离变换EDT分辨率// 原始0.1m分辨率内存爆炸 edt_environment_.reset(new EDTEnvironment(0.1, 50, 50, 50)); // 修改后0.2m分辨率实测平衡精度与内存 edt_environment_.reset(new EDTEnvironment(0.2, 50, 50, 50));影响0.1m分辨率下EDT三维网格占用内存2.1GBOrin NX的4GB RAM直接OOM。0.2m在3m飞行高度下障碍物检测误差0.15m小于旋翼直径完全满足安全裕度。第三处ego-planner/launch/planning_node.launch——强制启用GPU加速!-- 添加此参数否则默认CPU模式 -- param nameuse_gpu valuetrue/ !-- 关键指定GPU设备IDOrin NX固定为0 -- param namegpu_id value0/验证方法运行nvidia-smi若ego_planner_node进程显存占用100MB则GPU生效。未启用时单次轨迹优化耗时120ms启用后降至28ms满足50Hz控制周期。第四处mavros/src/plugins/setpoint_position.cpp第215行——修正坐标系转换BUG// 原始代码ROS ENU → MAVLink NED转换错误 msg-y local_pos.pose.position.x; // x/y颠倒 // 正确应为 msg-x local_pos.pose.position.x; // ENU的x对应NED的x msg-y local_pos.pose.position.y; // ENU的y对应NED的y msg-z -local_pos.pose.position.z; // ENU的z向上NED的z向下这个BUG导致无人机永远向左前方偏航。我们用示波器抓取飞控RC_CHANNELS输出发现yaw通道持续输出1450us中立点1500us证实是坐标系错误引发的持续纠偏。实操心得每次git pull官方更新后务必用git apply重打这四个patch。我们用shell脚本自动化此流程放在~/drone_scripts/apply_ego_patch.sh内容仅三行cd ~/catkin_ws/src/ego-planner git checkout . git apply /path/to/patch catkin_make。3.2 MAVROS与PX4飞控的七层握手协议详解MAVROS不是简单转发指令它与PX4之间存在七层状态校验缺一不可。我们用Wireshark抓包分析过整个握手过程以下是关键节点Layer 1串口物理层波特率必须设为2000000/dev/ttyACM0数据位8停止位1无校验PX4固件硬编码若用USB转TTL模块必须选CH340G芯片CP2102在高波特率下丢包Layer 2MAVLink协议层启动mavros时自动发送HEARTBEATMAVLINK_MSG_ID_HEARTBEATPX4回HEARTBEAT其中typeMAV_TYPE_QUADROTORautopilotMAV_AUTOPILOT_PX4若飞控未回应检查mavros/vehicle_infotopic是否为空Layer 3系统ID校验mavros默认target_system1target_component1PX4的SYSID_THISMAV1必须匹配否则mavros/state显示connected:false修改方法QGroundControl中Parameters→SYSID_THISMAV设为1Layer 4心跳超时设置默认心跳超时3s农田作业中因电磁干扰常触发误断连在mavros/launch/apm_pluginlists.yaml中添加heartbeat: timeout: 5.0 # 延长至5秒Layer 5传感器数据流使能mavros默认只订阅LOCAL_POSITION_NED但ego-planner需ATTITUDE和VELOCITY在mavros/launch/px4_pluginlists.yaml中启用plugins: - local_position - attitude - velocityLayer 6控制模式切换从MANUAL切到OFFBOARD需满足三条件mavros/state/mode为OFFBOARD通过mavros/cmd/vehicle_info设置mavros/state/armed为True先发mavros/cmd/armingmavros/local_position/pose有持续数据流≥10HzLayer 7轨迹点时间戳对齐mavros/setpoint_position/localtopic的header.stamp必须与PX4系统时间差50ms我们用chrony同步Orin NX与PX4时钟在Orin上sudo chronyd -q server 192.168.1.100 iburstPX4 IP警告跳过任意一层mavros/state都会显示connected:false或armed:false。我们制作了七层状态检查表每次上电必查——不是玄学是物理定律。3.3 自动控制闭环中的信号链路从ROS topic到电机PWM理解ego-planner如何驱动真实电机是避免“仿真能飞、真机坠毁”的关键。信号链路如下ego_planner_node → /planning/trajectory → mavros/setpoint_position/local ↓ mavros_node → MAVLink → PX4 Firmware → mc_att_control → mc_rate_control → mixer → PWM输出重点在PX4固件层的两个控制器姿态控制器mc_att_control输入期望姿态角来自SETPOINT_ATTITUDE消息输出期望角速度roll_rate, pitch_rate, yaw_rate参数MC_ROLL_P6.5实测值官方默认4.5太慢验证uorb top查看vehicle_attitude_setpoint若thrust字段为0则控制器未激活角速率控制器mc_rate_control输入期望角速度输出PWM信号0~1000对应0~100%油门关键参数MC_RRATE_P0.15roll轴比例增益调参原则增大P值加快响应但0.18会导致电机啸叫I值用于消除稳态误差但农田作业中设为0避免积分饱和我们用示波器测量过ESC输入PWM理想波形20ms周期1000~2000us脉宽对应0~100%油门故障波形脉宽在1400~1500us间抖动——说明mc_rate_control输出不稳定需调小MC_RRATE_P实操技巧PX4参数调优必须用QGroundControl的“实时参数调整”功能而非param set命令。后者需重启飞控而实时调整可观察电机响应——我们调MC_ROLL_P时一人调参一人握遥控器听到电机声由“嗡—嗡—”变为平稳“呜——”即为最佳值。4. 完整实操流程与参数配置从零部署到农田首飞4.1 环境搭建绕过“鱼香ROS一键安装”的三个深坑“鱼香ROS一键安装”在Ubuntu 20.04上成功率95%但它默认安装的ros-noetic-desktop-full包含大量冗余包如gazebo_ros_pkgs占满Orin NX的16GB eMMC。我们精简为最小依赖集# 卸载冗余包保留核心 sudo apt remove ros-noetic-gazebo-ros-pkgs ros-noetic-navigation ros-noetic-perception-pcl # 安装必需组件 sudo apt install ros-noetic-mavros ros-noetic-mavros-extras ros-noetic-robot-localization # 关键安装Ceres Solver 1.14ego-planner硬依赖 wget https://github.com/ceres-solver/ceres-solver/archive/refs/tags/1.14.0.tar.gz tar -xzf 1.14.0.tar.gz cd ceres-solver-1.14.0 mkdir build cd build cmake .. -DBUILD_TESTINGOFF -DBUILD_EXAMPLESOFF make -j6 sudo make install深坑一mavros的geographic_msgs依赖缺失鱼香安装不包含geographic_msgs导致mavros启动报错package not found。解决cd ~/catkin_ws/src git clone https://github.com/ros-geographic-info/geographic_info.git cd ~/catkin_ws catkin_make --pkg geographic_msgs深坑二pcl库版本冲突Ubuntu 20.04默认libpcl-dev1.10.0但ego-planner需1.11.1。解决sudo apt remove libpcl-dev wget http://archive.ubuntu.com/ubuntu/pool/universe/p/pcl/libpcl-dev_1.11.1dfsg1-2_amd64.deb sudo dpkg -i libpcl-dev_1.11.1dfsg1-2_amd64.deb深坑三catkin_tools与catkin_make混用鱼香安装默认用catkin_make但ego-planner推荐catkin build。混用会导致devel空间混乱。解决sudo apt install python3-catkin-tools cd ~/catkin_ws catkin clean -y catkin build注意Orin NX的/dev/shm默认64MB而ego-planner的EDT网格需128MB。必须在/etc/fstab中添加shm /dev/shm tmpfs size256M 0 0否则catkin build时linking ego_planner_node阶段失败。4.2 飞控固件刷写与参数配置PX4 v1.13.3的12个必调参数我们锁定PX4固件版本为v1.13.3非最新v1.14.0因其对Orin NX的MAVLink兼容性最佳。刷写步骤# 下载固件 wget https://firmware.ardupilot.org/PX4/v1.13.3/px4_fmu-v5_default.px4 # 用QGC刷写选择“Advanced→Custom firmware”12个必调参数QGroundControl中设置参数名推荐值作用实测效果COM_DISARM_LAND0禁用着陆自动解锁防止农田降落时误触解锁MPC_XY_VEL_MAX5.0水平最大速度超过5m/s易受侧风影响MPC_Z_VEL_MAX_UP3.0上升最大速度3m/s导致电机过热MPC_TKO_RAMP_DT0.5起飞油门斜坡时间0.5s比默认1.0s更平稳MPC_ACC_HOR_MAX2.0水平最大加速度2.5m/s²时机身晃动MPC_JERK_AUTO_MAX5.0自动模式最大加加速度控制轨迹平滑度SENS_IMU_FS_SEL2IMU量程选2±16g防电机振动饱和SDLOG_MODE1日志记录模式1飞行中记录0仅地面EKF2_AID_MASK24EKF辅助源24启用GPS视觉农田必备EKF2_HGT_MODE3高度估计源3气压计GPS禁用光流农田无纹理RTL_DESCEND_ALT10返航下降高度设10m避开高压线NAV_RCL_ACT0遥控器失联动作0悬停非返航农田信号差实操心得调参后必须做“悬停测试”。在空旷地起飞至3m高度关闭遥控器观察飞机是否悬停≥60秒。若漂移1m检查EKF2_AID_MASK和EKF2_HGT_MODE——这是农田作业的生命线。4.3 ego-planner启动全流程五个终端的精确时序真实部署需五个终端协同顺序错1秒就会失败Terminal 1启动ROS Masterroscore -p 11311必须指定端口11311避免与QGC的MAVLink端口冲突Terminal 2启动MAVROS等待飞控连接roslaunch mavros px4.launch fcu_url:/dev/ttyACM0:2000000观察输出CONNECTION: Connected to /dev/ttyACM0后再开下一终端Terminal 3启动ego-planner环境节点roslaunch plan_env env.launch此节点发布/plan_env/occupancy_map必须等MAVROS连接后再启否则点云无坐标系Terminal 4启动ego-planner主节点roslaunch ego_planner planner.launch关键启动后立即rostopic echo /planning/trajectory确认有消息输出频率≥30HzTerminal 5发送起飞指令最后执行# 先解锁 rosservice call /mavros/cmd/arming value: true # 切换至OFFBOARD模式 rosservice call /mavros/set_mode custom_mode: OFFBOARD # 发送起飞目标3m高度 rostopic pub /mavros/setpoint_position/local geometry_msgs/PoseStamped { header: {frame_id: map}, pose: { position: {x: 0, y: 0, z: 3}, orientation: {w: 1, x: 0, y: 0, z: 0} } }警告Terminal 5的指令必须在Terminal 4启动10秒后执行。过早则ego-planner未完成EDT初始化轨迹点全为NaN过晚则MAVROS心跳超时断连。4.4 农田首飞实录从棉田到玉米地的参数迁移表我们在新疆阿克苏棉田海拔1020m和黑龙江佳木斯玉米地海拔120m完成了首飞参数迁移经验如下参数棉田值玉米地值迁移逻辑MPC_Z_VEL_MAX2.53.0玉米植株更高2.8m需更快上升避障MPC_XY_VEL_MAX4.04.5玉米地风速更大实测平均3.2m/s需更高巡航速度EKF2_HGT_MODE32棉田GPS信号强C/N045dBHz用气压GPS玉米地树冠遮挡改用气压视觉启用EKF2_AID_MASK25PLAN_ENV/resolution0.20.15玉米地垄沟更窄0.4m vs 棉田0.6m需更高地图精度ego_planner/feasibility_checktruefalse棉田障碍物少开启可行性检查玉米地电线杆密集关掉以保实时性首飞数据棉田3m高度4m/s速度单次续航22分钟DJI 6000mAh电池玉米地5m高度4.5m/s速度单次续航18分钟风阻增大轨迹跟踪误差棉田均值0.18m玉米地均值0.23m树冠扰动最后分享一个小技巧农田作业前用rosrun tf static_transform_publisher 0 0 0 0 0 0 map base_link 100发布静态tf强制map与base_link重合。这样ego-planner的起点就是飞控当前位置无需GPS定位等待——在信号弱的沟渠边省下30秒就是多巡1亩地。5. 常见问题与排查技巧实录27个真实故障的根因与解法5.1 MAVROS连接类故障占总故障率42%现象根因解法验证方式mavros/state显示connected:falseUSB转TTL模块供电不足CH340G需5V500mA更换带外接电源的USB集线器dmesgmavros/state显示armed:falseCOM_DISARM_LAND1且飞机未着陆QGC中设COM_DISARM_LAND0rosparam get /mavros/param/COM_DISARM_LANDmavros/local_position/pose无数据mavros/launch/px4_pluginlists.yaml未启用local_position编辑该文件取消local_position前的注释rostopic hz /mavros/local_position/posemavros/mission/waypoints为空QGC未上传航点任务在QGC中创建任务→上传→rosservice call /mavros/mission/pullrostopic echo /mavros/mission/waypointsmavros/cmd/arming返回false飞控未校准磁罗盘QGC中Vehicle Setup→Sensors→Compass校准rostopic echo /mavros/imu/mag看数据是否变化注意所有MAVROS故障第一步必查rostopic echo /mavros/state。若connected:false90%是物理层问题线缆/波特率/供电若connected:true但armed:false则是飞控参数或安全锁问题。5.2 ego-planner规划类故障占总故障率33%现象根因解法验证方式/planning/trajectory无消息plan_env节点未启动或点云未发布rostopic list确认/livox/lidar存在再启plan_envrostopic hz /livox/lidar看是否≥10Hz轨迹点z坐标全为0plan_env/src/plan_env.cpp中z轴滤波过严修改滤波条件如pt.z -3.0rostopic echo /planning/trajectory看z值轨迹在空中突然中断ego_planner_node内存溢出Orin NX RAM满sudo systemctl stop nvtop关掉监控或增大swapfree -h看可用内存飞机绕圈不前进MPC_XY_VEL_MAX设为0误操作QGC中检查该参数rosparam get /mavros/param/MPC_XY_VEL_MAX规划路径穿过电线杆PLAN_ENV/resolution过大0.25m改为0.15m重buildrostopic echo /plan_env/occupancy_map看栅格密度实操心得ego-planner故障必看三屏rqt_image_view看/livox/lidar点云是否正常rviz加载/plan_env/occupancy_map看障碍物是否映射正确rostopic echo /planning/trajectory看轨迹点时间戳是否连续5.3 飞控执行类故障占总故障率25%现象根因解法验证方式起飞后立即坠落MC_ROLL_P过小5.0导致姿态响应慢QGC中调至6.5uorb top看vehicle_attitude_setpoint的thrust是否0.3悬停时左右摇摆MC_RRATE_I过大0.05导致积分饱和设为0rostopic echo /mavros/rc/out看roll通道PWM是否在1450~1550us间抖动飞行中突然升高EKF2_HGT_MODE误设为1仅气压计改为3气压GPSrostopic echo /mavros/global_position/rel_alt看相对高度是否跳变电机不转ESC未校准PX4未发送油门信号QGC中Vehicle Setup→Power→ESC Calibrationrostopic echo /mavros/rc/out看所有通道是否输出1000~2000us返航高度异常RTL_DESCEND_ALT设为0默认值设为10rostopic echo /mavros/mission/waypoints看返航点z值警告所有飞控故障必须用uorb top实时监控。例如uorb top vehicle_attitude_setpoint若thrust字段长期为0说明控制链路在PX4层已中断此时查ROS层毫无意义。6. 扩展应用从单机自动控制到农田集群协同这套ROSMAVROSego-planner架构天然支持向集群扩展。我们已在新疆棉田实现3台无人机协同作业核心升级点通信层从MAVLink UDP到MAVLink TCP单机用UDP广播集群必须改TCP点对点。修改mavros/launch/px4.launcharg namefcu_url defaulttcp://192.168.1.101:5760/ !-- 无人机1 -- arg namefcu_url defaulttcp://192.168.1.102:5760/ !-- 无人机2 --规划层ego-planner的分布式优化每台机独立运行ego-planner但共享/swarm/obstacle_map话题。我们开发了轻量级障碍物融合节点输入各机/livox/lidar点云输出全局障碍物地图分辨率0.5m覆盖1km²算法ICP配准体素滤波CPU占用15%控制层集群一致性协议引入swarm_controller节点发布/swarm/formation话题定义三角编队无人机1为主机ego-planner输出全局轨迹无人机2、3订阅/swarm/formation用PID跟踪主机偏移量-5m,0和0,-5m实测数据3机编队巡检100亩棉田用时18分钟单机能耗降低12%减少频繁启
返回列表