公司动态

从零跑通EGO Planner:无人机局部规划器仿真环境配置与实操指南

📅 2026/9/1 5:10:47
从零跑通EGO Planner:无人机局部规划器仿真环境配置与实操指南
简介这是一份面向无人机自主飞行初学者的 EGO-Planner 仿真教程资源基于 Gazebo 与 PX4 环境配套可运行源码与说明文档帮助读者从零搭建 ROS/Gazebo/MAVROS 仿真平台并完成算法测试。资源包共 2 个文件包含 1 个 HTML 格式的图文教程和 1 个 insCode 代码文件压缩包仅 4KB轻量便携适合快速查阅与部署。内容覆盖环境安装步骤、EGO-Planner 测试方法以及作者在 Ubuntu 20.04 实测中遇到的无人机高度控制、障碍物碰撞、速度过快导致失控等典型问题的调试思路并给出改进方向同时针对软件版本兼容、参数调整等常见错误提供了注意事项便于读者对照排查。已有 534 人学习下载对刚接触 EGO-Planner 或 Gazebo 仿真的研究者和开发者来说是一份可直接上手、能少走弯路的参考。 从零开始折腾一个无人机局部规划器最常听到的名字就是EGO Planner。我见过不少人卡在环境配置和编译上源码clone下来好几天跑不起来最后放弃了确实可惜。这篇东西就是一次完整的实操记录——怎么把EGO Planner的可运行源码在本地仿真环境里真正跑起来包括环境选型、编译坑位、RVIZ操作和参数调节尽量少说废话给的都是能直接照着敲的命令。EGO Planner的全称是Enhanced Gradient Optimization Planner一个基于梯度优化的局部轨迹规划器。它解决的问题很具体无人机在未知环境下飞怎么在每一帧感知到障碍物的情况下快速规划出一段平滑、不碰撞、动力学上可飞行的轨迹。跟经典的Fast-Planner相比它最大的变化是不需要维护一整张ESDF距离场地图而是直接用障碍物信息估算碰撞梯度计算开销小很多。这个思路也让它在算力受限的机载平台上更有优势。对刚开始接触路径规划的同学来说这份源码既有B样条轨迹生成又有梯度优化、代价函数设计内容非常密集值得反复读。1. 项目整体认知EGO Planner到底解决什么问题1.1 四旋翼局部规划的痛点先说清楚这个规划器在整个无人机自主导航流程里处在什么位置。一个完整的自主飞行系统通常分成三个层级全局规划器负责从起点到终点的粗略路径局部规划器负责在飞行过程中躲避新出现的障碍物底层控制器负责把规划出来的轨迹转成电机转速。EGO Planner做的就是中间这一层——局部规划也就是决定了无人机每一瞬间往哪飞、飞多快这个决定必须在几十毫秒内完成不能等太久。如果把局部规划抽象成数学问题它本质是一个带约束的优化问题在起点状态和目标状态之间找一条满足动力学约束、不与障碍物相交、同时尽可能平滑的曲线。EGO Planner的处理方式是使用均匀B样条来表示这条轨迹然后把碰撞 平滑性 动力学可行性 终点到达四个目标写成代价函数通过迭代优化出最优控制点。这跟很多传统方法完全不同——传统方法先找一条几何路径再去平滑最后再检查动力学步骤之间容易累积误差。而EGO是一步到位把优化过程直接跑到轨迹级别。这个思路也和它的名字对应起来了Enhanced是相对早期版本做的改进Gradient指出它用梯度下降法迭代优化Optimization是它解决问题的核心手段。理解了这层逻辑后面看代码就不会迷路。1.2 为什么我推荐先跑官方仿真方案EGO Planner的官方仓库提供了一个轻量级的仿真环境组件包括uav_simulator无人机状态与传感器模拟、map_generator随机障碍物点云生成、plan_manage规划节点、bsplineB样条工具库整套东西跑在ROS里不需要完整搭建一套PX4加Gazebo的无人机仿真系统。这样做的好处非常明显启动快、依赖少、加载地图和发目标点都是秒级操作你只需要关心规划算法本身。我知道有一些朋友会问为什么不直接用PX4加Gazebo那套更接近真实飞控的方案说实话那套方案更适合做飞控开发或者传感器集成对研究规划算法的人来说负担太重。PX4固件版本、MAVROS参数、Gazebo模型文件、机体坐标系标定任何一个环节出问题都够你查半天很多基础问题还没搞明白时间就没了。所以我一直建议第一步先用官方自带仿真把算法跑通、把原理读透之后再迁移到PX4环境或者真机。这个顺序能少走很多弯路。2. 环境准备4步把EGO Planner源码编译跑通2.1 系统与ROS版本怎么选EGO Planner官方支持两套常见组合Ubuntu 18.04配ROS MelodicUbuntu 20.04配ROS Noetic。我自己实测下来20.04加Noetic的组合更顺主要是新系统对显卡驱动和RVIZ渲染的支持更好跑3D点云时不容易卡。如果你只有18.04也别担心编译流程基本一致把包名里的noetic替换成melodic就行。在动手之前先确认一下你的系统里有没有装好ROS主框架。推荐装desktop-full版本它自带RVIZ、tf、以及大量常用工具省得后面缺一个装一个。另外强烈建议把系统源切换到国内镜像不然rosdep那一步会让你等到怀疑人生。这一步不要跳过后面编译时的依赖解析全靠它。2.2 工作空间与源码获取我的习惯是单独建一个工作空间专门放EGO Planner不跟其他项目混在一起排错时干净利落。下面这套命令是完整流程# 创建并初始化工作空间 mkdir -p ~/egoworkspace/src cd ~/egoworkspace catkin_make # 拉取源码注意检查自己的ROS版本选对应分支 cd ~/egoworkspace/src git clone https://github.com/HKUST-Aerial-Robotics/EGO-Planner.git # 编译前依赖解析 cd ~/egoworkspace rosdep install --from-paths src --ignore-src -r -y # 正式编译建议先给2个线程降低内存峰值 catkin_make -j2这里有个细节值得注意catkin_make第一次编译时会先生成一些基础包如果这时候就把EGO Planner的源码放进去可能会出现依赖顺序问题所以我习惯先把空工作空间init一次再放源码再编译。如果你用的是catkin toolscatkin build也可以但社区里跑EGO-Planner的教程大多用catkin_make跟着用可以少踩一些版本兼容的坑。源码clone之后建议看一眼src目录下都有哪些子包。正常情况会看到plan_manage、bspline、uav_simulator、traj_utils、map_generator这些文件夹确认核心包都齐全再编译。有时候clone会遇到Git LFS文件缺失的问题如果编译时报缺了某个资源文件进到对应目录执行一次git lfs pull通常能解决。2.3 编译期三个高频坑编译阶段是劝退最多人的地方我把我自己遇到和身边人常遇到的问题整理成一份避坑清单第一个坑是rosdep解析依赖时找不到某些包。这种情况多半是ROS源没有更新先执行sudo apt update然后重新跑rosdep install。如果还不行看报错信息里缺的是哪个包手动sudo apt-get install ros-noetic-xxx装上就行。EGO Planner依赖的包不算太多但mavros和swri系列在部分版本里会出现在依赖列表里需要提前装。第二个坑是Eigen版本冲突。Eigen是ROS里常用的线性代数库系统里可能同时存在多个版本。如果编译时报Eigen相关头文件找不到检查一下/usr/include/eigen3这个目录是否存在然后考虑在CMakeLists里显式指定Eigen目录路径。大多数情况下ROS自带的Eigen版本已经够用不需要额外折腾。第三个坑是内存不足导致编译进程被杀。EGO Planner的C代码模板很多编译时内存占用比较高。解决方法很简单把并行线程数从默认的8个降到2个也就是上面写的catkin_make -j2。如果4GB内存的机器还扛不住可以先关掉其他大程序或者临时加一点swap空间。编译成功的标志是终端里出现[ 100%] Built target ...同时~/egoworkspace/devel目录下生成了可执行文件。这时候千万别急着关终端先把工作空间的setup脚本加入bashrc避免每次开终端都要手动source一遍echo source ~/egoworkspace/devel/setup.bash ~/.bashrc source ~/.bashrc3. 仿真实战用RVIZ让无人机自主规划避障3.1 启动仿真环境编译通过只是万里长征第一步真正的乐趣从启动仿真开始。打开一个新终端先确认环境变量没问题然后运行roslaunch ego_planner rviz.launch这个launch文件会做几件事启动map_generator生成一张随机点云障碍物地图启动uav_simulator虚拟出一个四旋翼模型再启动规划节点的核心进程。如果一切正常RVIZ窗口会弹出来里面能看到一个无人机模型周围散布着大量红白相间的点云障碍物无人机默认在某个起点悬停。我第一次跑起来的时候看到这个画面还挺兴奋的——点云地图是实时生成的每次启动的障碍物位置都不一样这意味着你可以反复测试算法在不同环境下的表现都会有差异。如果窗口是黑的先不要慌检查底部是否缺少TF消息耐心看后面的排查章节。有一点要提醒EGO Planner启动后默认是待命状态无人机并不会自己乱飞需要你给它一个目标点。这是设计上的安全机制也方便你控制实验节奏。3.2 给无人机下达目标任务下达目标最直观的方式是直接在RVIZ里操作。在RVIZ工具栏上找到Goal或者Waypoint工具点击它然后在3D视图里选择一个点作为目标位置松开鼠标目标就发布出去了。这时候你会看到规划器迅速计算出一条B样条轨迹在无人机前方显示成一条半透明的曲线无人机沿着这条曲线开始飞行遇到障碍物时会实时重规划绕过去之后继续朝目标前进。如果你习惯用命令行也可以直接发布目标话题。以我的环境为例目标点话题是/goal类型是geometry_msgs/Point命令长这样rostopic pub /goal geometry_msgs/Point x: 5.0 y: 2.0 z: 1.0 --once发布之后观察RVIZ里的变化如果无人机开始规划并且飞向目标说明整个链路是通的。这一步其实是检验整个系统是否正常的最快方式——如果目标点发布不出去或者规划器没收到后面什么都跑不起来。我还建议你用rostopic list看一眼当前环境下有哪些话题重点关注以/planning、/odom、/map为前缀的几个。通过这些话题你能直观看出数据流是怎么走的map是环境感知层输入odom是状态反馈层planning是规划器输出。把这几个话题的数量和频率搞明白对整个系统的理解会加深很多。3.3 核心参数到哪里调、怎么调仿真跑通之后下一步就是折腾参数了。EGO Planner的配置文件在各个子包的config目录下主要是plan_manage里的yaml文件。用文本编辑器打开你会看到一组密密麻麻的参数第一次看容易头大我建议只关注几个影响最明显的参数名作用调试建议max_vel最大飞行速度调大飞行更激进但容易碰撞max_acc最大加速度调大可让转弯更果断obstacle_inflation障碍物膨胀半径调大飞行更安全但路径更绕smoothness_weight平滑性权重调大轨迹更顺滑但可能远离最短路径resolution地图分辨率调小地图更精细但计算量上升以max_vel为例如果你把速度从2.0调到5.0会发现无人机飞行动作明显变快但遇到复杂障碍物时轨迹重规划的失败率也会增加。原因很简单速度越快留给规划器的时间窗口越短约束越紧。这种参数间的相互影响只有亲手调一遍才能真正感受到。如果你想在运行时动态调参可以用rqt_reconfigure工具rosrun rqt_reconfigure rqt_reconfigure前提是节点里启用了dynamic_reconfigure支持。在弹出的界面里滑动参数RVIZ里的行为会立刻变化非常适合直观感受每个参数的作用。对新手来说我强烈建议先通过rqt_reconfigure来回滑动建立参数-行为的对应直觉再回yaml文件里固定参数这种方式上手快很多。4. 常见问题与排查卡壳时看这一节4.1 问题速查表我把仿真过程中最容易遇到的问题整理成一张表每条都是真实踩过的现象可能原因处理方式编译报缺包rosdep没跑全或源没更新sudo apt update后重试rosdep installrviz.launch启动后黑屏没收到TF或地图话题用rostopic hz /map检查话题频率无人机悬停不动没有发布目标点或目标被拒绝用rostopic pub手动发布目标点测试点云地图过大导致RVIZ卡顿障碍物数量太多降低map_generator的生成范围或密度目标点设置在障碍物内部终点状态不合法换个空旷位置的目标点再试规划器异常退出数值优化发散降低max_vel和max_acc恢复默认参数这六条覆盖了我见过的绝大部分问题。很多看起来莫名其妙的现象根源往往特别简单比如目标点没有发出去、话题命名空间对不上、地图没有更新排查的时候先从最基础的链路查起。4.2 排查思路分享分享一个我自己特别受用的排查路径先看终端再看话题最后看RVIZ。终端里打印的日志是最直接的线索规划器有没有收到目标、优化有没有收敛、有没有触发碰撞检测全都会打印出来接着用rostopic hz检查关键话题的频率频率异常说明上游节点出了问题最后才回到RVIZ里看可视化结果。这个顺序能让你少走很多弯路不是一上来就怀疑算法有问题。还有一个常见误区多个launch文件重复启动导致节点冲突。如果你跑过一次仿真没有完全关闭就重新启动新进程可能跟旧进程抢话题或端口表现就是RVIZ里行为异常。这时候把开过的终端全部关掉用pkill -f ros和pkill -f gzserver清理残留进程再重新启动一次问题通常就消失了。这个操作没有风险可以放心用。再补充一点如果无人机在飞行过程中轨迹出现剧烈抖动先别认为是仿真器坏了多半是速度或加速度上限设置过高优化器在动力学约束上反复震荡。把最大速度调低20%再观察多数情况下会平稳下来。规划算法对参数非常敏感这种经验是论文里不写、但实际调试必须知道的。5. 跑通之后还能做什么源码能跑、仿真能飞这只是起点。我强烈建议你在ROS里用rosrun rqt_graph rqt_graph看一下节点和话题的连接图这个可视化图会清楚地展示map_generator、planner、simulator之间的数据流理解了这个图以后换传感器、换地图来源、甚至做多机分布式规划都不会一头雾水。接下来可以尝试自己控制难度修改map_generator里的障碍物密度和地图边界测试规划器在更密集环境下的表现或者把目标点改成一系列航点让无人机连续飞行感受连续重规划之间的衔接逻辑。我自己当时尝试了把地图换成自己录制的点云数据这个实验让我真正理解了规划器对感知质量的敏感程度——点云噪声大一点轨迹就明显变差这也是很多实际项目里不得不做感知和规划联合调试的原因。最后分享一个我个人的体会跑通EGO Planner并不难难的是把它讲清楚。如果你能对着代码复述出B样条轨迹是怎么参数化的、碰撞代价是怎么计算的、梯度是怎么反传的这才是真正的收获。建议花点时间读一读论文里的优化目标公式再对照代码里的对应实现这个对照过程比跑通十个demo都更值钱。本文还有配套的精品资源点击获取