ROS2与Gazebo11入门教程-制作移动机器人
说明:
- 介绍如何制作移动机器人
概述
- 将展示Gazebo的基础模型管理功能,并通过引导用户完成创建一个使用差分驱动机制进行移动的两轮移动机器人的整个过程,来熟悉模型数据库中的基础模型表示方法
设置模型目录
mkdir -p ~/.gazebo/models/my_robot
- 创建模型配置文件,命令为:
gedit ~/.gazebo/models/my_robot/model.config
- 将以下内容粘贴到该模型配置文件中:
<?xml version="1.0"?>
<model>
<name>My Robot</name>
<version>1.0</version>
<sdf version='1.4'>model.sdf</sdf>
<author>
<name>My Name</name>
<email>me@my.email</email>
</author>
<description>
My awesome robot.
</description>
</model>
- 创建模型SDF文件,命令为:
gedit ~/.gazebo/models/my_robot/model.sdf
- 将以下内容粘贴到该模型SDF文件中:
<?xml version='1.0'?>
<sdf version='1.4'>
<model name="my_robot">
</model>
</sdf>
- 至此,我们已经有了一个模型的基本内容。模型配置文件model.config用一些额外的元数据描述了该机器人。
- 模型SDF文件model.sdf包含了必要的标签,以使用链接到SDF 1.4版的Gazebo来实例化一个名为my_robot的模型。
构建模型的结构
这个步骤将会创建一个有两个轮子的矩形底座(底盘)。
非常重要的一点就是从简单开始并逐步建立模型。第一步是确定模型的基本形状。
为此,我们将模型设为静态,这意味着物理引擎将忽略它。
其结果就是模型将会停留在一个位置上,这样可以让我们正确地对齐所有组成部分。
通过向〜/.gazebo/models/my_robot/model.sdf文件中添加
true </ static>元素,可以将模型设置为静态。 其正确的做法就是在model.sdf文件中
行下面插入子元素 true </ static>,注意要缩进该子元素,如下所示: 不要复制下面这三行,这三行只是用于参考目的。
<?xml version='1.0'?>
<sdf version='1.4'>
<model name="my_robot">
- 不要复制下面这两行,这两行只是用于参考目的。
</model>
</sdf>
通过编辑〜/.gazebo/models/my_robot/model.sdf文件来添加矩形底座(底盘),如下所示:
不要复制下面这几行,这些行只是用于参考目的。
<?xml version='1.0'?>
<sdf version='1.4'>
<model name="my_robot">
<static>true</static>
<link name='chassis'>
<pose>0 0 .1 0 0 0</pose>
<collision name='collision'>
<geometry>
<box>
<size>.4 .2 .1</size>
</box>
</geometry>
</collision>
<visual name='visual'>
<geometry>
<box>
<size>.4 .2 .1</size>
</box>
</geometry>
</visual>
</link>
<static>true</static>
- 不要复制下面这两行,这两行只是用于参考目的。
</model>
</sdf>
- 这里创建了一个尺寸为0.4 × 0.2 × 0.1米的盒子。
- 碰撞(collision)元素指定了碰撞检测引擎使用的形状。
- 视觉(visual)元素指定了渲染引擎使用的形状。
- 在大多数情况下,碰撞元素和视觉元素的形状和大小是相同的。碰撞元素和视觉元素形状和大小不同的最常见用法是用一个简化的碰撞元素与一个使用复杂网格的视觉元素配对。
- 这样会有助于提高性能。
- 通过运行Gazebo并用GUI上的“插入模型”界面导入您的模型来试用该模型。
- 输入以下命令运行Gazebo:
gazebo
- 您应该可以看见一个白色的盒子悬浮在地平面上0.1米高处,如下图所示:
- 现在可以向该机器人添加一个脚轮。脚轮是一个无摩擦的球体。
- 添加这种脚轮比添加有关节的轮子更好,因为脚轮对物理引擎的约束更少。
- 具体做法就是底盘链接元素中分别为该脚轮添加一个碰撞子元素和视觉子元素,如下所示:
- 不要复制以下这些行。这些行只是用于参考目的。
<?xml version='1.0'?>
<sdf version='1.4'>
<model name="my_robot">
<static>true</static>
<link name='chassis'>
<pose>0 0 .1 0 0 0</pose>
<collision name='collision'>
<geometry>
<box>
<size>.4 .2 .1</size>
</box>
</geometry>
</collision>
<visual name='visual'>
<geometry>
<box>
<size>.4 .2 .1</size>
</box>
</geometry>
</visual>
<collision name='caster_collision'>
<pose>-0.15 0 -0.05 0 0 0</pose>
<geometry>
<sphere>
<radius>.05</radius>
</sphere>
</geometry>
<surface>
<friction>
<ode>
<mu>0</mu>
<mu2>0</mu2>
<slip1>1.0</slip1>
<slip2>1.0</slip2>
</ode>
</friction>
</surface>
</collision>
<visual name='caster_visual'>
<pose>-0.15 0 -0.05 0 0 0</pose>
<geometry>
<sphere>
<radius>.05</radius>
</sphere>
</geometry>
</visual>
</link>
</model>
</sdf>
- 试用您的模型,以确保脚轮出现在机器人的末端。
- 在Gazebo中生成该机器人来查看它(无需重新启动Gazebo;每次插入模型时,都会从磁盘上重新加载修改后的模型)。
- 结果应该像下图所示:
- 现在来添加左轮。
- 修改
~/.gazebo/models/my_robot/model.sdf
文件,向其添加左轮链接,使该文件如下所示: - 不要复制以下这些行。这些行只是用于参考目的。
<?xml version='1.0'?>
<sdf version='1.4'>
<model name="my_robot">
<static>true</static>
<link name='chassis'>
<pose>0 0 .1 0 0 0</pose>
<collision name='collision'>
<geometry>
<box>
<size>.4 .2 .1</size>
</box>
</geometry>
</collision>
<visual name='visual'>
<geometry>
<box>
<size>.4 .2 .1</size>
</box>
</geometry>
</visual>
<collision name='caster_collision'>
<pose>-0.15 0 -0.05 0 0 0</pose>
<geometry>
<sphere>
<radius>.05</radius>
</sphere>
</geometry>
<surface>
<friction>
<ode>
<mu>0</mu>
<mu2>0</mu2>
<slip1>1.0</slip1>
<slip2>1.0</slip2>
</ode>
</friction>
</surface>
</collision>
<visual name='caster_visual'>
<pose>-0.15 0 -0.05 0 0 0</pose>
<geometry>
<sphere>
<radius>.05</radius>
</sphere>
</geometry>
</visual>
</link>
<link name="left_wheel">
<pose>0.1 0.13 0.1 0 1.5707 1.5707</pose>
<collision name="collision">
<geometry>
<cylinder>
<radius>.1</radius>
<length>.05</length>
</cylinder>
</geometry>
</collision>
<visual name="visual">
<geometry>
<cylinder>
<radius>.1</radius>
<length>.05</length>
</cylinder>
</geometry>
</visual>
</link>
- 不要复制以下这些行。这些行只是用于参考目的。
</model>
</sdf>
- 运行Gazebo,插入您的机器人模型,并确认该轮子已经出现在了正确的位置上。
可以通过复制左轮来制作右轮,并调整右轮链接的位置,如下所示:
不要复制以下这些行。这些行只是用于参考目的。
<?xml version='1.0'?>
<sdf version='1.4'>
<model name="my_robot">
<static>true</static>
<link name='chassis'>
<pose>0 0 .1 0 0 0</pose>
<collision name='collision'>
<geometry>
<box>
<size>.4 .2 .1</size>
</box>
</geometry>
</collision>
<visual name='visual'>
<geometry>
<box>
<size>.4 .2 .1</size>
</box>
</geometry>
</visual>
<collision name='caster_collision'>
<pose>-0.15 0 -0.05 0 0 0</pose>
<geometry>
<sphere>
<radius>.05</radius>
</sphere>
</geometry>
<surface>
<friction>
<ode>
<mu>0</mu>
<mu2>0</mu2>
<slip1>1.0</slip1>
<slip2>1.0</slip2>
</ode>
</friction>
</surface>
</collision>
<visual name='caster_visual'>
<pose>-0.15 0 -0.05 0 0 0</pose>
<geometry>
<sphere>
<radius>.05</radius>
</sphere>
</geometry>
</visual>
</link>
<link name="left_wheel">
<pose>0.1 0.13 0.1 0 1.5707 1.5707</pose>
<collision name="collision">
<geometry>
<cylinder>
<radius>.1</radius>
<length>.05</length>
</cylinder>
</geometry>
</collision>
<visual name="visual">
<geometry>
<cylinder>
<radius>.1</radius>
<length>.05</length>
</cylinder>
</geometry>
</visual>
</link>
<link name="right_wheel">
<pose>0.1 -0.13 0.1 0 1.5707 1.5707</pose>
<collision name="collision">
<geometry>
<cylinder>
<radius>.1</radius>
<length>.05</length>
</cylinder>
</geometry>
</collision>
<visual name="visual">
<geometry>
<cylinder>
<radius>.1</radius>
<length>.05</length>
</cylinder>
</geometry>
</visual>
</link>
- 不要复制以下这些行。这些行只是用于参考目的。
</model>
</sdf>
- 至此,该机器人应该就是了一个具有一个脚轮和2个轮子的底盘。
通过将
标签设置成false来使该模型为动态的,并为左轮和右轮添加两个铰链关节 不要复制以下这些行。这些行只是用于参考目的
<?xml version='1.0'?>
<sdf version='1.4'>
<model name="my_robot">
<static>false</static>
- 不要复制以下这些行。这些行只是用于参考目的。
<link name='chassis'>
<pose>0 0 .1 0 0 0</pose>
<collision name='collision'>
<geometry>
<box>
<size>.4 .2 .1</size>
</box>
</geometry>
</collision>
<visual name='visual'>
<geometry>
<box>
<size>.4 .2 .1</size>
</box>
</geometry>
</visual>
<collision name='caster_collision'>
<pose>-0.15 0 -0.05 0 0 0</pose>
<geometry>
<sphere>
<radius>.05</radius>
</sphere>
</geometry>
<surface>
<friction>
<ode>
<mu>0</mu>
<mu2>0</mu2>
<slip1>1.0</slip1>
<slip2>1.0</slip2>
</ode>
</friction>
</surface>
</collision>
<visual name='caster_visual'>
<pose>-0.15 0 -0.05 0 0 0</pose>
<geometry>
<sphere>
<radius>.05</radius>
</sphere>
</geometry>
</visual>
</link>
<link name="left_wheel">
<pose>0.1 0.13 0.1 0 1.5707 1.5707</pose>
<collision name="collision">
<geometry>
<cylinder>
<radius>.1</radius>
<length>.05</length>
</cylinder>
</geometry>
</collision>
<visual name="visual">
<geometry>
<cylinder>
<radius>.1</radius>
<length>.05</length>
</cylinder>
</geometry>
</visual>
</link>
<link name="right_wheel">
<pose>0.1 -0.13 0.1 0 1.5707 1.5707</pose>
<collision name="collision">
<geometry>
<cylinder>
<radius>.1</radius>
<length>.05</length>
</cylinder>
</geometry>
</collision>
<visual name="visual">
<geometry>
<cylinder>
<radius>.1</radius>
<length>.05</length>
</cylinder>
</geometry>
</visual>
</link>
<joint type="revolute" name="left_wheel_hinge">
<pose>0 0 -0.03 0 0 0</pose>
<child>left_wheel</child>
<parent>chassis</parent>
<axis>
<xyz>0 1 0</xyz>
</axis>
</joint>
<joint type="revolute" name="right_wheel_hinge">
<pose>0 0 0.03 0 0 0</pose>
<child>right_wheel</child>
<parent>chassis</parent>
<axis>
<xyz>0 1 0</xyz>
</axis>
</joint>
- 不要复制以下这些行。这些行只是用于参考目的
</model>
</sdf>
通过设置
的子元素 0 1 0 ,可以让这两个关节绕着y轴转动,而且通过关节将这两个轮子链接到底盘上。启动Gazebo,并插入您的模型。单击屏幕右侧的点并将其拖动到左侧,这样可以打开原来隐藏的右面板。
应该会出现一个新窗口(即右面板),该面板上包含每个关节的各种控制属性。(注意,请确保已选中想要控制的模型)
在“Force”选项卡下,将施加到每个关节的力增大到约0.1N-m。 这样机器人就应该会四处移动:
参考:
获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号