🤖 ROS 2 少年创客营:Day 2
主题:编写你的第一个 Python 机器人程序 ------ 从"手动遥控"到"自动驾驶"
👋 欢迎回到实验室,见习工程师!
昨天回顾:我们像开"手动挡"汽车一样,通过命令行一条一条地给海龟发指令。虽然成功了,但要想画个完美的正方形,手都酸了,而且很难控制精确的时间和角度。
今天目标 :我们要升级系统!🚀
我们将告别手动输入,学习如何编写 Python 代码 ,让计算机自动、精准、智能地控制海龟。你将创建自己的工作空间,写出第一个真正的 ROS 2 节点,让海龟进入"自动驾驶"模式!
🗺️ 今日探险地图 (Checklist)
- 🏗️ 基地建设:创建专属的"工作空间" (Workspace) 和"功能包" (Package)。
- 🛠️ 工具升级:学会用 VS Code 优雅地编写代码。
- 🐍 语言解锁:理解 ROS 2 Python 代码的骨架(节点、发布者、Shebang)。
- 💻 代码实战 :编写
square_drawer.py,让海龟自动画正方形。 - 🔧 编译与注册 :配置
setup.py,理解colcon的魔法。 - 🎨 创意挑战:修改参数,让海龟画出五角星或螺旋线!
🏗️ 第一关:建立你的"秘密基地" (工作空间)
在 ROS 2 中,代码不能随便乱放。我们需要一个专门的文件夹来管理项目,这叫工作空间 (Workspace) 。
比喻:就像你要建一个乐高城堡,得先有一块平整的底板,并且把积木分类放好。
1. 创建基地
打开终端,执行以下命令:
bash
# 1. 回家目录
cd ~
# 2. 创建名为 ros2_ws (workspace 的缩写) 的文件夹
# ⚠️ 关键点:必须在里面建一个 src 文件夹!src = source (源代码)
# colcon build 默认只扫描 src 目录下的包
mkdir -p ros2_ws/src
# 3. 进入工作空间根目录
cd ros2_ws
2. 创建你的第一个"功能包" (Package)
我们要做一个叫 my_turtle_bot 的包,里面将存放我们的控制程序。
bash
# ⚠️ 关键步骤:必须先进入 src 目录再创建包!
# 如果直接在 ros2_ws 下运行,包会建错位置(建在根目录下),导致 colcon 找不到它。
cd ~/ros2_ws/src
# 🆕 优化点:添加了 --license 参数,声明开源协议 (Apache-2.0 是 ROS 社区最常用的)
ros2 pkg create --build-type ament_python --license Apache-2.0 my_turtle_bot --dependencies rclpy geometry_msgs
🔍 原理解析(敲黑板):
| 参数 | 含义 | 为什么要加它? |
|---|---|---|
--build-type ament_python |
构建类型 | 告诉 ROS 2:"这是一个 Python 项目,不是 C++。" |
--license Apache-2.0 |
许可证 | 🆕 重要! 声明你的代码是开源的。Apache 2.0 允许别人自由使用、修改甚至商用你的代码(只要保留署名),这是 ROS 社区的标准礼仪。 |
my_turtle_bot |
包名 | 你的项目名字(尽量用小写字母和下划线)。 |
--dependencies |
依赖库 | 告诉系统我们需要哪些工具箱:1. rclpy: ROS 2 的 Python 核心库。2. geometry_msgs: 包含速度消息 (Twist)。 |
✅ 成功标志 :
终端显示
Successfully created package...,且src/my_turtle_bot文件夹已生成,里面多了一个LICENSE文件。
检查命令:ls ~/ros2_ws/src/my_turtle_bot
🛠️ 第二关:工欲善其事 (选择你的代码编辑器)
写代码需要趁手的兵器。虽然我们可以用终端里的 nano,但为了更舒服地写代码、看颜色高亮和自动补全,我们推荐使用 VS Code。
选项 A:极客模式 (Nano) - 适合快速修改
如果你还在终端里,可以直接用 nano:
bash
cd ~/ros2_ws/src/my_turtle_bot/my_turtle_bot
nano square_drawer.py
(提示:在 Nano 中,Ctrl+O 保存,Ctrl+X 退出)
选项 B:大师模式 (VS Code) - 🌟 推荐!
VS Code 是全世界最流行的代码编辑器,对 Python 和 ROS 支持极好。
-
打开项目 :
在终端中输入以下命令,直接用 VS Code 打开整个工作空间:
bashcode ~/ros2_ws(如果提示
command not found,请在 VS Code 中按Ctrl+Shift+P,输入 "Shell Command: Install 'code' command in PATH" 并安装) -
创建文件:
- 在左侧文件栏,找到
src/my_turtle_bot/my_turtle_bot文件夹。 - 💡 小贴士:为什么有两个
my_turtle_bot?- 外层 (
src/my_turtle_bot):是功能包 的根目录,里面放着package.xml和setup.py(给 ROS 看的配置文件)。 - 内层 (
.../my_turtle_bot):是Python 模块 目录,里面才放你的.py代码(给 Python 解释器看的)。 - 这是 Python 包的标准规范,一定要把代码放在内层文件夹里哦!
- 外层 (
- 右键点击内层
my_turtle_bot文件夹 -> New File -> 命名为square_drawer.py。
- 在左侧文件栏,找到
-
优势:
- 彩色高亮:不同的代码部分显示不同颜色,易读。
- 智能提示 :输入
rcl会自动提示rclpy的相关函数。 - 错误检查:写错语法时,红色波浪线会立刻提醒你。
💻 第三关:编写你的第一个 Python 节点
现在,我们在 square_drawer.py 中写入真正的"大脑"代码。
1. 复制并理解代码 (核心时刻!✨)
将以下代码复制进去。别急着运行,我们先看看它是怎么工作的:
python
#!/usr/bin/env python3
# ^ 🆕 重点讲解:这行叫 Shebang (见下方解密)
import rclpy # 1. 引入 ROS 2 的 Python 核心库
from rclpy.node import Node # 2. 引入"节点"类
from geometry_msgs.msg import Twist # 3. 引入"速度消息"类型
import time # 4. 引入时间库
class TurtleSquareDrawer(Node):
"""这是一个专门画正方形的节点类"""
def __init__(self):
super().__init__('square_drawer_node') # 给节点起个独一无二的名字
# 创建发布者:向 /turtle1/cmd_vel 话题发送 Twist 类型的消息
self.publisher_ = self.create_publisher(Twist, 'turtle1/cmd_vel', 10)
self.get_logger().info('🐢 海龟画家已启动!准备画正方形...')
def move(self, linear, angular, duration):
"""
助手函数:移动指定时间
"""
msg = Twist()
msg.linear.x = linear
msg.angular.z = angular
start_time = time.time()
# 🆕 优化:循环发布消息,直到达到指定时长
# 使用 0.05秒 (20Hz) 的频率,比 0.1秒 更平滑,防止动作卡顿
while (time.time() - start_time) < duration:
self.publisher_.publish(msg)
time.sleep(0.05)
# 发送停止信号
stop_msg = Twist()
self.publisher_.publish(stop_msg)
time.sleep(0.5)
def draw_square(self):
"""主逻辑:画一个正方形"""
side_speed = 2.0
turn_speed = 1.5
move_time = 2.0
# 90度 ≈ 1.57弧度。1.57 / 1.5 ≈ 1.05秒
turn_time = 1.05
for i in range(4):
self.get_logger().info(f'第 {i+1} 条边:前进!')
self.move(linear=side_speed, angular=0.0, duration=move_time)
self.get_logger().info(f'第 {i+1} 个角:转弯!')
self.move(linear=0.0, angular=turn_speed, duration=turn_time)
self.get_logger().info('🎉 正方形画完啦!')
def main(args=None):
rclpy.init(args=args)
node = TurtleSquareDrawer()
try:
node.draw_square()
except KeyboardInterrupt:
pass
node.destroy_node()
rclpy.shutdown()
if __name__ == '__main__':
main()
🧠 代码深度解密
1️⃣ 什么是 Shebang (#!/usr/bin/env python3)? 🆕
- 位置 :代码文件的第一行。
- 作用 :它是一个特殊的标记,告诉 Linux 操作系统:"嘿,当你直接运行这个文件时,请使用
/usr/bin/env找到的python3解释器来执行我!" - 为什么重要 :
- 如果没有它,Linux 可能不知道用什么语言运行这个文件。
- 加上它,配合文件权限设置,你就可以像运行普通程序一样直接运行它。
🛠️ 小操作:赋予执行权限
虽然 ros2 run 不需要这一步,但作为一个好习惯,建议在写完代码后运行:
bash
chmod +x src/my_turtle_bot/my_turtle_bot/square_drawer.py
2️⃣ 核心逻辑
class ... (Node): 定义一个"海龟画家"类,继承自 ROS 2 的Node,获得通信超能力。create_publisher: 安装"无线电发射器",向turtle1/cmd_vel频道发射速度信号。move函数: 小助手。以 20Hz 的频率循环发送速度指令,时间一到立刻发"停止"信号。draw_square: 总指挥。循环 4 次:走直线 -> 转弯。
🔧 第四关:注册、编译与 Colcon 揭秘
写完代码不能直接跑,ROS 2 还不知道这个新脚本的存在。我们需要两步操作:
1. 注册入口 (修改 setup.py)
打开 src/my_turtle_bot/setup.py 文件(在 VS Code 中点击该文件即可):
找到 entry_points 部分,修改如下(注意同时检查 install_requires):
python
# 🆕 优化:明确列出基础依赖,防止运行时报错
install_requires=['setuptools'],
entry_points={
'console_scripts': [
# 格式:'以后运行的命令名 = 包名.文件名:函数名'
# 注意:这里的 my_turtle_bot 是内层的 Python 模块名
'draw_square = my_turtle_bot.square_drawer:main',
],
},
💡 记忆口诀 :
命令名 = 包名.文件名:主函数名以后只要输入
ros2 run my_turtle_bot draw_square就能运行了!
2. 🆕 什么是 Colcon? (Common Constructor)
在执行编译命令前,我们来认识一下今天的大功臣 Colcon。
- 全称 :Co mmon Constructor (通用构建工具)。
- 身份:它是 ROS 2 的"包工头"兼"总指挥"。
- 它做了什么?
当你运行colcon build时,它在幕后忙碌地做了三件事:- 扫描 (Scan) :走进
src文件夹,找出所有的包(通过识别package.xml)。 - 排序 (Sort):如果包 A 依赖包 B,它会先编译 B,再编译 A。
- 构建 (Build) :
- 对于 Python 包:它检查语法,整理文件结构,生成可执行脚本。
- 对于 C++ 包:它调用
cmake和make进行编译。
- 安装 (Install) :把生成的可执行文件和库,整齐地复制到
install/文件夹中,方便系统调用。
- 扫描 (Scan) :走进
简单说:没有 Colcon,你的代码只是一堆文本;有了 Colcon,它们才变成系统能识别的"程序"。
3. 执行编译
回到根目录 ros2_ws 进行编译:
bash
cd ~/ros2_ws
colcon build
- 现象 :屏幕滚动信息,生成
build,install,log文件夹。 - ✅ 成功标志 :显示
Summary: 1 package finished.
4. 加载环境 (关键一步!❗)
编译后,必须刷新环境变量:
bash
source install/setup.bash
(⚠️ 重要提示:每次新开终端窗口,都要运行这句命令,否则系统找不到你刚编译好的程序!)
🚀 第五关:见证奇迹时刻!
准备好了吗?让我们运行代码!
1. 启动海龟仿真器
(如果之前没开,先开一个终端运行)
bash
ros2 run turtlesim turtlesim_node
2. 运行你的 Python 节点
新开一个终端 ,记得先 source 环境:
bash
source ~/ros2_ws/install/setup.bash
ros2 run my_turtle_bot draw_square
👀 观察现象
- 终端打印日志:
🐢 海龟画家已启动!... - 仿真窗口里,小海龟自动 走出一个完美的正方形!🔲
- 任务完成!
🎉 恭喜! 你刚刚完成了从"手动遥控"到"自动编程"的飞跃!
🎨 第六关:创意挑战赛 (课后作业)
现在的海龟只会画正方形,太无聊了。作为创客,你要改造它!
🌟 挑战等级
-
🥉 青铜级:画三角形 🔺
- 任务 :修改
range(4)为range(3)。 - 思考 :三角形外角是 120 度 (≈ 2.09 弧度)。
turn_time应该设为多少?(2.09 / 1.5≈ 1.4 秒)
- 任务 :修改
-
🥈 白银级:画五角星 ⭐
- 任务:循环 5 次。
- 思考 :五角星每次转弯角度是 144 度 (≈ 2.51 弧度)。调整时间让比例协调 (
2.51 / 1.5≈ 1.67 秒)。
-
🥇 黄金级:画螺旋线 🌀
- 任务 :在循环内部动态增加
move_time。 - 思路 :
move_time = move_time + 0.2,每次多跑一点,海龟就会越跑越远,形成螺旋。
- 任务 :在循环内部动态增加
-
💎 钻石级:绘制你的名字首字母 ✍️
- 组合
go_forward,turn_left,go_backward等动作,画出你名字的第一个字母。
- 组合
🆘 常见问题急救包 (Troubleshooting)
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
Package not found |
1. 没运行 source2. 包不在 src 下 |
1. 运行 source install/setup.bash2. 检查目录结构,确保包在 ~/ros2_ws/src/ 内 |
ImportError: No module named... |
setup.py 没改对,或者文件放错了文件夹 |
1. 检查 entry_points 里的文件名和函数名拼写。2. 确保 .py 文件在内层 my_turtle_bot 文件夹里。 |
| 海龟不动 | 没启动 turtlesim_node |
确保另一个终端里正在运行仿真器。 |
| VS Code 打不开 | 未安装 code 命令 | 在 VS Code 中按 F1,输入 "Install 'code' command"。 |
| colcon build 失败 | 语法错误或依赖缺失 | 仔细查看报错信息的最后几行,通常是 Python 语法错误。 |
📝 Day 2 总结清单
| 步骤 | 关键命令/概念 | 作用 |
|---|---|---|
| 建基地 | mkdir -p ws/src |
创建工作空间 (必须包含 src) |
| 建包 | cd src + ros2 pkg create ... |
在 src 内生成项目骨架 |
| 写代码 | #!/usr/bin/env python3 |
Shebang: 指定解释器 |
| 编辑器 | code . |
使用 VS Code 高效开发 |
| 注册 | 修改 setup.py |
告诉 ROS 2 入口在哪 |
| 编译 | colcon build |
Colcon: 构建系统的包工头 |
| 激活 | source install/setup.bash |
加载新包到当前环境 |
| 运行 | ros2 run <包名> <命令名> |
启动节点 |
🔮 明日预告 (Day 3)
海龟只能盲目地走固定时间吗?如果它走歪了怎么办?
明天,我们将赋予海龟**"眼睛"和"大脑"**:
- 订阅者 (Subscriber) :如何让海龟"看"到自己的实时位置 (
pose)?- 闭环控制:编写代码,让海龟自动走到坐标 (5.0, 5.0),如果偏了就自动修正方向。
- 真正的智能:从"开环控制"进化到"闭环控制"!
明天见,未来的机器人专家!
© 2026 ROS 2 少年创客营 | 让每个孩子都能创造未来