在上一节博客中我们系统的学习了在ROS环境下机器人3D模型建立的方法,以及通过URDF、RVIZ、Gazebo等组件实现仿真的基本流程。本节博客则将会主要从建立机器人模型出发,介绍URDF文件的具体原理。
- 通过URDF对机器人建模然后放到ROS里面进行仿真与分析
- 把一个URDF文件转换成simscape模型,在Simulink里面进行仿真分析或者控制器设计
- 把simscape模型转化成urdf格式
标签化
正如机器人的构成那样,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 ... >
" link A" />
<child link = "link B" />
joint>
<joint name = "joint B ... >
" link A" />
<child link = "link C" />
joint>
<joint name = "joint C ... >
" link C" />
<child link = "link D" />
joint>
robot>
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>
geometry>
<origin xyz="0 0 0" rpy="0 0 0" />
<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>
注意:机器人的两个部件(分别称之为 parent link 与 child link)以"关节"的形式相连接,joint标签对应的数据在模型中是不可见的
- continuous: 旋转关节,可以绕单轴无限旋转
- revolute: 旋转关节,类似于 continues,但是有旋转角度限制
- prismatic: 滑动关节,沿某一轴线移动的关节,有位置极限
- planer: 平面关节,允许在平面正交方向上平移或旋转
- floating: 浮动关节,允许进行平移、旋转运动
- fixed: 固定关节,不允许运动的特殊关节
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>