【保姆级教程】在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并进入容器

这一步是所有操作的起点,重点是“找到终端入口”:

  1. 登录AutoDL控制台:打开AutoDL官网(https://www.autodl.com/),登录后在“我的容器”中找到已创建的容器,点击“启动”;
  2. 进入终端:启动后点击“JupyterLab”,在打开的页面中,左侧导航栏找到“终端”图标(类似命令行的黑色图标),点击即可打开Linux终端;
  3. 确认初始路径:默认终端路径为/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目录下已有planneruav_simulatorUtils:跳过“克隆代码”,直接编译;

若没有:先执行以下命令克隆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已完全跑通:

  1. 目标点接收成功[INFO] Received goal: 5.000000, 2.000000, 1.500000 → 无人机正确识别目标;
  2. 状态切换正常[FSM]Drone:0, from WAIT_TARGET to SEQUENTIAL_START → 从“等待目标”进入“启动流程”;
  3. 动态重规划成功Drone 0 Replan 0, Success=yes(多次出现)→ 无人机实时计算避障路径,每次重规划都成功;
  4. 轨迹执行中[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 连接远程桌面

  1. 复制终端输出的远程桌面链接,在本地浏览器中打开;
  2. 输入之前设置的密码,进入Linux桌面环境;
  3. 打开桌面的“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中会显示无人机模型(绿色/蓝色)、随机障碍物(灰色)、彩色规划轨迹(红色/绿色),无人机将沿轨迹飞向目标点。

八、常见问题排查(避坑指南)

  1. 启动仿真报错“RLException: [xxx.launch] is neither a launch file”
    → 原因:功能包名错误或路径错误;解决方案:用绝对路径启动(如本文Step 3.2的命令)。
  2. 发送目标点后无反应,日志仍显示“WAIT_TARGET”
    → 原因:话题名或消息格式错误;解决方案:执行rosnode info /drone_0_ego_planner_node | grep "Subscriptions"确认目标点话题,再用rosmsg show 话题类型确认格式。
  3. Rviz启动报错“qt.qpa.xcb: could not connect to display”
    → 原因:未进入远程桌面,纯终端无GUI环境;解决方案:按Step 7配置远程桌面后再启动Rviz。

九、总结

本文从AutoDL登录到规划成功,覆盖了“环境准备→编译→启动→验证”全流程,核心是避开三个新手坑:

  1. 用“绝对路径”启动仿真文件,避免功能包名识别错误;
  2. rosmsg show确认的消息结构发送目标点,避免格式错误;
  3. 启动前清理旧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
启动Rvizroslaunch ~/catkin_ws/src/planner/plan_manage/launch/rviz.launch

要不要我帮你整理一份 “EGO-Planner 常见问题排查手册”?把本文中提到的报错和解决方案汇总成文档,方便你后续遇到问题时快速定位原因。

Read more

MedGemma-1.5-4B实战教程:医学影像多模态理解从模型调用到Web集成

MedGemma-1.5-4B实战教程:医学影像多模态理解从模型调用到Web集成 1. 为什么你需要一个医学影像“看图说话”工具? 你有没有遇到过这样的情况:手头有一张CT扫描图,想快速了解它大致显示了什么结构,但又不是放射科医生;或者在带学生做AI医疗实验时,需要一个能即时响应影像提问的演示系统,而不是等半天跑完一整套预处理+模型推理流程;又或者,你刚跑通了一个多模态模型,却卡在“怎么让别人一眼看懂它到底能干啥”这一步。 MedGemma-1.5-4B 就是为这类真实需求而生的——它不是泛泛而谈的“多模态大模型”,而是 Google 针对医学影像专门优化过的 40 亿参数多模态模型。它不生成假报告,也不编造诊断结论,但它能准确识别肺部纹理、脊柱节段、脑室轮廓,能理解“这张MRI里左侧海马区信号是否增高”这样的专业问题,并用清晰、克制、符合医学表达习惯的语言给出回应。 本文不讲论文里的指标曲线,也不堆砌训练细节。我们直接带你从零开始: 下载并本地加载 MedGemma-1.5-4B 模型 写三行代码完成一张X光片+中文问题的联合推理

LangGraph 智能体状态管理与决策

LangGraph 智能体状态管理与决策

LangGraph 智能体状态管理与决策 * 写在最前面 🌌你好!这里是 晓雨的笔记本在所有感兴趣的领域扩展知识,感谢你的陪伴与支持~👋 欢迎添加文末好友,不定期掉落福利资讯 写在最前面 版权声明:本文为原创,遵循 CC 4.0 BY-SA 协议。转载请注明出处。 本次演示围绕 Bright Data Web MCP 与 LangGraph 的集成实操 展开,完整展示了从获取大模型 API Key、创建大模型会话,到获取 Bright Data API Key、通过 MultiServerMCPClient 连接 Web MCP 服务器,并在 Bright Data 后台进一步启用浏览器自动化工具、扩展智能体可调用能力的全流程;同时结合 LangGraph

【Linux网络系列】:JSON+HTTP,用C++手搓一个web计算器服务器!

【Linux网络系列】:JSON+HTTP,用C++手搓一个web计算器服务器!

🔥 本文专栏:Linux网络Linux实践系列 🌸作者主页:努力努力再努力wz 💪 今日博客励志语录:别害怕选错,人生最遗憾的从不是‘选错了’,而是‘我本可以’。每一次推倒重来的勇气,都是在给灵魂贴上更坚韧的勋章。 ★★★ 本文前置知识: 序列化与反序列化 引入 在之前的博客中,我详细介绍了序列化 与反序列化 的概念。对于使用 TCP 协议进行通信的双方,由于 TCP 是面向字节流的,在发送数据之前,我们通常需要定义一种结构化的数据来描述传输内容,并以此作为数据的容器。在 C++ 中,这种结构化数据通常表现为对象或结构体。然而,我们不能直接将结构体内存中对应的字节原样发送到另一端,因为直接传递内存字节会引发字节序 和结构体内存对齐 的问题。不同平台、不同编译器所遵循的内存对齐规则可能不同,这可能导致接收方在解析结构体字段时出现错误。 因此,我们需要借助序列化 。序列化 是指将结构化的数据按照预定的规则转换为连续的字节流。其主要目的是屏蔽平台差异,使得位于不同平台的进程能够以统一的方式解析该字节流。序列化通常分为两种形式:文本序列化 与二进制序列化 。 文

基于Java和高德开放平台的WebAPI集成实践-以搜索POI2.0为例

基于Java和高德开放平台的WebAPI集成实践-以搜索POI2.0为例

目录 前言 一、高德搜索API简介 1、高德开放平台 2、搜索功能介绍  3、部分API介绍 二、Uniapi集成高德API 1、API集成流程 2、访问接口的定义 3、业务调用集成 三、常见问题与优化 四、总结 前言         在当今数字化时代,地理信息系统(GIS)和位置服务(LBS)已成为许多应用程序的核心组成部分。无论是导航、物流、社交网络还是电子商务,位置数据的获取和处理都显得尤为重要。高德开放平台作为国内领先的地理信息服务提供商,提供了丰富的WebAPI接口,帮助开发者快速集成地图、导航、搜索等功能。其中,POI(Point of Interest)搜索是许多应用场景中的关键功能,它能够帮助用户快速找到附近的兴趣点,如餐馆、酒店、加油站等。         Java作为一种广泛使用的编程语言,因其跨平台性、