背景
系统
Ubuntu20.04
ROS版本
ROS2 Foxy
安装教程
Gazebo版本
Gazebo Garden
安装教程
在Gazebo中创建好一个机器人模型
原版教程
移动机器人
在本教程中,我们将学习如何移动我们的机器人。我们将使用在“在Gazebo Garden中创建一个机器人”教程中构建的机器人。你可以从这里下载机器人。你也可以在这里找到本教程的成品世界描述文件。
什么是插件
为了让我们的机器人动起来,我们将使用 diff_drive 插件。但在此之前,让我们先回答一个问题:“什么是插件?”插件是作为共享库编译的代码块,并插入到模拟中。插件使我们能够控制模拟的许多方面,如世界、模型等。
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>
表示两个车轮之间的距离。我们的机器人的左车轮在 y 轴上相对于底盘的位置是 0.6 米,右车轮在 y 轴上相对于底盘的位置是-0.6 米,因此轮距是 1.2 米。<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}"
现在你应该看到你的机器人在仿真器中移动了。
注意: 别忘了在仿真器中按播放按钮启动仿真,不然机器人是不会有反应的。
该命令使用 -t 选项指定要发布到的主题。在 -m 之后,我们指定消息类型。我们的机器人期望 Twist 类型的消息,它由两个组件组成,线性和角度。在 -p 选项之后,我们指定消息的内容(值):线速度 x: 0.5 和角速度 z: 0.05。
提示:你可以使用这个命令来了解每个gz topic命令选项的作用:
gz topic -h
有关 Gazebo 中主题和消息的更多信息,请查看传输库教程。
使用键盘移动机器人
我们将使用键盘按键来发送消息,而不是从终端发送消息。为此,我们将添加两个新的插件:KeyPublisher 和 TriggeredPublisher。
Key Publisher
KeyPublisher 是一个 gz-gui 插件,用于读取键盘按键并将其发送到默认主题 /keyboard/keypress 上。我们可以按以下方式尝试此插件:
- 在一个终端中输入:
在右上角点击插件下拉列表(垂直省略号),然后点击 Key Publisher。gz sim building_robot.sdf
- 在另一个终端中输入:
最后一个命令将显示发送到 /keyboard/keypress 主题的所有消息。gz topic -e -t /keyboard/keypress
在 Gazebo 窗口中按不同的键,你应该会在运行 gz topic -e -t /keyboard/keypress 命令的终端上看到数据(数字)。
我们希望将这些按键映射为 Twist 类型的消息,并将其发布到我们的模型正在监听的 /cmd_vel 主题上。TriggeredPublisher 插件将执行此操作。
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>
这段代码定义了触发发布插件。它接受类型为 gz.msgs.Int32 的 /keyboard/keypress 主题上的消息,如果数据字段中的值与 16777235(向上箭头键)匹配,则在 cmd_vel 主题上输出一个 Twist 消息,其中 x 值为 0.5,z 值为 0.0。
现在启动 building_robot.sdf,然后添加 Key Publisher 插件,我们的机器人应该在我们按下向上箭头键 ↑ 时向前移动(确保你通过按下播放按钮启动仿真,以便在按下向上箭头键后看到机器人向前移动)。
接下来我们通过一个demo解释触发发布插件如何起作用。
通过方向键移动机器人
要查看按箭头键时在 /keyboard/keypress 主题上发送的值,可以使用 –echo 或 -e 选项。
-
在一个终端中运行模型:
gz sim building_robot.sdf
在右上角点击插件下拉列表(垂直省略号),然后点击 Key Publisher。
-
在另一个终端中运行以下命令:
gz topic -e -t /keyboard/keypress
开始按箭头键,看看它们给出的值:
- Left ← : 16777234
- Up ↑ : 16777235
- Right → : 16777236
- Down ↓ : 16777237
我们将为每个箭头键添加触发发布插件。例如,对于向下箭头:
<!-- 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>
将每个箭头(按键)与所需的消息(移动)映射,就像我们对向后箭头所做的那样:
- Left ➞ 16777234 ➞ linear: {x: 0.0}, angular: {z: 0.5}
- Up ➞ 16777235 ➞ linear: {x: 0.5}, angular: {z: 0.0}
- Right ➞ 16777236 ➞ linear: {x: 0.0}, angular: {z: -0.5}
- Down ➞ 16777237 ➞ linear: {x: -0.5}, angular: {z: 0.0}
现在轮到你尝试使用不同的键来移动机器人了。
在下一个教程中,你将学习如何使用 SDF 创建自己的仿真世界。