【ROS进阶篇】第八讲(上) URDF文件的语法详解
   
     
   
     文章目录
    
    
    
    前言
   
    在上一节博客中我们系统的学习了在ROS环境下机器人3D模型建立的方法,以及通过URDF、RVIZ、Gazebo等组件实现仿真的基本流程。本节博客则将会主要从
    
     建立机器人模型出发,介绍URDF文件的具体原理。
     
     
     
     
     
     
     
    
   
    
    
    一、URDF的基本概念
   
- 概念:全称(United Robotics Description Format)统一机器人描述格式,是一个XML语法框架下用来描述机器人的语言格式,使用方法由以下三种:
- 通过URDF对机器人建模然后放到
ROS里面进行仿真与分析
- 把一个URDF文件
转换成simscape模型,在Simulink里面进行仿真分析或者控制器设计
- 把simscape模型转化成urdf格式
- 
     核心思想:
 
 标签化、XML树状结构、连杆层次结构
 
    
     标签化
    
   
    正如机器人的构成那样,URDF的标签主要可以分为
    
     连杆,即link标签和关节、joint标签
    
    ,而在实际的编程中包含以下多种标签:
   
robot根标签:类似于HTML中的HTML、launch文件中的launch标签,标签内部使用name属性设置名称
link连杆标签:内部包含连杆的质量、惯量属性等
joint标签:内部包含颜色、关节种类等
- gazebo标签:在配置仿真环境,类似于机器人材料属性等时才会使用,这里暂时不予深入介绍
sensor标签:用于描述传感器等
- transmission标签:用于描述关节与驱动器之间的关系
7.model_state标签:用于描述模型当前状态
model标签:用于描述模型运动学参数和动态参数
<robot>
	<link>
		...
	</link>
	<link>
		...
	</link>
	<joint>
		...
	</joint>
</robot>
    
     XML树状结构
    
   
    正如我们先前提到的link和joint属于robot下的子分量,而对于inertial、visual等又属于link下的子标签,geometry、material属于visual下的子标签,通过循环往复,我们就
    
     通过URDF实现了对于机器人的基本组成部分以及各部分基本信息的充分定义
    
    ,再加上对于这些分量的描述,类似于name属性、color属性等,就可以建立起机器人模型的各模块外表和物理属性,结构如下:
   
<robot name = "linkage">
	<link name = "root link">
		<inertial>
			...
		</inertial>
		<visual>
			<geometry>
				...
			</geometry>
			<material>
				<color rgba = "1 0 0 1" />
			</material>
		</visual>
	</link>
	...
</robot>
    
     连杆层次结构
    
   
对于URDF文件来说,各个link通过joint连接,而joint通过父子关系将上下的link连接起来,效果示意如图:
     
   
    要注意的是:
    
     URDF存在着一定的拓扑结构限制,即URDF不能定义一个闭环的连杆模型
    
    ,对于URDF用法就是:
   
- 一个child 只能有一个parent link
- 只有root link(也就是connectivity graph的起源)可以有多个分支
- 一个模型只能由一个root link
     
   
如上图所示,右侧的模型是不能使用URDF文件进行描述的,对于左侧的模型,对应的URDF文件如下:
<parent> and <child> Joint Elements
<robot name = "linkage">
	<joint name = "joint A ... >
		<parent link = "link A" />
		<child link = "link B" />
	</joint>
	<joint name = "joint B ... >
		<parent link = "link A" />
		<child link = "link C" />
	</joint>
	<joint name = "joint C ... >
		<parent link = "link C" />
		<child link = "link D" />
	</joint>
</robot>
    
    
    二、link标签
   
    
    
    1. 标签作用
   
- 
     
 用于描述机器人某个部件(也即刚体部分)的外观和物理属性,比如: 底座、轮子、激光雷达、摄像头…每一个部件都对应一个 link, 在 link 标签内,可以设计该部件的形状、尺寸、颜色、惯性矩阵、碰撞参数等一系列属性
 
     
   
    
    
    2. 子标签
   
    
     1)inertial:连杆的惯性特性
    
   
    
     
      
       \qquad
      
      
       
        
        
        
        
       
      
     
    
    
     ① origin:定义相对于连杆坐标系的惯性系参考坐标,此坐标原点须为连杆重心,坐标轴可与惯性主轴不平行
    
   
