urdf 学习与制作

转载 2016年08月28日 15:25:56

http://blog.csdn.net/sunbibei/article/details/52297524

在定义好了机器人的骨架后, 进一步我们可以使用origin子标签进行定义link所应该在的位置. 但是有一点应该注意到, link和link之间是使用joint进行连接, 那么link的位置, 就由连接他的joint确定. 所以, 该子标签是定义在joint内. 在三维空间中, 要精确描述一个刚性体的姿态, 仅仅使用他的xyz坐标是不够的, 还需要使用rpy. rpy角是描述船舶在海中航行时姿态的一种方法. 将船的行驶方向取为z轴, 绕z轴旋转称为滚动(Roll), 绕y轴旋转称为俯仰(Pitch), 绕x轴旋转称为偏转(Yaw). 

http://blog.csdn.net/crazyquhezheng/article/details/42840955

使用ROS强大的机器人功能,建立ROS可以识别的机器人模型是第一步,也是无法绕过去的环节。Unified Robot Description Format (URDF) 就是描述机器人硬件尺寸布局的模型语言。它是同ROS沟通的渠道,有了机器人的物理尺寸,ROS就可以有效的进行Navagation和碰撞检测(collision detect)了。

未来,该语言会从ROS独立出来,集成到Ubuntu官方包发布。必须承认,URDF 是个很难懂的语言,但有RViz的强大仿真功能,我们很容易调试它。今天我们就以经常见到智能四轮驱动小车为例介绍它的使用。

1.  软件环境

OS: Ubuntu 14.04

ROS: Indigo Full package

2.  小车形状与尺寸

具体实际的物理小车的建立请看我的文章树莓派搭建 ROS 系统下四论驱动车,并用 IPad, 手机控制。该车有两层,4个轮子,头部还有一个hc-sr04超声波和舵机。

基座(base_link): 长 27cm 宽 15cm  每层板厚度3mm 下层高度4.5cm  上层高度7.8cm

轮子 直径6.8cm 这个尺寸必须非常精确,影响测速和轨迹运算。厚度2.5cm

该车名字 SP1S (顺跑1 Smart)

3. 创建Ros package 

[plain] view plain copy
  1. <span style="font-size:18px;">$ catkin_create_pkg sp1s std_msgs rospy roscpp urdf  
  2. $ cd sp1s/  
  3. $ mkdir urdf</span>  
catkin_create_pkg最后一个参数是引入urdf 库。创建urdf目录存放urdf文件。

**必须已经创建好了一个workspace的情况下,使用该命令创建package.

4. 创建lauch文件启动Rviz

创建目录launch并新建文件dispaly.launch  建立好urdf文件后就使用该文件launch

[html] view plain copy
  1. <launch>  
  2.     <arg name="model" />  
  3.     <arg name="gui" default="False" />  
  4.     <param name="robot_description" textfile="$(arg model)" />  
  5.     <param name="use_gui" value="$(arg gui)"/>  
  6.     <node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" />  
  7.     <node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher" />  
  8.     <node name="rviz" pkg="rviz" type="rviz" args="-d $(find urdf_tutorial)/urdf.rviz" required="true" />  
  9. </launch>  
该文件可以帮助启动RViz来观察机器人。其中有三个node,一个是rviz,另外两个joint_state_publisher robot_state_publisher是必须的node。

第一个输入参数 model 就是要启动的urdf文件路径。

第二个输入参数 gui 指定是否启用关节转动控制面板窗口

5. 创建基座base_link

ROS里面把每个零件称为link,作为基座的link统一称为base_link.在官方的所有事例文章里面到处可以看到base_link,所以最好也延续该名称。其它的link都要依附到base_link上。这里我们把下层的板作为base_link. 新建一个文件sp1s.urdf,描述代码如下:

[plain] view plain copy
  1. <pre name="code" class="html"><span style="font-size:18px;"><?xml version="1.0"?>  
  2. <robot name="sp1s">  
  3.   <link name="base_link">  
  4.     <visual>  
  5.       <geometry>  
  6.         <box size="0.27 .15 .003"/>  
  7.       </geometry>  
  8.       <material name="white">  
  9.          <color rgba="1 1 1 .5"/>  
  10.       </material>  
  11.     </visual>  
  12.   </link>  
  13. </robot></span>  


