Gazebo筆記(七)__mesh

Chien-lin.Tseng
My learning note
Published in
10 min readAug 17, 2019

2019年9月29日(日)

目錄:

一、參考的網站

二、總結一下目前完成的事

三、使用blender來轉換檔案

四、在.xacro檔加入mesh

五、撰寫一個使手掌動的程式

六、加上 collision

一、參考的網站

(1) 暫無

(2)

二、總結一下目前完成的事

(1) 把.stl檔import進blender,然後進行組裝,設定origin位置,設定縮放大小。最後匯出.dae檔。

(2) 把.dae檔加入.xacro檔(urdf),發現不少東西其實沒排好。回去blender使用它內建的量測工具,量出各個零件的相對位置(為了 urdf 裡的那一堆origin)。

(3) 加入 collision 。

(4) 寫一個可以操作手掌模型的ros程式。

上面大概是我做的事,花最多時間的是在(1)和(2),摸索了非常久才把模型建出來。

三、使用blender來轉換檔案

(1) 開啟 blender

打開之後,記得先把畫面中的不相干東西全刪掉(像相機…之類的),只留下空空的畫面。(免得到時候輸出檔案時,被那些東西影響)

(2) import .stl 檔進來

點擊 file>import>Stl,然後到放有stl檔的資料夾:

全選,並且把左邊的”Scale”設成0.001,然後按 Import STL:

全部零件加完後,會變這樣子(可能有點小,用滑鼠滾輪放大):

可以用左邊的move 按鈕,移動這個模型(記得先圈選):

合併:將整個model全選後,按Ctrl+J,使整個model合併成一個。如圖:

錯的!!(2020年2月13日)
(調整origin位置:上面那張圖中,手掌的左下方有個點點,那就是這個手的origin位置。一個東西的origin位置非常重要,尤其是當我們要把mesh加入.xacro檔時特別重要。)
錯的!!

2020年2月13日修正:
調整origin位置:上面那張圖中,手掌的左下方有個點點,那就是這個手的origin位置。

調整origin位置到物體的重心:點選那個已經合併的手掌,
Object>Set origin>Origin to center of mass(volume)。此時就會看到那個origin點點跑到重心了,同時可以看到旁邊location: x,y,z的值有了變化。如圖:

一定要 把手掌移到中間:將location: x,y,z 的值都改成0即可。如圖:

之後當我們的urdf 檔要讀這個立體圖檔時,urdf 檔會判定blender視窗的最中心點為這個立體圖檔的中心位置!!

所以在export這個檔案前,一定要調整好視窗最中心點的擺設!

2020年2月13日 修正完畢。

(3) export .dae 檔

點擊 file>export>(.dae)。如圖:

之後就打入名稱,就轉成.dae了。

(4) 量測工具

  • 左邊的尺規圖示:
    建議要看清楚,拉的線有沒有變成三維的(測出來的長度會變長、不準確)
  • cursor的使用

點開右邊的<按鈕,再點view,會出現一個3D cursor的欄位:

在螢幕上點一下,3D cursor 會移動,欄位裡的location x,y,z 也會改變:

這個功能可以用來找旋轉軸向量(.xacro會用到),把兩個位置的座標相減,就可以得到了。

(5) 按鍵

shift+滑鼠中鍵:可以平移整個畫面。

中間上方有個棋盤圖示:可以用來切換透視圖、正視圖兩種模式。

中間右上有個xyz座標:可以用來調整觀看方向。

四、在.xacro檔加入mesh

(1)建立 my_hand_version4_mesh.xacro

(之前是 version3,現在加上了mesh變成version4。)

在 /catkin_ws/src/gazebo_ros_demos/rrbot_description/urdf 中

my_hand_version4_mesh.xacro :

https://gist.github.com/pythongo1/345cf5fa4173f862f8daee0274e96b63

下面是我在這個.xacro檔修改的地方(從 version3 到version4 )。

(2) 加上 mesh

(<collision>可以先不要加,因為這時候加根本看不到效果。)

在<mesh filename>中加上.dae檔的路徑即可。

<origin>的調整:可以用blender的量測工具,量出(joint)到(mesh物件origin)的距離。