\qquad\qquad
1° xyz:表示 x , y , z 方向的偏置,单位为米,默认零向量。
\qquad\qquad
2° rpy:表示坐标轴在RPY方向的偏置,单位为弧度 。
    
     
      
       \qquad
      
      
       
        
        
        
        
       
      
     
    
    
     ② mass:定义连杆的质量属性
    
   
    
     
      
       \qquad
      
      
       
        
        
        
        
       
      
     
    
    
     ③ inertia:表示一个3*3旋转惯性矩阵
    
   
    
     2)visual:连杆的可视化特性,用于指定连杆显示的形状
    
   
    
     
      
       \qquad
      
      
       
        
        
        
        
       
      
     
    
    
     ① namel:连杆几何形状的名称
    
   
    
     
      
       \qquad
      
      
       
        
        
        
        
       
      
     
    
    
     ② origin:相对于连杆坐标系的几何形状坐标系(子元素同上)
    
   
    
     
      
       \qquad
      
      
       
        
        
        
        
       
      
     
    
    
     ③ geometry:可视化对象的形状
    
   
\qquad\qquad
1° box:长方体,元素包含长、宽、高,原点在中心
\qquad\qquad
2° cylinder:圆柱体,元素包含半径、长度,原点在中心
\qquad\qquad
3° sphere:球体,元素包含半径,原点在球心
\qquad\qquad
4° mesh:网格,由本地文件决定,同时提高scale界定边界
    
     
      
       \qquad
      
      
       
        
        
        
        
       
      
     
    
    
     ④ material:可视化组件的材料,可在link标签外定义(引用名称即可)
    
   
\qquad\qquad
1° color:颜色,rgba属性
\qquad\qquad
2° texture:材料属性,由文件决定
    
     3)collision:连杆的碰撞特性,由其定义的几何图形集构成,常用于简化计算
    
   
    
     
      
       \qquad
      
      
       
        
        
        
        
       
      
     
    
    
     ① name:连杆几何形状的名称
    
   
    
     
      
       \qquad
      
      
       
        
        
        
        
       
      
     
    
    
     ② origin:相对于连杆坐标系的碰撞组件坐标系(子元素同上)
    
   
    
     
      
       \qquad
      
      
       
        
        
        
        
       
      
     
    
    
     ③ geometry:可视化对象的形状(子元素同上)
    
   
- 实例如下:
    <link name="base_link">
        <visual>
            <!-- 形状 -->
            <geometry>
                <!-- 长方体的长宽高 -->
                <!-- <box size="0.5 0.3 0.1" /> -->
                <!-- 圆柱,半径和长度 -->
                <!-- <cylinder radius="0.5" length="0.1" /> -->
                <!-- 球体,半径-->
                <!-- <sphere radius="0.3" /> -->
            </geometry>
            <!-- xyz坐标 rpy翻滚俯仰与偏航角度(3.14=180度 1.57=90度) -->
            <origin xyz="0 0 0" rpy="0 0 0" />
            <!-- 颜色: r=red g=green b=blue a=alpha -->
            <material name="black">
                <color rgba="0.7 0.5 0 0.5" />
            </material>
        </visual>
        <collision>
     		 <origin rpy="0 0 0" xyz="-0.065 0 0.0"/>
     		 <geometry>
       			 <mesh filename="package://robot_description/meshes/base_link_simple.DAE"/>
     		 </geometry>
   		 </collision>
    	 <collision_checking>
      		 <origin rpy="0 0 0" xyz="-0.065 0 0.0"/>
     		 <geometry>
        		 <cylinder length="0.7" radius="0.27"/>
      		 </geometry>
   		 </collision_checking>
    	 <inertial>
      		...
    	 </inertial>
    </link>
    
    
    三、joint标签
   
    
    
    1. 标签作用
   
- 
     
 用于描述机器人关节的运动学和动力学属性,指定关节运动的安全极限,不同的关节有不同的运动形式.
 
     
   
    注意:机器人的两个部件(分别称之为 parent link 与 child link)以”关节”的形式相连接,
    
     joint标签对应的数据在模型中是不可见的
    
    
    
    2. 属性
   
