三 Gazebo学习总结之制作一个模型及导入网格

时间:2022-11-26 03:31:28

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"?>
<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

gazebo my_mesh.world
例如使用duck.daeduck.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>
结果如图:

三  Gazebo学习总结之制作一个模型及导入网格



本文靠自己理解,翻译而来,错误之处望不吝指教!!!