日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

【从零开始的ROS四轴机械臂控制】(三) - 为机械臂添加摄像头和夹爪、解决gazebo模型抖动、使用gazebo建立sdf模型

發(fā)布時間:2023/11/27 生活经验 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【从零开始的ROS四轴机械臂控制】(三) - 为机械臂添加摄像头和夹爪、解决gazebo模型抖动、使用gazebo建立sdf模型 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

【從零開始的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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。