CATEGORY 1 · 核心课程 / CORE-04

机器人 SLAM 与自主导航

7 个递进实验,从 SLAM 原理与 URDF 建模起步,用 SLAM Toolbox 遥控建图,深入 Nav2 导航栈与 AMCL 粒子滤波定位,以 DWB 局部避障、激光雷达多点任务调度收口,最终展望 RTAB-Map 三维 SLAM —— 每个实验均配原理讲解、动画演示与交互沙盒,基于 slam_practice 实验讲义与 car1 真实源码改写。

📚 7 个实验 ⏱️ 48 学时 🤖 激光雷达 + 麦轮底盘 🎯 前置:ROS2 基础 🚗 仅适配小车 C1
7递进实验
48总学时
3知识篇章
⭐1~3难度跨度
CHAPTER 1

第 1 章 · 建模与建图

先给机器人一副"身体"(URDF + TF),再给它一张"户型图"(SLAM Toolbox 建图)—— 自主导航的两块基石。

EXP-01⭐ · 4 学时

SLAM 原理与 URDF 模型

用"蒙眼逛新家"的比喻吃透 SLAM = 边走边画地图 + 定位;再用 URDF + RViz 把 car1 机器人"搬"上屏幕,看清连杆、关节与 TF 坐标树怎么连。

SLAM 概念URDF / XacroTF 树
👆 点击小节标题或右侧标签直达对应章节
EXP-02⭐⭐ · 4 学时

SLAM Toolbox 建图

整门课第一个"高光时刻":键盘遥控小车在房间里逛一圈,得到一张跟户型图一样的二维地图。全程只做三件事——启动建图、遥控逛圈、保存地图。

SLAM Toolbox扫描匹配回环检测
👆 点击小节标题或右侧标签直达对应章节
CHAPTER 2

第 2 章 · 定位与导航

Nav2 导航栈五大服务器、AMCL 粒子滤波、DWA 动态窗口局部避障 —— 让小车从"看地图"进化到"会走路、会躲人"。

EXP-03⭐⭐⭐ · 8 学时

Nav2 机器人导航

在 RViz 里点一个目标点,小车自己规划路线、自己转弯、自己躲开静态障碍。拆解 planner / controller / bt_navigator / behavior / velocity_smoother 五大服务器与全局、局部双代价地图。

Nav2代价地图行为树
👆 点击小节标题或右侧标签直达对应章节
EXP-04⭐⭐⭐ · 8 学时

AMCL 自适应蒙特卡洛定位

小车被搬动、地图和现实对不上时,"我到底在地图哪里?"用粒子滤波三步(预测、更新、重采样)+ 似然场模型,让小车雷达一扫就自己猜出精确位置。

粒子滤波似然场初始位姿
👆 点击小节标题或右侧标签直达对应章节
EXP-05⭐⭐⭐ · 8 学时

DWA/TEB 局部避障

实验 3 小车会"看地图走大路",但路上突然滚来一个球怎么办?用 DWB 局部规划器在动态窗口内采样 800 条短轨迹实时打分,绕不过去还会自己转圈、后退重新想办法。

DWA / DWB评价函数膨胀层
👆 点击小节标题或右侧标签直达对应章节
CHAPTER 3

第 3 章 · 任务调度与三维进阶

从"点一个目标到一处"升级为"先去 A 取货、再去 B 放货"的连续任务;再用 RGB-D + RTAB-Map 让小车长出立体眼睛。

EXP-06⭐⭐⭐ · 8 学时

激光雷达多点导航避障

真实任务往往是"先去 A、再去 B、最后回 C"。用两个 Nav2 导航器(NavigateToPose / NavigateThroughPoses)连续执行多目标,中途有障碍也能一路安全走完,并做堵死鲁棒性测试。

NavigateToPoseNavigateThroughPosesAction
👆 点击小节标题或右侧标签直达对应章节
EXP-07⭐⭐⭐ · 8 学时

