机器人仿真技术前沿综述
零、这一节你会学到什么
为什么机器人研究离不开仿真?在虚拟世界里,我们可以低成本地验证算法、复现实验,甚至让机器人"摔"上千次而不心疼。仿真既是控制工程师的实验室,也是具身智能研究者的训练场。
- 从控制工程的视角出发,你会理解仿真的本质定义、三大核心价值与"仿不全"的固有局限,并对比 Gazebo、Webots、Ignition、Unity 四大平台,看清本课程为何选择 Gazebo。
- 进入具身智能的世界,你将认识 Body、Brain、Environment 三元结构,回顾从 Shakey 到 Atlas 再到 RT-2 的技术演进,理解 Sim2Real 的核心挑战,并纵览七款主流仿真器。
- 最后,我们将从 ROS2 的 Turtlesim 起步,掌握话题、服务、动作三种通信范式,探索多机协同,并搭建通往 Gazebo 的桥梁。
这三条线索交织在一起,为你打开机器人仿真的全景图。准备好了吗?让我们从"零"开始。
试着同时启动 Turtlesim 和 Gazebo,观察两者的界面差异与操作手感——一个是极简的二维沙盘,一个是逼真的三维世界,你更喜欢哪一种?
❝
仿真不是现实的替代品,而是通往现实的桥梁。每一个在虚拟世界中跑通的算法,都在为真实世界中的机器人铺路。
从控制工程到具身智能,从 Turtlesim 到 Gazebo——这条路,从今天开始。
——博士创新站
一、控制理论与控制工程视角下的"机器人仿真"
1.1 什么是机器人仿真
机器人仿真,就是通过软件来模仿硬件的特性,用于验证机器人算法、架构等。这个定义简单直白。
仿真的核心是用软件模型替代物理实体,在虚拟环境中复现机器人的运动学、动力学、感知与控制行为。它属于数字孪生(Digital Twin)概念的早期形态,是算法验证和系统集成的核心。
仿真与真机不是替代关系,而是互补关系。仿真回答"能不能做",真机回答"做得好不好"。仿真里跑不通的算法,上真机大概率也会出问题。但仿真里表现完美的方案,真机未必能直接复现。
你可以把机器人仿真理解为"虚拟实验室"。就像物理课上的电路仿真软件,不用去焊电路,就能知道电流会怎么流。机器人仿真也是一样,不用造一台机器人,就能在电脑里看它会不会撞墙、能不能走到目标点。
1.2 为什么需要仿真
解决真机资源不足
机器人价格昂贵。在创业公司的真实场景中,不同部门抢机器人的现象时常发生:算法组在调试导航,视觉组等着标定摄像头,硬件组又要测功耗——一台机器根本不够用。
在教学场景里,这个问题更突出。学生人数多,真机数量有限,仿真提供了"人手一台"的虚拟实验环境。每个人都能在自己的电脑上搭建机器人系统,不用排队等硬件。
保证环境的一致和稳定
真机存在硬件个体差异、磨损、松动等问题。一个典型案例:同一套代码,A 机器人运行正常,B 机器人却频繁丢位置。排查了两天,最后发现是 B 的 IMU 模块松了一颗螺丝。
仿真环境可以完全复现,排除硬件不确定性的干扰。可重复性是实验科学的基础。如果每次实验条件都不一样,你就无法判断结果变化来自算法改进,还是硬件波动。
场景灵活,加速迭代
仿真软件可以快速更改环境、障碍物、地形、光照等参数。你可以测试极端场景:机器人在悬崖边会不会掉下去?碰撞后能不能恢复?
控制算法的参数调优尤其受益于仿真。你可以在虚拟环境中批量测试不同的 PID 参数组合,筛选出最优方案后再上真机验证。这缩短了研发周期,降低了试错成本。
| 对比维度 | 真机实验 | 仿真实验 |
|---|---|---|
| 成本 | 硬件购置与维护费用高 | 仅需电脑,成本极低 |
| 可重复性 | 受硬件个体差异影响 | 环境完全可控,结果可复现 |
| 安全性 | 存在碰撞、损坏风险 | 无物理风险,可大胆尝试 |
| 场景灵活性 | 修改环境需重新搭建 | 参数化调整,秒级切换 |
| 调试效率 | 需排队共享设备 | 人手一套,并行开发 |
| 真实度 | 100% 真实物理世界 | 存在"仿不全"的固有差距 |
仿真不是"玩游戏",而是严肃的工程验证手段。它的核心价值概括为三点:资源普惠(人手一台虚拟机器人)、结果可信(排除干扰,确保实验可重复)、迭代加速(低成本试错,快速收敛最优方案)。
1.3 仿真的局限性
机器人仿真的主要缺陷就是"仿不全"。现实世界非常复杂,光线、材质、电磁干扰等等,仿真平台无法做到 100% 还原。
物理层面的差距最为直接。仿真中的摩擦力模型往往是理想化的,真实地面的摩擦系数会随温度、湿度变化。接触碰撞的细微差异、柔性体的变形,都很难精确建模。
感知层面的差距同样显著。仿真中的摄像头是"完美"的传感器,没有噪点、没有镜头畸变、光照永远均匀。真实摄像头的信噪比、动态范围,都会给视觉算法带来额外的挑战。
还有一些因素几乎无法建模:电机运转时的电磁干扰、无线通信的丢包和延迟、电源波动对传感器读数的影响等等。有做机械臂动力学的工程师坦言,"从来没做过仿真",因为仿真与真实环境差别过大,结果对真机调试几乎没有参考价值。
仿真结果不能等同于真机表现。从仿真到真机的迁移(Sim-to-Real)是机器人学的重要课题,至今没有万能解法。建议采用"仿真验证 + 真机微调"的两阶段策略:先在仿真里把算法跑通,再上真机做参数适配。
1.4 ROS2 常用仿真平台
相较于 ROS,ROS2 支持更多更专业的仿真平台。下面介绍四个最常用的选择。
Gazebo 是 ROS 生态的"标配"仿真器,由 OSRF 出品。它与 ROS/ROS2 深度集成,物理引擎基于 ODE、Bullet 和 DART。社区庞大、教程丰富,是通用机器人仿真的首选。缺点是渲染效果一般,大规模场景性能有限。
Webots 由 Cyberbotics 开发,提供建模、编程、仿真一体化环境。跨平台支持 Windows、Linux 和 macOS,编程接口覆盖 C/C++、Python、Java 和 MATLAB。开箱即用,界面友好,适合教育和快速原型验证。但与 ROS2 的集成深度不如 Gazebo。
Ignition(现更名为 Gazebo Sim)是 Gazebo 的下一代继承者。它提供高度逼真的传感器仿真,支持 CI/CD 集成。目前生态仍在过渡中,正在逐步替代经典 Gazebo。
Unity 是游戏引擎跨界进入机器人仿真领域的代表。通过 ROS2 For Unity 与 ROS2 实现通信。优势在于高质量渲染和 NVIDIA PhysX 物理模拟。适合视觉算法训练和高画质演示。缺点是非开源,有商业授权限制。
| 平台 | 开发者 | 物理引擎 | 渲染质量 | ROS2 集成 | 开源 | 适用场景 |
|---|---|---|---|---|---|---|
| Gazebo | OSRF | ODE / Bullet / DART | 中等 | 深度原生 | 是 | 通用机器人仿真 |
| Webots | Cyberbotics | ODE | 中等 | 良好 | 是 | 教育、跨平台 |
| Ignition / Gazebo Sim | OSRF | 多种可选 | 高 | 深度原生 | 是 | 高保真传感器、云端 |
| Unity | Unity Technologies | NVIDIA PhysX | 极高 | 通过接口包 | 否 | 视觉训练、演示 |
没有最好的平台,只有最适合的平台。选仿真器时,先问自己:需要多高的传感器保真度?目标场景是什么?教学场景优先考虑社区支持和文档完善度,研究场景则可以大胆尝试 Ignition 或 Unity。
1.5 本课程的选择
鉴于 ROS 和 Gazebo 的大量历史经验积累,Gazebo 仍是 ROS2 生态中最成熟、文档最完善的仿真平台。本课程以教学为目标,需要学生能够快速上手、遇到问题能找到解决方案。Gazebo 与 ROS2 的原生集成度最高,URDF、插件体系一脉相承,学习曲线最为平缓。
后续章节会详细展开 Gazebo 的物理属性配置、传感器插件、控制插件等内容。最终目标是让 FishBot 在 Gazebo 中动起来,完成自主导航仿真。
当然,如果你学有余力,强烈建议自行探索 Webots 和 Ignition。每个平台都有自己的设计哲学和独特优势,多试几家,你才能找到最适合自己的那一款。
接下来,我们将从 Gazebo 的基础操作开始,学习如何为 URDF 模型注入物理属性、在仿真世界中显示机器人、配置差速控制插件。准备好让你的虚拟机器人动起来了吗?
二、具身智能视角下的"机器人仿真"
2.1 具身智能是什么:有身体的人工智能
具身智能(Embodied AI) 是指拥有物理身体、能在真实环境中感知和交互的智能系统。它与 ChatGPT 这类 离身智能(Disembodied AI) 有本质区别:传统 AI 只处理符号和文本,没有物理实体;而具身智能必须通过传感器收集环境信息,再通过执行器改变环境状态。
想象一只猫和一个聊天机器人。猫能通过爪子感知沙发的质地,通过跳跃学习距离感。这些"身体经验"本身就是智能的一部分。而聊天机器人再聪明,也摸不到任何东西。具身智能的核心观点是:"智能不仅来自大脑,还来自身体与环境的交互。"
一个具身智能系统包含三个核心组件:传感器、"大脑"和执行器。这种结构让机器人不再是被动执行命令的工具,而是能够主动探索、试错、成长的智能体(Agent)。
2.2 具身智能的三大要素
具身智能的理论框架可归纳为三大要素:身体(Body)、大脑(Brain)和环境(Environment)。
身体是智能的物理载体。传感器(摄像头、激光雷达、触觉传感器、IMU)负责感知,执行器(电机、液压、机械臂、灵巧手)负责行动。身体的形态本身就在"计算"——昆虫的六条腿天然提供了稳定步态,这被称为"形态计算"。
大脑是决策中枢。传统方法依赖深度学习和强化学习。最新趋势是将大语言模型引入机器人领域,Google 的 RT-2 和 RT-X 将视觉、语言和动作统一为 VLA(Vision-Language-Action) 模型,开创了端到端的新范式。
环境是智能的训练场。真实世界充满不确定性:重力、摩擦、碰撞、光照变化。仿真环境则是真实世界的"压缩副本",支持低成本、高效率的大规模训练。
三者的关系可用下面的闭环图表示:
身体感知环境,大脑做出决策,决策指挥身体行动,行动改变环境,环境变化又反馈给身体——这是一个永不停歇的闭环。仿真技术的价值,就在于为这个闭环提供安全、可控、可重复的"虚拟训练场"。
2.3 具身智能的发展历程
具身智能的发展经历三个阶段的螺旋式上升。
阶段一:蹒跚学步(1960s—2010s)。 这一时期以符号 AI 和行为主义为主导。1966 年至 1972 年,斯坦福大学的 Shakey 成为第一台具身智能机器人。1986 年,Rodney Brooks 提出"基于行为的机器人学",主张从感知直接到行动。1990 年代到 2000 年代,Sony AIBO、Honda ASIMO、iRobot Roomba 尝试商业化。但规则驱动的架构使泛化能力十分有限。
阶段二:深度学习赋能(2010s—2022)。 2013 年,DeepMind 的 DQN 展现了深度强化学习的潜力。2016 年,Boston Dynamics 的 Atlas 完成后空翻,标志动态运动控制的巅峰。Sim2Real 技术兴起,OpenAI 的 Dactyl 和 Google 的 QT-Opt 是代表作。数据驱动让机器人具备一定泛化能力,但对仿真的依赖也日益加深。
阶段三:大模型新纪元(2022—至今)。 2022 年底,ChatGPT 引发 LLM 革命。2023 年,Google RT-2 首次将视觉、语言和动作统一为端到端 VLA 模型。Tesla Optimus Gen-1 亮相,人形机器人走向量产。2024 年,Figure 01、Unitree H1 密集发布,具身智能进入商业化元年。
下表梳理了七个关键里程碑:
| 年份 | 里程碑 | 意义 |
|---|---|---|
| 1966—1972 | Shakey(斯坦福大学) | 第一台具身智能机器人,符号 AI 的实践 |
| 1986 | Brooks 的包容式架构 | 行为主义机器人学的理论奠基 |
| 2013 | DeepMind DQN | 深度强化学习的突破性进展 |
| 2016 | Boston Dynamics Atlas | 动态运动控制的技术巅峰 |
| 2022 | ChatGPT / RT-1 | 大模型与机器人结合的起点 |
| 2023 | RT-2 / Optimus Gen-1 | VLA 模型成熟,人形机器人量产化 |
| 2024 | Figure 01 / Unitree H1 | 具身智能商业化元年,国内爆发 |
从规则驱动到数据驱动,再到模型驱动,具身智能的每一次跃升都伴随着仿真技术的同步进化。
2.4 为什么具身智能需要仿真:Sim2Real 问题
既然具身智能强调"身体与真实环境的交互",为什么还要在仿真里训练?答案藏在 Sim2Real(仿真到现实迁移) 这个核心问题里。
仿真中表现完美的策略,放到真实世界往往会"水土不服"。物理参数差异、传感器噪声、光照变化、材质纹理,这些难以精确建模的因素都会导致性能断崖式下降。Sim2Real Gap 是具身智能领域最具挑战性的难题之一。
尽管存在鸿沟,仿真仍是不可或缺的工具,原因有四:
第一,数据效率。 真实数据采集缓慢且昂贵,某些场景(如碰撞)具有破坏性。仿真可并行运行数千实例,24 小时不间断生成数据。
第二,安全性。 真实环境试错成本极高:可能损坏设备、伤害人员。仿真提供零成本试错空间。
第三,可重复性。 真实实验难以复现:光照随天气而变,摩擦力随磨损而不同。仿真可精确复现任意场景。
第四,规模化。 NVIDIA Isaac Sim 支持在 GPU 集群上同时训练数万个实例,这在物理世界中无法实现。
为缩小 Sim2Real Gap,研究者发展了多种迁移技术。 Domain Randomization(域随机化) 通过在仿真中随机化摩擦、质量、光照等参数,训练出更具鲁棒性的策略。Domain Adaptation 缩小仿真与真实数据的分布差异。System Identification 通过实验标定让仿真参数逼近真实机器人。三种技术常组合使用,共同目标只有一个:让仿真中练出的"大脑",在真实身体里可靠运转。
2.5 具身智能主流仿真器对比
工欲善其事,必先利其器。下表对比了七个主流仿真平台:
| 仿真器 | 物理引擎 | 渲染质量 | ROS2 支持 | 并行训练 | 特点 | 代表用户/项目 |
|---|---|---|---|---|---|---|
| NVIDIA Isaac Sim | PhysX 5 | RTX 实时光追 | 原生 | 超强(GPU 集群) | 工业级、数字孪生、USD 流程 | NVIDIA、Tesla、Boston Dynamics |
| MuJoCo | 自有引擎 | 中等 | 通过插件 | 强(Brax) | 接触动力学精准、RL 友好 | DeepMind、OpenAI、Google |
| Habitat-Sim | Bullet | 可配置 | 有限 | 强 | 室内导航、语义理解 | Meta FAIR、学术界 |
| SAPIEN | PhysX | 高 | 部分 | 中等 | 关节精细、操作任务 | UCSD、学术界 |
| Genesis | 自有(Luisa) | RTX | 开发中 | 超强 | 2024 新星、生成式仿真、速度极快 | General Robot |
| Gazebo | ODE/Bullet/DART | 中等 | 原生最佳 | 弱 | 传统 ROS 生态、教育友好 | 学术界、ROS 社区 |
| PyBullet | Bullet | 基础 | 通过接口 | 中等 | 轻量、易用、教育友好 | 学术界、入门学习 |
按应用场景分类,这些平台可归纳为三类:
- 工业级/生产环境
- 学术研究
- 教育/入门
- Isaac Sim:NVIDIA 生态核心,支持数字孪生和大规模并行训练,适合工业级应用。
- Genesis:2024 年新星,生成式物理仿真,速度比实时快一百万倍,代表未来方向。
- MuJoCo:接触动力学最精准,强化学习论文"标配",Google DeepMind 开源维护。
- Habitat-Sim:Meta FAIR 出品,专注室内导航和视觉语言导航(VLN)。
- SAPIEN:UCSD 开发,对关节级精细操作支持尤为出色。
- Gazebo:与 ROS2 原生集成度最高,文档丰富,是机器人教育首选。
- PyBullet:纯 Python 接口,安装简单,适合快速验证算法原型。
没有最好的仿真器,只有最适合的。做强化学习研究,选 MuJoCo 或 Isaac Sim;做室内导航,选 Habitat-Sim;做精细操作,选 SAPIEN 或 MuJoCo;追求 ROS2 集成和教学友好性,Gazebo 仍是最成熟的选择。
以上仿真器各有优劣,但在工程实践中,ROS2 + Gazebo 仍是最成熟、文档最完善的教育与开发组合。下一节,我们将从工程视角出发,介绍 ROS2 仿真基础,带你亲手搭建第一个仿真环境,让机器人在虚拟世界中真正"动"起来。
三、ROS2 仿真基础:从这里开始动手
后续章节将深入展开 ROS2 仿真环境的完整搭建与调试流程,本节仅作概览与过渡。
3.1 Turtlesim 仿真环境简介
Turtlesim 是 ROS2 官方提供的二维仿真器,以一只可在平面移动的海龟为对象,演示节点(Node)、话题(Topic)、服务(Service)与动作(Action)的核心概念。它轻量、直观,是理解 ROS2 通信机制的理想沙盒。
启动命令如下:
ros2 run turtlesim turtlesim_node
运行后,一个可视化的海龟窗口随即打开,可通过键盘或程序控制其运动。
3.2 ROS2 三种通信范式演示
本节通过四个 Python 节点,依次演示 ROS2 的三种通信范式。项目结构如下:
ros2_ws4/src/
├── turtle_exercise/ # ament_python — 仿真练习节点
│ ├── draw_spiral.py # 话题控制:画螺旋线 <== 本节重点关注
│ ├── spawn.py # 服务调用:批量生成海龟
│ ├── action_move.py # 动作反馈:画正多边形
│ ├── random_walk.py # 随机游走
│ └── launch/ # 11 个 launch 文件
└── interfaces_exercise/ # ament_cmake — 自定义接口
└── action/Move.action # 自定义 Action 定义
话题(Topic)—— 画螺旋线
如果你从未写过 ROS2 程序,别慌。我们用"开门三板斧"的方式,从零开始带你写一个让海龟画螺旋线的程序。
这个程序的目标很简单:让海龟画一条螺旋线。它通过"话题"(Topic)向海龟发送速度指令,每次发送都比上一次快一点点,于是海龟就转着圈跑出去了。
第一斧:搭骨架——创建工作空间与功能包
▶ 创建 workspace
mkdir -p ~/ros2_ws4/src
▶ 创建 package
cd ~/ros2_ws4/src
ros2 pkg create turtle_exercise \
--build-type ament_python \
--dependencies rclpy geometry_msgs
| 参数 | 作用 | 为什么重要 |
|---|---|---|
--build-type ament_python | 指定为纯 Python 包 | ROS2 的 Python 包必须声明此类型,否则 colcon 不知道如何构建 |
--dependencies rclpy geometry_msgs | 声明运行时依赖 | rclpy 是 ROS2 的 Python 客户端库,没有它无法创建节点;geometry_msgs 提供 Twist 等速度消息类型 |
▶ 配置节点入口点
编辑 src/turtle_exercise/setup.py,在 entry_points 中添加:
entry_points={
'console_scripts': [
'draw_spiral = turtle_exercise.draw_spiral:main',
],
},
'draw_spiral = turtle_exercise.draw_spiral:main' 的意思是:在终端输入 ros2 run turtle_exercise draw_spiral 时,ROS2 会执行 turtle_exercise/draw_spiral.py 文件中的 main() 函数。没有这条配置,ros2 run 找不到你的节点。
第二斧:写发布——编写发布者节点
在 src/turtle_exercise/turtle_exercise/ 目录下创建 draw_spiral.py:
#!/usr/bin/env python3
"""
draw_spiral.py - 发布者节点:让海龟画螺旋线
"""
import rclpy # ① 导入 ROS2 的 Python 库
from rclpy.node import Node # ② 导入"节点"基类
from geometry_msgs.msg import Twist # ③ 导入速度消息类型
class SpeedPublisher(Node): # ④ 定义我们的节点类
def __init__(self):
super().__init__('draw_spiral') # ⑤ 给节点起名字
# 声明参数:允许用户指定海龟名称,默认为 'turtle1'
self.turtlename = self.declare_parameter(
'turtlename', 'turtle1').get_parameter_value().string_value
# 话题通信的核心 API:create_publisher(消息类型, 话题名称, QoS)
self.publisher = self.create_publisher(
Twist, # ⑥ 消息类型:速度指令
f'{self.turtlename}/cmd_vel', # ⑦ 话题名称:海龟订阅这个话题
1 # ⑧ QoS 队列深度
)
# 定时器:每 0.1 秒触发一次回调,实现周期性发布
self.timer = self.create_timer(0.1, self.on_timer) # ⑨
# 初始化速度指令
self.cmd = Twist() # ⑩ 创建一条速度消息
self.cmd.linear.x = 0 # 初始前进速度为 0
self.cmd.angular.z = 3.0 # 旋转速度固定 3.0 rad/s
self.get_logger().info('画螺旋线节点已启动 → 发布到 /turtle1/cmd_vel')
def on_timer(self): # ⑪ 定时器回调:每 0.1 秒执行一次
self.cmd.linear.x += 0.03 # ⑫ 每次让前进速度增加 0.03 m/s
self.publisher.publish(self.cmd) # ⑬ 把速度指令发出去!
self.get_logger().info(f'发布速度: linear.x={self.cmd.linear.x:.2f}, angular.z={self.cmd.angular.z}')
def main(args=None):
rclpy.init(args=args) # ⑭ 初始化 ROS2
speed_publisher = SpeedPublisher() # ⑮ 创建节点实例
try:
rclpy.spin(speed_publisher) # ⑯ 让节点"转起来",等待定时器触发
except KeyboardInterrupt:
pass
finally:
speed_publisher.destroy_node()
rclpy.shutdown()
if __name__ == '__main__':
main()
create_publisher() 的三个参数是一组话题通信的完整契约,缺一不可:
create_publisher(消息类型, 话题名称, QoS)
↓ ↓ ↓
Twist 'turtle1/cmd_vel' 1
| 要素 | 代码中 | 含义 | 规则 |
|---|---|---|---|
| 消息类型 | Twist | 话题上传递的数据结构 | 发布者和订阅者必须使用完全相同的类型 |
| 话题名称 | 'turtle1/cmd_vel' | 通信通道的标识 | 发布者和订阅者的话题名必须逐字符一致(大小写敏感) |
| QoS | 1 | 服务质量,这里 1 是队列深度 | 1 表示只保留最新一条消息,适合实时控制 |
self.cmd = Twist() # ① 创建消息对象
self.cmd.linear.x = 0.5 # ② 填充字段(Twist 有 linear 和 angular 两个子结构)
self.cmd.angular.z = 3.0 # ③ 填充角速度
self.publisher.publish(self.cmd) # ④ 发布——无返回值,消息进入 DDS 层,自动分发给所有订阅者
Twist 消息有两个子结构:
linear:线速度(x,y,z),控制前进/后退/平移angular:角速度(x,y,z),控制旋转
rclpy.spin() 会怎样?如果去掉 rclpy.spin(),节点会启动后立即退出,定时器根本没有机会触发。
spin() 的作用是:阻塞当前线程,进入事件循环,等待定时器、回调等事件发生。
第三斧:编译运行、验证——打通完整链路
▶ 编译功能包
cd ~/ros2_ws4
colcon build
ROS2 的 Python 包虽然不需要像 C++ 那样编译成二进制文件,但 colcon build 会将你的代码复制到 install/ 目录。因此:
- 每次修改
.py文件后,必须重新运行colcon build - 每次打开新终端,必须先执行
source ~/ros2_ws4/install/setup.bash
养成这个习惯,能避免 90% 的"代码改了但没生效"问题。
预期输出:最后一行显示 Summary: 1 package finishing。
▶ 启动 Turtlesim 仿真器
打开一个终端:
source ~/ros2_ws4/install/setup.bash
ros2 run turtlesim turtlesim_node
一个蓝色窗口出现,里面有一只海龟。
▶ 运行画螺旋线节点
打开另一个终端:
source ~/ros2_ws4/install/setup.bash
ros2 run turtle_exercise draw_spiral
预期效果:
- 海龟开始转圈,而且越转越快,轨迹呈螺旋状展开
- 终端每秒打印一条发布记录:
[INFO] [draw_spiral]: 发布速度: linear.x=0.15, angular.z=3.0
ros2 service call /reset std_srvs/srv/Empty
运行效果如下图所示:

