Skip to content

移动机器人

本教程介绍如何移动在 搭建你自己的机器人 教程中搭建的机器人。可从 此处 下载该机器人,并在 此处 查看本教程完成的仿真世界。

要让机器人动起来,我们将使用 diff_drive 插件。在此之前,先回答一个问题:“什么是插件?”插件是一段编译为共享库并插入仿真器中的代码,使我们能够控制仿真的许多方面,如世界、模型等。

diff_drive 插件用于控制差速驱动机器人。下面为机器人配置这个插件。打开 building_robot.sdf,在 vehicle_blue 模型标签内添加以下代码。

<plugin
filename="gz-sim-diff-drive-system"
name="gz::sim::systems::DiffDrive">
<left_joint>left_wheel_joint</left_joint>
<right_joint>right_wheel_joint</right_joint>
<wheel_separation>1.2</wheel_separation>
<wheel_radius>0.4</wheel_radius>
<odom_publish_frequency>1</odom_publish_frequency>
<topic>cmd_vel</topic>
</plugin>

<plugin> 标签有两个属性:filename 指定库文件名,name 指定插件名称。 在 <left_joint> 和 <right_joint> 标签中,定义了将左右轮与机器人本体连接的关节,这里是 left_wheel_joint 和 right_wheel_joint。<wheel_separation> 指定两个轮子之间的距离。本例中机器人的 left_wheel 在 y 轴上距离 chassis 0.6 m,right_wheel 在 -0.6 m 处,所以 wheel_separation 为 1.2 m。 <wheel_radius> 指定轮子的半径,即轮子链接下 <radius> 标签中定义的值。 <odom_publish_frequency> 设置里程计在 /model/vehicle_blue/odometry 上发布的频率。 cmd_vel 是 DiffDrive 插件的输入 <topic>。

现在模型已准备就绪,只需向它发送命令(消息)即可。这些消息将发布(发送)到上面定义的 cmd_vel 主题上。

主题(topic)是用于对一组特定消息或某个服务进行分组的名称。 我们的模型会订阅(监听)发送到 cmd_vel 主题上的消息。

启动机器人世界:

gz sim building_robot.sdf

在另一个终端中,向机器人发送一条消息:

gz topic -t "/cmd_vel" -m gz.msgs.Twist -p "linear: {x: 0.5}, angular: {z: 0.05}"

现在你应该能看到机器人在仿真中移动了。

注意:别忘了按下仿真中的播放(play)按钮。

该命令在 -t 选项后指定要发布消息的主题。-m 之后指定消息类型。机器人期望收到 Twist 类型的消息,它由两个分量组成:linear(线速度)和 angular(角速度)。-p 选项后指定消息的内容(值):线速度 x: 0.5 和角速度 z: 0.05。

提示:可以使用 gz topic -h 了解每个主题选项的作用。

关于 Gazebo 中主题和消息的更多信息,请参阅 Transport 库教程。

除了从终端发送消息,还可以用键盘按键来发送。为此,我们将添加两个新插件:KeyPublisher 和 TriggeredPublisher。

KeyPublisher 是一个 gz-gui 插件,它会读取键盘按键并发送到默认主题 /keyboard/keypress 上。 下面来试用这个插件:

  • 在一个终端中输入

    gz sim building_robot.sdf

  • 在右上角点击插件下拉列表(垂直省略号),点击 Key Publisher。

  • 在另一个终端中输入

    gz topic -e -t /keyboard/keypress

最后一条命令会显示 /keyboard/keypress 主题上发送的所有消息。

在 Gazebo 窗口中按下不同的按键,你应该会在运行 gz topic -e -t /keyboard/keypress 命令的终端中看到数据(数字)。

$ gz topic -e -t /keyboard/keypress
data: 68
data: 85
data: 72
data: 74
data: 81
data: 16777235
data: 16777234
data: 16777237
data: 16777236

接下来,我们要将这些按键映射为 Twist 类型的消息,并发布到模型监听的 /cmd_vel 主题上。TriggeredPublisher 插件可以完成这项工作。

TriggeredPublisher 插件在收到与用户指定条件匹配的输入消息时,会在输出主题上发布一条用户指定的消息。 在 <world> 标签下添加以下代码:

<!-- Moving Forward-->
<plugin filename="gz-sim-triggered-publisher-system"
name="gz::sim::systems::TriggeredPublisher">
<input type="gz.msgs.Int32" topic="/keyboard/keypress">
<match field="data">16777235</match>
</input>
<output type="gz.msgs.Twist" topic="/cmd_vel">
linear: {x: 0.5}, angular: {z: 0.0}
</output>
</plugin>

这段代码定义了 triggered-publisher 插件。它在 /keyboard/keypress 主题上接收 gz.msgs.Int32 类型的消息,当 data 字段的值与 16777235(上箭头键)匹配时,就会在 cmd_vel 主题上输出一条 Twist 消息,值为 x: 0.5、z: 0.0。

现在启动 building_robot.sdf 并添加 Key Publisher 插件,按上箭头键 ↑ 时机器人就会向前移动(确保先按播放按钮启动仿真,这样按下上箭头键后才能看到机器人移动)。

这里有一个演示说明了 Triggered Publisher 的工作原理。

要查看按下方向键时 /keyboard/keypress 主题上发送的值,可以使用 --echo 或 -e 选项。

  • 在一个终端中运行模型:

    gz sim building_robot.sdf

  • 在右上角点击插件下拉列表(垂直省略号),点击 Key Publisher。

  • 在另一个终端中运行以下命令:

    gz topic -e -t /keyboard/keypress

开始按下方向键,查看它们对应的值:

  • 左 ← : 16777234
  • 上 ↑ : 16777235
  • 右 → : 16777236
  • 下 ↓ : 16777237

我们将为每个方向键添加 Triggered publisher 插件。例如,下箭头:

<!-- Moving Backward-->
<plugin filename="gz-sim-triggered-publisher-system"
name="gz::sim::systems::TriggeredPublisher">
<input type="gz.msgs.Int32" topic="/keyboard/keypress">
<match field="data">16777237</match>
</input>
<output type="gz.msgs.Twist" topic="/cmd_vel">
linear: {x: -0.5}, angular: {z: 0.0}
</output>
</plugin>

像我们对下箭头所做的那样,将每个箭头(按键)映射到期望的消息(运动):

  • 左 → 16777234 → linear: {x: 0.0}, angular: {z: 0.5}
  • 上 → 16777235 → linear: {x: 0.5}, angular: {z: 0.0}
  • 右 → 16777236 → linear: {x: 0.0}, angular: {z: -0.5}
  • 下 → 16777237 → linear: {x: -0.5}, angular: {z: 0.0}

现在轮到你了,尝试使用不同的按键让机器人移动。

在 下一个教程 中,你将学习如何使用 SDF 创建你自己的仿真世界。

本教程的视频演示可在我们的 YouTube 频道上观看:Gazebo 教程:移动机器人。