Skip to the content.

一、实验背景与目的 本次实验基于 ROS 2(Robot Operating System 2)的经典入门工具 turtlesim,通过命令行向海龟发布运动指令,实现海龟的直线运动,并观察其与边界交互的行为,以此理解 ROS 2 中话题(Topic)通信、消息(Message)发布的核心机制,以及仿真环境中机器人运动控制的基本逻辑。 二、实验环境与过程

  1. 实验环境 操作系统:Windows 11 + WSL2(Ubuntu 24.04) ROS 版本:ROS 2 Humble 核心工具:turtlesim 仿真器、ros2 topic 命令行工具
  2. 实验步骤 启动仿真节点:在终端输入 ros2 run turtlesim turtlesim_node,启动 turtlesim 仿真环境,窗口中出现初始海龟。 发布运动指令:新开终端,使用 ros2 topic pub 命令向 /turtle1/cmd_vel 话题发布 geometry_msgs/Twist 消息,控制海龟直线前进: bash 运行 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}}” 观察现象:海龟沿 x 轴正方向直线运动,直至碰到仿真窗口边界。 三、实验现象与问题分析
  3. 核心现象 运动控制成功:海龟接收到 Twist 消息后,以 linear.x=1.0 的速度匀速直线前进,说明 ROS 2 话题通信机制正常,消息发布与订阅流程有效。 边界碰撞警告:终端持续输出 [WARN] [turtlesim]: Oh no! I hit the wall! (Clamping from [x=11.104889, y=5.544445]) 警告信息,同时海龟被限制在窗口边界,无法继续前进。
  4. 问题原因分析 运动控制原理:/turtle1/cmd_vel 话题的消息类型为 geometry_msgs/Twist,其中 linear.x 控制海龟的前后线速度,angular.z 控制角速度。本次指令中 linear.x=1.0、angular.z=0.0,因此海龟保持直线运动。 边界碰撞与 “Clamping” 机制:turtlesim 窗口存在固定边界(默认 x 轴范围约 0~11,y 轴约 0~11),当海龟运动到边界时,仿真器会触发位置钳制(Clamping)机制,强制将海龟坐标限制在边界内,避免超出窗口范围,同时输出警告信息。 命令行消息格式问题:实验中出现的 The passed value needs to be in YAML string or a dictionary 提示,是因为早期命令中消息格式不符合 ROS 2 对 YAML 语法的解析要求,修正为标准嵌套字典格式后,消息可正常发布。 四、实验结论 ROS 2 的话题通信机制可实现节点间的消息传递,通过发布 Twist 消息可有效控制 turtlesim 中海龟的运动状态。 turtlesim 内置了边界碰撞检测与位置钳制逻辑,能防止仿真对象超出场景范围,这与真实机器人中避障、限位控制的设计思路相似。 命令行发布消息时,需严格遵循 YAML 语法格式,否则会导致消息解析失败,影响控制指令的发送。 五、实验心得 ROS 2 通信机制的直观理解:通过本次实验,我对 ROS 2 中 “发布 - 订阅” 的话题通信模式有了具象化的认识 ——turtlesim_node 作为订阅者监听 /turtle1/cmd_vel 话题,而 ros2 topic pub 作为发布者发送控制指令,二者通过预定义的消息类型实现数据交互,这是 ROS 2 中机器人模块化控制的核心基础。 仿真与真实场景的联系:turtlesim 的边界碰撞机制,让我联想到真实移动机器人的限位开关、避障传感器等设计。仿真环境中的警告信息,本质上是对机器人 “超出安全工作范围” 的反馈,这提示我在后续真实机器人开发中,需要提前考虑运动范围限制与安全控制逻辑。 细节规范的重要性:实验中因 YAML 格式错误导致消息发布失败的问题,让我意识到命令行操作中语法规范的重要性。ROS 2 对消息格式、参数类型的严格要求,是为了保证节点间数据交互的稳定性,这种严谨性也需要贯穿后续的开发流程中。 后续拓展方向:本次实验仅实现了直线运动控制,后续可通过修改 angular.z 参数实现海龟转向,或编写 Python/C++ 节点替代命令行发布指令,实现更复杂的路径规划(如正方形、圆形轨迹),进一步探索 ROS 2 节点开发与运动控制的更多可能性。