ROS學習之URDF

URDFhtml

爲了製做咱們的模擬器,首先咱們得了解下什麼是URDF編程

什麼是URDF? Unified Robot Description Format——統一機器人描述格式。總以爲這和Sensor支持纔是ROS的精華所在,通訊frameworks的並不見得出彩。框架

可能大部分讀者都像我這樣窮<bi~背景聲>沒錢買ROS支持的機器人,不過ROS仍是很Nice的考慮到了這一羣體,提供了模擬器支持。(明明是爲了更快速的軟件開發,喂!)工具

本想從ROS網站的培訓教程開始http://wiki.ros.org/urdf/Tutorials開始的,不過本着實踐爲本的目的,咱們仍是以《Learning ROS for Robostic Programming》爲基礎吧。網站

 

參考文獻spa

1. ROS urdf教程:http://wiki.ros.org/urdf/Tutorials.net

2. 《Learning ROS for Robostic Programming》設計

 

準備工做orm

安裝urdf_tutorial包xml

[plain] view plain copy
  1. sudo apt-get install ros-hydro-urdf-tutorial  

執行

[plain] view plain copy
  1. rosrun rviz rviz  

固然,沒有運行roscore你的rviz也沒法啓動。不過若是錯誤顯示你的rviz找不到執行文件的話,請參照http://wiki.ros.org/rviz

URDF基本語法

統一機器人描述格式URDF,其實就是爲了可以抽象描述一個機器人的硬件。並且URDF是基於XML的,因此閱讀起來應該很是容易。

筆者覺得要理解URDF用自頂向下的方式更快。即從爲了解決一個怎樣的問題開始。在這裏咱們先用一個簡單場景熟悉一下會用到的工具。

不得不說小車是最簡單實用的機器人, 一個車身加四個輪子就組成了最基本的小車結構,並且具有必定載重能力的小車也不會太貴。

見以下圖片。

(圖一)

 

初版

在URDF語言中,機器人都會由各個部件(Link)經過關節(Joint)鏈接而成。而這裏的關鍵就是描述部件和關節之間的關係。

在這個簡單的小車模型中,一共有5個部件: 車身 + 4個輪子。 4個關節: 每一個輪子一個。

因而,咱們獲得了最初了URDF版本 01_car_skeleton.urdf

[html] view plain copy
  1. <robot name="test_robot">  
  2.   <link name="base_link" />  
  3.   <link name="wheel_1" />  
  4.   <link name="wheel_2" />  
  5.   <link name="wheel_3" />  
  6.   <link name="wheel_4" />  
  7.   
  8.   
  9.   <joint name="joint_base_wheel1" type="fixed">  
  10.     <parent link="base_link"/>  
  11.     <child link="wheel_1"/>  
  12.   </joint>  
  13.   
  14.   
  15.   <joint name="joint_base_wheel2" type="fixed">  
  16.     <parent link="base_link"/>  
  17.     <child link="wheel_2"/>  
  18.   </joint>  
  19.   
  20.   
  21.   <joint name="joint_base_wheel3" type="fixed">  
  22.     <parent link="base_link"/>  
  23.     <child link="wheel_3"/>  
  24.   </joint>  
  25.   
  26.   
  27.   <joint name="joint_base_wheel4" type="fixed">  
  28.     <parent link="base_link"/>  
  29.     <child link="wheel_4"/>  
  30.   </joint>  
  31. </robot>  

 

很簡單對吧?

用<link> tag描述各個部件,<joint> tag描述各個關節。用<parent>和<child>描述關節鏈接的部件。

只要描述了Link和Joint之間的關係,咱們很容易就能構建機器人的框架。

咱們能夠用以下命令來檢查urdf文件是否有語法問題。

[plain] view plain copy
  1. check_urdf 01_skeleton.urdf  

只要獲得以下結果就代表語法沒問題。

[html] view plain copy
  1. robot name is: test_robot  
  2. ---------- Successfully Parsed XML ---------------  
  3. root Link: base_link has 4 child(ren)  
  4.     child(1):  wheel_1  
  5.     child(2):  wheel_2  
  6.     child(3):  wheel_3  
  7.     child(4):  wheel_4  

