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 plaincopy
  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 plaincopy
  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 plaincopy
  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 plaincopy
  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 plaincopy
  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. <link name="tyer_front_left">
  14. <visual>
  15. <geometry>
  16. <cylinder length=".025" radius="0.034"></cylinder>
  17. </geometry>
  18. <material name="yellow">
  19. <color rgba="1 1 0 1"/>
  20. </material>
  21. </visual>
  22. </link>
  23. <joint name="base_to_front_left" type="fixed">
  24. <parent link="base_link"/>
  25. <child link="tyer_front_left"/>
  26. </joint>
  27. </robot>
  28. </span>
  • 定义黄色的轮子tyer_front_left
  • 添加了一个关节 joint将base_link和tyer_front_left关联在一起,为了简单将joint定义为fixed类型。下一篇文章里将会改成continuous,并详细解释joint的作用
  • 两个及以上的link定义到一个文件里必须使用joint关联,否则出错
[plain] view plaincopy
  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 plaincopy
  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. <link name="front_left">
  14. <visual>
  15. <geometry>
  16. <cylinder length=".025" radius="0.034"></cylinder>
  17. </geometry>
  18. <material name="yellow">
  19. <color rgba="1 1 0 1"/>
  20. </material>
  21. </visual>
  22. </link>
  23. <joint name="base_to_front_left" type="<span style="color:#FF0000;"><strong>continuous</strong></span>">
  24. <origin rpy="1.57075  0  0" xyz="0.06  0.064  -0.011"/>
  25. <parent link="base_link"/>
  26. <child link="front_left"/>
  27. <axis xyz="0 0 1"/>
  28. </joint>
  29. </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 plaincopy
  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. <link name="tyer_front_left">
  14. <visual>
  15. <geometry>
  16. <cylinder length=".025" radius="0.034"></cylinder>
  17. </geometry>
  18. <material name="yellow">
  19. <color rgba="1 1 0 1"/>
  20. </material>
  21. </visual>
  22. </link>
  23. <link name="tyer_front_right">
  24. <visual>
  25. <geometry>
  26. <cylinder length=".025" radius="0.034"></cylinder>
  27. </geometry>
  28. <material name="yellow">
  29. <color rgba="1 1 0 1"/>
  30. </material>
  31. </visual>
  32. </link>
  33. <link name="tyer_back_left">
  34. <visual>
  35. <geometry>
  36. <cylinder length=".025" radius="0.034"></cylinder>
  37. </geometry>
  38. <material name="yellow">
  39. <color rgba="1 1 0 1"/>
  40. </material>
  41. </visual>
  42. </link>
  43. <link name="tyer_back_right">
  44. <visual>
  45. <geometry>
  46. <cylinder length=".025" radius="0.034"></cylinder>
  47. </geometry>
  48. <material name="yellow">
  49. <color rgba="1 1 0 1"/>
  50. </material>
  51. </visual>
  52. </link>
  53. <joint name="base_to_front_left" type="continuous">
  54. <origin rpy="1.57075  0  0" xyz="0.06  0.064  -0.011"/>
  55. <parent link="base_link"/>
  56. <child link="tyer_front_left"/>
  57. <axis xyz="0 0 1"/>
  58. </joint>
  59. <joint name="base_to_front_right" type="continuous">
  60. <origin rpy="1.57075  0  0" xyz="0.06  -0.064  -0.011"/>
  61. <parent link="base_link"/>
  62. <child link="tyer_front_right"/>
  63. <axis xyz="0 0 1"/>
  64. </joint>
  65. <joint name="base_to_back_left" 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_back_left"/>
  69. <axis xyz="0 0 1"/>
  70. </joint>
  71. <joint name="base_to_back_right" type="continuous">
  72. <origin rpy="1.57075  0  0" xyz="-0.06  -0.064  -0.011"/>
  73. <parent link="base_link"/>
  74. <child link="tyer_back_right"/>
  75. <axis xyz="0 0 1"/>
  76. </joint>
  77. </robot>
  78. </span>

三  添加四个柱子

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

[html] view plaincopy
  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. <joint name="base_to_pillar_front_left" type="fixed">
  13. <origin xyz="0.13  0.07  0.0015"/>
  14. <parent link="base_link"/>
  15. <child link="pillar_front_left"/>
  16. </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 plaincopy
  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. <joint name="base_to_top" type="fixed">
  12. <origin xyz="0  0  0.03"/>
  13. <parent link="base_link"/>
  14. <child link="top_link"/>
  15. </joint>

五  完整的urdf

