urdf 学习与制作
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
- <span style="font-size:18px;">$ catkin_create_pkg sp1s std_msgs rospy roscpp urdf
- $ cd sp1s/
- $ mkdir urdf</span>
catkin_create_pkg最后一个参数是引入urdf 库。创建urdf目录存放urdf文件。
**必须已经创建好了一个workspace的情况下,使用该命令创建package.
4. 创建lauch文件启动Rviz
创建目录launch并新建文件dispaly.launch 建立好urdf文件后就使用该文件launch
- <launch>
- <arg name="model" />
- <arg name="gui" default="False" />
- <param name="robot_description" textfile="$(arg model)" />
- <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 urdf_tutorial)/urdf.rviz" required="true" />
- </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,描述代码如下:
- <pre name="code" class="html"><span style="font-size:18px;"><?xml version="1.0"?>
- <robot name="sp1s">
- <link name="base_link">
- <visual>
- <geometry>
- <box size="0.27 .15 .003"/>
- </geometry>
- <material name="white">
- <color rgba="1 1 1 .5"/>
- </material>
- </visual>
- </link>
- </robot></span>
link可以指定许多属性:
- <inertial> 定义惯性
- <visual> 定义一个link的外观,大小,颜色和材质纹理贴图
- <collision>定义碰撞检测属性
我们详细看一下<visual>的定义:
- <geometry> 定义了几何形状为一个立方体,三个参数分别为长宽高,单位是米(m). 这里我们指定下层小车板子的板的尺寸。<geometry>可以有好几个选项:<box> 立方体 <cylinder>圆柱体 <sphere>球体
- <material> 指定颜色rgb和透明度a. 它们取值范围都是[0,1] 区间。
使用下面命令启动RViz来查看我们刚刚完成的机器人模型:
- 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. 先以一个轮子为例:
- <span style="font-size:18px;"><?xml version="1.0"?>
- <robot name="sp1s">
- <link name="base_link">
- <visual>
- <geometry>
- <box size="0.27 .15 .003"/>
- </geometry>
- <material name="white">
- <color rgba="1 1 1 .5"/>
- </material>
- </visual>
- </link>
- <link name="tyer_front_left">
- <visual>
- <geometry>
- <cylinder length=".025" radius="0.034"></cylinder>
- </geometry>
- <material name="yellow">
- <color rgba="1 1 0 1"/>
- </material>
- </visual>
- </link>
- <joint name="base_to_front_left" type="fixed">
- <parent link="base_link"/>
- <child link="tyer_front_left"/>
- </joint>
- </robot>
- </span>
- 定义黄色的轮子tyer_front_left
- 添加了一个关节 joint将base_link和tyer_front_left关联在一起,为了简单将joint定义为fixed类型。下一篇文章里将会改成continuous,并详细解释joint的作用
- 两个及以上的link定义到一个文件里必须使用joint关联,否则出错
- <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
- <span style="font-size:18px;"><?xml version="1.0"?>
- <robot name="sp1s">
- <link name="base_link">
- <visual>
- <geometry>
- <box size="0.27 .15 .003"/>
- </geometry>
- <material name="white">
- <color rgba="1 1 1 .5"/>
- </material>
- </visual>
- </link>
- <link name="front_left">
- <visual>
- <geometry>
- <cylinder length=".025" radius="0.034"></cylinder>
- </geometry>
- <material name="yellow">
- <color rgba="1 1 0 1"/>
- </material>
- </visual>
- </link>
- <joint name="base_to_front_left" type="<span style="color:#FF0000;"><strong>continuous</strong></span>">
- <origin rpy="1.57075 0 0" xyz="0.06 0.064 -0.011"/>
- <parent link="base_link"/>
- <child link="front_left"/>
- <axis xyz="0 0 1"/>
- </joint>
- </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正负值的调整
- <span style="font-size:18px;"><?xml version="1.0"?>
- <robot name="sp1s">
- <link name="base_link">
- <visual>
- <geometry>
- <box size="0.27 .15 .003"/>
- </geometry>
- <material name="white">
- <color rgba="1 1 1 .5"/>
- </material>
- </visual>
- </link>
- <link name="tyer_front_left">
- <visual>
- <geometry>
- <cylinder length=".025" radius="0.034"></cylinder>
- </geometry>
- <material name="yellow">
- <color rgba="1 1 0 1"/>
- </material>
- </visual>
- </link>
- <link name="tyer_front_right">
- <visual>
- <geometry>
- <cylinder length=".025" radius="0.034"></cylinder>
- </geometry>
- <material name="yellow">
- <color rgba="1 1 0 1"/>
- </material>
- </visual>
- </link>
- <link name="tyer_back_left">
- <visual>
- <geometry>
- <cylinder length=".025" radius="0.034"></cylinder>
- </geometry>
- <material name="yellow">
- <color rgba="1 1 0 1"/>
- </material>
- </visual>
- </link>
- <link name="tyer_back_right">
- <visual>
- <geometry>
- <cylinder length=".025" radius="0.034"></cylinder>
- </geometry>
- <material name="yellow">
- <color rgba="1 1 0 1"/>
- </material>
- </visual>
- </link>
- <joint name="base_to_front_left" type="continuous">
- <origin rpy="1.57075 0 0" xyz="0.06 0.064 -0.011"/>
- <parent link="base_link"/>
- <child link="tyer_front_left"/>
- <axis xyz="0 0 1"/>
- </joint>
- <joint name="base_to_front_right" type="continuous">
- <origin rpy="1.57075 0 0" xyz="0.06 -0.064 -0.011"/>
- <parent link="base_link"/>
- <child link="tyer_front_right"/>
- <axis xyz="0 0 1"/>
- </joint>
- <joint name="base_to_back_left" type="continuous">
- <origin rpy="1.57075 0 0" xyz="-0.06 0.064 -0.011"/>
- <parent link="base_link"/>
- <child link="tyer_back_left"/>
- <axis xyz="0 0 1"/>
- </joint>
- <joint name="base_to_back_right" type="continuous">
- <origin rpy="1.57075 0 0" xyz="-0.06 -0.064 -0.011"/>
- <parent link="base_link"/>
- <child link="tyer_back_right"/>
- <axis xyz="0 0 1"/>
- </joint>
- </robot>
- </span>
三 添加四个柱子
上下层的四个角上是高3cm的柱子. 在上面urdf的基础上再添加下面的内容添加一个左前方的柱子。
- <span style="font-size:18px;"> <link name="pillar_front_left">
- <visual>
- <geometry>
- <cylinder length=".03" radius="0.0025"></cylinder>
- </geometry>
- <origin xyz="0 0 0.015"/>
- <material name="silver">
- <color rgba=".86 .86 .86 1"/>
- </material>
- </visual>
- </link>
- <joint name="base_to_pillar_front_left" type="fixed">
- <origin xyz="0.13 0.07 0.0015"/>
- <parent link="base_link"/>
- <child link="pillar_front_left"/>
- </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。
- <link name="top_link">
- <visual>
- <geometry>
- <box size="0.27 .15 .003"/>
- </geometry>
- <material name="white">
- <color rgba="1 1 1 .5"/>
- </material>
- </visual>
- </link>
- <joint name="base_to_top" type="fixed">
- <origin xyz="0 0 0.03"/>
- <parent link="base_link"/>
- <child link="top_link"/>
- </joint>
五 完整的urdf
- <?xml version="1.0"?>
- <robot name="sp1s">
- <link name="base_link">
- <visual>
- <geometry>
- <box size="0.27 .15 .003"/>
- </geometry>
- <material name="white">
- <color rgba="1 1 1 .5"/>
- </material>
- </visual>
- </link>
- <link name="tyer_front_left">
- <visual>
- <geometry>
- <cylinder length=".025" radius="0.034"></cylinder>
- </geometry>
- <material name="yellow">
- <color rgba="1 1 0 1"/>
- </material>
- </visual>
- </link>
- <link name="tyer_front_right">
- <visual>
- <geometry>
- <cylinder length=".025" radius="0.034"></cylinder>
- </geometry>
- <material name="yellow">
- <color rgba="1 1 0 1"/>
- </material>
- </visual>
- </link>
- <link name="tyer_back_left">
- <visual>
- <geometry>
- <cylinder length=".025" radius="0.034"></cylinder>
- </geometry>
- <material name="yellow">
- <color rgba="1 1 0 1"/>
- </material>
- </visual>
- </link>
- <link name="tyer_back_right">
- <visual>
- <geometry>
- <cylinder length=".025" radius="0.034"></cylinder>
- </geometry>
- <material name="yellow">
- <color rgba="1 1 0 1"/>
- </material>
- </visual>
- </link>
- <joint name="base_to_front_left" type="continuous">
- <origin rpy="1.57075 0 0" xyz="0.06 0.064 -0.011"/>
- <parent link="base_link"/>
- <child link="tyer_front_left"/>
- <axis xyz="0 0 1"/>
- </joint>
- <joint name="base_to_front_right" type="continuous">
- <origin rpy="1.57075 0 0" xyz="0.06 -0.064 -0.011"/>
- <parent link="base_link"/>
- <child link="tyer_front_right"/>
- <axis xyz="0 0 1"/>
- </joint>
- <joint name="base_to_back_left" type="continuous">
- <origin rpy="1.57075 0 0" xyz="-0.06 0.064 -0.011"/>
- <parent link="base_link"/>
- <child link="tyer_back_left"/>
- <axis xyz="0 0 1"/>
- </joint>
- <joint name="base_to_back_right" type="continuous">
- <origin rpy="1.57075 0 0" xyz="-0.06 -0.064 -0.011"/>
- <parent link="base_link"/>
- <child link="tyer_back_right"/>
- <axis xyz="0 0 1"/>
- </joint>
- <link name="pillar_front_left">
- <visual>
- <geometry>
- <cylinder length=".03" radius="0.0025"></cylinder>
- </geometry>
- <origin xyz="0 0 0.015"/>
- <material name="silver">
- <color rgba=".86 .86 .86 1"/>
- </material>
- </visual>
- </link>
- <link name="pillar_front_right">
- <visual>
- <geometry>
- <cylinder length=".03" radius="0.0025"></cylinder>
- </geometry>
- <origin xyz="0 0 0.015"/>
- <material name="silver">
- <color rgba=".86 .86 .86 1"/>
- </material>
- </visual>
- </link>
- <link name="pillar_back_left">
- <visual>
- <geometry>
- <cylinder length=".03" radius="0.0025"></cylinder>
- </geometry>
- <origin xyz="0 0 0.015"/>
- <material name="silver">
- <color rgba=".86 .86 .86 1"/>
- </material>
- </visual>
- </link>
- <link name="pillar_back_right">
- <visual>
- <geometry>
- <cylinder length=".03" radius="0.0025"></cylinder>
- </geometry>
- <origin xyz="0 0 0.015"/>
- <material name="silver">
- <color rgba=".86 .86 .86 1"/>
- </material>
- </visual>
- </link>
- <joint name="base_to_pillar_front_left" type="fixed">
- <origin xyz="0.13 0.07 0.0015"/>
- <parent link="base_link"/>
- <child link="pillar_front_left"/>
- </joint>
- <joint name="base_to_pillar_front_right" type="fixed">
- <origin xyz="-0.13 0.07 0.0015"/>
- <parent link="base_link"/>
- <child link="pillar_front_right"/>
- </joint>
- <joint name="base_to_pillar_back_left" type="fixed">
- <origin xyz="0.13 -0.07 0.0015"/>
- <parent link="base_link"/>
- <child link="pillar_back_left"/>
- </joint>
- <joint name="base_to_pillar_back_right" type="fixed">
- <origin xyz="-0.13 -0.07 0.0015"/>
- <parent link="base_link"/>
- <child link="pillar_back_right"/>
- </joint>
- <link name="top_link">
- <visual>
- <geometry>
- <box size="0.27 .15 .003"/>
- </geometry>
- <material name="white">
- <color rgba="1 1 1 .5"/>
- </material>
- </visual>
- </link>
- <joint name="base_to_top" type="fixed">
- <origin xyz="0 0 0.03"/>
- <parent link="base_link"/>
- <child link="top_link"/>
- </joint>
- </robot>
urdf 学习与制作相关推荐
- 学习网页制作中如何在正确选取和使用 CSS 单位
在 CSS 测量系统中,有好几种单位,如像素.百分比.英寸.厘米等等,Web 开发人员很难了解哪些单位在何处使用,如何使用.很多人习惯了总是使用同一种单位,但这一决定可能会严重限制你的设计的执行. 这 ...
- 深度学习数据集制作工作_创建我的第一个深度学习+数据科学工作站
深度学习数据集制作工作 My Home Setup 我的家庭设置 Creating my workstation has been a dream for me, if nothing else. 创 ...
- html css做网页总结,学习CSS制作网页总结的一些经验
学习CSS制作网页总结的一些经验 互联网 发布时间:2008-10-17 19:28:20 作者:佚名 我要评论 让你使用DIV CSS排版 不是让你用换个标签然后再去按照表格的方式去排版 ...
- C#坏习惯:通过不好的例子学习如何制作好的代码——第5部分
目录 介绍 定义和历史 我如何理解OCP? 我如何理解OCP? 3个级别 当代码关闭时 预测未来和YAGNI 让我们编码 不好的例子 更好的方法 SOLID恰当的结合在一起 更多例子 修改或扩展 什么 ...
- C#坏习惯:通过不好的例子学习如何制作好的代码——第4部分
目录 介绍 没有"一个真正的来源" 它为什么如此重要? 文章的形式 1.吃异常 2.不正确的日志记录 3.重新抛出异常和方法上下文日志记录 4.控制程序流程的异常 全局异常处理 总 ...
- C#坏习惯:通过不好的例子学习如何制作好的代码——第3部分
目录 这篇文章的目标 什么是c#中的静态类? 我们去看看代码 问题 单元测试 未来的变化 如何修复?? !! 第一步 第二步 第三步 第四步 这次改变后我们获得了什么? 单元测试问题--已解决 未来的 ...
- C#坏习惯:通过不好的例子学习如何制作好的代码——第2部分
目录 介绍 这篇文章的目标 Switch case与字典模式 第一个问题 第二个问题 更有力的例子 了解对象的生命周期 有用的字典 每次调用相同的实例 基础(Basic)版本 代码外的配置 在单独的源 ...
- C#坏习惯:通过不好的例子学习如何制作好的代码——第1部分
目录 介绍 类写得那么糟糕...... 1.命名 2.神奇数字 3.不明显的错误 4.不可读 5.神奇数字--又一次 6.DRY--不要重复自己 7.每类多重责任 重构... I STE ...
- urdf转sdf制作模型包
urdf转sdf制作模型包 0.前言 在gazebo中我们可以将模型包放置于.gazebo/models路径下,在gazebo中可以直接将这些模型包随意拖出来用,非常的方便,本篇将以mini_gaze ...
- 由浅入深学习Flash制作高射炮游戏(2)
[1b]接上篇:[/1b] [url=http://www2.flash8.net/teach/5990.htm][1b]由浅入深学习Flash制作高射炮游戏[/1b][/url] [1b] ,我们来 ...
最新文章
- 039_CSS3边框
- matlab与quartus的联合数据交换(NCO与文件数据的混频处理)
- oracle 存储过程循环体中的return和exit区别:
- JavaScript 第二课 JavaScript语法
- 矩阵快速幂的学习(系统的学习)
- MFC 教程【10_内存分配方式和调试机制 】
- 【数据结构和算法】广度优先BFS遍历图(树的层序遍历的拓展)
- netbeasn支持php7吗,php7+nginx+netbeans使用debug配置注意
- redis 字符串类型原子性实现方案与memcached-cas原子性性能比较
- VMware Vsphere 6.0安装部署 总体部署架构
- python map对象
- Atitit.词法分析的理论原理 part2
- ASP.NET中的EnableViewState
- 原生android tv 盒子,超强大的安卓7.0电视盒子是什么体验!
- 51单片机最小系统及晶振电容的选择
- 手机连上电脑热点发现网络不可用,怎么办?
- 台式计算机摄像头插哪,台式电脑摄像头怎么调试
- echarts pie legend设置 (自定义文本)
- BAT蝙蝠视频聊天室(服务器+客户端+架设相关软件)免费提供
- 电荷泵负压输出电路,这么简单,我还能不会?
热门文章
- effect和watch 的区别详解
- make: *** [config-host.mak] Error 1
- 全国计算机比赛图片,我校学子获2020年“中国高校计算机大赛-网络技术挑战赛”全国总决赛一等奖(图)-全国文明校园建设网...
- 字符串的基本使用规则、推导式和常用的几种模块的应用(代码及简单解释)
- 【笔记】MyBatis 大于等于小于等于常用写法
- 【续】关于对MSB/LSB写0时的步骤
- php中的refresh,PHP mysqli_refresh() 函数用法及示例
- 【GLPNet2021】GLOBAL-LOCAL PROPAGATION NETWORK FOR RGB-D SEMANTIC SEGMENTATION
- 为什么要处理自然语言? | NLP基础
- poj 1284 Primitive Roots 求素数元根数