link可以指定许多属性:

  • <inertial>    定义惯性
  • <visual>     定义一个link的外观,大小,颜色和材质纹理贴图
  • <collision>定义碰撞检测属性

我们详细看一下<visual>的定义:

  • <geometry> 定义了几何形状为一个立方体,三个参数分别为长宽高,单位是米(m). 这里我们指定下层小车板子的板的尺寸。<geometry>可以有好几个选项:<box> 立方体  <cylinder>圆柱体  <sphere>球体
  • <material> 指定颜色rgb和透明度a.  它们取值范围都是[0,1] 区间。

使用下面命令启动RViz来查看我们刚刚完成的机器人模型:

[plain] view plain copy
  1. roslaunch sp1s display.launch model:=urdf/sp1s.urdf  

这时只是显示了一个半透明的长方体,就是我们的主体部分。中间的黄色点代表了base_link的原点,也是整个RViz世界的原点。

6. 创建轮子

下面我们开始创建四个轮子,它们的名字分别为tyer_front_left, tyer_front_right, tyer_back_left, tyer_back_right. 尺寸大小直径6.8cm 厚度2.5cm先以一个轮子为例:

[html] view plain copy
  1. <span style="font-size:18px;"><?xml version="1.0"?>  
  2. <robot name="sp1s">  
  3.   <link name="base_link">  
  4.     <visual>  
  5.       <geometry>  
  6.         <box size="0.27 .15 .003"/>  
  7.       </geometry>  
  8.       <material name="white">  
  9.          <color rgba="1 1 1 .5"/>  
  10.     </material>  
  11.     </visual>  
  12.   </link>  
  13.     
  14.   <link name="tyer_front_left">  
  15.     <visual>  
  16.       <geometry>  
  17.        <cylinder length=".025" radius="0.034"></cylinder>  
  18.       </geometry>  
  19.       <material name="yellow">  
  20.           <color rgba="1 1 0 1"/>  
  21.       </material>    
  22.     </visual>  
  23.   </link>  
  24.     
  25.   <joint name="base_to_front_left" type="fixed">  
  26.     <parent link="base_link"/>  
  27.     <child link="tyer_front_left"/>  
  28.   </joint>  
  29. </robot>  
  30. </span>  

  • 定义黄色的轮子tyer_front_left
  • 添加了一个关节 joint将base_link和tyer_front_left关联在一起,为了简单将joint定义为fixed类型。下一篇文章里将会改成continuous,并详细解释joint的作用
  • 两个及以上的link定义到一个文件里必须使用joint关联,否则出错

[plain] view plain copy
  1. <span style="font-size:18px;">roslaunch sp1s display.launch model:=urdf/sp1s.urdf</span>  

可以看到黄色的轮子显示到了车身的中央,因为它的原点origin和base_link的origin重合. 选中TFcheckbox,就会显示出XYZ坐标轴,红色为X, 绿色为Y,蓝色为Z

我们接着上文  ROS 学习系列 -- 使用urdf创建机器人模型在Rviz中3D观察 之一 link使用继续完成创建带四个可以转动轮子的双层小车。

一 建立可以转动的joint

[html] view plain copy
  1. <span style="font-size:18px;"><?xml version="1.0"?>  
  2. <robot name="sp1s">  
  3.   <link name="base_link">  
  4.     <visual>  
  5.       <geometry>  
  6.         <box size="0.27 .15 .003"/>  
  7.       </geometry>  
  8.       <material name="white">  
  9.          <color rgba="1 1 1 .5"/>  
  10.     </material>  
  11.     </visual>  
  12.   </link>  
  13.     
  14.   <link name="front_left">  
  15.     <visual>  
  16.       <geometry>  
  17.        <cylinder length=".025" radius="0.034"></cylinder>  
  18.       </geometry>  
  19.       <material name="yellow">  
  20.           <color rgba="1 1 0 1"/>  
  21.       </material>    
  22.     </visual>  
  23.   </link>  
  24.     
  25.   <joint name="base_to_front_left" type="<span style="color:#FF0000;"><strong>continuous</strong></span>">  
  26.     <origin rpy="1.57075  0  0" xyz="0.06  0.064  -0.011"/>  
  27.     <parent link="base_link"/>  
  28.     <child link="front_left"/>      
  29.     <axis xyz="0 0 1"/>  
  30.   </joint>  
  31. </robot></span>  