[html] view plaincopy
  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. <link name="tyer_front_left">
  14. <visual>
  15. <geometry>
  16. <cylinder length=".025" radius="0.034"></cylinder>
  17. </geometry>
  18. <material name="yellow">
  19. <color rgba="1 1 0 1"/>
  20. </material>
  21. </visual>
  22. </link>
  23. <link name="tyer_front_right">
  24. <visual>
  25. <geometry>
  26. <cylinder length=".025" radius="0.034"></cylinder>
  27. </geometry>
  28. <material name="yellow">
  29. <color rgba="1 1 0 1"/>
  30. </material>
  31. </visual>
  32. </link>
  33. <link name="tyer_back_left">
  34. <visual>
  35. <geometry>
  36. <cylinder length=".025" radius="0.034"></cylinder>
  37. </geometry>
  38. <material name="yellow">
  39. <color rgba="1 1 0 1"/>
  40. </material>
  41. </visual>
  42. </link>
  43. <link name="tyer_back_right">
  44. <visual>
  45. <geometry>
  46. <cylinder length=".025" radius="0.034"></cylinder>
  47. </geometry>
  48. <material name="yellow">
  49. <color rgba="1 1 0 1"/>
  50. </material>
  51. </visual>
  52. </link>
  53. <joint name="base_to_front_left" type="continuous">
  54. <origin rpy="1.57075  0  0" xyz="0.06  0.064  -0.011"/>
  55. <parent link="base_link"/>
  56. <child link="tyer_front_left"/>
  57. <axis xyz="0 0 1"/>
  58. </joint>
  59. <joint name="base_to_front_right" type="continuous">
  60. <origin rpy="1.57075  0  0" xyz="0.06  -0.064  -0.011"/>
  61. <parent link="base_link"/>
  62. <child link="tyer_front_right"/>
  63. <axis xyz="0 0 1"/>
  64. </joint>
  65. <joint name="base_to_back_left" 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_back_left"/>
  69. <axis xyz="0 0 1"/>
  70. </joint>
  71. <joint name="base_to_back_right" type="continuous">
  72. <origin rpy="1.57075  0  0" xyz="-0.06  -0.064  -0.011"/>
  73. <parent link="base_link"/>
  74. <child link="tyer_back_right"/>
  75. <axis xyz="0 0 1"/>
  76. </joint>
  77. <link name="pillar_front_left">
  78. <visual>
  79. <geometry>
  80. <cylinder length=".03" radius="0.0025"></cylinder>
  81. </geometry>
  82. <origin xyz="0 0 0.015"/>
  83. <material name="silver">
  84. <color rgba=".86 .86 .86 1"/>
  85. </material>
  86. </visual>
  87. </link>
  88. <link name="pillar_front_right">
  89. <visual>
  90. <geometry>
  91. <cylinder length=".03" radius="0.0025"></cylinder>
  92. </geometry>
  93. <origin xyz="0 0 0.015"/>
  94. <material name="silver">
  95. <color rgba=".86 .86 .86 1"/>
  96. </material>
  97. </visual>
  98. </link>
  99. <link name="pillar_back_left">
  100. <visual>
  101. <geometry>
  102. <cylinder length=".03" radius="0.0025"></cylinder>
  103. </geometry>
  104. <origin xyz="0 0 0.015"/>
  105. <material name="silver">
  106. <color rgba=".86 .86 .86 1"/>
  107. </material>
  108. </visual>
  109. </link>
  110. <link name="pillar_back_right">
  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. <joint name="base_to_pillar_front_left" type="fixed">
  122. <origin xyz="0.13  0.07  0.0015"/>
  123. <parent link="base_link"/>
  124. <child link="pillar_front_left"/>
  125. </joint>
  126. <joint name="base_to_pillar_front_right" type="fixed">
  127. <origin xyz="-0.13  0.07  0.0015"/>
  128. <parent link="base_link"/>
  129. <child link="pillar_front_right"/>
  130. </joint>
  131. <joint name="base_to_pillar_back_left" type="fixed">
  132. <origin xyz="0.13  -0.07  0.0015"/>
  133. <parent link="base_link"/>
  134. <child link="pillar_back_left"/>
  135. </joint>
  136. <joint name="base_to_pillar_back_right" type="fixed">
  137. <origin xyz="-0.13  -0.07  0.0015"/>
  138. <parent link="base_link"/>
  139. <child link="pillar_back_right"/>
  140. </joint>
  141. <link name="top_link">
  142. <visual>
  143. <geometry>
  144. <box size="0.27 .15 .003"/>
  145. </geometry>
  146. <material name="white">
  147. <color rgba="1 1 1 .5"/>
  148. </material>
  149. </visual>
  150. </link>
  151. <joint name="base_to_top" type="fixed">
  152. <origin xyz="0  0  0.03"/>
  153. <parent link="base_link"/>
  154. <child link="top_link"/>
  155. </joint>
  156. </robot>

