4. 使用turtlesim模拟器

任务目标

本案例通过ROS2自带的turtlesim模拟器,完成以下闭环:启动乌龟模拟器节点,使用命令行工具发布速度指令控制乌龟移动,并通过话题和服务接口查询/修改乌龟状态。最终目标是熟悉ROS2的核心通信机制——话题(Topic)与服务(Service)的实际操作流程。

环境准备

需要已安装ROS2(Humble或更高版本),并完成环境变量加载。turtlesim是ROS2默认组件,无需额外安装。若使用Docker或虚拟机,确保图形界面可用。

实现步骤与代码

1. 启动模拟器

打开终端,加载ROS2环境后启动turtlesim节点:

source /opt/ros/humble/setup.bash
ros2 run turtlesim turtlesim_node

此时会弹出蓝色窗口,中央有一只乌龟。保持此终端运行。

2. 查看话题与服务列表

新开一个终端,执行以下命令观察可用的通信接口:

source /opt/ros/humble/setup.bash
ros2 topic list
ros2 service list

预期输出中应包含:

  • 话题:/turtle1/cmd_vel(速度控制)、/turtle1/pose(位置反馈)
  • 服务:/spawn(生成新乌龟)、/turtle1/teleport_absolute(位置传送)、/kill(删除乌龟)

3. 通过话题控制乌龟移动

使用ros2 topic pub命令发布速度指令,让乌龟画圆。在终端中执行(单次发布):

ros2 topic pub --once /turtle1/cmd_vel geometry_msgs/msg/Twist "{linear: {x: 2.0, y: 0.0, z: 0.0}, angular: {z: 1.8}}"

乌龟应开始以圆弧轨迹移动约1秒后停止。若希望持续运动,可将--once改为--rate 1(每秒发布1次)。

4. 通过服务查询与修改乌龟状态

查询当前乌龟位置(调用/turtle1/pose对应的get服务):

ros2 service call /turtle1/pose turtlesim/srv/TeleportAbsolute "x: 5.0
y: 5.0
theta: 0.0"

注意:/turtle1/pose是话题,不是服务。正确的位置查询应使用ros2 topic echo(见下一步)。上述命令实际是调用/turtle1/teleport_absolute服务,将乌龟瞬间移动到(5.0, 5.0)并朝向0弧度。执行后观察乌龟是否跳转。

生成一只新乌龟(调用/spawn服务):

ros2 service call /spawn turtlesim/srv/Spawn "{x: 2.0, y: 2.0, theta: 0.0, name: 'turtle2'}"

窗口中应出现第二只乌龟,终端返回新乌龟名称turtle2。

5. 订阅位置话题验证移动

在第三个终端中实时查看乌龟坐标变化:

ros2 topic echo /turtle1/pose

当您发布速度指令时,此处会持续输出x、y、theta等数据,数值随乌龟移动而变化。

验证方法与通过标准

  • 移动验证:执行第3步的速度发布后,窗口中的乌龟确实沿弧线移动,且ros2 topic echo /turtle1/pose输出的坐标值同步变化。
  • 服务验证:调用teleport_absolute后,乌龟瞬间出现在坐标(5.0, 5.0)附近;调用spawn后,窗口出现名为turtle2的新乌龟。
  • 接口认知:能通过ros2 topic list和ros2 service list正确区分话题与服务,并说出cmd_vel是话题、spawn是服务。

常见问题

  • 窗口不显示:确认图形环境正常,尝试在turtlesim_node前加ros2 run turtlesim turtlesim_node --ros-args -p use_sim_time:=false。
  • 乌龟不动:检查cmd_vel话题名称是否正确(默认乌龟名为turtle1),且发布的消息类型为geometry_msgs/msg/Twist。
  • 服务调用报错:确认服务名称和类型与ros2 service list -t输出一致,注意teleport_absolute需要三个浮点参数。

完成以上步骤并观察到预期现象,即达成案例目标。本案例不涉及代码编写,核心在于掌握ROS2命令行工具对话题和服务的操作范式,为后续编写导航节点奠定基础。