1. 将joint的类型改为"continuous" 这样front_left相对base_link就是一个转动的装置

2. 转动的位置就是由 origin定义的,它同时定义了tyer_front_left的新原点,之前它的原点默认就是base_link的原点

     xyz 是相对相对parant base_link原点的偏移, 它把轮子移动到了左前方。其中:

     z = -0.011m = 6.8cm/2-4.5cm,保证轮子是在地上的

       y = 0.064m = 15cm/2 - 2.5cm / 2 (轮子厚度) + offset

     pry 是分别以 x y z 轴为中心转动的角度(弧度制) 1.57075 就是90度。 围绕x轴旋转90度轮子就竖了起来。

3. axis重新定义转动轴在原点的方向,它是一个矢量,只指示方向,它们必须满足 x * x + y * y + z * z = 1   原点Z轴已经被旋转90度变成水平方向,所以这里定义Z轴方向为转动方向


    


二  重复添加四个轮子

其它三个轮子只有origin正负值的调整

[html] view plain copy
  1. <span style="font-size:18px;"><?xml version="1.0"?>  
  2. <robot name="sp1s">  
  3.   <link name="base_link">  
  4.     <visual>  
  5.       <geometry>  
  6.         <box size="0.27 .15 .003"/>  
  7.       </geometry>  
  8.       <material name="white">  
  9.          <color rgba="1 1 1 .5"/>  
  10.     </material>  
  11.     </visual>  
  12.   </link>  
  13.     
  14.   <link name="tyer_front_left">  
  15.     <visual>  
  16.       <geometry>  
  17.        <cylinder length=".025" radius="0.034"></cylinder>  
  18.       </geometry>  
  19.       <material name="yellow">  
  20.           <color rgba="1 1 0 1"/>  
  21.       </material>    
  22.     </visual>  
  23.   </link>  
  24.   
  25.   <link name="tyer_front_right">  
  26.     <visual>  
  27.       <geometry>  
  28.        <cylinder length=".025" radius="0.034"></cylinder>  
  29.       </geometry>  
  30.       <material name="yellow">    
  31.           <color rgba="1 1 0 1"/>    
  32.       </material>    
  33.     </visual>  
  34.   </link>  
  35.     
  36.   <link name="tyer_back_left">  
  37.     <visual>  
  38.       <geometry>  
  39.        <cylinder length=".025" radius="0.034"></cylinder>  
  40.       </geometry>  
  41.       <material name="yellow">    
  42.           <color rgba="1 1 0 1"/>    
  43.       </material>    
  44.     </visual>  
  45.   </link>  
  46.     
  47.   <link name="tyer_back_right">  
  48.     <visual>  
  49.       <geometry>  
  50.        <cylinder length=".025" radius="0.034"></cylinder>  
  51.       </geometry>  
  52.       <material name="yellow">    
  53.           <color rgba="1 1 0 1"/>    
  54.       </material>    
  55.     </visual>  
  56.   </link>  
  57.     
  58.   <joint name="base_to_front_left" type="continuous">  
  59.     <origin rpy="1.57075  0  0" xyz="0.06  0.064  -0.011"/>  
  60.     <parent link="base_link"/>  
  61.     <child link="tyer_front_left"/>      
  62.     <axis xyz="0 0 1"/>  
  63.   </joint>  
  64.   
  65.   <joint name="base_to_front_right" type="continuous">  
  66.     <origin rpy="1.57075  0  0" xyz="0.06  -0.064  -0.011"/>  
  67.     <parent link="base_link"/>  
  68.     <child link="tyer_front_right"/>      
  69.     <axis xyz="0 0 1"/>  
  70.   </joint>  
  71.   
  72.   <joint name="base_to_back_left" type="continuous">  
  73.     <origin rpy="1.57075  0  0" xyz="-0.06  0.064  -0.011"/>  
  74.     <parent link="base_link"/>  
  75.     <child link="tyer_back_left"/>      
  76.     <axis xyz="0 0 1"/>  
  77.   </joint>  
  78.   
  79.   <joint name="base_to_back_right" type="continuous">  
  80.     <origin rpy="1.57075  0  0" xyz="-0.06  -0.064  -0.011"/>  
  81.     <parent link="base_link"/>  
  82.     <child link="tyer_back_right"/>      
  83.     <axis xyz="0 0 1"/>  
  84.   </joint>  
  85. </robot>  
  86. </span>  


