注:本篇博文所有源碼下載地址爲:Git Repo。html
1. 下載到本地後解壓到當前文件夾而後運行:catkin_make 編譯。node
2. 源碼是在 Ubuntu14.04 + Indigo 環境下編寫。git
1、ROS系統的MoveIt模塊簡介github
機器人操做系統ROS目前最受關注的兩個模塊是導航(Navigation)和機械臂控制(MoveIt!),其中,機械臂控制模塊(後面簡稱MoveIt)可讓用戶快速創建機械臂模型並實現機械臂的控制(包括建模、運動學求解、運動規劃、避障等),後續我將分幾篇博客分別介紹如何一步步使用MoveIt控制本身的機械臂,算是對之前的學習內容的記錄和分享。編程
關於MoveIt最全面的講解能夠參考MoveIt官方網站,推薦你們多參考官方文檔和例程,這裏的博文系列權當簡介和入門。微信
若是用幾個特色來歸納MoveIt,主要有:併發
這裏借用官方經典圖例作簡單說明,以下如:ide
MoveIt結構圖工具
上圖能夠看出:佈局
1.MoveIt 的核心節點(node)爲move_group,外圍的幾個部分分別爲:ROS Param Server, Robot Controllers, Robot 3D Sensors, User Interface, 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。
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
微信二維碼:↓