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

ROS2 Communication

课时: 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. 解释"发布者"和"订阅者"的区别
  2. 如果要同时控制两个机器人,需要什么条件?

📐 计算题

已知:小乌龟线速度 1.5 m/s,角速度 0.75 rad/s

  • 画出的圆半径是多少?
  • 转一圈需要多少秒?

💻 实践题

  1. 用命令行实现走正方形

知识点速查表

┌─────────────────────────────────────────────────────────────┐
│                    第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周结束!🚀

results matching ""

    No results matching ""