三  添加四个柱子

上下层的四个角上是高3cm的柱子. 在上面urdf的基础上再添加下面的内容添加一个左前方的柱子。

[html] view plain copy
  1. <span style="font-size:18px;">  <link name="pillar_front_left">  
  2.     <visual>  
  3.       <geometry>  
  4.        <cylinder length=".03" radius="0.0025"></cylinder>  
  5.       </geometry>  
  6.       <origin xyz="0 0 0.015"/>    
  7.       <material name="silver">    
  8.           <color rgba=".86 .86 .86 1"/>    
  9.       </material>  
  10.     </visual>  
  11.   </link>  
  12.   
  13.   <joint name="base_to_pillar_front_left" type="fixed">  
  14.     <origin xyz="0.13  0.07  0.0015"/>  
  15.     <parent link="base_link"/>  
  16.     <child link="pillar_front_left"/>  
  17.   </joint></span>  
1. 柱子不转动,所以joint的类型为 fixed 

2. joint里面定义改变了柱子的原点为 xyz="0.13 0.07 0.0015" 是相对base_link的

3. link里面也定义了原点为xyz="0 0 0.015", 这里只是显示上的偏移,它相对于joint里面定义的原点,但并不改变joint里面定义的物理原点

4. 接下来重复加三个柱子,详见最后一段的urdf定义


四 添加上层

上层和base_link一样,它们之间通过fixed joint相连。在 Z 轴方向上偏移3cm。

[html] view plain copy
  1. <link name="top_link">  
  2.   <visual>  
  3.     <geometry>  
  4.       <box size="0.27 .15 .003"/>  
  5.     </geometry>  
  6.     <material name="white">  
  7.        <color rgba="1 1 1 .5"/>  
  8.   </material>  
  9.   </visual>  
  10. </link>  
  11.   
  12. <joint name="base_to_top" type="fixed">  
  13.   <origin xyz="0  0  0.03"/>  
  14.   <parent link="base_link"/>  
  15.   <child link="top_link"/>  
  16. </joint>  

五  完整的urdf

