简介面向无人机自主导航与规划方向的研究者和爱好者一份仅4KB的教程资源即可帮助快速搭建EGO-Planner的Gazebo仿真测试平台。内容围绕ROS、Gazebo、MAVROS与PX4的安装配置展开涵盖从环境配置、功能包依赖到仿真启动的完整流程并给出算法调试与常见问题排查思路适用具备一定ROS基础、希望开展无人机避障与轨迹规划实验的读者。包体包含2个文件以inscode与html格式为主前者支持在线查看和运行代码后者则是图文操作指引结构精简便于对照学习。目前已有534人学习浏览作者在Ubuntu 20.04系统上实测成功并针对无人机高度控制、障碍物碰撞和速度过快导致的失控现象分享了调试建议同时探讨了提高算法稳定性与实用性的改进方向。通过这套说明读者能减少环境搭建中的弯路更高效地完成从配置到仿真的完整实践为后续深入研究无人机自主飞行提供可复用的起点。 近两年接触过自主无人机项目的朋友十有八九都会绕开 EGO Planner。这个由港科大团队开源的局部规划器算是在无人机避障导航领域被验证过的标杆方案之一。如果你手头正好有一份标注“可运行源码”的 ego planner 仿真工程却卡在环境配置和跑通环节那这篇文章就是给你准备的。我会从仿真环境搭建、源码编译、参数调整到常见坑位排查把整个流程拆开揉碎尽量让你照着做就能把无人机在仿真环境里飞起来。1. 整体设计与思路拆解为什么 EGO Planner 适合做仿真入门1.1 它到底解决的是什么问题EGO Planner 的完整称呼是Edge-based Gradient Optimization Planner核心任务只有一个在拥挤未知或半已知环境中实时给无人机规划出一条从当前位置到目标点的安全、平滑、动力学可行的轨迹。它不依赖全局静态地图而是基于局部感知信息做在线优化这个特性让它特别适合做仿真验证——因为仿真环境可以精确模拟传感器噪声和动态障碍物能更快逼出算法在不同工况下的表现。它的核心亮点在轨迹表示方式。常见方案是用离散路径点插值EGO Planner 直接用B-SplineB样条参数化整条轨迹。这样做的好处是轨迹天然具备高阶连续性对应无人机姿态和角速度不会突变同时优化变量数量大大减少实时性就上来了。再加上它基于ESDF欧氏距离场来计算碰撞代价和梯度而不是传统方法里那种先构建全局地图再搜索路径的做法从原理上就绕开了一大堆建图误差累积的问题。1.2 仿真对理解这套算法的价值在哪很多人上来就想着上真机但 EGO Planner 的调参和状态观测在真机上非常烧钱且效率低。仿真环境的好处有三点状态完全透明你可以实时看到规划器的内部状态、轨迹变化、代价函数数值不用靠猜。参数实验成本极低同一套代码改一个惩罚系数跑 10 次仿真看效果几分钟完成。可复现性高算法表现不会因为硬件平台差异而产生随机波动便于横向对比不同参数的影响。这也是为什么“可运行源码”的价值不是让你直接拿去做二次开发而是让先通过仿真建立起对算法内部机理的直觉。我在教团队成员上手规划算法时标准路径就是先读懂代码里的数据结构再跑通仿真最后才讨论替换传感器模型。提示源码的可运行性不等于免配置。大多数 EGO Planner 仿真工程默认在 ROS Noetic Ubuntu 20.04 下编译运行如果你的主机是别的系统建议先装虚拟机或者 Docker不要在环境问题上浪费时间。1.3 代码仓库的整体结构分析拿到源码后先别急着编译花十分钟把目录过一遍。一个典型的 ego planner 仿真工程会包含这些模块我帮你标注各自职责目录/包名职责ego_planner核心规划器包含 B-Spline 优化、ESDF 地图管理、代价函数计算uav_simulator无人机动力学仿真器模拟位置/速度控制下的机体响应plan_manage规划管理节点负责目标点接收、规划请求触发、轨迹执行poscmd_2_odom将规划器的位置指令转换成里程计反馈形成控制闭环rviz_plugins可视化插件用于显示轨迹、ESDF 切片、障碍物点云等这种分层结构是有意为之。仿真器和规划器分离意味着以后你换真实飞控只需要修改底层控制接口上层规划逻辑可以完全复用。这也是这份源码值得反复研读的原因。2. 仿真环境搭建从零开始配置可运行系统2.1 系统与 ROS 版本选型EGO Planner 的依赖并不复杂但对版本敏感。我个人推荐以下组合这是最容易一次跑通的操作系统Ubuntu 20.04其他版本可能要处理额外兼容问题ROS 发行版Noetic编译器g / gcc 9.x构建工具catkin tools 或 catkin_make 均可如果你是 Ubuntu 18.04 用户需要把代码里个别std::make_unique或者模板库调用做兼容处理比较麻烦且没必要。Ubuntu 20.04 是验证过的最稳路径。2.2 依赖安装过程在干净的系统上依赖安装可以分成两组基础依赖主要给绘图和点云处理用sudo apt update sudo apt install ros-noetic-navigation ros-noetic-cv-bridge ros-noetic-tf2-geometry-msgs ros-noetic-mavros-msgs编译依赖包括线性代数、随机数生成等sudo apt install libeigen3-dev libgoogle-glog-dev libgflags-dev libyaml-cpp-dev sudo apt install ros-noetic-grid-map-msgs ros-noetic-roslint装好依赖后我习惯在~/.bashrc加这几行避免每次开终端都手动 sourcesource /opt/ros/noetic/setup.bash source ~/ego_planner_ws/devel/setup.bash2.3 编译流程与源码放置源码一般建议放在独立工作空间我用的结构是mkdir -p ~/ego_planner_ws/src cd ~/ego_planner_ws/src git clone 你的源码仓库地址 cd ~/ego_planner_ws catkin_make第一次编译时会有大量.h和.cpp文件耗时约 3-8 分钟不等取决于机器性能。编译过程中如果报错多半是缺依赖按报错信息直接apt install对应的 ros-noetic-* 包就能解掉。编译成功标志是生成的devel/lib下有这些可执行文件ego_planner_nodetraj_servertarget_generatorodom_visualization注意有些版本的代码里plan_manage文件夹下还包含swarm相关文件一般不影响单机仿真。编译时如果遇到swarm相关的rosparam错误先确认 launch 文件里有没有加载这些参数没有就忽略。两个核心入口 launch 文件通常在plan_manage/launch目录下run_in_sim.launch启动仿真环境Gazebo 或内置简易仿真器rviz.launch启动可视化界面3. 实操运行把无人机在仿真里飞起来3.1 启动仿真环境完成编译后首次运行可以分两个终端模拟也可以写一个总 launch 文件。先看下常见的启动方式终端一启动仿真核心source ~/ego_planner_ws/devel/setup.bash roslaunch ego_planner run_in_sim.launch这条命令会启动无人机动力学仿真器节点EGO Planner 的规划主节点目标点生成器默认发布固定或随机目标点Rviz 可视化如果一切正常Rviz 窗口里会看到一架简易的无人机模型通常用一个小四旋翼 Marker 表示以及一个用于显示规划出的轨迹框。3.2 在 Rviz 中设置目标点Rviz 中需要先配置一个Goal工具在顶部按2D Nav Goal2D 导航目标按钮然后在地图平面上点击并拖动就能给无人机发送一个目标位置。发送成功后观察点云和轨迹变化绿色的线是当前执行轨迹蓝色的线是规划器实时计算出的候选轨迹如果点云表示障碍物轨迹会自动绕开这里有个容易误操作的地方EGO Planner 是局部规划器它只负责把目标点纳入规划范围但仿真中的目标点管理器target_generator通常会周期性发布新的目标点如果你想自己控制目标点需要在 launch 里把target_generator的自动发布关掉或者手动rostopic pub目标点话题。rostopic pub /goal_pos geometry_msgs/PointStamped header: seq: 0 stamp: secs: 0 nsecs: 0 frame_id: world pose: position: x: 5.0 y: 3.0 z: 2.0 orientation: w: 1.0 --once3.3 核心节点通信关系跑起来后我建议用rqt_graph看一下节点间的通信拓扑。你会看到类似下面的链路target_generator - ego_planner_node - traj_server - poscmd_2_odom - odom_visualization这个链路里隐藏着 EGO Planner 的关键机制规划器每收到一个新的里程计odom和点云point cloud数据就会触发一次局部轨迹重规划。所以你在 Rviz 里看到的轨迹不是一次性规划结果而是高频动态更新的结果。这就是它在动态环境中能及时避障的原因。3.4 仿真运行状态的判定标准跑起来之后怎么判断运行是否正常我总结一套快速自检清单检查项正常表现异常表现终端日志每 50-100ms 打印一次规划信息无红色 ERROR卡死无输出或输出 NaN 错误Rviz 轨迹轨迹平滑连续无抖动断裂轨迹乱跳、飞向远处、直接穿障碍物无人机位置平滑移动速度曲线连续剧烈震荡、位置突变、原地打转CPU 占用单核 30% 以下持续超高规划频率被拖慢4. 参数配置与核心效果调优4.1 关键参数解读源码运行起来只是第一步真正有意义的是读懂参数。核心参数在plan_manage/launch/param下的 YAML 文件里重点看这几个参数作用调整逻辑max_vel无人机最大速度调大速度更快但避障反应时间变短max_acc最大加速度限制急转弯太高会导致轨迹颠簸feasibility_ctrl_ratio动力学可行性约束权重增大后轨迹更保守平滑性提升obstacle_inflation障碍物膨胀半径增大后轨迹离障碍物更远更安全plan_horizon规划视野长度决定无人机能看多远太短容易陷入局部最优optimization_period优化周期周期越短更新越快但计算负载也越高4.2 调参实操案例我举一个实际调参案例。默认配置下无人机在障碍物密集场景中飞行时偶尔会表现为轨迹贴着障碍物边缘擦过去看着不够安全。此时把obstacle_inflation从 0.1 调到 0.25再重启仿真轨迹与障碍物距离明显拉开但到达目标点的时间会稍微变长如果调得过大比如 0.5可能会出现“找不到可行路径”的情况因为膨胀后的空间把可通行区域堵死了另一个常见问题是无人机飞行时频繁急刹车。这是因为max_acc设置过大而max_vel较小导致无人机总是猛加速又猛减速。把max_acc从 3.0 降到 1.8同时把plan_horizon从 8.0 加到 12.0急刹车现象会明显缓解。提示调参不要同时动多个参数。一次只改一个跑一圈观察效果再做下一项调整。并行调多个参数时出了问题你根本不知道是哪个参数引发的。4.3 感知输入对规划质量的影响仿真环境中感知输入通常是用一个模拟的深度相机点云或射线扫描获得。在源码的simulator中一般会有一个fake depth sensor节点它每 0.05s 发布一次点云。这里有个关键认知EGO Planner 的避障质量直接取决于点云的密度和范围而不是算法本身。如果你的仿真中无人机频繁撞到障碍物先检查点云是否覆盖了障碍区域而不是直接怀疑规划器算法。我遇到过一次点云话题没有正确发布结果无人机全程睁眼瞎直接穿墙而过。5. 常见问题与排查技巧实录5.1 编译失败类问题最常碰到的编译错误是Could not find a package configuration file provided by grid_map_msgs解决方案sudo apt install ros-noetic-grid-map-msgserror: ‘make_unique’ is not a member of ‘std’解决方案确认编译标准是否设置为 C14 或更高在 CMakeLists.txt 中加一行set(CMAKE_CXX_STANDARD 14)。Eigen3 版本不兼容解决方案检查/usr/include/eigen3/Eigen/src/Core/util/Macros.h中的版本号EGO Planner 对 Eigen 3.3 兼容性最好老版本建议升级。5.2 运行启动类问题启动 launch 文件后没有 Rviz 窗口一般有两种情况Rviz 插件库没有加载成功查看终端有没有pluginlib相关的红色警告有的话需要手动安装ros-noetic-rviz-plugins。启动文件里 Rviz 配置文件路径不对检查rviz.launch中引用的.rviz文件是否存在。无人机没有反馈持续原地悬停先rostopic echo /odom确认里程计是否有数据再rostopic echo /trajectory确认规划器是否发布轨迹如果两个都有数据但无人机不动大概率是控制接口的坐标系没有对齐检查 odom 的 frame_id 是否为world5.3 避障失效类问题这个是最让人头疼的。轨迹明明规划出来了但无人机还是撞上障碍物排查顺序按照这个来优先级排查点判断方法1点云是否正常发布Rviz中显示点云确认覆盖范围2障碍物膨胀参数是否合理观察轨迹与点云的实际距离3规划器是否真的在执行避障优化看终端日志中collision cost是否在优化中变化4动力学约束是否过大轨迹能否被仿真器执行速度/加速度是否超限5局部最小值问题换更空旷场景测试确认基本逻辑关于第 5 点EGO Planner 本质上是梯度优化方法遇到极端复杂的障碍物分布时存在陷入局部极小值的可能。解决思路不是调整算法参数而是让无人机有更大的感知范围或者往全局规划器里加引导路径。这也是为什么 EGO Planner 源码仓库里通常同时配套了一个简易的全局规划器就是为了给出初始引导路径。5.4 系统性能问题仿真跑久了内存不断增长多数情况下是 Rviz 中保留的历史轨迹帧太多了。在 Rviz 的Path Display设置里把Keep属性从无限改为 100 帧左右就能避免内存膨胀。CPU 占用过高时可以把点云发布的频率从 20Hz 降到 10Hz规划器本身对频率没那么敏感但点云数量会显著影响优化耗时。这也对应了真实系统里的经验控制率高、感知频率低规划层在中间做缓冲这是标准的架构设计。6. 从仿真迈向实际应用的扩展思考仿真跑通之后我的建议是不要急着收工可以做两件延伸的事情。第一件替换仿真器。源码里自带的是一个简化版四旋翼模型你也可以尝试接入 Gazebo PX4 的完整仿真。EGO Planner 的接口对底层控制做了抽象只要把poscmd_2_odom的输入输出映射到 MAVROS 的setpoint_position话题整个规划器不用改一行代码就能在更真实的动力学模型下跑起来。第二件修改代价函数进行实验。在ego_planner/src/plan_manage中可以找到代价计算类的实现自己加一个高度惩罚项或者针对特定场景加一个方向一致性约束用来观察行为变化这是快速打通算法理解→代码实现的好路径。我当时就是通过改障碍物距离场的数据结构第一次真正理解了 ESDF 地图和占据栅格图的区别。提示如果你后续想把这套规划器部署到自己的无人机上仿真阶段就要注意保存所有参数配置文件。真机上可没有 Rviz 让你一边飞一边调参的机会每一次飞行都要依据事前做好的参数快照所以在仿真阶段养成熟练的调参和记录习惯很重要。7. 写在最后的实操心得按我自己的使用经验拿到一份可运行源码后最有价值的三个动作是第一完整读一遍 CMakeLists.txt 和 package.xml搞清楚依赖和编译目标第二在干净环境中从头到尾用命令行完成编译不走任何IDE捷径第三把所有 launch 文件里的参数打印成表逐一在仿真中改变并记录效果。EGO Planner 的仿真学习本质上是在学习一种感知-规划-控制闭环的实现方式。你在仿真里调过的每一个参数、排掉的每一个 bug最后都会变成你对自主导航系统设计直觉的一部分。这比单纯跑通一份代码解决问题重要得多。本文还有配套的精品资源点击获取