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.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>
結果如圖:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIiclRnblN0LclHdpZXYyd2LcBzNvwVZ2x2bzNXak9CX90TQNNkRrFlQKBTSvwFbslmZvwFMwQzLcVmepNHdu9mZvwFVywUNMZTY18CX052bm9CX90zdOlXRE9UMVpWT4FEVkZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39jMxMDOxYDMzEzMxMDM0EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
本文靠自己了解,翻譯而來,錯誤之處望不吝指教!!!