URDF(Universal Robot Description Format):通用机器人描述格式,包含的内容有:连杆、关节,运动学和动力学参数、可视化模型、碰撞检测模型等。
父子关系树:连杆link1 --> 关节joint1 --> 连杆link2 --> 关节joint2 ·····
下一个连杆/关节的位置是相对上一个连杆/关节描述的,形成一个位姿关系链,比如改动关节joint1的位姿,则关节joint1后面的所有连杆和关节的位姿都随之改变。
一、连杆:描述具有惯性、视觉特征和碰撞特性的刚体。
连杆属性:名称
name (必选参数):连杆的名称
连杆元素:
1、<inertial> (可选:默认为零质量和零惯性):连杆的质量、重心位置及其相对于质心的惯性张量。
<origin> (可选:默认为identity):这个参数(平移、旋转)描述了连杆的质心坐标系C相对于连杆坐标系L的位置xyz和方向rpy。
xyz (可选:默认为零向量):表示从Lo(连杆坐标系原点)到Co(连杆的质心)的位置向量x=L̂x + y L̂y + z L̂z,其中L̂x, L̂y, L̂z是连杆坐标系L的正交单位向量。
rpy (可选:默认为标识):表示C的单位向量Ĉx, Ĉy, Ĉz相对于连杆坐标系L的方向,表示为以弧度为单位的欧拉旋转序列(rpy)。Ĉx, Ĉy, Ĉz不需要与连杆的主轴惯性对齐。
<mass>:连杆的质量kg
<inertia>:惯性张量(在连杆质心坐标系下表达)。
2、<visual>(可选参数):连杆的视觉特征。指定对象(长方体、圆柱体等)的形状以便可视化。对于同一个连杆,可以存在多个<visual>标记的实例,他们定义的几何图形的并集作为连杆的视觉表示。
3、<collision> (可选):连杆的碰撞特性。与连杆的视觉特征不一定是相同的,通常使用更简单的碰撞模型来减少计算时间。同一连杆可以存在多个<collision>标签实例,它们定义的几何图形的并集作为连杆的碰撞表示。
二、关节:joint,描述了关节的运动学和动力学,还指定了关节的安全极限。
关节属性:名称和类型
name (required):指定关节的唯一名称
type (required):指定运动类型,可以是以下类型之一:
- revolute-沿轴旋转的铰链关节,即转动关节,具有由上限和下限指定的有限范围。
- continuous-绕轴旋转的连续铰链关节,即转动关节,没有上限和下限。
- prismatic-沿轴滑动的滑动关节,即平动关节,具有由上限和下限指定的有限范围。
- fixed-这不是真正的关节,因为它不能移动。即固定关节,所有自由度都被锁定。这种类型的关节不需要<axis>、<calibration>、<dynamics>、<limits>或<safety_controller>参数。
- floating-浮动关节,此关节允许所有6个自由度的运动。
- planar-平面关节,该关节允许在垂直于轴线的平面内运动。
三、导出URDF文件:
1、添加基准轴
菜单栏:插入 --> 参考几何体 --> 基准轴
① 选择某个零件的边线/轴作为基准轴
② 选择两个相交平面的相交线作为基准轴
③ 选择两个点构成的直线作为基准轴
④ 选择圆柱/圆锥的中轴线作为基准轴
⑤ 选择点垂直于面的线作为基准轴
注:基准轴就是关节旋转/移动的参考轴线,建立的基准轴/坐标系等最好重新命名成全英文的名称
2、添加点
3、添加坐标系
提前在放置坐标系的地方添加一个点 --> 装配体 --> 参考几何体 --> 坐标系 --> 调整坐标轴的方向。
4、插件安装
下载插件:solidworks_urdf_exporter
Releases · ros/solidworks_urdf_exporter · GitHub
下载对应solidworks版本的exe文件,直接安装就可以了。
四、生成Link和Joint
1、打开插件
工具 --> Tools --> Export as URDF,或直接在右上角搜索框输入urdf。
2、设置连杆父子关系
base_link是整个机器人的根连杆,整个机器人的运动参考坐标系就建立在base_link上。输入与base_link相连的link的个数,下方会创建Empty_link,单击Empty_link对Empty_link进行设置,右键可以移除Empty_link或创建Child Link。根据机器人各连杆的运动关系建立连杆的父子关系树,并依次对每个link进行设置。
注意:
在点击Preview and Export之前,所有操作都不会保存。Link / Joint的名称可以由字母、下划线、数字组成,但是开头需要是英文字母。
关节类型Joint Type说明:
- continuous:旋转关节,可以绕轴无限旋转,无位置限制;
- revolute:旋转关节,可设定转动范围;
- prismatic:滑动关节,可以沿某一轴线移动,有位置限制;
- fixed:固定关节,不可运动;
- planar:平面关节,允许在垂直于轴的平面内运动(3自由度:平移+旋转),想在哪个平面内运动就将垂直于该平面的轴设置为1。
- floating:六自由度关节,可以沿着三轴平移、旋转。
3、设置连杆和关节参数
单击 Preview and Export --> 进入参数配置界面,配置好后 --> Next
注意:
弹出Exporter对话框前不要做任何操作,等待转化完成。如果转化终止,重新打开urdf插件,并单击Preview and Export。
(1)关节参数设置
在关节参数配置对话框可以重新设置之前的一些参数,确定关节类型和关节轴是否正确(包括方向,右手定则)。
Limit参数:lower和upper是以模型的初始姿态作度量的,且在continuous模式下设置Limit参数是无效的。
lower:关节运动范围的下限
upper:关节运动范围的上限
effort:最大关节力/力矩
velocity:最大速度
转动关节单位为:rad、N/m、rad/s
移动关节单位为:m、N、m/s
Axis参数:插件会把某些轴定义成-1,如果自定义的坐标系没有问题的话,需要改成1,否则转动或移动的方向会与你定义的方向相反。
(2)连杆参数设置
Next --> 设置好连杆参数后 --> Export URDF and Meshes... --> 保存
注意:
1、保存时不要修改名称,采用默认的,不然会因为找不到文件保错。
2、urdf文件配置好后会随模型文件一起保存着,可以随时修改导出。
3、RGBA 即红色、绿色、蓝色、透明度(英语:Red, Green, Blue、Alpha)。
红色(R):取值0 到 1 之间,代表颜色中的红色成分。
绿色(G):取值0 到 1 之间,代表颜色中的绿色成分。
蓝色(B):取值0 到 1 之间,代表颜色中的蓝色成分。
透明度(A):取值 0~1 之间, 代表透明度。
4、验证URDF文件
Ubuntu18.04:在终端
直接在存放.urdf文件的文件夹右键打开终端或cd到存放.urdf文件的文件夹:cd /mnt/hgfs/虚拟机/PaddleRobotics-main/QuadrupedalRobots/ETGRL/MMF/BigCat/urdf
在终端输入命令:
安装插件:
sudo apt-get install liburdfdom-tools
sudo apt install graphviz
语法检查:
check_urdf BigCat.urdf
结构查看、图形化显示URDF模型:
urdf_to_graphiz BigCat.urdf # 会生成.gv和.pdf文件,打开pdf文件
5、MATLAB可视化
robot=importrobot("RM65-B-3.urdf")
show(robot);
6、RVIZ可视化
安装roslaunch:sudo apt install python-roslaunch
在 launch 文件中集成 URDF 与 Rviz
用ubuntu默认的编辑器gedit创建一个launch文件:gedit panda5.launch
启动launch文件:roslaunch jubot_demo display_jubot_base_urdf.launch
roslaunch panda5 panda5.launch
启动rviz:rviz
一个urdf可视化网站:https://mymodelrobot.appspot.com/5629499534213120
?xml 这里是申明文件类型,这申明的是XML文件;version="1.0"定义XML文件类型的版本,encoding="UTF-8" 定义XML文件的语言编码。
<?xml version="1.0" encoding="utf-8"?>
<!-- This URDF was automatically created by SolidWorks to URDF Exporter! Originally created by Stephen Brawner (brawner@gmail.com)
Commit Version: 1.6.0-4-g7f85cfe Build Version: 1.6.7995.38578
For more information, please see http://wiki.ros.org/sw_urdf_exporter -->
在最顶层“robot”元素中、“link”对象之外指定材质元素,然后在连杆中按名称引用材质。
<robot
name="RM65-B-3">
<link
name="base_link">
<inertial>
<origin
xyz="-3.32860491769144E-05 0.0605056293060711 -0.000429298636761367"
rpy="0 0 0" />
<mass
value="0.847617283552053" />
<inertia
ixx="0.00174804822368135"
ixy="1.68361305215697E-06"
ixz="2.50097399709207E-06"
iyy="0.000909998560984007"
iyz="-3.68773281686804E-05"
izz="0.00176435875694909" />
</inertial>
<visual>
<origin
xyz="0 0 0"
rpy="0 0 0" />
<geometry>
<mesh
filename="package://RM65-B-3/meshes/base_link.STL" />
</geometry>
<material
name="">
<color
rgba="1 1 1 1" />
</material>
</visual>
<collision>
<origin
xyz="0 0 0"
rpy="0 0 0" />
<geometry>
<mesh
filename="package://RM65-B-3/meshes/base_link.STL" />
</geometry>
</collision>
</link>
<link
name="shoulder_3_1_link">
<inertial>
<origin
xyz="-0.021048 0.06982 0.0015711"
rpy="0 0 0" />
<mass
value="0.59292" />
<inertia
ixx="0.0011733"
ixy="0.00020649"
ixz="6.0734E-06"
iyy="0.00056101"
iyz="-1.5445E-05"
izz="0.0012567" />
</inertial>
<visual>
<origin
xyz="0 0 0"
rpy="0 0 0" />
<geometry>
<mesh
filename="package://RM65-B-3/meshes/shoulder_3_1_link.STL" />
</geometry>
<material
name="">
<color
rgba="1 1 1 1" />
</material>
</visual>
<collision>
<origin
xyz="0 0 0"
rpy="0 0 0" />
<geometry>
<mesh
filename="package://RM65-B-3/meshes/shoulder_3_1_link.STL" />
</geometry>
</collision>
</link>
<joint
name="shoulder_3_1_joint"
type="revolute">
<origin
xyz="0 0.1455 0"
rpy="0 0 0" />
<parent
link="base_link" />
<child
link="shoulder_3_1_link" />
<axis
xyz="0 -1 0" />
<limit
lower="-3.14"
upper="3.14"
effort="0"
velocity="0" />
</joint>
<link
name="shoulder_3_2_link">
<inertial>
<origin
xyz="0.0021142 0.073057 -0.010762"
rpy="0 0 0" />
<mass
value="0.45055" />
<inertia
ixx="0.0013248"
ixy="0.00030275"
ixz="-4.0729E-05"
iyy="0.00034715"
iyz="0.00012469"
izz="0.0013513" />
</inertial>
<visual>
<origin
xyz="0 0 0"
rpy="0 0 0" />
<geometry>
<mesh
filename="package://RM65-B-3/meshes/shoulder_3_2_link.STL" />
</geometry>
<material
name="">
<color
rgba="1 1 1 1" />
</material>
</visual>
<collision>
<origin
xyz="0 0 0"
rpy="0 0 0" />
<geometry>
<mesh
filename="package://RM65-B-3/meshes/shoulder_3_2_link.STL" />
</geometry>
</collision>
</link>
<joint
name="shoulder_3_2_joint"
type="revolute">
<origin
xyz="0.0082134 0.094696 -0.00060499"
rpy="0 0 0" />
<parent
link="shoulder_3_1_link" />
<child
link="shoulder_3_2_link" />
<axis
xyz="0.99725 0 -0.074088" />
<limit
lower="-2.26"
upper="2.26"
effort="0"
velocity="0" />
</joint>
<link
name="elbow_3_1_link">
<inertial>
<origin
xyz="0.021592 0.067858 -0.010316"
rpy="0 0 0" />
<mass
value="0.44998" />
<inertia
ixx="0.00080054"
ixy="-0.00014403"
ixz="2.2628E-05"
iyy="0.0003489"
iyz="7.9099E-05"
izz="0.00085949" />
</inertial>
<visual>
<origin
xyz="0 0 0"
rpy="0 0 0" />
<geometry>
<mesh
filename="package://RM65-B-3/meshes/elbow_3_1_link.STL" />
</geometry>
<material
name="">
<color
rgba="1 1 1 1" />
</material>
</visual>
<collision>
<origin
xyz="0 0 0"
rpy="0 0 0" />
<geometry>
<mesh
filename="package://RM65-B-3/meshes/elbow_3_1_link.STL" />
</geometry>
</collision>
</link>
<joint
name="elbow_3_1_joint"
type="revolute">
<origin
xyz="-0.010208 0.15737 -0.021997"
rpy="0 0 0" />
<parent
link="shoulder_3_2_link" />
<child
link="elbow_3_1_link" />
<axis
xyz="-0.010885 0.98976 -0.14229" />
<limit
lower="-2.35"
upper="2.35"
effort="0"
velocity="0" />
</joint>
<link
name="elbow_3_2_link">
<inertial>
<origin
xyz="-0.0040394 0.058762 0.0093249"
rpy="0 0 0" />
<mass
value="0.27546" />
<inertia
ixx="0.00055693"
ixy="-0.00013414"
ixz="-2.0423E-05"
iyy="0.00015836"
iyz="-6.2401E-05"
izz="0.00057079" />
</inertial>
<visual>
<origin
xyz="0 0 0"
rpy="0 0 0" />
<geometry>
<mesh
filename="package://RM65-B-3/meshes/elbow_3_2_link.STL" />
</geometry>
<material
name="">
<color
rgba="1 1 1 1" />
</material>
</visual>
<collision>
<origin
xyz="0 0 0"
rpy="0 0 0" />
<geometry>
<mesh
filename="package://RM65-B-3/meshes/elbow_3_2_link.STL" />
</geometry>
</collision>
</link>
<joint
name="elbow_3_2_joint"
type="revolute">
<origin
xyz="-0.0075547 0.09573 -0.013549"
rpy="0 0 0" />
<parent
link="elbow_3_1_link" />
<child
link="elbow_3_2_link" />
<axis
xyz="0.99959 0.0070053 -0.027737" />
<limit
lower="-3.14"
upper="3.14"
effort="0"
velocity="0" />
</joint>
<link
name="wrist_3_1_link">
<inertial>
<origin
xyz="-0.01883 0.054906 0.0075269"
rpy="0 0 0" />
<mass
value="0.23223" />
<inertia
ixx="0.00024711"
ixy="4.2585E-05"
ixz="5.4744E-06"
iyy="0.00011652"
iyz="-2.1292E-05"
izz="0.00026486" />
</inertial>
<visual>
<origin
xyz="0 0 0"
rpy="0 0 0" />
<geometry>
<mesh
filename="package://RM65-B-3/meshes/wrist_3_1_link.STL" />
</geometry>
<material
name="">
<color
rgba="1 1 1 1" />
</material>
</visual>
<collision>
<origin
xyz="0 0 0"
rpy="0 0 0" />
<geometry>
<mesh
filename="package://RM65-B-3/meshes/wrist_3_1_link.STL" />
</geometry>
</collision>
</link>
<joint
name="wrist_3_1_joint"
type="revolute">
<origin
xyz="0.0064042 0.13143 0.020439"
rpy="0 0 0" />
<parent
link="elbow_3_2_link" />
<child
link="wrist_3_1_link" />
<axis
xyz="-0.0026287 0.9879 0.15508" />
<limit
lower="-2.23"
upper="2.23"
effort="0"
velocity="0" />
</joint>
<link
name="wrist_3_2_link">
<inertial>
<origin
xyz="-0.0010975 0.056649 0.019782"
rpy="0 0 0" />
<mass
value="0.20572" />
<inertia
ixx="0.00028608"
ixy="7.0133E-05"
ixz="2.3408E-05"
iyy="0.00012022"
iyz="-6.0294E-05"
izz="0.00028501" />
</inertial>
<visual>
<origin
xyz="0 0 0"
rpy="0 0 0" />
<geometry>
<mesh
filename="package://RM65-B-3/meshes/wrist_3_2_link.STL" />
</geometry>
<material
name="">
<color
rgba="1 1 1 1" />
</material>
</visual>
<collision>
<origin
xyz="0 0 0"
rpy="0 0 0" />
<geometry>
<mesh
filename="package://RM65-B-3/meshes/wrist_3_2_link.STL" />
</geometry>
</collision>
</link>
<joint
name="wrist_3_2_joint"
type="revolute">
<origin
xyz="0.006887 0.075529 0.012271"
rpy="0 0 0" />
<parent
link="wrist_3_1_link" />
<child
link="wrist_3_2_link" />
<axis
xyz="-0.99833 0.0063528 -0.057393" />
<limit
lower="-6.28"
upper="6.28"
effort="0"
velocity="0" />
</joint>
</robot>