[html] view plain copy
  1. <?xml version="1.0"?>  
  2. <robot name="sp1s">  
  3.   <link name="base_link">  
  4.     <visual>  
  5.       <geometry>  
  6.         <box size="0.27 .15 .003"/>  
  7.       </geometry>  
  8.       <material name="white">  
  9.          <color rgba="1 1 1 .5"/>  
  10.     </material>  
  11.     </visual>  
  12.   </link>  
  13.     
  14.   <link name="tyer_front_left">  
  15.     <visual>  
  16.       <geometry>  
  17.        <cylinder length=".025" radius="0.034"></cylinder>  
  18.       </geometry>  
  19.       <material name="yellow">  
  20.           <color rgba="1 1 0 1"/>  
  21.       </material>    
  22.     </visual>  
  23.   </link>  
  24.   
  25.   <link name="tyer_front_right">  
  26.     <visual>  
  27.       <geometry>  
  28.        <cylinder length=".025" radius="0.034"></cylinder>  
  29.       </geometry>  
  30.       <material name="yellow">    
  31.           <color rgba="1 1 0 1"/>    
  32.       </material>    
  33.     </visual>  
  34.   </link>  
  35.     
  36.   <link name="tyer_back_left">  
  37.     <visual>  
  38.       <geometry>  
  39.        <cylinder length=".025" radius="0.034"></cylinder>  
  40.       </geometry>  
  41.       <material name="yellow">    
  42.           <color rgba="1 1 0 1"/>    
  43.       </material>    
  44.     </visual>  
  45.   </link>  
  46.     
  47.   <link name="tyer_back_right">  
  48.     <visual>  
  49.       <geometry>  
  50.        <cylinder length=".025" radius="0.034"></cylinder>  
  51.       </geometry>  
  52.       <material name="yellow">    
  53.           <color rgba="1 1 0 1"/>    
  54.       </material>    
  55.     </visual>  
  56.   </link>  
  57.     
  58.   <joint name="base_to_front_left" type="continuous">  
  59.     <origin rpy="1.57075  0  0" xyz="0.06  0.064  -0.011"/>  
  60.     <parent link="base_link"/>  
  61.     <child link="tyer_front_left"/>      
  62.     <axis xyz="0 0 1"/>  
  63.   </joint>  
  64.   
  65.   <joint name="base_to_front_right" type="continuous">  
  66.     <origin rpy="1.57075  0  0" xyz="0.06  -0.064  -0.011"/>  
  67.     <parent link="base_link"/>  
  68.     <child link="tyer_front_right"/>      
  69.     <axis xyz="0 0 1"/>  
  70.   </joint>  
  71.   
  72.   <joint name="base_to_back_left" type="continuous">  
  73.     <origin rpy="1.57075  0  0" xyz="-0.06  0.064  -0.011"/>  
  74.     <parent link="base_link"/>  
  75.     <child link="tyer_back_left"/>      
  76.     <axis xyz="0 0 1"/>  
  77.   </joint>  
  78.   
  79.   <joint name="base_to_back_right" type="continuous">  
  80.     <origin rpy="1.57075  0  0" xyz="-0.06  -0.064  -0.011"/>  
  81.     <parent link="base_link"/>  
  82.     <child link="tyer_back_right"/>      
  83.     <axis xyz="0 0 1"/>  
  84.   </joint>  
  85.   
  86.   <link name="pillar_front_left">  
  87.     <visual>  
  88.       <geometry>  
  89.        <cylinder length=".03" radius="0.0025"></cylinder>  
  90.       </geometry>  
  91.       <origin xyz="0 0 0.015"/>    
  92.       <material name="silver">    
  93.           <color rgba=".86 .86 .86 1"/>    
  94.       </material>  
  95.     </visual>  
  96.   </link>  
  97.   
  98.   <link name="pillar_front_right">  
  99.     <visual>  
  100.       <geometry>  
  101.        <cylinder length=".03" radius="0.0025"></cylinder>  
  102.       </geometry>  
  103.       <origin xyz="0 0 0.015"/>    
  104.       <material name="silver">    
  105.           <color rgba=".86 .86 .86 1"/>    
  106.       </material>  
  107.     </visual>  
  108.   </link>  
  109.   
  110.   <link name="pillar_back_left">  
  111.     <visual>  
  112.       <geometry>  
  113.        <cylinder length=".03" radius="0.0025"></cylinder>  
  114.       </geometry>  
  115.       <origin xyz="0 0 0.015"/>    
  116.       <material name="silver">    
  117.           <color rgba=".86 .86 .86 1"/>    
  118.       </material>  
  119.     </visual>  
  120.   </link>  
  121.   
  122.   <link name="pillar_back_right">  
  123.     <visual>  
  124.       <geometry>  
  125.        <cylinder length=".03" radius="0.0025"></cylinder>  
  126.       </geometry>  
  127.       <origin xyz="0 0 0.015"/>    
  128.       <material name="silver">    
  129.           <color rgba=".86 .86 .86 1"/>    
  130.       </material>  
  131.     </visual>  
  132.   </link>  
  133.   
  134.   <joint name="base_to_pillar_front_left" type="fixed">  
  135.     <origin xyz="0.13  0.07  0.0015"/>  
  136.     <parent link="base_link"/>  
  137.     <child link="pillar_front_left"/>  
  138.   </joint>  
  139.   
  140.   <joint name="base_to_pillar_front_right" type="fixed">  
  141.     <origin xyz="-0.13  0.07  0.0015"/>  
  142.     <parent link="base_link"/>  
  143.     <child link="pillar_front_right"/>  
  144.   </joint>  
  145.   
  146.   <joint name="base_to_pillar_back_left" type="fixed">  
  147.     <origin xyz="0.13  -0.07  0.0015"/>  
  148.     <parent link="base_link"/>  
  149.     <child link="pillar_back_left"/>  
  150.   </joint>  
  151.   
  152.   <joint name="base_to_pillar_back_right" type="fixed">  
  153.     <origin xyz="-0.13  -0.07  0.0015"/>  
  154.     <parent link="base_link"/>  
  155.     <child link="pillar_back_right"/>  
  156.   </joint>  
  157.   
  158.   <link name="top_link">  
  159.     <visual>  
  160.       <geometry>  
  161.         <box size="0.27 .15 .003"/>  
  162.       </geometry>  
  163.       <material name="white">  
  164.          <color rgba="1 1 1 .5"/>  
  165.     </material>  
  166.     </visual>  
  167.   </link>  
  168.   
  169.   <joint name="base_to_top" type="fixed">  
  170.     <origin xyz="0  0  0.03"/>  
  171.     <parent link="base_link"/>  
  172.     <child link="top_link"/>  
  173.   </joint>  
  174. </robot>  


