Gazebo筆記(七)__mesh
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>
。