urdf 学习与制作相关推荐

  1. 学习网页制作中如何在正确选取和使用 CSS 单位

    在 CSS 测量系统中,有好几种单位,如像素.百分比.英寸.厘米等等,Web 开发人员很难了解哪些单位在何处使用,如何使用.很多人习惯了总是使用同一种单位,但这一决定可能会严重限制你的设计的执行. 这 ...

  2. 深度学习数据集制作工作_创建我的第一个深度学习+数据科学工作站

    深度学习数据集制作工作 My Home Setup 我的家庭设置 Creating my workstation has been a dream for me, if nothing else. 创 ...

  3. html css做网页总结,学习CSS制作网页总结的一些经验

    学习CSS制作网页总结的一些经验 互联网   发布时间:2008-10-17 19:28:20   作者:佚名   我要评论 让你使用DIV CSS排版 不是让你用换个标签然后再去按照表格的方式去排版 ...

  4. C#坏习惯:通过不好的例子学习如何制作好的代码——第5部分

    目录 介绍 定义和历史 我如何理解OCP? 我如何理解OCP? 3个级别 当代码关闭时 预测未来和YAGNI 让我们编码 不好的例子 更好的方法 SOLID恰当的结合在一起 更多例子 修改或扩展 什么 ...

  5. C#坏习惯:通过不好的例子学习如何制作好的代码——第4部分

    目录 介绍 没有"一个真正的来源" 它为什么如此重要? 文章的形式 1.吃异常 2.不正确的日志记录 3.重新抛出异常和方法上下文日志记录 4.控制程序流程的异常 全局异常处理 总 ...

  6. C#坏习惯:通过不好的例子学习如何制作好的代码——第3部分

    目录 这篇文章的目标 什么是c#中的静态类? 我们去看看代码 问题 单元测试 未来的变化 如何修复?? !! 第一步 第二步 第三步 第四步 这次改变后我们获得了什么? 单元测试问题--已解决 未来的 ...

  7. C#坏习惯:通过不好的例子学习如何制作好的代码——第2部分

    目录 介绍 这篇文章的目标 Switch case与字典模式 第一个问题 第二个问题 更有力的例子 了解对象的生命周期 有用的字典 每次调用相同的实例 基础(Basic)版本 代码外的配置 在单独的源 ...

  8. C#坏习惯:通过不好的例子学习如何制作好的代码——第1部分

    目录 介绍 类写得那么糟糕...... 1.命名 2.神奇数字      ​ 3.不明显的错误 4.不可读 5.神奇数字--又一次 6.DRY--不要重复自己 7.每类多重责任 重构... I STE ...

  9. urdf转sdf制作模型包

    urdf转sdf制作模型包 0.前言 在gazebo中我们可以将模型包放置于.gazebo/models路径下,在gazebo中可以直接将这些模型包随意拖出来用,非常的方便,本篇将以mini_gaze ...

  10. 由浅入深学习Flash制作高射炮游戏(2)

    [1b]接上篇:[/1b] [url=http://www2.flash8.net/teach/5990.htm][1b]由浅入深学习Flash制作高射炮游戏[/1b][/url] [1b] ,我们来 ...

最新文章

  1. 039_CSS3边框
  2. matlab与quartus的联合数据交换(NCO与文件数据的混频处理)
  3. oracle 存储过程循环体中的return和exit区别:
  4. JavaScript 第二课 JavaScript语法
  5. 矩阵快速幂的学习(系统的学习)
  6. MFC 教程【10_内存分配方式和调试机制 】
  7. 【数据结构和算法】广度优先BFS遍历图(树的层序遍历的拓展)
  8. netbeasn支持php7吗,php7+nginx+netbeans使用debug配置注意
  9. redis 字符串类型原子性实现方案与memcached-cas原子性性能比较
  10. VMware Vsphere 6.0安装部署 总体部署架构
  11. python map对象
  12. Atitit.词法分析的理论原理 part2
  13. ASP.NET中的EnableViewState
  14. 原生android tv 盒子,超强大的安卓7.0电视盒子是什么体验!
  15. 51单片机最小系统及晶振电容的选择
  16. 手机连上电脑热点发现网络不可用,怎么办?
  17. 台式计算机摄像头插哪,台式电脑摄像头怎么调试
  18. echarts pie legend设置 (自定义文本)
  19. BAT蝙蝠视频聊天室(服务器+客户端+架设相关软件)免费提供
  20. 电荷泵负压输出电路,这么简单,我还能不会?

热门文章

  1. effect和watch 的区别详解
  2. make: *** [config-host.mak] Error 1
  3. 全国计算机比赛图片,我校学子获2020年“中国高校计算机大赛-网络技术挑战赛”全国总决赛一等奖(图)-全国文明校园建设网...
  4. 字符串的基本使用规则、推导式和常用的几种模块的应用(代码及简单解释)
  5. 【笔记】MyBatis 大于等于小于等于常用写法
  6. 【续】关于对MSB/LSB写0时的步骤
  7. php中的refresh,PHP mysqli_refresh() 函数用法及示例
  8. 【GLPNet2021】GLOBAL-LOCAL PROPAGATION NETWORK FOR RGB-D SEMANTIC SEGMENTATION
  9. 为什么要处理自然语言? | NLP基础
  10. poj 1284 Primitive Roots 求素数元根数