用ROS制作我们的机器人小车(一): URDF简介
2014-02-07 19:48
711 查看
相信许多爱好者止步于昂贵的机器人价格。虽然有了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包
执行
当然,没有运行roscore你的rviz也无法启动。不过如果错误显示你的rviz找不到执行文件的话,请参照http://wiki.ros.org/rviz
URDF基本语法
统一机器人描述格式URDF,其实就是为了能够抽象描述一个机器人的硬件。而且URDF是基于XML的,所以阅读起来应该非常容易。
笔者以为要理解URDF用自顶向下的方式更快。即从为了解决一个怎样的问题开始。在这里我们先用一个简单场景熟悉一下会用到的工具。
不得不说小车是最简单实用的机器人, 一个车身加四个轮子就组成了最基本的小车结构,而且具备一定载重能力的小车也不会太贵。
见如下图片。
(图一)
第一版
在URDF语言中,机器人都会由各个部件(Link)通过关节(Joint)连接而成。而这里的关键就是描述部件和关节之间的关系。
在这个简单的小车模型中,一共有5个部件: 车身 + 4个轮子。 4个关节: 每个轮子一个。
于是,我们得到了最初了URDF版本 01_car_skeleton.urdf
很简单对吧?
用<link> tag描述各个部件,<joint> tag描述各个关节。用<parent>和<child>描述关节连接的部件。
只要描述了Link和Joint之间的关系,我们很容易就能构建机器人的框架。
我们可以用如下命令来检查urdf文件是否有语法问题。
只要得到如下结果就表明语法没问题。
第二版
<visual>tag用来描述模块的视觉效果。
<geometry>tag 用来描述模块的形状和大小。
<origin>tag用来描述模块的位置。
加上模块大小之后的小车文件如下所示。02_visual.urdf
现在通过如下命令,你就通过rviz查看你的小车模型啦。
第三步: 上色
Mmm,我们的小车就快完成了,但全是红色总觉得怪怪的而且很难辨认。
不过上色同样很简单。使用<material> tag并且设置<color> tag
我们得到第三个版本:03_color.urdf
<robot name="test_robot">
<link name="base_link">
<visual>
<geometry>
<box size="0.2 .3 .1"/>
</geometry>
<origin rpy="0 0 0" xyz="0 0 0.05"/>
<material name="white">
<color rgba="1 1 1 1"/>
</material>
</visual>
</link>
<link name="wheel_1">
<visual>
<geometry>
<cylinder length="0.05" radius="0.05"/>
</geometry>
<origin rpy="0 1.5 0" xyz="0.1 0.1 0"/>
<material name="black">
<color rgba="0 0 0 1"/>
</material>
</visual>
</link>
<link name="wheel_2">
<visual>
<geometry>
<cylinder length="0.05" radius="0.05"/>
</geometry>
<origin rpy="0 1.5 0" xyz="-0.1 0.1 0"/>
<material name="black"/>
</visual>
</link>
<link name="wheel_3">
<visual>
<geometry>
<cylinder length="0.05" radius="0.05"/>
</geometry>
<origin rpy="0 1.5 0" xyz="0.1 -0.1 0"/>
<material name="black"/>
</visual>
</link>
<link name="wheel_4">
<visual>
<geometry>
<cylinder length="0.05" radius="0.05"/>
</geometry>
<origin rpy="0 1.5 0" xyz="-0.1 -0.1 0"/>
<material name="black"/>
</visual>
</link>
<joint name="joint_base_wheel1" type="fixed">
<parent link="base_link"/>
<child link="wheel_1"/>
</joint>
<joint name="joint_base_wheel2" type="fixed">
<parent link="base_link"/>
<child link="wheel_2"/>
</joint>
<joint name="joint_base_wheel3" type="fixed">
<parent link="base_link"/>
<child link="wheel_3"/>
</joint>
<joint name="joint_base_wheel4" type="fixed">
<parent link="base_link"/>
<child link="wheel_4"/>
</joint>
</robot>
我们可以看到rviz的结果,如图一所示。
这下我们差不多完成了。我们马上就可以移动我们的小车啦。
但是等等,在我们的URDF文件中,内嵌了关于各个部件的大小参数以及位置。这些当然是我们根据草图用计算器算出来的。
但是这样的扩展性也太差了吧?难道对每个模型我们都得这么计算吗?对于相同模型的不同尺寸我们还得重新计算一次?
第四步: Xacro
什么是Xacro? 我们可以把它理解成为针对URDF的扩展性和配置性而设计的宏语言(macro language)。
有了Xacro,我们就可以像编程一样来写URDF文件了。
首先我们来看Xacro文件的变量定义:
其次,我们来看一下Xacro如何进行宏定义。
这里的宏和C语言的宏很像,在转换成URDF文件时编译器会将其展开。其基本语法为:
我们来看下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中定义参数的语法为:
并且每个轮子和连接的代码也基本相同。
基于上述亮点,我们可以得到以下xacro文件。04_xacro.xacro
验证该文件的正确性可以有两种方法。
1. 转换成URDF文件,使用check_urdf
2. 使用xacrodisplay.launch
我们都会得到和图1一样的小车模型。这下我们就可以用Xacro来构建机器人模型了。
所以如果你只是普通机器人爱好者,或者还没想好要拿机器人做什么,那我们还是从模拟器开始吧……
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包
sudo apt-get install ros-hydro-urdf-tutorial
执行
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
<robot name="test_robot"> <link name="base_link" /> <link name="wheel_1" /> <link name="wheel_2" /> <link name="wheel_3" /> <link name="wheel_4" /> <joint name="joint_base_wheel1" type="fixed"> <parent link="base_link"/> <child link="wheel_1"/> </joint> <joint name="joint_base_wheel2" type="fixed"> <parent link="base_link"/> <child link="wheel_2"/> </joint> <joint name="joint_base_wheel3" type="fixed"> <parent link="base_link"/> <child link="wheel_3"/> </joint> <joint name="joint_base_wheel4" type="fixed"> <parent link="base_link"/> <child link="wheel_4"/> </joint> </robot>
很简单对吧?
用<link> tag描述各个部件,<joint> tag描述各个关节。用<parent>和<child>描述关节连接的部件。
只要描述了Link和Joint之间的关系,我们很容易就能构建机器人的框架。
我们可以用如下命令来检查urdf文件是否有语法问题。
check_urdf 01_skeleton.urdf
只要得到如下结果就表明语法没问题。
robot name is: test_robot ---------- Successfully Parsed XML --------------- root Link: base_link has 4 child(ren) child(1): wheel_1 child(2): wheel_2 child(3): wheel_3 child(4): wheel_4但请注意这虽然描述了各个部件之间的关系,但仍是一个不完整的URDF,无法在模拟器中显示。
第二版
<visual>tag用来描述模块的视觉效果。
<geometry>tag 用来描述模块的形状和大小。
<origin>tag用来描述模块的位置。
加上模块大小之后的小车文件如下所示。02_visual.urdf
<robot name="test_robot"> <link name="base_link"> <visual> <geometry> <box size="0.2 .3 .1"/> </geometry> <origin rpy="0 0 0" xyz="0 0 0.05"/> </visual> </link> <link name="wheel_1"> <visual> <geometry> <cylinder length="0.05" radius="0.05"/> </geometry> <origin rpy="0 1.5 0" xyz="0.1 0.1 0"/> </visual> </link> <link name="wheel_2"> <visual> <geometry> <cylinder length="0.05" radius="0.05"/> </geometry> <origin rpy="0 1.5 0" xyz="-0.1 0.1 0"/> </visual> </link> <link name="wheel_3"> <visual> <geometry> <cylinder length="0.05" radius="0.05"/> </geometry> <origin rpy="0 1.5 0" xyz="0.1 -0.1 0"/> </visual> </link> <link name="wheel_4"> <visual> <geometry> <cylinder length="0.05" radius="0.05"/> </geometry> <origin rpy="0 1.5 0" xyz="-0.1 -0.1 0"/> </visual> </link> <joint name="joint_base_wheel1" type="fixed"> <parent link="base_link"/> <child link="wheel_1"/> </joint> <joint name="joint_base_wheel2" type="fixed"> <parent link="base_link"/> <child link="wheel_2"/> </joint> <joint name="joint_base_wheel3" type="fixed"> <parent link="base_link"/> <child link="wheel_3"/> </joint> <joint name="joint_base_wheel4" type="fixed"> <parent link="base_link"/> <child link="wheel_4"/> </joint> </robot>
现在通过如下命令,你就通过rviz查看你的小车模型啦。
roslaunch urdf_tutorial display.launch model:=02_visual.urdf
第三步: 上色
Mmm,我们的小车就快完成了,但全是红色总觉得怪怪的而且很难辨认。
不过上色同样很简单。使用<material> tag并且设置<color> tag
我们得到第三个版本:03_color.urdf
<robot name="test_robot">
<link name="base_link">
<visual>
<geometry>
<box size="0.2 .3 .1"/>
</geometry>
<origin rpy="0 0 0" xyz="0 0 0.05"/>
<material name="white">
<color rgba="1 1 1 1"/>
</material>
</visual>
</link>
<link name="wheel_1">
<visual>
<geometry>
<cylinder length="0.05" radius="0.05"/>
</geometry>
<origin rpy="0 1.5 0" xyz="0.1 0.1 0"/>
<material name="black">
<color rgba="0 0 0 1"/>
</material>
</visual>
</link>
<link name="wheel_2">
<visual>
<geometry>
<cylinder length="0.05" radius="0.05"/>
</geometry>
<origin rpy="0 1.5 0" xyz="-0.1 0.1 0"/>
<material name="black"/>
</visual>
</link>
<link name="wheel_3">
<visual>
<geometry>
<cylinder length="0.05" radius="0.05"/>
</geometry>
<origin rpy="0 1.5 0" xyz="0.1 -0.1 0"/>
<material name="black"/>
</visual>
</link>
<link name="wheel_4">
<visual>
<geometry>
<cylinder length="0.05" radius="0.05"/>
</geometry>
<origin rpy="0 1.5 0" xyz="-0.1 -0.1 0"/>
<material name="black"/>
</visual>
</link>
<joint name="joint_base_wheel1" type="fixed">
<parent link="base_link"/>
<child link="wheel_1"/>
</joint>
<joint name="joint_base_wheel2" type="fixed">
<parent link="base_link"/>
<child link="wheel_2"/>
</joint>
<joint name="joint_base_wheel3" type="fixed">
<parent link="base_link"/>
<child link="wheel_3"/>
</joint>
<joint name="joint_base_wheel4" type="fixed">
<parent link="base_link"/>
<child link="wheel_4"/>
</joint>
</robot>
我们可以看到rviz的结果,如图一所示。
这下我们差不多完成了。我们马上就可以移动我们的小车啦。
但是等等,在我们的URDF文件中,内嵌了关于各个部件的大小参数以及位置。这些当然是我们根据草图用计算器算出来的。
但是这样的扩展性也太差了吧?难道对每个模型我们都得这么计算吗?对于相同模型的不同尺寸我们还得重新计算一次?
第四步: Xacro
什么是Xacro? 我们可以把它理解成为针对URDF的扩展性和配置性而设计的宏语言(macro language)。
有了Xacro,我们就可以像编程一样来写URDF文件了。
首先我们来看Xacro文件的变量定义:
<xacro:property name="body_width" value=".2" />只要定义了body_width,我们就可以通过${body_width}来引用其值了。有了这个,至少我们可以把需要配置的变量进行统一管理。
其次,我们来看一下Xacro如何进行宏定义。
这里的宏和C语言的宏很像,在转换成URDF文件时编译器会将其展开。其基本语法为:
<xacro:macro name="wheel" params="param1 param2"> </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中定义参数的语法为:
<xacro:property name="body_size" value=".2 .3 .1" /> <xacro:property name="body_pos" value="0 0 0.05" /> <xacro:property name="wheel_radius" value="0.05" /> <xacro:property name="wheel_length" value="0.05" /> <xacro:property name="wheel1_pos" value="0.1 0.1 0" /> <xacro:property name="wheel2_pos" value="-0.1 0.1 0" /> <xacro:property name="wheel3_pos" value="0.1 -0.1 0" /> <xacro:property name="wheel4_pos" value="-0.1 -0.1 0" />
并且每个轮子和连接的代码也基本相同。
基于上述亮点,我们可以得到以下xacro文件。04_xacro.xacro
<?xml version="1.0"?> <robot xmlns:sensor="http://playerstage.sourceforge.net/gazebo/xmlschema/#sensor" xmlns:controller="http://playerstage.sourceforge.net/gazebo/xmlschema/#controller" xmlns:interface="http://playerstage.sourceforge.net/gazebo/xmlschema/#interface" xmlns:xacro="http://playerstage.sourceforge.net/gazebo/xmlschema/#interface" name="test_robot"> <xacro:property name="body_size" value=".2 .3 .1" /> <xacro:property name="body_pos" value="0 0 0.05" /> <xacro:property name="wheel_radius" value="0.05" /> <xacro:property name="wheel_length" value="0.05" /> <xacro:property name="wheel1_pos" value="0.1 0.1 0" /> <xacro:property name="wheel2_pos" value="-0.1 0.1 0" /> <xacro:property name="wheel3_pos" value="0.1 -0.1 0" /> <xacro:property name="wheel4_pos" value="-0.1 -0.1 0" /> <xacro:macro name="wheel" params="wheelname position"> <link name="${wheelname}"> <visual> <geometry> <cylinder length="${wheel_length}" radius="${wheel_radius}"/> </geometry> <origin rpy="0 1.5 0" xyz="${position}"/> <material name="black"> <color rgba="0 0 0 1"/> </material> </visual> </link> <joint name="joint_base_${wheelname}" type="fixed"> <parent link="base_link"/> <child link="${wheelname}"/> </joint> </xacro:macro> <xacro:wheel wheelname="wheel1" position="${wheel1_pos}"/> <xacro:wheel wheelname="wheel2" position="${wheel2_pos}"/> <xacro:wheel wheelname="wheel3" position="${wheel3_pos}"/> <xacro:wheel wheelname="wheel4" position="${wheel4_pos}"/> <link name="base_link"> <visual> <geometry> <box size="${body_size}"/> </geometry> <origin rpy="0 0 0" xyz="${body_pos}"/> <material name="white"> <color rgba="1 1 1 1"/> </material> </visual> </link> </robot>
验证该文件的正确性可以有两种方法。
1. 转换成URDF文件,使用check_urdf
rosrun xacro xacro.py 04_xacro.xacro > 04_xacro.urdf
2. 使用xacrodisplay.launch
roslaunch urdf_tutorial xacrodisplay.launch model:=04_xacro.xacro
我们都会得到和图1一样的小车模型。这下我们就可以用Xacro来构建机器人模型了。
相关文章推荐
- 收集的ROS防火墙脚本
- 微信公众平台开发教程(四) 实例入门:机器人回复(附源码)
- asp.net(c#)捕捉搜索引擎蜘蛛和机器人
- 什么是android(What Is Android?)
- ROS限速脚本 动态限速 固定限速
- ROS超智能的脚本
- ROS 采用NAT方式提高双线转发效率的方法
- ROS最正确的限速--------小包优先+带宽均分+简单队列限制上传速度
- ROS用流量监控动态控制限速点(新方法)----预留带宽
- http协议状态码详解
- ROS與二層交換機3COM(4200)做24個多出口ADSL(固定IP)拔號
- ROS莫明掉线断流的解决方法
- 50年后人工智能将成为人类最大的威胁
- 实用工具类 GTalk机器人
- 如何使用ROS 限制BT下载
- ros防火墙脚本(经典推荐)
- ROS加强精通过程--禁止 未授权用户上网
- ROS最正确的限速--------小包优先+带宽均分+简单队列限制上传速度
- Ros强开指定首页,类似电信的ADSL强开指定首页,即push功能
- ROS做PCQ集体限速图