▶ 验证——调试黄金三连
# 验证 1:节点是否在运行?
ros2 node list
# 输出应包含:/draw_spiral 和 /turtlesim
# 验证 2:话题是否存在?
ros2 topic list
# 输出应包含:/turtle1/cmd_vel
# 验证 3:消息是否在流动?(最常用!)
ros2 topic echo /turtle1/cmd_vel
# 应看到速度值不断增加:
# linear:
# x: 0.15
# y: 0.0
# z: 0.0
# angular:
# x: 0.0
# y: 0.0
# z: 3.0
# ---
# linear:
# x: 0.18
# ...
ros2 topic echo 是调试话题通信的第一工具不需要写订阅者,直接在命令行看任何话题的实时数据。如果 echo 能看到数据,说明你的发布者工作正常。
服务(Service)—— 批量生成海龟
spawn.py 中的 SpawnNode 类以异步客户端调用 /spawn 服务,可在同一窗口中创建多只海龟。
受保护的内容
请输入密码以查看此内容
动作(Action)—— 画正多边形
action_move.py 中的 TeleportTurtleClient 类实现了一个 Action 客户端,接收目标边数,逐边移动并反馈已到达的顶点坐标。
受保护的内容
请输入密码以查看此内容
3.3 群机器人仿真预览
在多机器人场景中,每只海龟通过命名空间(namespace)实现隔离。random_walk.py 中的 RandomWalk 类利用定时器生成随机角速度,让海龟在窗口内无序漫游。
受保护的内容
请输入密码以查看此内容
进一步地,通过编排多个节点的启动顺序与初始位置,可以让一群海龟协同绘制出奥运五环等复杂图案。这预览了多机器人协同控制的基本思路。
3.4 下一步预告
Turtlesim 是一个优雅的二维沙盒,但它终究无法替代真实的三维物理世界。后续章节将从这里过渡到 Gazebo 仿真器,在更逼真的环境中控制移动机器人与机械臂。
本节演示的三种通信范式——话题、服务、动作——在 Gazebo 中完全适用,多海龟的命名空间隔离思路也将直接映射到多机器人 Gazebo 场景。如果你想继续深入,请参阅 第 4.9 节:基于 ROS2 的运动控制及 RViz 数据可视化。