第2周:ROS2基本命令介绍和通信机制基础

课时: 2小时50分钟(含10分钟休息)
📋 本周课程表
| 次序 | 时间 | 主题 | 内容 |
|---|---|---|---|
| 第1次 | 1小时20分钟 | ROS2基本命令 | 节点/话题/服务命令、工作目录、编译 |
| 第2次 | 1小时20分钟 | 通信机制基础 | 节点与话题深入理解、Pub/Sub模型 |
第一次课:ROS2基本命令(1小时20分钟)
⏱️ 时间分配
| 环节 | 时间 | 内容 |
|---|---|---|
| 复习 | 10分钟 | 上周内容回顾 |
| 基本命令 | 30分钟 | 节点/话题/服务命令 |
| 工作目录 | 15分钟 | 工作空间、编译命令 |
| 实战 | 20分钟 | 练习使用命令 |
| 总结 | 5分钟 | 本周小结 |
1.1 ROS2 基本命令概述
ROS2提供了一套完整的命令行工具,用于管理和操作节点、话题、服务等。
┌─────────────────────────────────────────────────────────────────┐
│ ROS2 命令体系 │
├─────────────────────────────────────────────────────────────────┤
│ │
│ ros2 pkg → 包管理 │
│ ros2 node → 节点管理 │
│ ros2 topic → 话题管理 │
│ ros2 service→ 服务管理 │
│ ros2 action → 动作管理 │
│ ros2 param → 参数管理 │
│ ros2 launch → 启动管理 │
│ ros2 bag → 录制/回放 │
│ │
└─────────────────────────────────────────────────────────────────┘
1.2 节点命令(Node Commands)
查看节点
# 列出所有运行中的节点
ros2 node list
# 查看节点信息
ros2 node info /节点名称
示例:
$ ros2 node list
/turtlesim
/teleop_turtle
运行节点
# 运行一个包中的节点
ros2 run <包名> <节点名>
# 示例:运行小乌龟
ros2 run turtlesim turtlesim_node
ros2 run turtlesim turtle_teleop_key
1.3 话题命令(Topic Commands)
查看话题
# 列出所有话题
ros2 topic list
# 查看话题信息
ros2 topic info /话题名称
# 查看话题消息类型
ros2 topic type /话题名称
示例:
$ ros2 topic list
/turtle1/cmd_vel
/turtle1/pose
/turtle1/color_sensor
$ ros2 topic info /turtle1/cmd_vel
Type: geometry_msgs/msg/Twist
Publisher count: 1
Subscription count: 1
发布话题
# 发布消息到话题
ros2 topic pub <话题名> <消息类型> "<数据>"
# 示例:让小乌龟前进
ros2 topic pub /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 1.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 0.0}}"
监听话题
# 监听话题消息
ros2 topic echo <话题名>
# 示例:监听小乌龟位置
ros2 topic echo /turtle1/pose
1.4 服务命令(Service Commands)
# 列出所有服务
ros2 service list
# 调用服务
ros2 service call <服务名> <服务类型> "<数据>"
1.5 工作空间与编译命令
工作空间结构
workspace/
├── src/ # 源代码目录
│ ├── package1/
│ ├── package2/
│ └── ...
├── build/ # 编译输出
├── install/ # 安装目录
└── log/ # 编译日志
编译命令
# 进入工作空间
cd ~/ros2_ws
# 编译所有包
colcon build
# 编译指定包
colcon build --packages-select <包名>
# 只编译修改过的包(更快)
colcon build --packages-up-to <包名>
# 清理编译
colcon clean
环境设置
# source 安装目录(每次打开终端需要)
source install/setup.bash
# 或使用 zsh
source install/setup.zsh
第二次课:通信机制深入(1小时20分钟)
1.1 节点深入理解(40分钟)
1.1.1 节点的特性
① 单一职责
原则:每个节点只做一件事
好例子:一个节点做一件事
┌─────────────────────────────────────────────┐
│ /camera_node → 只管相机 │
│ /detection_node → 只管检测 │
│ /navigation_node → 只管导航 │
└─────────────────────────────────────────────┘
❌ 不好例子:一个节点做所有事
┌─────────────────────────────────────────────┐
│ /super_robot_node │
│ → 相机+检测+导航+控制+显示+...全部搞定 │
└─────────────────────────────────────────────┘
② 独立运行
节点是独立的进程,互不干扰:
┌─────────────────────────────────────────────┐
│ │
│ 进程A (/camera) 进程B (/detection) │
│ │ │ │
│ ▼ ▼ │
│ 相机驱动 目标检测 │
│ │ │ │
│ │ │ │
│ 即使A崩溃,B继续运行! │
│ │
└─────────────────────────────────────────────┘
③ 松耦合
松耦合 = 不需要知道对方在哪
发布者: 订阅者:
┌────────────┐ ┌────────────┐
│ 我只管发布 │ ────────►│ 我只管订阅 │
│ 到/camera │ │ /camera │
└────────────┘ └────────────┘
不需要知道 不需要知道
谁在订阅 谁在发布
1.1.2 节点的生命周期
节点状态机:
┌──────────┐
│ 未初始化 │
└─────┬────┘
│ rclpy.init()
▼
┌──────────┐
│ 初始 │ ◄──────────────┐
└─────┬────┘ │
│ create_node() │
▼ │
┌──────────┐ │
┌─────►│ 运行中 │─────┐ │
│ │ └─────┬────┘ │ │
│ │ │ │ │destroy_node()
│ │ spin() │ │
│ │ │ │ │
│ │ ▼ │ │
│ │ ┌──────────┐ │ │
│ │ │ 销毁中 │───┘ │
│ │ └──────────┘ │
│ │ │ │
│ │ ▼ │
│ │ ┌──────────┐ │
│ └──────│ 已销毁 │◄────────────────
└──────────┘
rclpy.shutdown()
1.2 话题深入理解(50分钟)
1.2.1 话题的特性
① 异步通信
异步 = 发布者不等订阅者
发布者: 订阅者:
┌────────────┐ ┌────────────┐
│ 碰碰碰 │ ────────►│ 叮叮叮 │
│ (连续发布) │ │ (收到回调) │
└────────────┘ └────────────┘
│ │
▼ ▼
不等待 收到就处理
继续运行 后再等待
② 消息队列
队列大小 = 10
发布者 ──► [消息1] [消息2] [消息3] ... [消息10] ──► 订阅者
▲ │
│ │
│ 新消息 │ 消费
└────────────────────────────────────────┘
如果订阅者处理太慢,队列只保留最近10条
1.2.2 消息类型详解
Twist消息(最常用的速度消息)
# geometry_msgs/Twist 定义
# 文件位置: geometry_msgs/msg/Twist.msg
# 线性速度(单位:米/秒)
geometry_msgs/Vector3 linear
float64 x # 前进方向 +为前 -为后
float64 y # 侧向(差速机器人通常为0)
float64 z # 垂直(平面运动为0)
# 角速度(单位:弧度/秒)
geometry_msgs/Vector3 angular
float64 x # 滚转(平面运动为0)
float64 y # 俯仰(平面运动为0)
float64 z # 偏航 +为逆时针 -为顺时针
1.2.3 发布/订阅模型
数据流向:
发布者节点 订阅者节点
┌────────────┐ ┌────────────┐
│ │ │ │
│ create_ │ DDS网络 │ create_ │
│ publisher │◄─────────────────►│ subscriber │
│ (/cmd_vel) │ (话题传输) │ (/cmd_vel) │
└─────┬──────┘ └─────┬──────┘
│ │
▼ ▼
┌────────────┐ ┌────────────┐
│ 发布Twist │ │ 回调函数 │
│ 消息 │ │ 处理消息 │
└────────────┘ └────────────┘
1.3 探索Turtlesim(30分钟)
演示1:查看节点
# 先启动Turtlesim(如果还没启动)
ros2 run turtlesim turtlesim_node
# 查看所有运行中的节点
ros2 node list
# 输出:
# /turtlesim
演示2:查看话题
# 查看所有话题
ros2 topic list
# 输出:
# /parameter_events
# /rosout
# /turtle1/cmd_vel ← 速度命令
# /turtle1/color_sensor ← 颜色传感器
# /turtle1/goal_vel ← 目标速度
# /turtle1/pose ← 位置坐标
演示3:监听话题
# 监听位置话题
ros2 topic echo /turtle1/pose
# 输出:
# x: 5.444444656
# y: 5.444444656
# theta: 0.0
# linear_velocity: 0.0
# angular_velocity: 0.0
第二次课:通信机制深入(1小时20分钟)
⏱️ 时间分配
| 环节 | 时间 | 内容 |
|---|---|---|
| 复习 | 10分钟 | 提问巩固基本命令 |
| 节点深入 | 20分钟 | 节点特性、通信模式 |
| 话题深入 | 20分钟 | 发布/订阅模型 |
| 实战 | 25分钟 | Turtlesim话题实验 |
| 总结 | 5分钟 | 本周小结 |
2.1 速度控制原理(40分钟)
2.1.1 运动学基础
重要公式
LaTeX公式
$$v = r \cdot \omega$$
其中:
- $v$ = 线速度 (m/s)
- $r$ = 圆的半径 (m)
- $\omega$ = 角速度 (rad/s)
推导:
- $r = v / \omega$ (求半径)
- $\omega = v / r$ (求角速度)
公式:圆周运动
┌─────────────────────────────────────┐
│ v = r × ω │
│ │
│ 其中: │
│ • v = 线速度 (m/s) │
│ • r = 圆的半径 (m) │
│ • ω = 角速度 (rad/s) │
│ │
│ 推导: │
│ r = v / ω (求半径) │
│ ω = v / r (求角速度) │
└─────────────────────────────────────┘
常用角度转换
| 角度 | 弧度 | 计算 |
|---|---|---|
| 360° | 2π ≈ 6.283 | 2 × 3.14159 |
| 180° | π ≈ 3.142 | 3.14159 |
| 90° | π/2 ≈ 1.571 | 3.14159 / 2 |
| 60° | π/3 ≈ 1.047 | 3.14159 / 3 |
| 45° | π/4 ≈ 0.785 | 3.14159 / 4 |
2.1.2 速度组合表
| 动作 | linear.x | angular.z | 效果 |
|---|---|---|---|
| 直行前进 | 1.0 | 0.0 | 1m/s向前 |
| 直行后退 | -1.0 | 0.0 | 1m/s向后 |
| 原地左转 | 0.0 | 1.0 | 逆时针1rad/s |
| 原地右转 | 0.0 | -1.0 | 顺时针1rad/s |
| 前进左转 | 1.0 | 0.5 | 画圆(半径2m) |
| 停止 | 0.0 | 0.0 | 静止 |
2.1.3 数学计算示例
示例1:半径2米的圆
- 设定线速度 v = 2 m/s
- 半径 r = 2 m
- 角速度 ω = v / r = 2 / 2 = 1 rad/s
- 命令:linear.x=2.0, angular.z=1.0
示例2:每秒转一圈
- 周期 T = 1秒
- 角速度 ω = 2π / T = 2π ≈ 6.28 rad/s
- 命令:angular.z=6.28
2.2 命令行发布速度(30分钟)
基本语法
# 语法
ros2 topic pub <话题> <消息类型> <数据>
# 示例
ros2 topic pub /turtle1/cmd_vel geometry_msgs/Twist \
"{linear: {x: 1.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 0.0}}"
2.3 画圆实验(60分钟)
实验1:基础画圆
# 让小乌龟画圆(前进 + 左转)
ros2 topic pub --rate 1 /turtle1/cmd_vel geometry_msgs/Twist \
"{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: 1.0}}"
按
Ctrl+C停止
实验2:不同半径
| 目标半径 | 线速度 | 角速度 | 命令参数 |
|---|---|---|---|
| 1米 | 1.0 m/s | 1.0 rad/s | x=1.0, z=1.0 |
| 2米 | 2.0 m/s | 1.0 rad/s | x=2.0, z=1.0 |
| 4米 | 2.0 m/s | 0.5 rad/s | x=2.0, z=0.5 |
实验3:顺时针画圆
# 顺时针转
ros2 topic pub --rate 1 /turtle1/cmd_vel geometry_msgs/Twist \
"{linear: {x: 1.0, y: 0.0, z: 0.0}, angular: {x: 0.0, y: 0.0, z: -1.0}}"
本周实验报告
✅ 验收清单
| 序号 | 实验 | 要求 | 完成 |
|---|---|---|---|
| 1 | 查看节点 | ros2 node list | ☐ |
| 2 | 查看话题 | ros2 topic list | ☐ |
| 3 | 监听话题 | ros2 topic echo /turtle1/pose | ☐ |
| 4 | 前进命令 | 小乌龟前进 | ☐ |
| 5 | 画圆 | 半径2米的圆 | ☐ |
| 6 | 顺时针 | 顺时针画圆 | ☐ |
| 7 | 旋转 | 原地转圈 | ☐ |
| 8 | 停止 | 发送停止命令 | ☐ |
本周作业
📝 理论题
- 解释"发布者"和"订阅者"的区别
- 如果要同时控制两个机器人,需要什么条件?
📐 计算题
已知:小乌龟线速度 1.5 m/s,角速度 0.75 rad/s
- 画出的圆半径是多少?
- 转一圈需要多少秒?
💻 实践题
- 用命令行实现走正方形
知识点速查表
┌─────────────────────────────────────────────────────────────┐
│ 第2周知识点速查 │
├─────────────────────────────────────────────────────────────┤
│ 概念 │
│ ├── Node = 独立运行的程序 │
│ ├── Topic = 异步通信频道 │
│ ├── Publisher = 发布者 │
│ ├── Subscriber = 订阅者 │
│ └── Twist = 速度消息类型 │
│ ├── linear.x = 线速度 (m/s) │
│ └── angular.z = 角速度 (rad/s) │
├─────────────────────────────────────────────────────────────┤
│ 公式 │
│ ├── v = r × ω │
│ ├── r = v / ω │
│ └── ω = v / r │
├─────────────────────────────────────────────────────────────┤
│ 命令 │
│ ├── ros2 node list │
│ ├── ros2 topic list │
│ ├── ros2 topic echo <topic> │
│ └── ros2 topic pub <topic> <type> <data> │
└─────────────────────────────────────────────────────────────┘
下周预告
🆙 进阶内容:用消息应用控制机器人(RosClaw)
想用Telegram/Discord/WhatsApp控制机器人吗?
RosClaw快速入门
# 克隆RosClaw
git clone https://github.com/PlaiPin/rosclaw.git
cd rosclaw
# 安装依赖
pnpm install
pnpm build
# 启动ROS2 + rosbridge
cd docker
docker compose up
# 配置OpenClaw连接
# 在OpenClaw中配置 ws://localhost:9090
自然语言控制示例
用户发送 → 机器人执行
─────────────────────────────────────
"Move forward 1m" → /cmd_vel 发布速度
"Turn left 90" → /cmd_vel 发布角速度
"Stop" → /cmd_vel 全零
"Take a photo" → /camera/capture
更多资源
第3周:Python编程与机器人控制
- 编写第一个Python ROS2节点
- 用代码控制小乌龟
- 实现走正方形
第2周结束!🚀