要進行機器人仿真首先需要得到機器人的幾何模型。我們可以直接通過VREP中提供的基本幾何體來搭建一個簡易的機器人[Menu bar --> Add --> Primitive shape --> ...],如下圖所示的兩輪差動機器人就是由球和圓柱體搭建而成。這種形狀簡單的幾何體稱為Primitive shape:best suited for dynamics collision response calculation, since it will perform much faster and more stable than non-pure shapes(e.g. random or convex meshes). Primitive shapes will be simple meshes, which might not contain enough details or geometric accuracy for our application. For that reason, pure shapes are often hidden in an invisible layer (e.g. layer 9).
使用基本幾何體來搭建抽象的機器人雖然有計算量小等諸多優點,但是卻無法模擬機器人真實形狀。為了模型更真實我們可以導入外部三維模型文件。但如果我們導入的文件過大(三角面片太多),就會嚴重影響圖形顯示和運動學、動力學計算的實時性。下面的圖片中導入的CAD模型就不是一個很好的例子,它包含多達47000個三角面片,而這僅僅只是一個機械手爪。如果場景中有多台機器人裝有這種手爪,那么當機器人與其它機器人、設備或外界環境接觸時物理引擎的計算量會非常大,仿真會變得很慢,因此我們需要簡化模型。Remember: less is better, in almost every aspect.
[Complex CAD data (in solid and wireframe)]
可以從上面左圖中看出,模型包含了很多孔和小細節,而這些特征在導出為網格模型時會生成很多不必要的三角面片。所以首先需要刪除這些孔、螺紋和CAD模型內部的一些特征(比如軸承、外殼內部的加強筋板等結構)。其次,在輸出網格文件時要限制輸出的精度,避免產生過大的文件(export the original data with a limited precision: most CAD applications let you specify the level of details of exported meshes)。同時還要注意當場景中模型的大小差別很大時要分別輸出,避免同時輸出時大模型細節過多,和小模型的細節過少。
VREP支持多種格式的導入文件:OBJ,STL,DXF,3DS,Collada,URDF。假設上面提到的幾點我們都考慮進去了,在刪除一系列不必要的細節后我們可能依然會得到如下圖所示的網格文件,這個模型文件還是很大,並且還存在許多問題(模型作為一個整體被導入,沒有可動部件;導入的姿態和位置不是我們想要的...)。
[Imported CAD data]
VREP為我們提供了幾種方法來進一步簡化模型:
- Automatic mesh division(自動分割網格):allows to generate a new shape for all elements that are not linked together via a common edge
- Extract the convex hull(提取凸殼):allows to simplify the mesh by transforming it into a convex hull.
- Decimate the mesh(縮減網格數量):allows to reduce the number of triangles contained in the mesh.
- Remove the inside of the mesh(移除內部網格):allows to simplify the mesh by removing its inside.
下面的圖片分別顯示了凸殼提取、縮減網格數、移除內部網格后的結果:
為了控制機構運動,我們接下來要將一個整體的機器人模型分割為幾個可動的部分(Two elements are distinct if they don't share any common edge),有如下兩種方法:
- Automatic mesh division(自動分割網格): This does not always work, but is always worth a try. The function can be accessed with [Menu bar --> Edit --> Grouping/merging --> Divide selected shapes]
- Manual mesh division(手動分割網格): via the the triangle edit mode, you can manually select the triangles than logically belong together, then click Extract shape. This will generate a new shape in the scene. Delete the selected triangles after that operation.
下圖中最左邊的是導入VREP中的虎克鉸STL文件,它是一個整體。選中它進行自動分割后將生成4個新的網格模型,如中間圖片所示。這幾個新生成的模型可以隨意拖動改變位置,如最右邊的圖所示,這樣我們就將一個整體模型拆分為可動的部分。
當然我們可以在SolidWorks等軟件導出STL文件時就設置好將裝配體的各零部件單獨輸出,然后在VREP中將其同時導入。如下圖所示,機器人共有11個零部件模型文件,將其同時導入到場景中就不需要使用自動/手動分割網格的功能了。
至於手動分割網格以下面一個簡單的連桿機構為例進行說明。有時自動分割生成的新幾何體可能不是我們想要的,這時先選中要編輯的網格模型,然后打開shape edit模式,手動選擇屬於同一個部件的三角面片。如下圖所示Triangle1~Triangle76都屬於同一個連桿,則同時選中這些面(按住Shift鍵同時用鼠標左鍵進行框選可以提高效率),然后點擊Extract shape生成新的幾何體,之前選中的面可以刪掉。
有時用提取的凸殼代替幾何體會很好,但更多時候需要綜合使用到上面提到的幾種方法來獲得滿意的結果。兼顧物理引擎計算效率和機器人外觀真實性簡化網格后,為了區分不同的零部件或者為了達到良好的顯示效果,我們需要改變幾何體的顏色等外觀屬性。可以通過雙擊模型圖標彈出形狀屬性對話框:
Adjust color選項可以更改幾何體的外觀顏色。勾選Show edges with angle時會顯示輪廓曲線,后面的角度控制顯示效果:角度越大,輪廓線越少;角度越小,輪廓線越多(A small angle makes a shape appear sharp, with many edges, a large angle makes a shape appear smooth and with less edges)。勾選Wireframe則幾何體會始終以線框模型顯示。
由於很多零部件作為一個整體導入,要給不同表面賦予不同的顏色需要先將模型拆分,調整顏色外觀后再將其組合。下面以UR3的基座為例進行說明:
進入shape edit模式,切換到正視圖,按住Shift鍵,同時用鼠標左鍵框選下圖中的一圈三角面片。A shift-selection will select all triangles under the selection area, also hidden triangles. If you wish to only select visible triangles via a shift-selection, hold down the ctrl-key in addition to the shift-key. 即按住Shift框選時可以選中隱藏的面,提高選取效率(注意這里切換到正視圖可以避免誤選其它三角面片;釋放鼠標前要按住Shift鍵不要放,否則會選不上),如果只需要選取可見的面可以同時按Shift+Ctrl鍵。確認沒有多選或少選后點擊Extract cylinder就可以將其提取為基本的圓柱體(之后就可以單獨調整這一部分的顏色),大量減少了網格數量。之后可以按Delete鍵將選中的三角面片刪掉,效果如下面右圖所示:
更改了部分面的顏色后我們要將其與其它部分組合成一個整體(雖然表面顏色不同但屬於同一可動部件)。We can group the shapes that are part of the same link with [Menu bar --> Edit --> Grouping/merging -> Group selected shapes]. Simple shapes can also be merged ([Menu bar --> Edit --> Grouping/Merging --> Merge selected shapes] in which case the visual properties become same for all composing elements. 如下圖所示,將藍色的端蓋,灰色的外殼和黑色的環狀墊圈組合成為一個整體,后續控制過程中這個整體將作為連桿相對於底下的固定基座旋轉。
參考:
Building a clean model tutorial