Models从简单的形状到复杂的机器人都有。它指的是<model>SDF标签,从本质上来说是links、joints、collision objects、visuals和plugins的集合,生成一个模型文件不一定依靠整体模型的复杂性,本文将介绍一些怎么生成模型的小窍门。
模型的组成部分:
Links:一个link包含了单个模型的物理属性,可能是一个*,或者是一个关节链中的一个link。每一个link包含许多碰撞(或冲突)元素和视觉元素,为了提高性能和稳定性要尽量减少links的数量。例如,一个桌子模型通过关节连接,可以由5个links组成(4条腿和1个桌面),但是,这过于复杂,特别是关节将不能移动,而我们可以用1个link和5个collision元素来创建一个桌子。
Collisions:碰撞元素封装了一个用于碰撞检测的几何结构,可以是一个简单的形状(首选),或者是一个三角形的网格(将消耗更多的资源),一个link可能包含许多个碰撞元素。
Visual:一个视觉元素被用于使link部分可视化,一个link包含0个或者多个视觉元素。
Inertial:惯性元素描述了link的动态属性,例如质量和矩阵转动惯量。
Sensor:传感器从world中搜集数据,用于插件的使用,一个link可能包含0个或多个传感器。
Joint:一个关节连接了两个link(环节),犹如parent和child的关系,是与其他参数例如旋转抽及关节限制建立在一起的。
Plugins:插件是由第三方为了控制模型而创建的一个共享库。
建立一个模型:
Step 1:集合网格
这一步涉及到为构建模型集合所需要的所有必要的3D网格文件,Gazebo提供了一组简单的形状:box,sphere和cylinder,如果你的模型需要更复杂的东西,请继续阅读。
网格来自于很多地方,Google的3D warehouse是一个很好的3D模型库,其次,你可能已经拥有了必要的文件,最后,你可以使用3D建模软件例如Blender和Sketchup来制作自己的网格。
Gazebo要求网格文件被转换为STL或者Collada格式,Collada为首选格式。
小窍门:1.使用3D建模软件移动每个网格,使它的中心在原点,这将使在Gazebo中的模型放置明显变得容易。
2.Collada(.ada)文件格式允许将材料连接到网格,使用这个机制是为了提高网格的视觉外观。
3.保持网格简单。尤其是如果计划使用网格作为碰撞元素,一个通用的做法是使用一个低多边形网格作为碰撞元素,和使用一个高多边形网格作为视觉。一个较好的做法是使用内置的形状(box,sphere,cylinder)作为碰撞元素。
Step2:创建模型SDF文件
从创建一个很简单的模型文件,或者复制一个存在的模型文件开始,关键的是要知道运行的(是什么)东西,或易于调试。
下面是一个只有单元大小形状,非常基本的最小box模型文件作为碰撞几何,和相同的单元惯性视觉的例子:
创建模型文件:
vim box.sdf复制以下内容到box.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>
<ixx>1.0</ixx>
<ixy>0.0</ixy>
<ixz>0.0</ixz>
<iyy>1.0</iyy>
<iyz>0.0</iyz>
<izz>1.0</izz>
</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>
注意:Box的几何原点是在box的几何中心,因此为了这个box的底部能与地平面齐平,一个<pose>0 0 0.5 0 0 0</pose>的原点被添加,是为了在地平面上提高box。
小窍门:以上例子设定这个简单的box模型为静态的,使模型不能移动。在模型创造中这个特性是有用的,当开始创建模型时,如果你想你的模型是移动的,设置<static>标签为false。
Step3:添加以下特征到模型SDF文件
对于一个正在运行的.sdf文件,慢慢的开始添加更多的复杂性,对于每一个新添加的特征,使用图形客户端( graphical client)重载模型,以确保model是正确的。
以下是一个很好的添加特征顺序:
a.增加一个link;
b.设定碰撞元素(collision element);
c.设定视觉元素(visual element);
d.设置惯性属性(inertial properties);
e.返回a,直到所有的links都被添加;
f.增添所有的关节(joints,若有的话)
g.增添所有的插件(plugins,若有的话)
导入网格:
以下内容描述了如何将3D网格导入到Gazebo中,Gazebo使用了一个右手定则来确定坐标系,Z轴是向上垂直的(中指),X轴是向前指向屏幕的(大拇指),Y轴是指向左边(食指)。
减少复杂性:许多网格过于复杂,为了达到高效,一个有上千个三角形的网格应该被减少,或者划分为单独的网格;
中心网:第一步是设置网格中心在(0,0,0),确定向前的方向(可以是主观的)沿着X轴;
缩放网:Gazebo使用的是米制系统,许多网格(特别是3D warehouse)使用的是英制单位,使用最喜欢的3D编辑器去缩放网格为米制尺寸。
一旦网格被准备好,以Collada文件格式导入,这个格式将包含所有的3D信息和材料。
测试网格:最容易的测试网格的方法是创建一个名为my_world.world的简单world文件来载入网格,用网格的实际名称代替my_mesh.dae。
<?xml version="1.0"?>然后,仅仅在文件所在的目录内运行Gazebo。
<sdf version="1.4">
<world name="default">
<include>
<uri>model://ground_plane</uri>
</include>
<include>
<uri>model://sun</uri>
</include>
<model name="my_mesh">
<pose>0 0 0 0 0 0</pose>
<static>true</static>
<link name="body">
<visual name="visual">
<geometry>
<mesh><uri>file://my_mesh.dae</uri></mesh>
</geometry>
</visual>
</link>
</model>
</world>
</sdf>
gazebo my_mesh.world例如使用duck.dae和duck.png网格文件,把它们一起放在模型目录下面,或者与world文件 放在 同一个目录下面。由于duck网格被定义为Y轴向上,为了让它显示的是直立的,需要在sdf中设置一个旋转量。
<visual name="visual">结果如图:
<pose>0 0 0 1.5708 0 0</pose>
<geometry>
<mesh><uri>file://duck.dae</uri></mesh>
</geometry>
</visual>
本文靠自己理解,翻译而来,错误之处望不吝指教!!!