ROS 2 少年创客营:Day 2

🤖 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 支持极好。

  1. 打开项目

    在终端中输入以下命令,直接用 VS Code 打开整个工作空间:

    bash 复制代码
    code ~/ros2_ws

    (如果提示 command not found,请在 VS Code 中按 Ctrl+Shift+P,输入 "Shell Command: Install 'code' command in PATH" 并安装)

  2. 创建文件

    • 在左侧文件栏,找到 src/my_turtle_bot/my_turtle_bot 文件夹。
    • 💡 小贴士:为什么有两个 my_turtle_bot
      • 外层 (src/my_turtle_bot):是功能包 的根目录,里面放着 package.xmlsetup.py(给 ROS 看的配置文件)。
      • 内层 (.../my_turtle_bot):是Python 模块 目录,里面才放你的 .py 代码(给 Python 解释器看的)。
      • 这是 Python 包的标准规范,一定要把代码放在内层文件夹里哦!
    • 右键点击内层 my_turtle_bot 文件夹 -> New File -> 命名为 square_drawer.py
  3. 优势

    • 彩色高亮:不同的代码部分显示不同颜色,易读。
    • 智能提示 :输入 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 时,它在幕后忙碌地做了三件事:
    1. 扫描 (Scan) :走进 src 文件夹,找出所有的包(通过识别 package.xml)。
    2. 排序 (Sort):如果包 A 依赖包 B,它会先编译 B,再编译 A。
    3. 构建 (Build)
      • 对于 Python 包:它检查语法,整理文件结构,生成可执行脚本。
      • 对于 C++ 包:它调用 cmakemake 进行编译。
    4. 安装 (Install) :把生成的可执行文件和库,整齐地复制到 install/ 文件夹中,方便系统调用。

简单说:没有 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

👀 观察现象

  1. 终端打印日志:🐢 海龟画家已启动!...
  2. 仿真窗口里,小海龟自动 走出一个完美的正方形!🔲
  3. 任务完成!

🎉 恭喜! 你刚刚完成了从"手动遥控"到"自动编程"的飞跃!


🎨 第六关:创意挑战赛 (课后作业)

现在的海龟只会画正方形,太无聊了。作为创客,你要改造它!

🌟 挑战等级

  • 🥉 青铜级:画三角形 🔺

    • 任务 :修改 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 少年创客营 | 让每个孩子都能创造未来

相关推荐
fundoit2 小时前
OpenClaw与ROS2的集成控制:从自然语言指令到机器人动作
机器人·openclaw
何玺3 小时前
“未来机器人按Token收费”——百度沈抖在博鳌绘出新图景
百度·机器人
bing_feilong3 小时前
MID360录制3D雷达数据bag包
机器人
fundoit4 小时前
OpenClaw通过ROS控制机器人完整教程
人工智能·ai·机器人·ai编程·openclaw
码农三叔5 小时前
(11-3)感知-运动耦合与行为理解:行为识别与预测
人工智能·机器人·自动驾驶·agent·人形机器人
沉睡的无敌雄狮7 小时前
B2B企业获客技术瓶颈:矩阵跃动龙虾机器人+GEO,精准捕捉采购端搜索流量
大数据·矩阵·机器人
yhdata8 小时前
多轴点焊机器人产业动能强劲:538.2亿元市场规模奠基,2032年将跃升至近1154.9亿元
机器人
欧阳秦穆8 小时前
使用openclaw+ollama+飞书部署智能机器人
机器人·飞书·openclaw
Deepoch9 小时前
Deepoc具身模型开发板:巡检机器人的“全天候工业视觉”中枢
人工智能·科技·机器人·开发板·巡检机器人·具身模型·deepoc