ROS系統MoveIt玩轉雙臂機器人系列(一)--ROS機器人建模

 

注:本篇博文所有源碼下載地址爲:Git Repohtml

1. 下載到本地後解壓到當前文件夾而後運行:catkin_make 編譯。node

2. 源碼是在 Ubuntu14.04 + Indigo 環境下編寫。git

 

1、ROS系統的MoveIt模塊簡介github

  機器人操做系統ROS目前最受關注的兩個模塊是導航(Navigation)和機械臂控制(MoveIt!),其中,機械臂控制模塊(後面簡稱MoveIt)可讓用戶快速創建機械臂模型並實現機械臂的控制(包括建模、運動學求解、運動規劃、避障等),後續我將分幾篇博客分別介紹如何一步步使用MoveIt控制本身的機械臂,算是對之前的學習內容的記錄和分享。編程

  關於MoveIt最全面的講解能夠參考MoveIt官方網站,推薦你們多參考官方文檔和例程,這裏的博文系列權當簡介和入門。微信

  若是用幾個特色來歸納MoveIt,主要有:併發

  1. 它是屬於ROS系統的一部分,用於控制多關節機械臂;
  2. 提供了一系列成熟的插件和工具,能夠實現機械臂控制的快速配置;
  3. 封裝了大量API,方便用戶在MoveIt模塊上進行二次開發,進而作出更多有意思的應用。

  這裏借用官方經典圖例作簡單說明,以下如:ide

MoveIt結構圖工具

  上圖能夠看出:佈局

  1.MoveIt 的核心節點(node)爲move_group,外圍的幾個部分分別爲:ROS Param ServerRobot  ControllersRobot 3D SensorsUser InterfaceRobot Sensors,其中:

  • ROS Param Server:這部分載入的是用戶定義的模型文件(xacro或urdf)和一些配置文件。(重要)
  • Robot  Controllers:  這部分能夠看作是和真正的機器人部分(硬件控制接口)打交道的部分,即運動規劃的數據由此發給機器人驅動部分,後續會詳細講解。(重要)
  • Robot 3D Sensors:  這部分做用是載入RGB-D相機或激光雷達等得到的點雲數據用於機械手的抓取或避障等。
  • User Interface:         這部分是用戶接口,MoveIt提供一系列的API供用戶完成自定義的功能,這裏主要。(重要)
  • Robot Sensors:        這部分是接收機械臂的傳感器數據,而後預估出機器人的狀態併發布。

2、MoveIt的安裝(Ubuntu14.04,Indigo)

  首先確保你的Linux上正確安裝了ROS系統,安裝步驟參考:http://wiki.ros.org/indigo/Installation/Ubuntu。而後安裝moveit,若是不想挑戰源碼編譯,MoveIt能夠用apt-get快速安裝,只須要輸入:

$ sudo apt-get install ros-indigo-moveit-full

3、本系列博文所用雙臂機器人簡介

  本系列博文將以一個雙臂機器人爲例,詳細講解基於MoveIt的使用方法,我爲這個雙臂機器人取名爲:rob,並在Solidworks中簡單繪製了該機器人的三維模型,結構示意圖以下:

Rob結構示意圖

  Rob包含兩個手臂,左右對稱佈局,每一個手臂包含5個自由度,關節狀況以下圖所示。

關節分佈狀況示意圖

  這種關節分佈是仿人形的雙臂機器人經常使用的手臂設置形式,但這種結構並不能徹底覆蓋人手臂全部的自由度(人的手臂包含7個自由度),但用於說明 MoveIt 的使用已經足夠了。此外,各個關節的自由度範圍以下表所示。

關節 肩關節先後轉動(左) 肩關節左右轉動(左) 肩關節軸向轉動(左) 肘關節先後轉動(左) 腕關節軸向轉動(左) 肩關節先後轉動(右) 肩關節左右轉動(右) 肩關節軸向轉動(右) 肘關節先後轉動(右) 腕關節軸向轉動(右)
範圍(度°) -25~175 0~60 -80~80 0~90 -80~80 -25~175 0~60 -80~80 0~90 -80~80

 

