1. 程式人生 > >1.4 Vrep之逆運動學模組

1.4 Vrep之逆運動學模組

文章目錄


  • 本章將學習逆運動學模組的使用,當然,我們在學習過程中也會複習如何建立機械臂模型
  • 你可以先看下IK和FK相關資料夾scenes/ik_fk_simple_examples下的例項來學習逆運動學模組

匯入模型

匯入mesh

  • 我們目的是建立一個non-dynamic機械臂,只用到逆運動學功能而不需要物理引擎的幫助(設定為non-dynamic的原因)
  • CAD資料位於"cadFiles" 資料夾中,具體操作如下: [Menu bar --> File --> Import --> Mesh…] ,則匯入了 A single simple shape ,其預設位於場景的中心。當然,取決於匯入時的設定,CAD資料可能處於不同位置,有不同縮放係數(scale),甚至可能已經被劃分為幾個小形狀。
    在這裡插入圖片描述

劃分形狀

  • 此時匯入的是A single simple shape ,我們要劃分其為幾個小形狀,選中機械臂,然後 [Menu bar --> Edit --> Grouping/Merging --> Divide selected shapes].
    在這裡插入圖片描述

  • 這種劃分演算法的原理是將具有相同邊的三角形(mesh由三角形組成)組合在一起,有時這種自動劃分不行,則進入三角形編輯模式,手動劃分


統一視覺屬性

  • 下面要統一視覺屬性,選中一個形狀,進入屬性設定介面,點選Adjust outside color,來調整所選形狀的外表面的各種顏色成分,這裡我們只調整形狀的外部顏色成分,搞掂一個後,通過選形狀A,CTRL+選形狀B(模板形狀),然後Apply to selection,達到統一的目的。同理,統一其他視覺屬性Shading angle, the Edges width or the Edges color。

效果圖:

在這裡插入圖片描述


新增關節

基本思想:從形狀中提取關節(三角形編輯模式)

  • 首先選中所有匯入的形狀,點選 [Menu bar --> Edit --> Bounding box alignment --> Align selected shapes’ coordinate frame with world],這一步保證包圍盒與絕對座標系對齊(our bounding boxes are aligned with the absolute reference frame),並且考慮到當前機械臂設定(given the current manipulator configuration),能代表最小包圍盒。

  • 然後新增旋轉關節Menu bar --> Add --> Joint --> Revolute,預設位置是0,0,0而預設姿態為垂直方向,所以新增的關節會被基座的圓柱體掩蓋,然後選中關節,Ctrl+選中基座,分別對位置和姿態Apply to selection,使得關節和基座處於完全相同的座標下,對其他6個關節重複這樣的操作,則所有關節的位置是對的,但部分關節的姿態要調整。

  • 對那些應該與世界座標系Y軸對齊的關節,在姿態框中輸入(90,0,0) for the Alpha, Beta and Gamma,然後點選 Apply to selection,而對那些應該與世界座標系X軸對齊的關節,在姿態框中輸入(0,90,0)for the Alpha, Beta and Gamma,然後點選 Apply to selection,最終所有關節的位姿都搞掂!

在這裡插入圖片描述


組合形狀

  • 下一步要組合(group)那些屬於同一剛性實體(連桿)的形狀。
  • 選中那些要組成連桿1(連桿0是基座)的形狀,然後組合,即[Menu bar --> Edit --> Grouping/Merging --> Group selected shapes]。
  • 一旦形狀組合成複合形狀,你可以重新將包圍盒與世界對齊,但這一步不是必需,只是為了視覺效果。(附英文)

Once the shapes are grouped in a compound shape, you could re-align its bounding box with the world, but this step is not required (and has only a visual effect).

  • 重複上述過程,合併其他邏輯上屬於一起的形狀,這裡我們不會去驅動gripper的手指,所以簡單地將它們與最後一個連桿剛性地組合在一起。
  • 當要組合的所有形狀具有相同的視覺屬性時,嘗試將它們合併到一起,即Menu bar --> Edit --> Grouping/Merging --> Merge selected shapes。

When all shapes that are meant to be grouped share the same visual attributes, try merging them together instead ([Menu bar --> Edit --> Grouping/Merging --> Merge selected shapes]).

  • 關於merge與group的辨析(待補)

  • 接著重新命名各結構,如"redundantRobot" - “redundantRob_joint1” - “redundantRob_link1” - “redundantRob_joint2”

  • 接著通過拖拽建立運動學鏈,效果如圖:

在這裡插入圖片描述


  • 接著選中所有關節,在關節模式的屬性設定中,選擇joint is in inverse kinematics mode,然後Apply to selection,接著設定關節所在的視覺層(比如關節預設處於第二層,則disable第二層顯示)

定義逆運動學任務

  • VREP中逆運動任務至少需要如下的幾種元素說明:
  1. 運動學鏈,包括一個末端dummy和基座(機械臂要求)
  2. 一個target dummy及與之相約束的tip dummy(任務要求tip-target對)

a kinematic chain described with a “tip” dummy and a “base” object.

A “target” dummy that the “tip” dummy will be constrained to follow.


  • 現在我們已經有了基座,下面新增末端dummy,命名為redundantRob_tip,並設定其位置為:(0.324,0,0.62),並將其拖拽到基座上(層次樹中)

  • 下面設定target dummy,複製和貼上redundantRob_tip,並重新命名為redundantRob_target

  • 接著為了說明"redundantRob_tip"和redundantRob_target"為逆運動學的tip/target對,開啟redundantRob_tip的dummy屬性設定框,指定redundantRob_target為Linked dummy,此外,屬性框中的Link type預設為 IK, tip-target,不需更改。注意到層次樹中tip/target對有紅色虛線連線。(重要

