本教程演示了Gazebo的基本模型管理,并通过带领用户完成创建使用差动驱动机构进行移动的两轮移动机器人的过程来熟悉模型数据库中的基本模型表示。
1. 设置你的模型目录
通读模型数据库文档。 您将创建自己的模型,该模型必须遵循Gazebo模型数据库目录结构的格式设置规则。 另外,有关模型描述格式的详细信息,请参考SDF参考。
- 创建模型目录:
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>[email protected]</email>
</author>
<description>
My awesome robot.
</description>
</model>
- 创建
~/.gazebo/models/my_robot/model.sdf
文件。
gedit ~/.gazebo/models/my_robot/model.sdf
- 复制以下内容:
<?xml version='1.0'?>
<sdf version='1.4'>
<model name="my_robot">
</model>
</sdf>
现在我们有了模型的基本内容。model.config
文件用一些额外的元数据描述robot。model.sdf
文件包含必要的标记,用于使用与sdf版本1.4链接的Gazebo实例化名为my_robot
的模型。
2. 构建模型的结构
此步骤将创建一个带有两个轮子的矩形底座。
从简单开始,循序渐进地建立模型,这一点很重要。 第一步是布置模型的基本形状。 为此,我们将使我们的模型成为静态的,这意味着它将被物理引擎忽略。 因此,模型将停留在一个位置,并允许我们正确对齐所有组件。
**注意:灰色代码是原有的(上一步已经编辑的),如本段文字,具体的显示效果可能与浏览器相关**
**<xml>彩色代码是本步骤新增的代码, 如本段文字,具体的显示效果可能与浏览器相关</xml>**
- 通过在
~/ .gazebo / models / my_robot / model.sdf
文件中添加<static> true </static>
元素使模型为静态:
<?xml version='1.0'?>
<sdf version='1.4'>
<model name="my_robot">
<static>true</static>
</model>
</sdf>
- 通过编辑
~/.gazebo/model/my_bot/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>
</model>
</sdf>
在这里,我们创建了一个0.4 x 0.2 x 0.1米大小的长方体。 collision
元素指定碰撞检测引擎使用的形状。visual
元素指定渲染引擎使用的形状。对于大多数用例,冲突和可视元素是相同的。对于不同的碰撞
和视觉
元素,最常用的方法是将简化的碰撞元素与使用复杂网格的视觉元素配对。这将有助于提高性能。
- 通过运行Gazebo并通过GUI上的Insert Model界面导入模型来试用您的模型。
gazebo
你应该看到在离地面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>
此时我们的机器人应该有一个底盘,一个脚轮和两个前轮。
- 通过将
<static>
设置为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>
两个关节绕 y 轴 <xyz>0 10</xyz>
旋转,并将每个车轮连接到汽车底盘。
-
启动Gazebo,然后插入您的模型。 单击屏幕右侧的点并将其拖动到左侧。
应出现一个新窗口,其中包含每个关节的各种控制器。(注意:请确保选择了要控制的模型) -
在
Force
选项卡下,将应用于每个运动类型的力增加到约0.1N-m。 机器人应该四处移动:
-
恭喜你,至此你已经构建了一个简单的移动机器人。
3. 试试构建你自己的机器人
- 发挥自己的创意,做一个新的机器人。
Idea: 四足动物,由具有四个圆柱腿的躯干组成。 每条腿都通过旋转关节连接到躯干。
Idea: 一种有铲子前装装置的六轮车辆。