4、機器人的ROS模型創建

   這個系列主要介紹機器人ROS模型的創建方法,ROS系統帶來的好處之一就是:咱們無需本身創建複雜的數學模型來描述本身的機器人幾何尺寸、運動學和動力學等,只須要用它提供的模型描述方法便可實現快速建模。

  ROS系統的模型描述方法主要有兩種格式: URDF 和 XACRO。

  • URDF:用於描述一些簡單的機器人模型,參考官網:URDF官方介紹(初學者必定要精讀這些文檔)。
  • XACRO: 應用更廣泛的機器人模型描述文件,參考官網:xacro,它有以下幾個特色:   

    1. 語法簡練。採用編程話的腳本語言格式,能夠定義變量、常量、引入數學表達式等,極易上手。

    2. 方便複用。它能夠進行一系列的宏定義,而且能夠包含其餘.xacro文件。

  下面,開始用xacro文件創建Rob的機器人模型,完整的源代碼能夠在:git上獲取(git建模源碼),下文會截取一部分代碼作簡要說明。

1. 第一部分是文件的頭和一些宏定義,robot name咱們能夠本身隨便定義,而後分別給出了幾組顏色和常數的定義,最後給出了關節傳動部分的宏定義。

<?xml version="1.0"?>
<robot name="rob_robot" xmlns:xacro="http://ros.org/wiki/xacro">

<!-- Include materials -->
    <material name="Black">
        <color rgba="0.0 0.0 0.0 1.0"/>
    </material>

    <material name="White">
        <color rgba="1.0 1.0 1.0 1.0"/>
    </material>

   常量的定義方法以下,在引用這裏定義的常量的時候,用${XX},例如在若是在下面的代碼中想引用M_PI,只須要用:${M_PI} 便可。

<!-- Constants -->
   <property name="deg_to_rad" value="0.01745329251994329577"/> <property name="M_PI" value="3.14159"/>

  關節的傳動參數宏定義方法以下,xacro:macro name 定義了本宏的名稱,這個名稱由用戶定義,後續引用該宏的時候就是根據名字來的,具體如何操做參考下文介紹或git上的源代碼,注意,這裏宏定義內部的一些具體數值僅爲說明而存在,具體的機器人關節應該是不同的。

<!-- transmission block macro definition -->
    <xacro:macro name="transmission_block" params="joint_name">
      <transmission name="tran1">
        <type>transmission_interface/SimpleTransmission</type>
        <joint name="${joint_name}">
          <hardwareInterface>PositionJointInterface</hardwareInterface>
        </joint>
        <actuator name="motor1">
          <hardwareInterface>PositionJointInterface</hardwareInterface>
          <mechanicalReduction>1</mechanicalReduction>
        </actuator>
      </transmission>
    </xacro:macro>

2,base_link的定義。

  base_link是全部的其餘關節的基礎,也就是基座標系所在的link,這裏他的幾何圖形咱們直接引用他的dae文件,至於如何用Solidworks繪製模型而後製做成dae文件,後續找機會專門寫一篇博客進行介紹,下面的gazebo句段是爲了咱們的模型在gazebo環境中仿真用的,注意,base_link 只是定義了「機械臂的基座」 它自己是不包含 joint 的。

<!-- BASE LINK AND -->
  <link name="base_link">
      <visual>
            <!-- <origin xyz="-0.22 -0.15 0.00" rpy="0 0 0" />  -->
          <origin xyz="0.1 -0.11 0.13" rpy="0 0 1.570796" /> 
            <geometry>
                <mesh filename="package://rob_description/meshes/body_link_humanoid.dae"/>
            </geometry>
              <material name="green" />
      </visual>

      <collision>
            <origin xyz="0.0 0.0 0.0" rpy="0 0 0" /> <!--  -->
            <geometry>
                  <mesh filename="package://rob_description/meshes/body_link_humanoid.dae"/>
            </geometry>
    </collision>
  </link>

  <gazebo reference="base_link">
    <material>Gazebo/green</material>
  </gazebo>

3.  其餘關節的定義。

   至於其餘關節的定義,一個 Link 就對應一個 Joint ,示例以下,這裏定義的是 l_shoulder_joint  和 l_shoulder_link。在Joint 的定義中,有一個limit 的程序段,這裏規定的是關節的力限制、速度限制和關節運動範圍限制,速度限制的單位是m/s(移動關節)或rad/s(轉動關節),詳細的說面看:這裏

  代碼中間: <xacro: ...../> 就是引用上文中咱們定義的關於傳動參數的宏定義。

   若是在xacro 代碼中想用數學表達式,使用的格式是:${ 數學表達式 } ,以下面代碼中所示。

  其他關節的定義詳見源代碼。

