【从零开始的ROS四轴机械臂控制】(三) - 为机械臂添加摄像头和夹爪、解决gazebo模型抖动、使用gazebo建立sdf模型
【從零開始的ROS四軸機(jī)械臂控制(三)】
- 五、在gazebo中添加攝像頭
- 1.修改arm1.gazebo.xacro文件
- 2.修改arm1.urdf.xacro文件
- 3.查看攝像頭圖像
- 六、為模型添加夾爪(Gripper)
- 1.通過solidworks建立模型
- 2.將夾爪添加進(jìn)gazebo
- (1)模型導(dǎo)入
- (2)更改urdf文件夾
- 3.gazebo模型抖動解決辦法
- ①pid參數(shù)設(shè)置
- ②旋轉(zhuǎn)慣量參數(shù)矩陣
- 4.制作物塊sdf模型
五、在gazebo中添加攝像頭
在完成simple_mover之后,回顧arm0.1版本的目標(biāo),是對不同顏色的方塊進(jìn)行分類并在Gazebo中模擬出來。
要實現(xiàn)不同顏色方塊的分類,就需要用到攝像頭了。所以接下來的任務(wù)是為模型添加一個攝像頭,以供以后圖像處理使用。若要實現(xiàn)攝像頭功能,則需要添加相應(yīng)的插件。可以參考:http://gazebosim.org/tutorials?tut=ros_gzplugins&cat=connect_ros。
本部分完成效果如下:
我們需要更改urdf文件夾下arm1.urdf.xacro、arm1.gazebo.xacro兩個文件。這個作為Robot arm 0.1.2 版本已經(jīng)上傳github。
1.修改arm1.gazebo.xacro文件
首先我們需要向arm1.gazebo.xacro文件中添加camera插件:
<!--link_4-->
<?xml version="1.0"?><robot>...(部分省略)<gazebo reference="link4"><mu1>0.2</mu1><mu2>0.2</mu2><material>Gazebo/White</material></gazebo><!--camera_link--><gazebo reference="camera_link"><material>Gazebo/Grey</material></gazebo><!-- camera--><gazebo reference="camera_link"><sensor type="camera" name="rgb_camera"><update_rate>30.0</update_rate><camera name="rgb_camera"><horizontal_fov>1.4</horizontal_fov><image><width>640</width><height>480</height><format>R8G8B8</format></image><clip><near>0.02</near><far>300</far></clip></camera><plugin name="camera_controller" filename="libgazebo_ros_camera.so"><alwaysOn>true</alwaysOn><updateRate>0.0</updateRate><cameraName>rgb_camera</cameraName><imageTopicName>image_raw</imageTopicName><cameraInfoTopicName>camera_info</cameraInfoTopicName><frameName>camera_link</frameName><hackBaseline>0.0</hackBaseline><distortionK1>0.0</distortionK1><distortionK2>0.0</distortionK2><distortionK3>0.0</distortionK3><distortionT1>0.0</distortionT1><distortionT2>0.0</distortionT2></plugin></sensor></gazebo>
</robot>
讓我們討論一下此插件的一些屬性…
<gazebo reference="camera_link">
鏈接名稱“ camera_link”必須與我們添加到Xacro URDF的鏈接的名稱匹配。
<sensor type="camera" name="rgb_camera">
傳感器名稱“ rgb_camera”必須保證相對于其他傳感器名稱唯一。除了可以訪問的Gazebo插件內(nèi),此名稱在很多地方都沒有使用
<update_rate>30.0</update_rate>
gazebo內(nèi)每秒拍攝一次新相機(jī)圖像的次數(shù)。這是傳感器在仿真過程中將嘗試的最大更新速率,但是如果物理仿真的運(yùn)行速度快于傳感器生成的速度,則它可能會落后于該目標(biāo)速率。
<horizontal_fov>1.4</horizontal_fov><image><width>640</width><height>480</height><format>R8G8B8</format></image><clip><near>0.02</near><far>300</far></clip>
填寫這些值以匹配物理相機(jī)硬件上制造商的規(guī)格。要注意的一件事是,假定像素為正方形。
此外,遠(yuǎn)近剪輯是特定于模擬的參數(shù),它給出攝像機(jī)在模擬中可以看到物體的距離的上限和下限。這是在相機(jī)的視光框中指定的。
<plugin name="camera_controller" filename="libgazebo_ros_camera.so">
這是實際文件作為共享對象鏈接到的地方。gazebo_ros/gazebo_ros_camera.cpp
<cameraName>rgb_camera</cameraName><imageTopicName>image_raw</imageTopicName><cameraInfoTopicName>camera_info</cameraInfoTopicName>
在這里,我們?yōu)閳D像主題和照相機(jī)信息主題定義了照相機(jī)將發(fā)布到的rostopic。
對于arm1,我們用以下命令來訂閱:
/arm1/rgb_camera/image_raw
/arm1/rgb_camera/camera_info
<frameName>camera_link</frameName>
圖像的坐標(biāo)系被發(fā)布在 tf樹 下。
2.修改arm1.urdf.xacro文件
若將攝像機(jī)添加在urdf文件中,則需在arm1.urdf.xacro文件中添加以下內(nèi)容:
<!--camera_link--><link name="camera_link"><collision><origin xyz="1 0 0" rpy="0 0 0"/><geometry><!--mesh filename="package://arm1/meshes/camera.dae"/--><sphere radius="0.005"/></geometry></collision><visual><origin xyz="0 0 0" rpy="0 0 0"/><geometry><!--mesh filename="package://arm1/meshes/camera.dae"/--><sphere radius="0.005"/></geometry><material name="red"><color rgba="1.0 0 0 1.0"/></material></visual><inertial><mass value="1e-5" /><origin xyz="0 0.05 0" rpy="0 1.57 0"/><inertia ixx="1e-6" ixy="0" ixz="0" iyy="1e-6" iyz="0" izz="1e-6" /></inertial></link><!--camera_joint--><joint name="camera_joint" type="fixed"><axis xyz="0 0 0" /><origin xyz="-0.042 -0.035 -0.01" rpy="-1.57 -3.1415 0"/><parent link="link4"/><child link="camera_link"/></joint>
其中,
<geometry><!--mesh filename="package://arm1/meshes/camera.dae"/--><sphere radius="0.005"/></geometry>
我們定義了一個半徑為0.005m的球體當(dāng)作攝像頭,所以在標(biāo)簽中寫作<sphere radius="0.005"/>。除此之外,也可以使用模型<mesh filename="package://arm1/meshes/camera.dae"/>作為攝像頭,這里因為攝像頭尺寸問題,所以選擇使用球體作為攝像頭的模型。
將更改的文件保存后,我們就可以運(yùn)行g(shù)azebo來仿真了。
新建一個終端,輸入
$ killall gzserver
$ source ~/catkin_ws/devel/setup.bash
$ roslaunch arm1 gazebo.launch
其中killall gzserver作用為關(guān)閉所有g(shù)azebo服務(wù),可能是因為虛擬機(jī)的問題還是別的,gazebo總是出問題,所以最好每次運(yùn)行新的終端的時候輸入此命令來防止gazebo加載出錯。
若無意外,gazebo應(yīng)該打開如下圖,可以看到camera已經(jīng)成功加載出來了。
3.查看攝像頭圖像
要查看攝像機(jī)圖像流,可以使用命令rqt_image_view(在此處了解有關(guān)rqt和相關(guān)工具的更多信息)
$ rqt_image_view /rgb_camera/image_raw
打開如下視圖
為了方便測試攝像頭,可以選擇gazebo左上角的insert標(biāo)簽,插入某些模型,其效果如下
六、為模型添加夾爪(Gripper)
為了實現(xiàn)夾取操作,需要為我們的模型添加夾爪。
我還是選擇在solidworks 中來繪制模型。導(dǎo)出stl文件和更改urdf文件。
1.通過solidworks建立模型
首先在solidworks中建立模型,因為只是在gazebo中模擬,我就畫的比較簡陋了一點(diǎn)…
具體方法還是可以參照【從零開始的ROS四軸機(jī)械臂控制】(三),還是可以選擇導(dǎo)出urdf文件和具體模型。
夾爪由三個link組成,分別是gripper_base_link(后面稱之為gripper_link),right_finger_link(后面稱之為right_link)和left_finger_link(后面稱之為left_link),還有兩個joint,稱之為right_joint 和 left_joint。在之后導(dǎo)出urdf文件后,會導(dǎo)出三個link的stl文件。
因為我們在~/catkin_ws/src目錄下已經(jīng)有arm1的包了,所以現(xiàn)在需要做的是把夾爪添加到我們的模型中。個人感覺,其實不如一開始就把所有模型都建好,因為后期導(dǎo)入新的模型會出現(xiàn)很多的bug。
2.將夾爪添加進(jìn)gazebo
(1)模型導(dǎo)入
最簡單的一步,就是把新導(dǎo)出的三個stl文件拷貝進(jìn)meshes文件夾
(2)更改urdf文件夾
拷貝完模型,接下來就是更改urdf文件,和添加攝像頭類似,添加了各個joints,links還有controllers,并對相應(yīng)文件進(jìn)行了添加修改,更多的這里不再贅述。完全可以參考上面如何添加攝像頭。
部分添加的urdf文件如下所示:
...<!--gripper links--><!--gripper base--><linkname="gripper_link"><inertial><originxyz="-0.0066122 0.0073345 0.035"rpy="0 0 0" /><massvalue="0.0035" /><inertiaixx="1.2396E-07"ixy="-1.3634E-23"ixz="1.9573E-24"iyy="3.6458E-07"iyz="5.8326E-24"izz="4.7396E-07" /></inertial><visual><originxyz="0 0 0"rpy="0 0 0" /><geometry><meshfilename="package://arm1/meshes/gripper_Link.STL" /></geometry><materialname=""><colorrgba="1 1 1 1" /></material></visual><collision><originxyz="0 0 0"rpy="0 0 0" /><geometry><meshfilename="package://arm1/meshes/gripper_Link.STL" /></geometry></collision></link><joint name="joint_gripper"type="fixed"><originxyz="-0.045 -0.035 -0.01"rpy="0 1.57 -2.45" /><parentlink="link4" /><childlink="gripper_link" /></joint><!--gripper_right link and joint--><linkname="right_link"><inertial><originxyz="-0.0085551 0.004 0.024348"rpy="0 0 0" /><massvalue="0.0013847" /><inertiaixx="1.28810723367291E-06"ixy="-4.80571958593516E-08"ixz="-1.80536823271041E-09"iyy="1.3067705064679E-06"iyz="-1.51983137928678E-09"izz="5.58044990324735E-07" /></inertial><visual><originxyz="0 0 0"rpy="0 0 0" /><geometry><meshfilename="package://arm1/meshes/right_Link.STL" /></geometry><materialname=""><colorrgba="1 1 1 1" /></material></visual><collision><originxyz="0 0 0"rpy="0 0 0" /><geometry><meshfilename="package://arm1/meshes/right_Link.STL" /></geometry></collision></link><jointname="right_joint"type="revolute"><originxyz="0.0125 -0.004 0"rpy="-1.5708 0 0" /><parentlink="gripper_link" /><childlink="right_link" /><axisxyz="0 0 1" /><limitlower="-0.4"upper="0.4"effort="1.0"velocity="0.5" /></joint><!--gripper_left link and joint--><linkname="left_link"><inertial><originxyz="-0.0085551 -0.004 0.024348"rpy="0 0 0" /><massvalue="0.0013847" /><inertiaixx="1.28810723367291E-06"ixy="-4.80571958593516E-08"ixz="-1.80536823271041E-09"iyy="1.3067705064679E-06"iyz="-1.51983137928678E-09"izz="5.58044990324735E-07" /></inertial><visual><originxyz="0 0 0"rpy="0 0 0" /><geometry><meshfilename="package://arm1/meshes/left_Link.STL" /></geometry><materialname=""><colorrgba="1 1 1 1" /></material></visual><collision><originxyz="0 0 0"rpy="0 0 0" /><geometry><meshfilename="package://arm1/meshes/left_Link.STL" /></geometry></collision></link><jointname="left_joint"type="revolute"><originxyz="-0.0125 -0.004 0"rpy="-1.5708 0 0" /><parentlink="gripper_link" /><childlink="left_link" /><axisxyz="0 0 -1" /><limitlower="-0.4"upper="0.4"effort="1.0"velocity="0.5" /></joint><!--camera_link--><link name="camera_link">...
之所以不建議后來添加模型是因為joint位置問題,如果后來添加模型,需要對<joint>的<origin>標(biāo)簽經(jīng)行仔細(xì)修改。而如果直接使用solidworks就不用這么麻煩,而且還可以避免一定的模型抖動問題。
若添加無問題則如下圖所示,
添加進(jìn)幾個模型,執(zhí)行命令:
$ rqt_image_view /rgb_camera/image_raw
可以達(dá)到如下圖所示的效果
3.gazebo模型抖動解決辦法
我總共遇到了兩種情況的模型抖動,一是為pid參數(shù)設(shè)置,二是為旋轉(zhuǎn)慣量參數(shù)矩陣設(shè)置。這兩種情況都會造成模型的抖動,其它的情況沒有遇到過,等以后有機(jī)會遇到會再總結(jié)一次的。
①pid參數(shù)設(shè)置
在controllers.yaml文件中,記錄著各個控制器的pid參數(shù)
arm1:#list of controllersjoint_state_controller:type: joint_state_controller/JointStateControllerpublish_rate: 50joint1_position_controller:type: effort_controllers/JointPositionControllerjoint: joint1pid: {p: 1, i: 0.001, d: 0.002}joint2_position_controller:type: effort_controllers/JointPositionControllerjoint: joint2pid: {p: 1, i: 0.001, d: 0.002}...
pid參數(shù)的值過大會造成震蕩等問題,過小就會控制效果差。所以要選擇適合自己模型的pid參數(shù),才能達(dá)到最好的效果。那什么是最好的參數(shù)選擇呢?..這就是門很深的學(xué)問了,可以自行百度,或者自己多次嘗試更改…
②旋轉(zhuǎn)慣量參數(shù)矩陣
在arm1.urdf.xacro文件中,在link的<inertial>標(biāo)簽下,都有類似于如下的內(nèi)容
<inertiaixx="7.57454654701591E-08"ixy="2.28779573583169E-08"ixz="8.70361108935048E-14"iyy="1.66799537620888E-08"iyz="3.19929708005816E-14"izz="8.54396424256289E-08" />
3x3轉(zhuǎn)動慣量矩陣由慣量元素指定。因為它是對稱的,所以它只能由6個元素來表示
ixxixyixzixyiyyiyzixziyzizz\begin{matrix}ixx &ixy& ixz\\ ixy& iyy& iyz\\ ixz& iyz& izz\end{matrix} ixxixyixz?ixyiyyiyz?ixziyzizz?
還是那句話,選擇合適的轉(zhuǎn)動慣量矩陣的參數(shù)會減少模型的震動。
最終效果如下所示:
本部分代碼已上傳github,接下來的博客便是關(guān)于添加相關(guān)節(jié)點(diǎn)的了。
4.制作物塊sdf模型
我們需要幾個物塊作為夾取目標(biāo),所以一個比較好的方法就是直接使用gazebo建立sdf模型。我準(zhǔn)備制作兩種顏色20mm320mm^320mm3的立方體作為抓取目標(biāo)。
在打開的gazebo中選擇Edit–>Model Editor
插入一個立方體
更改相應(yīng)link,Visual,Collision
選擇ok進(jìn)行確認(rèn)。保存模型,將其插入到我們的機(jī)械臂世界中。效果如下圖所示。
總結(jié)
以上是生活随笔為你收集整理的【从零开始的ROS四轴机械臂控制】(三) - 为机械臂添加摄像头和夹爪、解决gazebo模型抖动、使用gazebo建立sdf模型的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【从零开始的ROS四轴机械臂控制】(二)
- 下一篇: 【从零开始的ROS四轴机械臂控制】(四)