我带少年创客营已经第八天了。Day 8的主题只有一个:让 ROS2 机器人自己找到路。说实话,这是整个营里最让人紧张也最兴奋的半天——前面几天我们学会了让小海龟转圈、写话题节点、用服务控制机器人、用动作执行长时间任务,但导航不一样,它把前面学的所有东西一次性串了起来。这篇文章不是官方教程,而是我们第 8 天的完整复盘,里面有教学设计、现场命令、踩坑记录,还有给孩子们准备的引导话术,适合正在带学生做 ROS2 项目的老师、想陪孩子玩机器人的家长,以及自学导航但总被“定位”和“路径规划”绕晕的人。
1. 课程走到第 8 天,为什么把导航当成重点
1.1 前 7 天的基础积累
我们这个营的学员年龄在 11 到 16 岁之间,大部分之前只玩过 Scratch 这类图形化编程,真正接触 Python 和命令行的很少。所以在入营前 7 天,课程安排得非常“碎”,每天只解决一个小问题,但每个问题都是后面导航的零件。
| Day | 主题 | 核心内容 | 孩子们当时的状态 |
|---|---|---|---|
| Day 1 | 操作系统与 ROS2 安装 | Ubuntu 22.04 + ROS2 Humble,了解 ros2、source、工作区 |
装到一半想放弃,但成功 launch 小海龟后全部真香 |
| Day 2 | 小海龟初体验 | ros2 run turtlesim turtle_teleop_key,话题订阅 /turtle1/cmd_vel |
争着遥控小乌龟,顺便理解了“发布者和订阅者” |
| Day 3 | 话题 Topic | 自己写 Python 节点发布坐标,键盘控制机器人 | 第一次觉得“我在编程”,虽然只是 copy 改参数 |
| Day 4 | 服务 Service | 用服务请求让小乌龟画正方形 | 明白了请求-响应模型,和话题的区别 |
| Day 5 | 动作 Action | 用 action 接口控制模拟机械臂执行“抓取-放置” | 开始接触“目标”“反馈”“结果”三层概念 |
| Day 6 | URDF 建模 | 用 URDF 给机器人搭身体,在 rviz2 里看到模型 | 对“坐标系”有了直观认识,知道 base_link 是什么 |
| Day 7 | Gazebo 仿真 | 把 URDF 放进 Gazebo,加入激光雷达、差速驱动 | 已经能看懂 / odom,知道车是靠 /cmd_vel 动的 |
到 Day 7 结束,孩子们其实已经掌握了 ROS2 最核心的通信机制:话题、服务、动作。Day 8 如果继续讲一个新概念,比如 TF2 进阶或者插件开发,可能就劝退了一半人。但导航不一样,它是把话题、服务、动作、URDF、Gazebo 全部串起来的一个完整项目,而且结果可视化程度极高——机器人有没有到达目标点,一眼就能看出来。
1.2 导航为什么是少年营最好的“毕业项目”
我在设计课程时有一个原则:每一个大项目,必须让孩子在 40 分钟内看到一次“完整的成功”。导航完美满足这个条件。它由五个环节组成:
- 机器人通过激光雷达感知周围障碍物,这是话题通信;
- AMCL 不断比较当前扫描和已知地图,输出机器人位姿,这背后是很多服务调用;
- 导航任务本身是一个长时间执行的动作,符合 Action 的模型;
- 机器人最终通过
/cmd_vel话题接收速度指令,完成移动; - 整个过程在 rviz2 里可视化,绿色路径、蓝色箭头、代价地图层层展开。
从行业角度看,移动机器人导航是仓储物流、巡检机器人、服务机器人里最核心的能力,青少年学完之后可以直接迁移到真实项目上。而且它不像机械臂控制那样需要太多数学基础,只要把“我在哪、要去哪、怎么去”这三件事讲清楚,再用仿真验证,孩子们就能理解移动机器人工作的全貌。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 给孩子们讲清楚导航三件事
2.1 我在哪:定位
开讲之前我先问了一个问题:“你闭着眼睛在教室里走五步,还能准确说出自己站在哪吗?”孩子们说不能。我说机器人也一样,它只知道轮子转了多少圈,这就是里程计。里程计在短时间挺准,但时间一长,轮子打滑、地面不平,误差就越来越大,机器人以为自己在一个位置,实际上早就偏了。
ROS2 里解决这个问题的是 AMCL,全称是“自适应蒙特卡洛定位”。名字听着吓人,但本质可以理解成:机器人手里抓着一把“猜测粒子”,每个粒子是一个可能的位姿(位置 + 朝向)。激光雷达每扫描一次,AMCL 就把这些粒子跟已知地图对一遍,跟地图匹配得好的粒子留下并复制多一点,匹配不好的粒子扔掉。反复几次,粒子们就聚成一团,机器人的位置就锁定了。
在 rviz2 里,孩子们能看到一团绿色箭头代表粒子。他们最喜欢干的事是什么?就是在地图另一个位置故意发一个错误的初始位姿,然后看粒子怎么“挣扎”着收敛到真实位置。这个过程比任何