但請注意這雖然描述了各個部件之間的關係,但還是一個不完整的URDF,沒法在模擬器中顯示。

第二版

<visual>tag用來描述模塊的視覺效果。

<geometry>tag 用來描述模塊的形狀和大小。

<origin>tag用來描述模塊的位置。

加上模塊大小以後的小車文件以下所示。02_visual.urdf

[html] view plain copy
  1. <robot name="test_robot">  
  2.   <link name="base_link">  
  3.     <visual>  
  4.        <geometry>  
  5.          <box size="0.2 .3 .1"/>  
  6.        </geometry>  
  7.        <origin rpy="0 0 0" xyz="0 0 0.05"/>  
  8.     </visual>  
  9.   </link>  
  10.   
  11.   <link name="wheel_1">  
  12.     <visual>  
  13.       <geometry>  
  14.         <cylinder length="0.05" radius="0.05"/>  
  15.       </geometry>  
  16.       <origin rpy="0 1.5 0" xyz="0.1 0.1 0"/>  
  17.     </visual>  
  18.   </link>  
  19.   
  20.   <link name="wheel_2">  
  21.     <visual>  
  22.       <geometry>  
  23.         <cylinder length="0.05" radius="0.05"/>  
  24.       </geometry>  
  25.       <origin rpy="0 1.5 0" xyz="-0.1 0.1 0"/>  
  26.     </visual>  
  27.   </link>  
  28.   
  29.   <link name="wheel_3">  
  30.     <visual>  
  31.       <geometry>  
  32.         <cylinder length="0.05" radius="0.05"/>  
  33.       </geometry>  
  34.       <origin rpy="0 1.5 0" xyz="0.1 -0.1 0"/>  
  35.     </visual>  
  36.   </link>  
  37.   
  38.   <link name="wheel_4">  
  39.     <visual>  
  40.       <geometry>  
  41.         <cylinder length="0.05" radius="0.05"/>  
  42.       </geometry>  
  43.       <origin rpy="0 1.5 0" xyz="-0.1 -0.1 0"/>  
  44.     </visual>  
  45.   </link>  
  46.   
  47.   <joint name="joint_base_wheel1" type="fixed">  
  48.     <parent link="base_link"/>  
  49.     <child link="wheel_1"/>  
  50.   </joint>  
  51.   
  52.   <joint name="joint_base_wheel2" type="fixed">  
  53.     <parent link="base_link"/>  
  54.     <child link="wheel_2"/>  
  55.   </joint>  
  56.   
  57.   <joint name="joint_base_wheel3" type="fixed">  
  58.     <parent link="base_link"/>  
  59.     <child link="wheel_3"/>  
  60.   </joint>  
  61.   
  62.   <joint name="joint_base_wheel4" type="fixed">  
  63.     <parent link="base_link"/>  
  64.     <child link="wheel_4"/>  
  65.   </joint>  
  66. </robot>  


如今經過以下命令,你就經過rviz查看你的小車模型啦。

[html] view plain copy
  1. roslaunch urdf_tutorial display.launch model:=02_visual.urdf  

 

 

第三步: 上色

Mmm,咱們的小車就快完成了,但全是紅色總以爲怪怪的並且很難辨認。

不過上色一樣很簡單。使用<material> tag而且設置<color> tag

咱們獲得第三個版本:03_color.urdf

