【保姆级教程】在AutoDL容器中部署EGO-Planner,实现无人机动态避障规划
【保姆级教程】在AutoDL容器中部署EGO-Planner,实现无人机动态避障规划
作为ROS生态中经典的无人机路径规划框架,EGO-Planner以其高效的动态避障能力和实时重规划特性,成为很多开发者入门无人机规划的首选工具。但在远程容器(如AutoDL)中部署时,常因环境配置、通信问题卡壳。本文结合实战经验,从AutoDL登录到规划成功,一步步带你打通全流程,新手也能轻松上手。
一、前置知识:核心概念与环境准备
在开始前,先明确几个关键概念,避免后续操作 confusion:
- AutoDL容器:提供远程GPU/CPU资源,预装Linux系统,需通过终端或远程桌面操作;
 - Catkin工作空间:ROS项目的“工程目录”,用于组织代码、编译产物,本文默认工作空间为
~/catkin_ws; - EGO-Planner:无人机路径规划框架,核心功能包为
planner/plan_manage,依赖uav_simulator(仿真)、Utils(工具库); - ROS消息通信:节点间通过“话题”传递数据,本文关键目标点话题为
/goal_with_id,消息类型quadrotor_msgs/GoalSet。 
环境要求
- AutoDL容器:建议选择“Ubuntu 20.04 + ROS Noetic”镜像(若无预装,可后续手动安装,但镜像自带更省心);
 - 硬件:最低1核2G内存,GPU非必需(仅仿真可CPU运行);
 - 网络:确保容器能正常访问外网(用于安装依赖、拉取代码)。
 