- name:关节名称
- type:关节运动形式,具体如下
- continuous: 旋转关节,可以绕单轴无限旋转
- revolute: 旋转关节,类似于 continues,但是有旋转角度限制
- prismatic: 滑动关节,沿某一轴线移动的关节,有位置极限
- planer: 平面关节,允许在平面正交方向上平移或旋转
- floating: 浮动关节,允许进行平移、旋转运动
- fixed: 固定关节,不允许运动的特殊关节
    
    
    3. 子标签
   
    
     1)origin:常用于调整实际模型与理论模型的误差
    
   
    
     
      
       \qquad
      
      
       
        
        
        
        
       
      
     
    
    
     含义:表示从parent link到child link的变换,joint位于child link的原点,修改参数可调整连杆位置(子元素同上)
    
   
    
     2)parent:强制属性
    
   
    
     
      
       \qquad
      
      
       
        
        
        
        
       
      
     
    
    
     link:parent link的名字,是这个link在机器人结构树中的名字。
    
   
    
     3)child:强制属性
    
   
    
     
      
       \qquad
      
      
       
        
        
        
        
       
      
     
    
    
     link:child link的名字,是这个link在机器人结构树中的名字。
    
   
    
     4)axis:旋转轴,位于joint的坐标系中
    
   
    
     
      
       \qquad
      
      
       
        
        
        
        
       
      
     
    
    
     含义:prismatic joint移动的轴,是planar joint的标准平面。这个轴在joint坐标系中被指定。修改该参数可以调整关节的旋转所绕着的轴,常用于调整旋转方向,若模型旋向与实际相反,只需乘-1即可
    
   
    
     
      
       \qquad
      
      
       
        
        
        
        
       
      
     
    
    
     子元素:xyz,代表轴向量的x , y , z分量,为标准化的向量。
    
   
    
     5)calibration:参考点,用于矫正joint绝对位置
    
   
    
     
      
       \qquad
      
      
       
        
        
        
        
       
      
     
    
    
     ① rising:正向运动时触发上升沿
    
   
    
     
      
       \qquad
      
      
       
        
        
        
        
       
      
     
    
    
     ② falling:正向运动时触发下降沿
    
   
    
     6)dynamics:指定物理、建模性能,仿真时重要
    
   
    
     
      
       \qquad
      
      
       
        
        
        
        
       
      
     
    
    
     ① damping:阻尼值,默认为0
    
   
    
     
      
       \qquad
      
      
       
        
        
        
        
       
      
     
    
    
     ② friction:摩擦力值,默认为0
    
   
    
     7)limit:关节运动学约束
    
   
    
     
      
       \qquad
      
      
       
        
        
        
        
       
      
     
    
    
     ① lower:指定关节运动范围下界的属性,默认为0
    
   
    
     
      
       \qquad
      
      
       
        
        
        
        
       
      
     
    
    
     ② upper:指定关节运动范围上界的属性,默认为0
    
   
    
     
      
       \qquad
      
      
       
        
        
        
        
       
      
     
    
    
     ③ effort:指定关节运行时的最大力
    
   
    
     
      
       \qquad
      
      
       
        
        
        
        
       
      
     
    
    
     ④ velocity:指定关节运行最大速度
    
   
    
     8)mimic:指定已定义joint模仿原有关节
    
   
    
     
      
       \qquad
      
      
       
        
        
        
        
       
      
     
    
    
     ① joint:需要模仿的关节名称,关节值计算公式如下:value = multiplier * other_joint_value + offset.
    
   
    
     
      
       \qquad
      
      
       
        
        
        
        
       
      
     
    
    
     ② multiplier:公式中的乘数因子
    
   
    
     
      
       \qquad
      
      
       
        
        
        
        
       
      
     
    
    
     ③ offset:公式中的偏移项
    
   
    
     9)safety_controller:安全控制限制
    
   
    
     
      
       \qquad
      
      
       
        
        
        
        
       
      
     
    
    
     ① soft_lower_limit:指定安全控制边界的下界,为安全控制的起始限制点
    
   
    
     
      
       \qquad
      
      
       
        
        
        
        
       
      
     
    
    
     ② soft_upper_limit:指定安全控制边界的上界,为安全控制的起始限制点
    
   
    
     
      
       \qquad
      
      
       
        
        
        
        
       
      
     
    
    
     ③ k_position:指定位置与速度之间的关系
    
   
    
     
      
       \qquad
      
      
       
        
        
        
        
       
      
     
    
    
     ④ k_velocity:指定力与速度之间的关系
    
   
- 实例如下:
 <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>
    
    
    总结
   
- 
     声明:本节博客部分参考了CSDN用户赵虚左的
 
 ROS教程
 
 ,本篇博客主要针对于URDF的基本语法详解,从各个标签及其下属属性和子标签进行分析研究,在下节博客将会推出对应的URDF实例练习,敬请期待
     
   
 
