由浅到深理解ROS(7)-URDF
轉自
?
相信許多愛好者止步于昂貴的機器人價格。雖然有了Arduino,但一個載重能力很弱的機器人小車成本也得一兩百塊錢。搭建自己的機器人更是費時費力。
所以如果你只是普通機器人愛好者,或者還沒想好要拿機器人做什么,那我們還是從模擬器開始吧……
?
URDF
為了制作我們的模擬器,首先我們得了解下什么是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》為基礎吧。
?
參考文獻
1. ROS urdf教程:http://wiki.ros.org/urdf/Tutorials
2. 《Learning ROS for Robostic Programming》
?
準備工作
安裝urdf_tutorial包
?
[plain]?view plain?copy
?
執行
?
[plain]?view plain?copy
?
?
當然,沒有運行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
?
?
?
很簡單對吧?
用<link> tag描述各個部件,<joint> tag描述各個關節。用<parent>和<child>描述關節連接的部件。
只要描述了Link和Joint之間的關系,我們很容易就能構建機器人的框架。
我們可以用如下命令來檢查urdf文件是否有語法問題。
?
[plain]?view plain?copy
?
?
只要得到如下結果就表明語法沒問題。
?
[html]?view plain?copy
?
但請注意這雖然描述了各個部件之間的關系,但仍是一個不完整的URDF,無法在模擬器中顯示。
?
?
第二版
<visual>tag用來描述模塊的視覺效果。
<geometry>tag 用來描述模塊的形狀和大小。
<origin>tag用來描述模塊的位置。
加上模塊大小之后的小車文件如下所示。02_visual.urdf
?
[html]?view plain?copy
?
現在通過如下命令,你就通過rviz查看你的小車模型啦。
?
?
[html]?view plain?copy
?
?
?
?
第三步: 上色
Mmm,我們的小車就快完成了,但全是紅色總覺得怪怪的而且很難辨認。
不過上色同樣很簡單。使用<material> tag并且設置<color> tag
我們得到第三個版本:03_color.urdf
?
[html]?view plain?copy
?
?
我們可以看到rviz的結果,如圖一所示。
這下我們差不多完成了。我們馬上就可以移動我們的小車啦。
但是等等,在我們的URDF文件中,內嵌了關于各個部件的大小參數以及位置。這些當然是我們根據草圖用計算器算出來的。
但是這樣的擴展性也太差了吧?難道對每個模型我們都得這么計算嗎?對于相同模型的不同尺寸我們還得重新計算一次?
?
第四步: Xacro
什么是Xacro? 我們可以把它理解成為針對URDF的擴展性和配置性而設計的宏語言(macro language)。
有了Xacro,我們就可以像編程一樣來寫URDF文件了。
首先我們來看Xacro文件的變量定義:
?
[html]?view plain?copy
?
只要定義了body_width,我們就可以通過${body_width}來引用其值了。有了這個,至少我們可以把需要配置的變量進行統一管理。
?
其次,我們來看一下Xacro如何進行宏定義。
這里的宏和C語言的宏很像,在轉換成URDF文件時編譯器會將其展開。其基本語法為:
?
[html]?view plain?copy
?
我們來看下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
?
?
并且每個輪子和連接的代碼也基本相同。
基于上述亮點,我們可以得到以下xacro文件。04_xacro.xacro
?
[html]?view plain?copy
?
驗證該文件的正確性可以有兩種方法。
?
1. 轉換成URDF文件,使用check_urdf
?
[html]?view plain?copy
?
2. 使用xacrodisplay.launch
?
?
[html]?view plain?copy
?
我們都會得到和圖1一樣的小車模型。這下我們就可以用Xacro來構建機器人模型了。
?
總結
以上是生活随笔為你收集整理的由浅到深理解ROS(7)-URDF的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 男子吃野菇拿银镯试毒进医院 网友:是镯
- 下一篇: 1000并发 MySQL数据库_再送一波