(3) 更改 EffortJointInterface

在執行原本的.xacro後,發現找不到 process_value(這個參數可以用來讀取當時的joint角度大小)。

經過一番debug後,發現把 PositionJointInterface 改成 EffortJointInterface(在<transmission>中) ,process_value 就會出現了。

以下是更改的步驟:

a. 更改<transmission>裡的<hardwareInterface>,改成EffortJointInterface

b. 更改 .yaml 檔,使其符合 EffortJointInterface

之前在 /catkin_ws/src/gazebo_ros_demos/rrbot_control/config, 有放一堆各個joint的.yaml檔,如 finger5_0.yaml。

之前 finger5_0.yaml 的樣子:

type: "position_controllers/JointPositionController"
joint: hand_base_to_finger5

因應 EffortJointInterface,改成:(記得同時加上pid)

type: "effort_controllers/JointPositionController"
joint: hand_base_to_finger5
pid: {p: 100.0, i: 0.01, d: 10.0}

c. 重複a和b步驟更改其他transmission和.yaml ,就完成了

五、撰寫一個使手掌動的程式

(1) 建立程式(python)

  • 第一版:my_hand_check_version1.py

https://gist.github.com/pythongo1/e1fb87d139a066a854a9876df5813c5f

  • 第二版:my_hand_check_version2.py

https://gist.github.com/pythongo1/ddc37436814e7007479a597c64a9930d

這個版本加入process_value的讀取,藉由判斷joint是否已經轉到指定角度。

  • 第三版:my_hand_check_version3_function.py

https://gist.github.com/pythongo1/751710308b92d95f09ae3bd95dcfeb68

將第二版的程式函式化,如 finger5_move(angle)、open_hand(),把類似的程式寫成副函式,方便之後的管理。
加入限制角度的機制,防止使用者輸入過大或過小的角度。

以下是手掌動的影片(第三版的):
張手 -> 彎小拇指 -> 彎無名指 -> 彎中指 -> 彎食指 -> 彎大拇指 -> 轉動旋轉軸 -> 張手

(2) 程式分析

  • 主要是因為使用global參數,使的這份程式還蠻簡單的。
# for publish
finger5_0_publisher = 0
finger5_1_publisher = 0
finger4_0_publisher = 0
finger4_1_publisher = 0
finger3_0_publisher = 0
finger3_1_publisher = 0
finger2_0_publisher = 0
finger2_1_publisher = 0
finger1_rotate_publisher = 0
finger1_0_publisher = 0
finger1_1_publisher = 0

# for global variable
finger5_0_process_value = 0
finger5_1_process_value = 0
finger4_0_process_value = 0
finger4_1_process_value = 0
finger3_0_process_value = 0
finger3_1_process_value = 0
finger2_0_process_value = 0
finger2_1_process_value = 0
finger1_rotate_axis_process_value = 0
finger1_0_base_process_value = 0
finger1_1_process_value = 0
  • python除法

式子中必須有一個浮點數,除出來的結果才會是浮點數。

angle_1 = angle / 2.00

六、加上 collision

(1) 在 .xacro 檔中加上collision

為了讓collision的位置與形狀都和<visual>一樣,基本上是把<visual>裡的<origin>、<geometry>貼過來。

為了指定摩擦力、剛性、阻尼,可以在其他地方加上<gazebo reference> (我是加在rrbot.gazebo):

  <gazebo reference="finger5">
<mu1>0.2</mu1>
<mu2>0.2</mu2>
<kp>10000000.0</kp>
<kd>10000000.0</kd>
</gazebo>

<mu1>、<mu2>和摩擦係數有關。<kp>和剛性有關。<kd>和阻尼有關。

加入collision後:

但是,手指link會伸進去手掌link(這是正常的):

如果想要讓link彼此不會伸進去,可以加上<selfCollide>true</selfCollide>:

  <gazebo reference="finger5">
<selfCollide>true</selfCollide>
<mu1>0.2</mu1>
<mu2>0.2</mu2>
<kp>10000000.0</kp>
<kd>10000000.0</kd>
</gazebo>

--

--