<!-- left shoulder link and joint -->
  <joint name="l_shoulder_joint" type="revolute">  
    <parent link="base_link"/>
    <child link="l_shoulder_link"/>
    <origin xyz="0 0.11 0.74" rpy="0 0 3.14159" />
    <axis xyz="0 1 0" />
    <limit effort="300" velocity="${0.2*0.6981}" lower="-0.43633" upper="3.0543"/><!-- (-25  +175)=(-25 175) -->
    <!-- velocity: m/s for prismatic, rad/s for revolute -->
    <dynamics damping="50" friction="1"/>
  </joint>
 
 <xacro:transmission_block joint_name="l_shoulder_joint"/> 

  <link name="l_shoulder_link">
      <visual>
            <origin xyz="-0.04 0.02 0.04" rpy="1.5708 1.5708 0" /> 
            <geometry>
                <mesh filename="package://rob_description/meshes/l_shoulder_link.dae"/>
            </geometry>
              <material name="green" />
      </visual>

      <collision>
            <origin xyz="-0.04 0.02 0.04" rpy="1.5708 1.5708 0" />
            <geometry>
                <mesh filename="package://rob_description/meshes/l_shoulder_link.dae"/>
            </geometry>
        </collision>>
    <xacro:inertial_matrix mass="1"/>
  </link>

  <gazebo reference="l_shoulder_link">
    <material>Gazebo/green</material>
  </gazebo>

4. 將 XACRO文件轉換成 URDF 文件 並檢查。

   轉換的方法很簡單,ROS封裝了實現方法,咱們只需進入xacro 所在的文件夾,而後鍵入以下命令便可:

rosrun xacro xacro.py rob.xacro > rob.urdf

  爲了檢驗咱們的模型的準確性,咱們進行簡單的檢查,在同一個目錄下輸入:

check_urdf rob.urdf

便可獲得以下圖顯示,能夠看到雙臂的關節連接狀況。

   爲了更直觀的觀看關節連接狀況,咱們在同一個目錄下輸入下面這行命令,就會獲得 rob_robot.gv 和 file rob_robot.pdf  兩個文件,打開後者以下圖所示。

urdf_to_graphiz rob.urdf

 5. 在RViz中觀看模型。

  編寫 launch 文件,取名: description.launch ,內容以下:

<launch>
    <arg name="model" />

    <!-- Parsing xacro and setting robot_description parameter -->
    <param name="robot_description" command="$(find xacro)/xacro.py $(find rob_description)/urdf/rob.xacro"/>

    <!-- Setting gui parameter to true for display joint slider -->
    <param name="use_gui" value="true"/>

    <!-- Starting Joint state publisher node which will publish the joint values -->
    <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" />

    <!-- Starting robot state publish which will publish tf -->
    <node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher" />

    <!-- Launch visualization in rviz -->
    <node name="rviz" pkg="rviz" type="rviz" args="-d $(find rob_description)/urdf/urdf.rviz" required="true" />
</launch>

輸入命令:

roslaunch rob_description description.launch

獲得:

  轉動每一個關節,檢查無誤後,模型創建完成,下一篇經介紹如何使用 MoveIt 控制 Rob 機器人。

6. Tips 建模常見錯誤

  問題1:若是在查看模型時發現錯誤提示:No transform from [xxxx] to [base_link]

       解決辦法:出現這個錯誤首先要懷疑是你的xacro描述文件編寫的格式出現了錯誤,如頭部多了空格、中間關鍵字拼寫錯誤等,建議耐下心來逐行逐句檢查語法。

   問題2: 源碼中和xacro文件同一目錄的 urdf.rviz 文件是什麼做用?

  答:全部的  .rviz 文件都是 Rviz 的配置文件,這裏咱們在launch 文件中制定了他的配置文件,若是不指定Rviz 啓動時會讀取默認的配置文件,用戶能夠根據需求啓動Rviz後在左上角工具欄上保存本身滿意的配置文件。

 

  <-- 本篇完 -->

 

歡迎留言、私信、郵箱、微信等任何形式的技術交流。

做者信息:

名稱:Shawn

郵箱:zhanggx0102@163.com

微信二維碼:↓

          

相關文章
相關標籤/搜索