目录
一、模型结构与要求
gazebo可以通过GUI或者编程方式动态的加载模型。
Gazebo中的模型定义了具有动态、运动学和视觉属性的物理实体。另外,一个模型可能有一个或多个插件,这些插件会影响模型的行为。
模型可以代表任何东西,从简单的形状到复杂的机器人;甚至地面也是一个模型。
可以通过一下方式下载模型数据库:
git clone https://github.com/osrf/gazebo_models
1.模型数据库结构
为了更好的管理以及设计,模型数据库必须遵循特定的目录和文件结构。
数据库的结构如下所示(仅有一个model_1的情况下):
模型数据库的根目录包含两部分:(1)一个保存数据库信息的database.config配置文件;(2)所有模块的目录;
在每个模块的目录之下也包含一个model.config,内部是关于每个model的meta-data(应该翻译成元数据吧,我理解的就是原始数据吧)。
同时模型的目录下还包含模型、任何材质和插件的SDF文件。
以下是针对上述根目录包含的两部分,分别就具体内容进行说明:
(1)database 配置
注意编辑这里采用gedit,如果采用gvim编辑config与sdf可能存在gazebo不识别模型的情况。
database.config的格式如下:
<?xml version='1.0'?>
<database>
<name>name_of_this_database</name>
<license>Creative Commons Attribution 3.0 Unported</license>
<models>
<uri>file://model_directory</uri>
</models>
</database>
database.config包含了数据库名字、模型的license信息,以及一个有效模型的列表。
(2)模型配置
每个模块必须在其根目录包含一个模型的配置文件
model.config的格式如下所示:
<?xml version="1.0"?>
<model>
<name>My Model Name</name>
<version>1.0</version>
<sdf version='1.5'>model.sdf</sdf>
<author>
<name>My name</name>
<email>name@email.address</email>
</author>
<description>
A description of the model
</description>
</model>
关于name、version、author这几项参数此处不解释,相信大家也能明白。
sdf参数,需要填入sdf文件,这里的sdf文件可以是网上下载的也可以是自己编辑的,description则是对于该模型的描述;
二、设计一个模型
SDF模型可以从简单的形状到复杂的机器人。其本质上就是连接(link),关节(joint)、碰撞对象、视觉效果和插件的集合。
1.SDF模型组成
sdf的模型组成主要包括links、joints、plugins,其中links又包括collision、visual、inertial、sensor、light。
(1)links
是一个模型的实体的物理特性,links可以是一个车轮、一个链环。每个link又可能包含可视化与碰撞部分。
因为碰撞检测的计算量非常大,甚至占到整个机器人控制中的90%以上,所以往往会通过简化模型的方式来降低碰撞检测的运算量。
所以才会有碰撞模型与可视化模型,可视化模型一般就是实际的模型外观,而碰撞模型则尽量采用规则的形状,力求简单。
(2)joints
joint是连接两个link的节点,也就是关节,关节参数主要包括子节点、父节点、旋转轴以及关节角限制。
(3)plugins
插件是由第三方创建的库
2.构建一个模型
gazebo到这里才开始涉及到实际的东西,终于可以动手操作一些东西了!
gazebo提供一些简单的例如长方体、球、圆柱基本的模型,在不满足设计要求的情况下,也可以通过绘图软件自己设计。
gazebo需要的模型文件的格式包括:STL,Collada,OBJ
产生一个简单的SDF文件:
<?xml version='1.0'?>
<sdf version="1.4">
<model name="my_model">
<pose>0 0 0.5 0 0 0</pose>
<static>true</static>
<link name="link">
<inertial>
<mass>1.0</mass>
<inertia> <!-- inertias are tricky to compute -->
<!-- http://gazebosim.org/tutorials?tut=inertia&cat=build_robot -->
<ixx>0.083</ixx> <!-- for a box: ixx = 0.083 * mass * (y*y + z*z) -->
<ixy>0.0</ixy> <!-- for a box: ixy = 0 -->
<ixz>0.0</ixz> <!-- for a box: ixz = 0 -->
<iyy>0.083</iyy> <!-- for a box: iyy = 0.083 * mass * (x*x + z*z) -->
<iyz>0.0</iyz> <!-- for a box: iyz = 0 -->
<izz>0.083</izz> <!-- for a box: izz = 0.083 * mass * (x*x + y*y) -->
</inertia>
</inertial>
<collision name="collision">
<geometry>
<box>
<size>1 1 1</size>
</box>
</geometry>
</collision>
<visual name="visual">
<geometry>
<box>
<size>1 1 1</size>
</box>
</geometry>
</visual>
</link>
</model>
</sdf>
产生了一个可视化尺寸与碰撞尺寸均是1的立方体。由于该立方体的原点在中心,所以为了方立方体平放在地面上,需要在z轴方向向上偏移0.5,设置为该model的位置。
三、构建一个可移动的机器人
第三部分主要解释gazebo的基本模型管理,通过一步一步的创建一个差动驱动两轮式移动机器人来练习熟悉模型数据库中的基本模型的表示。
1.建立模型路径
(1)产生一个模型的路径:
mkdir -p ~/.gazebo/models/my_robot
(2)产生一个配置文件:
gedit ~/.gazebo/models/my_robot/model.config
(3)将以下内容写入配置文件:
<?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>
(4)产生一个sdf文件
gedit ~/.gazebo/models/my_robot/model.sdf
(5)将以下内容写入sdf文件
<?xml version='1.0'?>
<sdf version='1.4'>
<model name="my_robot">
</model>
</sdf>
至此,已经有一个模型的基本内容。
2.建立模型的结构
通过这一部分,会构建一个简单的车子,车身是一个长方体,并带有两个轮子。
(1)首先是将模型设置为静态,此种情况下会被物理引擎忽略。因此,模型会保持在一个位置,同时可以让我们把所有组件正确的对其。
在原有的model.sdf的
上图所示代码的后面插入<static>true</static>后,model.sdf内容如下:
<?xml version='1.0'?>
<sdf version='1.4'>
<model name="my_robot">
<static>true</static>
</model>
</sdf>
(2)添加矩形的车体
添加之后的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>
设置的碰撞尺寸是碰撞检测用到的形状,视觉尺寸是渲染时使用的形状。就如前面所提到的碰撞检测的特点一样,实际碰撞检测用的尺寸是跟我们在GUI中看到的外形有些区别的。
(3)测试一下设计好的模块
输入:gazebo
然后点左上角菜单栏Insert
下拉菜单中找到My Robot单击后,鼠标移到右侧显示界面,就会出现原来编辑的立方体,
选择想放置的位置即可。如下图所示:
(4)现在在原来立方体的基础上添加车轮
车轮设置的是一个没有摩擦力的球体。
需要添加的代码段是:
<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>
(5)添加左轮
需要添加的代码:
<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>
(6)添加右轮
需要添加的代码:
<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>
(7)编写代码的最后一步
将模型设置为动态,就是(1)中的<static>true</static>修改成<static>false</static>
给左右轮分别增加一个铰链节点,代码如下:
<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>
然后完整的代码如下:
<?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>
(8)启动gazebo,然后按照刚才方式插入设置好的模型
根据gazebo官方的说话,在force栏设置力的大小,做左侧窗口中,点上模型鼠标右键选择,如下图
单击Apply Force/Torque,弹出的菜单就可以设置力了。