RTAB-Map 3D SLAM

前 6 个实验小车眼里世界是"一张平面图"。这节课让它长出立体眼睛:RGB-D 深度相机 + RTAB-Map 构建三维点云 / 八叉树地图,理解高度、层次与悬空障碍(原理与选型为主,详见页内说明)。

RTAB-MapRGB-DOctoMap 点云
👆 点击小节标题或右侧标签直达对应章节
EXPERIMENT MATRIX

七实验一览表

学时结构与交付物一目了然:CH1 打地基(4+4)、CH2 练核心(8×3)、CH3 上台阶(8+8),合计 48 学时。

编号实验学时难度类型核心交付物
EXP-01SLAM 原理与 URDF 模型4⭐验证性car1 的 URDF + TF 树 + RViz 可视化截图
EXP-02SLAM Toolbox 建图4⭐⭐设计性一张 0.05 m 精度、四角闭合的 map.pgm/yaml
EXP-03Nav2 机器人导航8⭐⭐⭐综合性导航 launch 跑通 + 5 目标点到达记录
EXP-04AMCL 自适应蒙特卡洛定位8⭐⭐⭐综合性初始位姿收敛观察 + 绑架恢复计时
EXP-05DWA/TEB 局部避障8⭐⭐⭐综合性纸箱 1 m 三重复试验 + 参数→现象对照表
EXP-06激光雷达多点导航避障8⭐⭐⭐综合性A→B→C 轨迹记录 + 四指标鲁棒性统计
EXP-07RTAB-Map 3D SLAM8⭐⭐⭐综合性反投影验算 + 选型报告(📌 无配套源码资源,原理与通用流程型)
LAB ENVIRONMENT

实验环境与关键话题速查

全课程同一套底座:Ubuntu 22.04 + ROS 2 Humble + 具身智能实验箱(B2)/ 小车(C1)。

感知层

COIN-D6 激光雷达(设备节点 /dev/lidar,发布 /scan,frame_id laser_link,0.05~12 m,10 Hz,Best Effort QoS)+ HP60C RGB-D 相机(/ascamera_hp60c/... 命名空间,供 EXP-07)。

本体层

麦轮底盘轮速 + BMI088 IMU,经 EKF(robot_localization)融合输出 odom→base_footprint;ω 取 IMU、vx 取轮速(麦轮旋转打滑约 45%,故不取轮速航向)。

地图与定位

SLAM Toolbox 出 /map(occupancy grid:-1 未知 / 0 空闲 / 100 占据,0.05 m 格,存盘后变成 205/254/0 灰度);AMCL 出 /amcl_pose 与粒子云 /particle_cloud。

导航栈

car1_navigation 的 navigation.launch.py 一键起 Nav2;参数集中在 config/nav2_params.yaml(planner/controller/bt/costmap 全在里面),行为树另有 2 个 XML。

TF 主干

map → odom(AMCL 修正)→ base_footprint(EKF 里程计)→ 各传感器 link(URDF 定义)。TF 一断,建图导航全部报错。

调试工具箱

RViz2(看 /scan /map /plan /costmap /particle_cloud)、ros2 topic hz/echo、rqt_image_view、view_frames 查 TF 树、/behavior_tree_log 看行为树分支。

TECH STACK

技术栈与硬件平台

全课程围绕 ROS2 Humble + 具身智能实验箱 B2 展开:COIN-D6 激光雷达提供 /scan,麦轮底盘 + EKF 提供 odom,HP60C RGB-D 相机留给三维进阶。

URDF / Xacro TF2 坐标树 SLAM Toolbox 占据栅格地图 Nav2 导航栈 AMCL 粒子滤波 DWA / DWB TEB 弹性带 RTAB-Map OctoMap 八叉树 LaserScan /scan 实验箱 B2 · 小车 C1
PITFALL RADAR

六个高频坑,开跑前先扫一眼

以下症状在历届上机中反复出现——每条都对应课内某章节的排障入口。