[html] view plain copy
  1. <robot name="test_robot">  
  2.   <link name="base_link">  
  3.     <visual>  
  4.        <geometry>  
  5.          <box size="0.2 .3 .1"/>  
  6.        </geometry>  
  7.        <origin rpy="0 0 0" xyz="0 0 0.05"/>  
  8.        <material name="white">  
  9.          <color rgba="1 1 1 1"/>  
  10.        </material>  
  11.     </visual>  
  12.   </link>  
  13.   
  14.   <link name="wheel_1">  
  15.     <visual>  
  16.       <geometry>  
  17.         <cylinder length="0.05" radius="0.05"/>  
  18.       </geometry>  
  19.       <origin rpy="0 1.5 0" xyz="0.1 0.1 0"/>  
  20.       <material name="black">  
  21.         <color rgba="0 0 0 1"/>  
  22.       </material>  
  23.     </visual>  
  24.   </link>  
  25.   
  26.   <link name="wheel_2">  
  27.     <visual>  
  28.       <geometry>  
  29.         <cylinder length="0.05" radius="0.05"/>  
  30.       </geometry>  
  31.       <origin rpy="0 1.5 0" xyz="-0.1 0.1 0"/>  
  32.       <material name="black"/>  
  33.     </visual>  
  34.   </link>  
  35.   
  36.   <link name="wheel_3">  
  37.     <visual>  
  38.       <geometry>  
  39.         <cylinder length="0.05" radius="0.05"/>  
  40.       </geometry>  
  41.       <origin rpy="0 1.5 0" xyz="0.1 -0.1 0"/>  
  42.       <material name="black"/>  
  43.     </visual>  
  44.   </link>  
  45.   
  46.   <link name="wheel_4">  
  47.     <visual>  
  48.       <geometry>  
  49.         <cylinder length="0.05" radius="0.05"/>  
  50.       </geometry>  
  51.       <origin rpy="0 1.5 0" xyz="-0.1 -0.1 0"/>  
  52.       <material name="black"/>  
  53.     </visual>  
  54.   </link>  
  55.   
  56.   <joint name="joint_base_wheel1" type="fixed">  
  57.     <parent link="base_link"/>  
  58.     <child link="wheel_1"/>  
  59.   </joint>  
  60.   
  61.   <joint name="joint_base_wheel2" type="fixed">  
  62.     <parent link="base_link"/>  
  63.     <child link="wheel_2"/>  
  64.   </joint>  
  65.   
  66.   <joint name="joint_base_wheel3" type="fixed">  
  67.     <parent link="base_link"/>  
  68.     <child link="wheel_3"/>  
  69.   </joint>  
  70.   
  71.   <joint name="joint_base_wheel4" type="fixed">  
  72.     <parent link="base_link"/>  
  73.     <child link="wheel_4"/>  
  74.   </joint>  
  75. </robot>  



咱們能夠看到rviz的結果,如圖一所示。

這下咱們差很少完成了。咱們立刻就能夠移動咱們的小車啦。

可是等等,在咱們的URDF文件中,內嵌了關於各個部件的大小參數以及位置。這些固然是咱們根據草圖用計算器算出來的。

可是這樣的擴展性也太差了吧?難道對每一個模型咱們都得這麼計算嗎?對於相同模型的不一樣尺寸咱們還得從新計算一次?

 

第四步: Xacro

什麼是Xacro? 咱們能夠把它理解成爲針對URDF的擴展性和配置性而設計的宏語言(macro language)。

有了Xacro,咱們就能夠像編程同樣來寫URDF文件了。

首先咱們來看Xacro文件的變量定義:

[html] view plain copy
  1. <xacro:property name="body_width" value=".2" />  

只要定義了body_width,咱們就能夠經過${body_width}來引用其值了。有了這個,至少咱們能夠把須要配置的變量進行統一管理。

其次,咱們來看一下Xacro如何進行宏定義。

這裏的宏和C語言的宏很像,在轉換成URDF文件時編譯器會將其展開。其基本語法爲:

[html] view plain copy
  1. <xacro:macro name="wheel" params="param1 param2">  
  2. </xacro:macro>  


咱們來看下URDF文件中關於車身和車輪的大小描述。

<box size="0.2 .3 .1"/>

<origin rpy="0 0 0" xyz="0 0 0.05"/>

<cylinder length="0.05" radius="0.05"/>

<origin rpy="0 1.5 0" xyz="-0.1 0.1 0"/>

這裏涉及到的參數有:

車身的大小(body_size),車身中心的位置(body_pos)。

車輪半徑(wheel_radius)和輪胎寬度(wheel_width),車輪圓心的位置(wheel1_pos, wheel2_pos, wheel3_pos, wheel4_pos)。

相應的在Xacro中定義參數的語法爲:

