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>
結果如圖:本文靠自己理解,翻譯而來,錯誤之處望不吝指教!!!