坑 1 · TF 树断链

现象:RViz 全线飘红"No transform"。入口:EXP-01 08 实操——核对 display 三件套与 view_frames 输出,确认 base_footprint 挂根。

坑 2 · 地图重影"双墙"

现象:建图回环后墙变两层。入口:EXP-02——回环没闭合或遥控过快,降速重逛并检查 loop_match_minimum_response_fine(0.45)。

坑 3 · 初始位姿没给

现象:粒子散成一地,小车发疯。入口:EXP-04——RViz「2D Pose Estimate」按真实位姿给初值,或开 set_initial_pose。

坑 4 · 目标点在墙里

现象:action 返回 ABORTED。入口:EXP-03——目标必须落在 map 系空闲区且在膨胀层之外;拖点后 zoom 确认。

坑 5 · 改参不重启

现象:yaml 改了没反应。入口:EXP-05——Nav2 各 server 启动时读参,改完必须重启 navigation.launch。

坑 6 · 途经点贴太近

现象:多点导航跳过中间点。入口:EXP-06——行为树会剔除 0.7 m 内的途经点,相邻点间距请拉开到 >1.0 m,frame_id 统一写 map。

GLOSSARY

术语速查表

十六个贯穿全课程的关键词,第一次读到不懂没关系——先混个脸熟,实验里会反复遇见。

术语一句话解释首秀实验
SLAMSimultaneous Localization And Mapping:边走边画地图 + 同时知道自己在哪EXP-01
URDF / Xacro用 XML 描述机器人的连杆与关节,Xacro 支持宏展开复用EXP-01
TF坐标变换树:任意两帧之间的平移/旋转关系,ROS 的"定位坐标系语法"EXP-01
mimic 关节从动关节,不独立驱动而是按倍数跟随主动关节——car1 夹爪 5 个指节跟 1 个 r_jointEXP-01
里程计 odom由轮速/IMU 融合同步推算的"走了多远",会漂移,靠 AMCL 校正EXP-01
占据栅格把世界切成 0.05 m 的格子:话题里 100 占据 / 0 空闲 / -1 未知;存成 .pgm 后是 0 / 254 / 205 灰度EXP-02
回环检测认出"我来过这里",把累积漂移一次性修掉(地图闭合的关键)EXP-02
代价地图 costmap在地图上叠"离障碍越远越便宜"的代价层(0 / 1-252 / 254 / 255),规划只走低代价区EXP-03
行为树 BTNav2 的任务剧本:算路径→跟踪→到达,失败时翻到恢复分支(清图 / Spin / Wait)EXP-03
AMCL撒一群粒子各自"假设我在哪",用扫描打分、重采样优胜劣汰EXP-04
膨胀半径 inflation障碍外扩一圈"别靠太近"的缓冲带(默认 0.18 m),半径 = 安全距 vs 通过性的权衡EXP-05
DWA / 动态窗口只在"刹得住"的速度里采样短轨迹(最多 20×40 条),打分选最优——局部避障的心脏EXP-05
Actiongoal/feedback/result 三段式通信,专为"跑很久还要看进度"的任务EXP-06
RemovePassedGoals多点导航里"进到途经点 0.7 m 内就剔除该点"的行为树节点,决定"经过"的判定方式EXP-06
词袋 Bag-of-Words把图像特征聚类成"词汇",凭词汇相似度判断"回到旧地"EXP-07
OctoMap把三维空间切成立方体体素的可压缩地图,导航避障的三维底图EXP-07
FAQ

常见问答

把历届同学最高频的疑问前置到首页,省下你翻论坛的功夫。

Q1 · RViz 里看不到 /scan?

九成是话题没数据或 QoS 不匹配:先 ros2 topic hz /scan 确认 10 Hz,再在 RViz 里把 LaserScan 的 Reliability 改为 Best Effort。

Q2 · 建图时小车开多快?