[html] view plain copy
  1.   <xacro:property name="body_size" value=".2 .3 .1" />  
  2.   <xacro:property name="body_pos" value="0 0 0.05" />  
  3.   <xacro:property name="wheel_radius" value="0.05" />  
  4.   <xacro:property name="wheel_length" value="0.05" />  
  5.   <xacro:property name="wheel1_pos" value="0.1 0.1 0" />  
  6.   <xacro:property name="wheel2_pos" value="-0.1 0.1 0" />  
  7.   <xacro:property name="wheel3_pos" value="0.1 -0.1 0" />  
  8.   <xacro:property name="wheel4_pos" value="-0.1 -0.1 0" />  

而且每一個輪子和鏈接的代碼也基本相同。

基於上述亮點,咱們能夠獲得如下xacro文件。04_xacro.xacro

[html] view plain copy
  1. <?xml version="1.0"?>  
  2. <robot xmlns:sensor="http://playerstage.sourceforge.net/gazebo/xmlschema/#sensor"  
  3.          xmlns:controller="http://playerstage.sourceforge.net/gazebo/xmlschema/#controller"  
  4.          xmlns:interface="http://playerstage.sourceforge.net/gazebo/xmlschema/#interface"  
  5.          xmlns:xacro="http://playerstage.sourceforge.net/gazebo/xmlschema/#interface" name="test_robot">  
  6.   
  7.   <xacro:property name="body_size" value=".2 .3 .1" />  
  8.   <xacro:property name="body_pos" value="0 0 0.05" />  
  9.   <xacro:property name="wheel_radius" value="0.05" />  
  10.   <xacro:property name="wheel_length" value="0.05" />  
  11.   <xacro:property name="wheel1_pos" value="0.1 0.1 0" />  
  12.   <xacro:property name="wheel2_pos" value="-0.1 0.1 0" />  
  13.   <xacro:property name="wheel3_pos" value="0.1 -0.1 0" />  
  14.   <xacro:property name="wheel4_pos" value="-0.1 -0.1 0" />  
  15.   
  16.   <xacro:macro name="wheel" params="wheelname position">  
  17.     <link name="${wheelname}">  
  18.       <visual>  
  19.         <geometry>  
  20.           <cylinder length="${wheel_length}" radius="${wheel_radius}"/>  
  21.         </geometry>  
  22.         <origin rpy="0 1.5 0" xyz="${position}"/>  
  23.         <material name="black">  
  24.           <color rgba="0 0 0 1"/>  
  25.         </material>  
  26.       </visual>  
  27.     </link>  
  28.   
  29.     <joint name="joint_base_${wheelname}" type="fixed">  
  30.       <parent link="base_link"/>  
  31.       <child link="${wheelname}"/>  
  32.     </joint>  
  33.   </xacro:macro>  
  34.   <xacro:wheel wheelname="wheel1" position="${wheel1_pos}"/>  
  35.   <xacro:wheel wheelname="wheel2" position="${wheel2_pos}"/>  
  36.   <xacro:wheel wheelname="wheel3" position="${wheel3_pos}"/>  
  37.   <xacro:wheel wheelname="wheel4" position="${wheel4_pos}"/>  
  38.   
  39.   <link name="base_link">  
  40.     <visual>  
  41.        <geometry>  
  42.          <box size="${body_size}"/>  
  43.        </geometry>  
  44.        <origin rpy="0 0 0" xyz="${body_pos}"/>  
  45.        <material name="white">  
  46.          <color rgba="1 1 1 1"/>  
  47.        </material>  
  48.     </visual>  
  49.   </link>  
  50. </robot>  


驗證該文件的正確性能夠有兩種方法。

1. 轉換成URDF文件,使用check_urdf

[html] view plain copy
  1. rosrun xacro xacro.py 04_xacro.xacro > 04_xacro.urdf  


2. 使用xacrodisplay.launch

[html] view plain copy
  1. roslaunch urdf_tutorial xacrodisplay.launch model:=04_xacro.xacro  

咱們都會獲得和圖1同樣的小車模型。這下咱們就能夠用Xacro來構建機器人模型了。

相關文章
相關標籤/搜索