零.前言

在学习这一节之前,至少得明白如何创建一个工作空间,如何编译工作空间,如何运行工作空间里的文件(把工作空间的环境目录添加到环境里)。如果有不会的,请看鄙人的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的子元素,分别是link1link2joint1
  • joint1还有一个参数,类型是fixed,这个后面讲。他有两个子元素(两重缩进),分别是parentchild,且该两元素分别指向了一个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"/> 指定一些机器人关节的活动
joint的参数细节并不好说明,最好去wiki上查看这些说明与例子。

三.可活动模型

小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更高级的传感器用法——雷达、摄像头。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