逛圈要"慢而不停":转角减速、短暂停留;slam_teleop 默认 0.2 m/s、0.5 rad/s 已经比较稳,别再加速——开太快扫描配准跟不上,墙会画重影。

Q3 · 地图保存到哪里了?

car1_slam 的 map_save 默认写到包的 maps 目录,文件名由参数决定:-p map_name:=map_01。挪动文件后 navigation.launch 的 map:= 参数要跟着改。

Q4 · AMCL 粒子越多越准?

不一定:粒子翻倍算力也翻倍;500~2000 是常用带宽,关键是"收敛后是否假收敛"(EXP-04 互动台可试)。

Q5 · 目标点总是 ABORTED?

依次排查:目标是否在墙里/膨胀层内 → 定位是否已收敛 → 全局代价地图有没有静态层。八成出在第一步。

Q6 · 避障测试总撞箱子?

箱子放得太近(进局部窗口才被发现)或速度过快刹不住:往远放、降 max_vel_x,见 EXP-05 坑表第一行。

Q7 · 多点导航跳过了中间点?

行为树会剔除 0.7 m 内已通过的途经点:把间距拉到 >1.0 m,核对 poses[] 顺序与 frame_id(必须是 map)。

Q8 · 键盘遥控方向是反的?

teleop 的"前后"对齐机器人 +X;若反了检查 URDF 里 base link 的朝向约定,或用 TF 确认车头方向。

Q9 · 改了 yaml 没生效?

Nav2 各 server 启动时读参:Ctrl+C 重启 navigation.launch;只 lifecycle reload 单节点未必覆盖全部参数。

Q10 · TEB 要不要装?

不用:本项目 controller_plugins 固定为 FollowPath→DWB,TEB 属知识扩展;理解差异即可,动手对照见 EXP-05 互动台。

Q11 · EXP-07 没有配套源码怎么考?

原理 + 通用流程型:交付反投影验算、数据链路验证记录、二维/三维选型报告;页面 05 节已写明验收标准。

Q12 · 实验报告写什么?

固定骨架:目标 → 环境 → 步骤(命令截图)→ 数据表 → 参数→现象对照 → 思考题作答。数据务必来自你自己的终端。

Q13 · 地图和真实房间对不上?

九成是没设初始位姿:先 rviz2 的 2D Pose Estimate 拉一次;还不准就遥控走一段直角路径让 AMCL 收敛。

Q14 · 发了 /cmd_vel 车不动?

先分清两条链路:手动遥控走 /cmd_vel(限幅 ±0.3 m/s),Nav2 走 /controller/cmd_vel(不设限幅)。echo 对应话题看有没有速度,再查底盘使能、急停与 remap。

Q15 · 键盘遥控没反应?

slam_teleop 用 termios 读原始按键,必须跑在真终端(IDE 内嵌终端读不到);点一下终端窗口再按,并确认 /cmd_vel 仍在发布。

Q16 · 保存的地图打不开?

map_saver_cli 同时生成 .pgm + .yaml,yaml 里的 image 是相对路径——两个文件必须一起挪,或把 image 改成绝对路径。

LEARNING PATH

学习路径建议

顺序就是因果链

严格按 EXP-01 → 07 顺序学:URDF 的 TF 树是建图的坐标基准,建出的 map 是 Nav2 的底图,AMCL 又必须依赖 map——跳着学必然卡住。

先看懂 02 原理再敲 08 实操

每个实验的"原理通俗讲解"用生活比喻讲清机制,动画与互动台把参数手感找到——再去终端跑命令,报错时才知道去哪里排查。

地图质量决定一切

墙厚 < 0.1 m、尺寸误差 < 2%、四角闭合的"好地图"才配得上后面 4 个导航实验;地图歪了,先回 EXP-02 重建,别急着调 Nav2 参数。

单变量调参法

每次只改一个参数并记录对照:膨胀半径、粒子数、DWA 权重都有明确症状。改完 Ctrl+C 重启 navigation 栈再验证,别在运行中盲改一串。