在這裡插入圖片描述


  • 下面要註冊逆運動學為IK group(register the task as an IK group),開啟逆運動學屬性框,點選Add new IK group,則IK group列表中出現新的一項:“IK_Group”,選中它,點選 Edit IK elements來開啟 IK element dialog,選中redundantRob_tip,然後點選 Add new IK element with tip按鈕。

  • 這一步只是添加了一個出現在列表中的IK模組,此外,還表明了redundantRobot作為基座(如圖),最後,確保所有的items在Constraints上為checked狀態(如圖)。我們確實希望tip dummy在位置和姿態上能跟隨target dummy。

This just added an IK element that appears in the list. Further down, indicate “redundantRobot” as the Base. Finally, make sure that all items are checked in the Constraints section (check als Alpha-Beta and Gamma). Indeed, we want our “tip” dummy to follow our “target” dummy in position and orientation
在這裡插入圖片描述


在逆運動學設定框中,你能enable Mechanism is redundant,但眼下在我們這裡沒差別,因為我們沒定義關節限制和避障引數
在這裡插入圖片描述


  • 執行模擬,此時若移動redundantRob_target的位置和姿態,則機械臂應該跟隨著運動,注意到若移動得太遠,則逆運動學模組會崩潰,這種情況通常由於兩種原因,一種是奇異點,另一種是達不到這一位置。
  • 針對這種行為,我們有變通的方法:選中逆運動框列表中的"IK_Group",然後為Calc. method項設定為DLS,這次若將target移動到很遠的地方,則逆運動運算更加穩定( the inverse kinematics resolution became more stable),上下調整Damping項,基本上,若該項值大時,逆運動更穩定但變慢。
  • 實際上,你可以獲得兩種解決方案的好處(get the advantages of both resolution methods),你只需要建立兩個相同的 “IK groups”,第一個是not damped,第二個是damped,那麼,對於第二個IK group,你可以指定帶條件的解決方案,有關更多資訊,請參閱“Edit conditional parameters項(specify a conditional resolution (refer to the Edit conditional parameters item for more information))。
  • 關於為什麼能兼有二者好處,是由於Edit conditional parameters中說明若not damped失敗,則採用damped方案
  • 現在將Calc. method項設定回 Pseudo inverse。
  • 執行模擬,在IK element框中,選中"redundantRob_tip,然後disable一些約束項,觀察此時若拖動target,機械臂會如何運動,實驗夠了,就將所有約束項重設為checked。

定義模型

  • 為了不用擔心誤操作從而破壞模型,我們要定義模型
  • 首先將"redundantRob_tip" and “redundantRob_target"移動到檢視層11使之不可見,然後shift+選中場景中所有可見物體,然後Ctrl+選中"redundantRobot"來將其移出選擇項中,開啟common properties dialog,然後enable Select base of model instead項,然後點選Apply to selection。然後通過ESC按鍵來清除選擇項,然後選中"redundantRobot”,enable Object is model base item(在common properties中)
  • 大功告成,成功新增包圍盒。

在這裡插入圖片描述

  • 接著新增一個控制球,從而來控制機械臂抓手的位姿,[Menu bar --> Add --> Primitive shape --> Sphere],為 X-Size, Y-Size and Z-Size指定為0.05, 然後 uncheck the Create dynamic and respondable shape項,接著使得球體位置和redundantRob_target的位置一致,此時球體出現在機械臂的末端(tip)上,重新命名其為redundantRob_manipSphere,接著通過拖拽將其作為"redundantRob_target"的父節點,此時執行模擬,你能通過移動小球來改變機械臂的configuration

  • 接著改變下球體外觀,在shape properties中,點選Adjust outside color, 然後 check the Opacity item以及 check the Backface culling item

  • 在球體的object common properties中,uncheck all items in the Object special properties section(因為球體並不屬於機械臂,更像是人機互動介面),接著將"redundantRobot" 作為 "redundantRob_manipSphere"的父節點。

在這裡插入圖片描述

register a collision object

  • 最後,我們要register a collision object來檢測機械臂與環境的碰撞,即機械臂中的每個形狀能檢測碰撞(當然不包括那個球體),所以要設定collection
  • 開啟collection對話方塊,選擇"redundantRobot",然後點選Add new collection,則添加了個新的,空的collection,接著定義這個collection的內容:點選Add(確保"redundantRobot" 仍然被選中)。接著選中新增加的collection項,點選Visualize selected collection,則所有組成機械臂的物體在場景中呈現pink的顏色,將collection命名為 “redundantRob”。

在這裡插入圖片描述


  • 接著註冊(register)一個碰撞物體(a collision object),具體操作:
  • 開啟collision dialog,然後新增新的collision object並指定如下的item pair:"[Collection] redundantRob" - “all other collidable objects in the scene”,然後將此collision object重新命名為 “redundantRob”
  • 此時執行模擬,複製貼上機械臂幾次,注意到那些模組也對應地被複制了,然後放在各自周圍,然後拖動球體,改變機械臂結構(位姿),可看到若發生碰撞時,場景中機械臂顏色的改變,且每個機械臂都在充分執行(發揮各自功能)。
  • 註冊最小距離計算object的步驟類似於註冊碰撞object的步驟,所有註冊的object(包括collision detection, collections, IK groups)和場景中的物體可通過API呼叫來獲取,除此之外,還可以被圖示記錄並可視化。

在這裡插入圖片描述