本文介紹如何在ROS中使用urdf創(chuàng)建機器人3D模型谴垫。
準(zhǔn)備工作
移動機器人小車3D模型的構(gòu)建
- 介紹
- 創(chuàng)建硬件描述包
- 繪制機器人小車模型
- 建立urdf文件
- 建立launch文件命令
- 效果展示
1. 介紹
機器人的3D模型在ROS中是通過URDF文件實現(xiàn),URDF(Unified Robot Description Format)就是描述機器人硬件尺寸布局的模型語言起惕。它是同ROS通信的渠道盛嘿,通過機器人的物理尺寸來配置機器人模型,ROS就可以有效的進(jìn)行自主導(dǎo)航(Navagation)和碰撞檢測(collision detect)了。
2. 創(chuàng)建硬件描述包
在ROS中熄求,所有的ROS軟件(包括我們創(chuàng)建的軟件)都被組織成軟件包的形式。因此逗概,在工作空間catkin_ws/src/目錄下通過catkin_create_pkg來創(chuàng)建硬件描述包:
$ catkin_create_pkg autolabor_description urdf
通過catkin_create_pkg創(chuàng)建了一個autolabor_description的包弟晚,該命令的最后一個參數(shù)是引入urdf庫。
ROS中創(chuàng)建包詳情請參考:http://wiki.ros.org/ROS/Tutorials/CreatingPackage
在新建的包中創(chuàng)建 urdf 和 launch 文件夾用于存儲 *.urdf 和 *.launch 文件逾苫∏涑牵可以在catkin_ws/src/目錄下看到:
3. 繪制機器人小車的3D模型
(當(dāng)然,這一步并不是必要的铅搓,你也可以通過配置urdf文件來得到小車的模型瑟押,詳情參考第四步)
通過機器人小車的物理參數(shù),使用3D制圖軟件繪制機器人小車的3D模型
在autolabor_description包的目錄下狸吞,新建meshes文件夾勉耀,將繪制的3D模型復(fù)制到在路徑下
4. 建立urdf文件
在urdf文件夾下創(chuàng)建文件 autolabor_description.urdf文件指煎,并將下列代碼放在 autolabor_description.urdf文件中
如果繪制了3D模型,建立urdf文件
<robot name="autolabor_description">
<link name="base_link">
<inertial>
<origin
xyz="0. 0. 0."
rpy="0. 0. 0." />
<mass
value="0.251988675650349" />
<inertia
ixx="0.000595579869264794"
ixy="5.99238175321912E-08"
ixz="-1.98242615307314E-08"
iyy="0.00102462329604677"
iyz="-1.73115625503396E-05"
izz="0.00060561972360446" />
</inertial>
<visual>
<origin
xyz="0. 0. 0.05"
rpy="1.57 0. 1.57" />
<geometry>
<mesh
filename="package://autolabor_description/meshes/base_link.stl" />
</geometry>
<material
name="">
<color
rgba="0.792156862745098 0.819607843137255 0.933333333333333 1" />
</material>
</visual>
</link>
</robot>
如果未繪制3D模型便斥,通過配置urdf來得到模型至壤,這里僅展示一個簡單的example
<?xml version="1.0"?>
<robot name="smartcar">
<link name="base_link">
<visual>
<geometry>
<box size="0.25 .16 .05"/>
</geometry>
<origin rpy="0 0 1.57075" xyz="0 0 0"/>
<material name="blue">
<color rgba="0 0 .8 1"/>
</material>
</visual>
</link>
<link name="right_front_wheel">
<visual>
<geometry>
<cylinder length=".02" radius="0.025"/>
</geometry>
<material name="black">
<color rgba="0 0 0 1"/>
</material>
</visual>
</link>
<joint name="right_front_wheel_joint" type="continuous">
<axis xyz="0 0 1"/>
<parent link="base_link"/>
<child link="right_front_wheel"/>
<origin rpy="0 1.57075 0" xyz="0.08 0.1 -0.03"/>
<limit effort="100" velocity="100"/>
<joint_properties damping="0.0" friction="0.0"/>
</joint>
<link name="right_back_wheel">
<visual>
<geometry>
<cylinder length=".02" radius="0.025"/>
</geometry>
<material name="black">
<color rgba="0 0 0 1"/>
</material>
</visual>
</link>
<joint name="right_back_wheel_joint" type="continuous">
<axis xyz="0 0 1"/>
<parent link="base_link"/>
<child link="right_back_wheel"/>
<origin rpy="0 1.57075 0" xyz="0.08 -0.1 -0.03"/>
<limit effort="100" velocity="100"/>
<joint_properties damping="0.0" friction="0.0"/>
</joint>
<link name="left_front_wheel">
<visual>
<geometry>
<cylinder length=".02" radius="0.025"/>
</geometry>
<material name="black">
<color rgba="0 0 0 1"/>
</material>
</visual>
</link>
<joint name="left_front_wheel_joint" type="continuous">
<axis xyz="0 0 1"/>
<parent link="base_link"/>
<child link="left_front_wheel"/>
<origin rpy="0 1.57075 0" xyz="-0.08 0.1 -0.03"/>
<limit effort="100" velocity="100"/>
<joint_properties damping="0.0" friction="0.0"/>
</joint>
<link name="left_back_wheel">
<visual>
<geometry>
<cylinder length=".02" radius="0.025"/>
</geometry>
<material name="black">
<color rgba="0 0 0 1"/>
</material>
</visual>
</link>
<joint name="left_back_wheel_joint" type="continuous">
<axis xyz="0 0 1"/>
<parent link="base_link"/>
<child link="left_back_wheel"/>
<origin rpy="0 1.57075 0" xyz="-0.08 -0.1 -0.03"/>
<limit effort="100" velocity="100"/>
<joint_properties damping="0.0" friction="0.0"/>
</joint>
<link name="head">
<visual>
<geometry>
<box size=".02 .03 .03"/>
</geometry>
<material name="white">
<color rgba="1 1 1 1"/>
</material>
</visual>
</link>
<joint name="tobox" type="fixed">
<parent link="base_link"/>
<child link="head"/>
<origin xyz="0 0.08 0.025"/>
</joint>
</robot>
其中配置解釋如下:
<link>對應(yīng)模型的一個模塊,可以通過標(biāo)簽joint讓子模塊與base_link進(jìn)行關(guān)聯(lián);
<visual>描述一個link的外觀枢纠,大小疹蛉,顏色官地,材質(zhì)紋理等;
<geometry>定義該link的幾何模型,包含該幾何模型的尺寸,單位:米思恐;
<box> 矩形摊册,定義屬性:size(包含長寬高乐埠,數(shù)據(jù)用空格隔開)找筝;
<cylinder> 圓柱體,定義屬性:length八千,radius吗讶;
<sphere> 球體,定義屬性:radius恋捆;
<material> 定義顏色和透明度(RGBA)照皆,取值區(qū)間 [0,1] ;
<collision> 描述碰撞檢測屬性沸停;
<origin> 用來描述模塊的位置膜毁;
<inertial> 定義慣性;
5.創(chuàng)建launch命令文件
*.launch文件的作用是:同時啟動多個節(jié)點,使用roslaunch命令運行.launch文件中指定的節(jié)點愤钾。在launch文件夾中創(chuàng)建文件display.launch瘟滨,并編輯,代碼如下:
<launch>
<arg name="model" />
<arg name="gui" default="false" />
<param name="robot_description" textfile="$(find autolabor_description)/urdf/autolabor_description.urdf" />
<param name="use_gui" value="$(arg gui)" />
<node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" />
<node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher" />
<node name="rviz" pkg="rviz" type="rviz" args="-d $(find autolabor_description)/urdf.rviz" />
</launch>
第一個輸入?yún)?shù) model 就是要啟動的urdf文件路徑绰垂。
第二個輸入?yún)?shù) gui 指定是否啟用關(guān)節(jié)轉(zhuǎn)動控制面板窗口室奏。
兩個參數(shù)表示:分別描述要啟動的模型描述文件(urdf)和關(guān)節(jié)轉(zhuǎn)到控制窗口(gui,對應(yīng)各個joint)劲装。
三個節(jié)點:分別用于發(fā)送joint的信息,robot的控制信息昌简,和rviz的啟動占业。至此,模型搭建完畢纯赎,啟動模型進(jìn)行測試谦疾。
6.效果展示
進(jìn)入工作空間目錄下,編譯文件犬金,使用roslaunch命令來啟動它:
$ cd ~/catkin_ws/
$ source devel/setup.bash
$ catkin_make
$ roslaunch autolabor_description display.launch
在啟動rviz后念恍,需要將上面標(biāo)記的topic的參數(shù)改成上述圖中六剥,否則是無法觀測到的,到此峰伙,就建立并啟動了自己的機器人小車了