二、Step 1:登录AutoDL并进入容器
这一步是所有操作的起点,重点是“找到终端入口”:
- 登录AutoDL控制台:打开AutoDL官网(https://www.autodl.com/),登录后在“我的容器”中找到已创建的容器,点击“启动”;
 - 进入终端:启动后点击“JupyterLab”,在打开的页面中,左侧导航栏找到“终端”图标(类似命令行的黑色图标),点击即可打开Linux终端;
 - 确认初始路径:默认终端路径为
/root,后续所有操作均在该用户下执行(无需切换用户,避免权限问题)。 
三、Step 2:确认并编译Catkin工作空间
EGO-Planner的代码需放在Catkin工作空间的src目录下,编译后才能运行。若你已上传代码(如之前操作),直接执行以下步骤;若未上传,需先克隆代码(附克隆命令)。
2.1 确认工作空间结构
先检查~/catkin_ws是否存在,以及src目录下是否有EGO-Planner相关代码:
# 进入工作空间
cd ~/catkin_ws
# 查看src目录内容(关键看是否有planner、uav_simulator、Utils)
ls src
- 若
src目录下已有planner、uav_simulator、Utils:跳过“克隆代码”,直接编译; - 若没有:先执行以下命令克隆EGO-Planner及其依赖(需等待1-2分钟,视网络速度而定):
# 进入src目录 cd ~/catkin_ws/src # 克隆EGO-Planner核心代码 git clone https://github.com/ZJU-FAST-Lab/EGO-Planner-v2.git planner/plan_manage # 克隆无人机仿真代码 git clone https://github.com/ZJU-FAST-Lab/uav_simulator.git # 克隆工具库 git clone https://github.com/ZJU-FAST-Lab/Utils.git 
2.2 编译工作空间
编译是将源代码生成可执行文件(如仿真节点、规划节点)的关键步骤,需确保无编译错误:
# 回到工作空间根目录
cd ~/catkin_ws
# 编译(-j1表示单线程编译,避免多线程冲突;性能好可去掉-j1)
catkin_make -j1
- 编译成功标志:终端最后输出“[100%] Built target xxx”,无“error”或“failed”;
 - 若编译报错:常见原因是缺少依赖,可执行
sudo apt install ros-noetic-xxx(xxx为报错中提示的缺失包名,如ros-noetic-octomap),安装后重新编译。 
2.3 加载ROS环境变量
编译后生成的可执行文件和功能包路径,需通过“环境变量”让系统识别,每次新开终端都需执行:
# 加载当前工作空间的环境变量
source ~/catkin_ws/devel/setup.bash
- 可选优化:将上述命令添加到
~/.bashrc,实现“新开终端自动加载”,无需每次手动输入:echo "source ~/catkin_ws/devel/setup.bash" >> ~/.bashrc 
四、Step 3:启动EGO-Planner仿真节点
仿真节点是“无人机+环境”的载体,启动后会创建随机障碍物,并等待目标点输入。
3.1 清理旧ROS进程(关键!避免通信冲突)
若之前启动过ROS相关进程(如roscore、仿真节点),未正常关闭会导致“连接重置”错误,需先清理:
# 杀死所有ROS相关进程(包括roscore、节点)
pkill -f "ros" && pkill -f "roscore"
执行后等待2-3秒,确保旧进程完全退出。
3.2 启动单机仿真核心
直接用“绝对路径”启动仿真文件,避免因“功能包名识别错误”导致启动失败(这是新手常踩的坑):
# 启动仿真节点(会自动启动roscore,无需单独启动)
roslaunch ~/catkin_ws/src/planner/plan_manage/launch/single_drone_interactive.launch
- 启动成功标志:终端持续输出
[FSM]: state: WAIT_TARGET, Drone:0. Waiting for target,表示无人机已就绪,等待目标点; - 注意:不要关闭这个终端!关闭会导致仿真节点退出。
 
五、Step 4:发送目标点,触发避障规划
仿真节点就绪后,需新建一个终端发送目标点,让无人机开始规划。
5.1 新建终端并加载环境变量
在JupyterLab中再次点击“终端”图标,新建一个终端,执行:
# 加载环境变量(若已添加到.bashrc,可跳过)
source ~/catkin_ws/devel/setup.bash
5.2 发送正确格式的目标点
关键!之前多次失败的核心原因是“消息格式不匹配”,需严格按照quadrotor_msgs/GoalSet的结构发送(通过rosmsg show quadrotor_msgs/GoalSet可查看结构):
# 发送目标点到/goal_with_id话题,坐标为(x=5.0, y=2.0, z=1.5)
rostopic pub -1 /goal_with_id quadrotor_msgs/GoalSet "drone_id: 0
goal: [5.0, 2.0, 1.5]"
- 参数说明:
drone_id: 0:单机场景固定为0(多机时区分不同无人机);goal: [5.0, 2.0, 1.5]:目标点的三维坐标,可根据需求修改(如[8.0, 5.0, 2.0]);-1:表示“发送一次后退出”,无需持续发送。
 
六、Step 5:验证规划成功(关键日志解读)
发送目标点后,回到“仿真终端”,若出现以下日志,说明EGO-Planner已完全跑通:
- 目标点接收成功:
[INFO] Received goal: 5.000000, 2.000000, 1.500000→ 无人机正确识别目标; - 状态切换正常:
[FSM]Drone:0, from WAIT_TARGET to SEQUENTIAL_START→ 从“等待目标”进入“启动流程”; - 动态重规划成功:
Drone 0 Replan 0, Success=yes(多次出现)→ 无人机实时计算避障路径,每次重规划都成功; - 轨迹执行中:
[FSM]Drone:0, from REPLAN_TRAJ to EXEC_TRAJ→ 规划出的路径正在被执行,“规划→执行”闭环打通。 
若出现Success=no:无需担心,偶尔一次重规划失败是正常的,后续会自动重试,只要大部分Success=yes即可。
七、可选:Rviz可视化(直观看到无人机与轨迹)
若想“眼见为实”,通过Rviz看到无人机、障碍物和彩色规划轨迹,需配置AutoDL远程桌面(纯终端环境无法显示GUI)。
7.1 启动远程桌面服务
在任意终端执行:
# 启动AutoDL远程桌面(首次执行会提示设置密码,记好密码)
autodl-desktop
- 启动成功后,终端会输出“远程桌面已启动”,并显示访问链接(如
http://xxx.autodl.com:xxxx)。 
7.2 连接远程桌面
- 复制终端输出的远程桌面链接,在本地浏览器中打开;
 - 输入之前设置的密码,进入Linux桌面环境;
 - 打开桌面的“Terminal”(类似Windows的命令提示符)。
 
7.3 启动Rviz
在桌面终端中执行:
# 加载环境变量
source ~/catkin_ws/devel/setup.bash
# 启动Rviz(加载EGO-Planner预设配置)
roslaunch ~/catkin_ws/src/planner/plan_manage/launch/rviz.launch
- 可视化效果:Rviz中会显示无人机模型(绿色/蓝色)、随机障碍物(灰色)、彩色规划轨迹(红色/绿色),无人机将沿轨迹飞向目标点。
 
八、常见问题排查(避坑指南)
- 启动仿真报错“RLException: [xxx.launch] is neither a launch file”
→ 原因:功能包名错误或路径错误;解决方案:用绝对路径启动(如本文Step 3.2的命令)。 - 发送目标点后无反应,日志仍显示“WAIT_TARGET”
→ 原因:话题名或消息格式错误;解决方案:执行rosnode info /drone_0_ego_planner_node | grep "Subscriptions"确认目标点话题,再用rosmsg show 话题类型确认格式。 - Rviz启动报错“qt.qpa.xcb: could not connect to display”
→ 原因:未进入远程桌面,纯终端无GUI环境;解决方案:按Step 7配置远程桌面后再启动Rviz。 
九、总结
本文从AutoDL登录到规划成功,覆盖了“环境准备→编译→启动→验证”全流程,核心是避开三个新手坑:
- 用“绝对路径”启动仿真文件,避免功能包名识别错误;
 - 按
rosmsg show确认的消息结构发送目标点,避免格式错误; - 启动前清理旧ROS进程,避免通信冲突。
 
按照本文步骤操作,即使是ROS新手,也能在1小时内打通EGO-Planner的动态避障功能。后续可尝试修改目标点坐标、调整仿真参数(如障碍物数量),深入探索EGO-Planner的特性。
最后,附上关键命令速查表,方便后续快速复用:
| 操作目标 | 命令 | 
|---|---|
| 编译工作空间 | cd ~/catkin_ws && catkin_make -j1 | 
| 加载环境变量 | source ~/catkin_ws/devel/setup.bash | 
| 清理ROS进程 | pkill -f "ros" && pkill -f "roscore" | 
| 启动仿真 | roslaunch ~/catkin_ws/src/planner/plan_manage/launch/single_drone_interactive.launch | 
| 发送目标点(x=5,y=2,z=1.5) | rostopic pub -1 /goal_with_id quadrotor_msgs/GoalSet "drone_id: 0; goal: [5.0, 2.0, 1.5]" | 
| 启动远程桌面 | autodl-desktop | 
| 启动Rviz | roslaunch ~/catkin_ws/src/planner/plan_manage/launch/rviz.launch | 
要不要我帮你整理一份 “EGO-Planner 常见问题排查手册”?把本文中提到的报错和解决方案汇总成文档,方便你后续遇到问题时快速定位原因。