相关文章推荐

ROS 学习系列 -- 使用urdf创建机器人模型在Rviz中3D观察 之一 link使用

 目录(?)[+] 软件环境 小车形状与尺寸创建Ros package 创建lauch文件启动Rviz创建基座base_link创建轮子 使用ROS强大的机器人功能,建立...
  • BBZZ2
  • BBZZ2
  • 2016年05月11日 16:35
  • 5157

Find out inertial parameters

对于该模型的物理上合理的行为,你需要去正确的设置惯性jz
  • dxuehui
  • dxuehui
  • 2014年09月27日 10:13
  • 747

URDF通用机器人格式化描述文件学习笔记

一、CMakelist.txt的find_package中增加urdf依赖 二、可以使用urdf语法解析器检查urdf、xml文件是否编写正确 三、使用知识描述语言(KDL)语法解析器 四、使用rob...

ROS 学习系列 -- RViz中移动机器人来学习 URDF,TF,base_link, map,odom和odom 主题的关系

前面已经介绍了如何使用URDF建造机器人小车并显示在Rviz的仿真环境里面,但是小车是静止的。下面介绍如何让它在Rviz里面动起来,并理清URDF,TF 和 odom 主题的关系。 1. ROS中b...

ROS学习-URDF学习纪要

ROS的URDF间断的学习了,老是抓不住要领,现在又重新学习了一篇终于有点眉目,问题主要集中在和的关系及其中的 标签的作用,现在记录下来,以防止再忘记。 1、如果urdf中的和中的没有 标签,这是的所...

用ROS制作我们的机器人小车(一): URDF简介

相信许多爱好者止步于昂贵的机器人价格。虽然有了Arduino,但一个载重能力很弱的机器人小车成本也得一两百块钱。搭建自己的机器人更是费时费力。 所以如果你只是普通机器人爱好者,或者还没想好要拿机器人做...

ROS 学习系列 -- 使用urdf创建机器人模型在Rviz中3D观察 之一 link使用

使用ROS强大的机器人功能,建立ROS可以识别的机器人模型是第一步,也是无法绕过去的环节。Unified Robot Description Format (URDF) 就是描述机器人硬件尺寸布局的模...

ROS学习(十):ROS URDF->joint

描述关节的运动学和动力学属性。描述关节的运动范围。

ROS学习系列---RViz中移动机器人来学习 URDF,TF,base_link, map,odom和odom 主题的关系

 前面已经介绍了如何使用URDF建造机器人小车并显示在Rviz的仿真环境里面,但是小车是静止的。下面介绍如何让它在Rviz里面动起来,并理清URDF,TF 和 odom 的关系。 1....
  • BBZZ2
  • BBZZ2
  • 2016年03月01日 14:02
  • 1905

ROS 学习系列 -- RViz中移动机器人来学习 URDF,TF,base_link, map,odom和odom 主题的关系

前面已经介绍了如何使用URDF建造机器人小车并显示在Rviz的仿真环境里面,但是小车是静止的。下面介绍如何让它在Rviz里面动起来,并理清URDF,TF 和 odom 的关系。 1. ROS...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:urdf 学习与制作
举报原因:
原因补充:

(最多只允许输入30个字)