ROS学习记录9——urdf文件的创建与使用
Posted 康娜喵
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ROS学习记录9——urdf文件的创建与使用相关的知识,希望对你有一定的参考价值。
零.前言
在学习这一节之前,至少得明白如何创建一个工作空间,如何编译工作空间,如何运行工作空间里的文件(把工作空间的环境目录添加到环境里)。如果有不会的,请看鄙人的ROS学习记录3。
本节默认工作空间已创好,且添加到环境目录中。且基于ubuntu18.04
ROS Melodic
一.URDF的定义
1.1 概念
官方wiki文档地址: urdf/Tutorials
人体骨架是怎样构成的?各块骨头间有关节来使得两块骨头可以旋转。
在美术中,我们构建一个人体是通过如何构建的?用近似圆形的关节
连接椭圆组成的骨骼
。
那么在我们ROS中的URDF文件它也有这两种元素:关节joint
与骨骼link
。
- link定义一个机器人模型的形状。
- joint定义两个link间的连接关系,以及运动方式。
他们之间的关系看起来是这样的:
1.2 创建
urdf
使用xml
语言实现,这是一种标记语言,你可以简单的理解为:<xxx参数开始>xxx参数内容</xxx参数结束>
,通过参数左右的标识,来让其他程序读取某些参数。xml
语言是一种树形结构,也就是某些参数里面,可以包含其他的内容的参数。
那么我们看看一个基础的模型结构:
<robot name="learn_urdf">
<link name="link1" />
<link name="link2" />
<joint name="joint1" type="fixed">
<parent link="link1"/>
<child link="link2"/>
</joint>
</robot>
为了方便观察,我对上述代码做了合理的缩进,当然你写代码的时候也应该养成这种习惯。
- 首先,最外层(未缩进)叫
robot
元素,他的名字是?立花泷learn_urdf
。 - 最外层里面的元素(一重缩进)均为
robot
的子元素,分别是link1
、link2
、joint1
。 joint1
还有一个参数,类型是fixed
,这个后面讲。他有两个子元素(两重缩进),分别是parent
和child
,且该两元素分别指向了一个link
。
所以根据我们学过的生物可以知道,关节的部分组成是:关节头——关节腔——关节窝。
ROS机器人的组成是parent-link
——joint
——child-link
。
现在我们就因该为这个机器人添加更多的细节了。
<?xml version="1.0"?>
<robot name="visualize_urdf">
<link name="base_link">
<visual>
<geometry>
<box size="1 1 1"/>
</geometry>
<origin rpy="0 0 0" xyz="0 0 0"/>
</visual>
</link>
<link name="head">
<visual>
<geometry>
<box size="0.5 0.5 0.5"/>
</geometry>
<origin rpy="0 0 0" xyz="0 0 0.75"/>
</visual>
</link>
<joint name="neck" type="fixed">
<parent link="base_link"/>
<child link="head"/>
</joint>
</robot>
现在,link
里多了一些尺寸参数,后面会讲它们的作用。得益于xml
的特性,我们可以大概知道我们两个link
间的参数含义:
- < visual>可视化,因该是机器人的外观参数
- < geometry>几何学,那因该是机器人的几何(物理尺寸)了
- < origin>起源,虽然不知道是啥,但是后面看起来像坐标,那因该就是该
link
的坐标咯
接下来就是我们通过Rviz来查看机器人了。
1.3 可视化
安装ros新手包(版本不同的需要自己改下述命令的ros版本号):
sudo apt-get install ros-melodic-urdf-tutorial
ros
新手包里为我们写好了一个节点,我们可以直接通过该节点来运行、可视化我们的urdf
首先在任意路径下创建urdf
文件visual.urdf
,写入上一节内容,然后在该目录下运行:
roslaunch urdf_tutorial display.launch model:=visual.urdf
然后就可以看到由两个box构成的机器人了。
二.URDF的进阶选项
好了熟悉了URDF以后,接下来就是URDF各种参数的讲解了。
这里是官方页面:urdf/XML,我只画个表格展示下结构,具体的定义请查询该网页。
2.0 ros中的坐标轴
在ros中,我们的xyz三个距离坐标轴可用右手表示,x是前,y是左,z是上(xyz均为正半轴时):
rpy三个角度坐标表示:
- 绕 X轴 旋转,称之为 横滚角,使用roll表示
- 绕 Y轴 旋转,称之为 俯仰角,使用pitch表示
- 绕 Z轴 旋转,称之为 航向角,使用yaw表示
在Rviz中,红色为x,绿色为y,蓝色为z(xyz均为正)
再补充一下,xyz的单位是米,rpy的单位是弧度,用小数近似代替π。
2.1 base_link
base_link
是极为特殊的一种link
,因为机器人的坐标变换或其他操作等需要指定一个参考点,那么就得规定,每个机器人必须包含一个固定名称的节点。于是产生了base_link
。形如电脑必须要有一个C盘。
该link
与其它link
参数相同,但必须有且仅为一个。
2.2 link
link长这样
<link name="my_link">
<inertial>
<origin xyz="0 0 0.5" rpy="0 0 0"/>
<mass value="1"/>
<inertia ixx="100" ixy="0" ixz="0" iyy="100" iyz="0" izz="100" />
</inertial>
<visual>
<origin xyz="0 0 0" rpy="0 0 0" />
<geometry>
<box size="1 1 1" />
</geometry>
<material name="Cyan">
<color rgba="0 1.0 1.0 1.0"/>
</material>
</visual>
<collision>
<origin xyz="0 0 0" rpy="0 0 0"/>
<geometry>
<cylinder radius="1" length="0.5"/>
</geometry>
</collision>
</link>
表格式:
<link> | name="必须" | ||
<inertial> | <origin> | xyz="0 0 1" | |
rpy="0 0 0" | |||
<mass> | value="1" | ||
<inertia> | ixx="100" ixy="0" ixz="0" iyy="100" iyz="0" izz="100" | ||
<visual> | name="eg.name" | ||
<orgin> | xyz="0 0 1" | ||
rpy="0 0 0" | |||
<geometry> 必须 | <box size= "1 1 1" /> 长 宽 高,原点在中心 | ||
<cylinder size= "1 1" />半径 高,原点在中心 | |||
<sphere size= "1" />半径, 原点在球心 | |||
<mesh> 文件,暂时用不到,除非你会用其他东西建模 | |||
<material name = "可空"/> | <color rgba= "0 1 1 1" /> RGBalpha, 范围[0,1] | ||
<mesh> 文件,暂时用不到,除非你会用其他东西建模 | |||
<collision name = "可空"/> | <origin> | xyz="0 0 1" | |
rpy="0 0 0" | |||
<geometry> | 同上,通过设置比<可视>更简洁的碰撞模型 可以提高仿真的效率 |
2.3 joint
joint长这样
<joint name="my_joint" type="floating">
<origin xyz="0 0 1" rpy="0 0 3.1416"/>
<parent link="link1"/>
<child link="link2"/>
<calibration rising="0.0"/>
<dynamics damping="0.0" friction="0.0"/>
<limit effort="30" velocity="1.0" lower="-2.2" upper="0.7" />
<safety_controller k_velocity="10" k_position="15" soft_lower_limit="-2.0" soft_upper_limit="0.5" />
</joint>
<joint> | name = "必须" | type = "以下六种" revolute:一种沿轴旋转的铰链关节,具有由上下限指定的限制范围 continuous:一种绕轴旋转且没有上下限的连续铰链接头 prismatic:一种沿轴滑动的滑动关节,具有由上下限指定的限制范围 fixed:这不是一个真正的关节,因为它不能移动。所有的自由度都被锁定。这种类型的关节不需要轴,校准,动力学,限制或安全控制器 floating:这个关节允许所有6个自由度的运动 planar:这个关节允许在垂直于轴的平面上运动。 |
<origin xyz="0 0 1" rpy="0 0 0"/> | ||
<parent link="link_name"/> 必须 | ||
<child link="link_name"/> 必须 | ||
<axis xyz="1 0 0"/> 默认1 0 0 | ||
<calibration rising="0.0" falling="0.0"/> 一般不用,具体值看官网 | ||
<dynamics damping="0.0" friction="0.0"/> 用于gazebo仿真 | ||
<limit lower="0.0" upper="0.0" effort(必须)="1" velocity(必须)="1"/> 只有revolute prismatic才是必填,限制一些物理属性 | ||
<safety_controller soft_lower_limit ="0.0" soft_upper_limit ="0.0" k_position="0" k_velocity(必须)="1"/> 指定一些机器人关节的活动 |
三.可活动模型
小tips:关闭rviz或gazebo这些带界面的工具时,彻底退出因该在终端里使用ctrl-c去关闭,而不是点击窗口的x,则否会出现节点关闭失败,无法重新运行的情况
根据刚才学到的一些细节,我们创建一个可以活动的迫击炮模型:
gedit mortar.urdf
roslaunch urdf_tutorial display.launch model:=mortar.urdf
<?xml version="1.0"?>
<robot name="mortar_urdf">
<link name="base_link">
<visual>
<geometry>
<box size="0.8 1 0.2"/>
</geometry>
<origin xyz="0 0 0" rpy="0.2 0 0"/>
<material name="yellow">
<color rgba="0.5 0.5 0.5 1"/>
</material>
</visual>
</link>
<link name="barrel">
<visual>
<geometry>
<cylinder radius="0.05" length="0.8"/>
</geometry>
<origin xyz="0.2 0 0.225" rpy="0 1.57 0"/>
<material name="yellow">
<color rgba="0.7 0.2 0.5 1"/>
</material>
</visual>
</link>
<link name="wheel_left">
<visual>
<geometry>
<cylinder radius="0.2" length="0.1"/>
</geometry>
<origin xyz="0 0 0" rpy="0 -1.57 0"/>
</visual>
</link>
<link name="wheel_right">
<visual>
<geometry>
<cylinder radius="0.2" length="0.1"/>
</geometry>
<origin xyz="0 0 0" rpy="0 1.57 0"/>
</visual>
</link>
<joint name="neck" type="prismatic">
<origin xyz="0 0.4 0" rpy="0 -0.2 1.57"/>
<limit effort="30" velocity="1.0" lower="-0.2" upper="0" />
<parent link="base_link"/>
<child link="barrel"/>
</joint>
<joint name="axis_left" type="continuous">
<origin xyz="0.45 0.2 0" rpy="0 0 0"/>
<parent link="base_link"/>
<child link="wheel_left"/>
</joint>
<joint name="axis_right" type="continuous">
<origin xyz="-0.45 0.2 0" rpy="0 0 0"/>
<parent link="base_link"/>
<child link="wheel_right"/>
</joint>
</robot>
通过调节关节的运动状态,可以伸缩枪管和转动左右轮:
四.总结
至此,urdf
的基础已经很透彻了,接下来会讲roslaunch
的使用,urdf
更高级的传感器用法——雷达、摄像头。
以上是关于ROS学习记录9——urdf文件的创建与使用的主要内容,如果未能解决你的问题,请参考以下文章
Robot Operating System (ROS)学习笔记2---使用smartcar进行仿真
ROS学习记录13SLAM仿真学习2——创建一个包含LidarCameraIMU的Ackman小车