移动机器人
本教程介绍如何移动在 搭建你自己的机器人 教程中搭建的机器人。可从 此处 下载该机器人,并在 此处 查看本教程完成的仿真世界。
什么是插件(Plugin)
Section titled “什么是插件(Plugin)”要让机器人动起来,我们将使用 diff_drive 插件。在此之前,先回答一个问题:“什么是插件?”插件是一段编译为共享库并插入仿真器中的代码,使我们能够控制仿真的许多方面,如世界、模型等。
Diff_drive 插件
Section titled “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 库教程。
使用键盘移动机器人
Section titled “使用键盘移动机器人”除了从终端发送消息,还可以用键盘按键来发送。为此,我们将添加两个新插件:KeyPublisher 和 TriggeredPublisher。
KeyPublisher
Section titled “KeyPublisher”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/keypressdata: 68
data: 85
data: 72
data: 74
data: 81
data: 16777235
data: 16777234
data: 16777237
data: 16777236接下来,我们要将这些按键映射为 Twist 类型的消息,并发布到模型监听的 /cmd_vel 主题上。TriggeredPublisher 插件可以完成这项工作。
Triggered Publisher
Section titled “Triggered Publisher”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 的工作原理。
使用方向键移动
Section titled “使用方向键移动”要查看按下方向键时 /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 教程:移动机器人。