Ros机械臂仿真建模基础:URDF模型进化版本xacro模型文件语法基础及如何从零构建一个机械臂模型(一)
-
Ros机械臂仿真建模基础:URDF模型进化版本xacro模型文件语法基础及如何从零构建一个机械臂模型(一)
-
一、机械臂仿真效果图
-
二、机器人组成结构图
-
三、URDF基本介绍
-
四、xacro在UDRF上的改进
-
五、机械臂xacro建模基本组成部分
-
robot定义
-
link定义
-
joint定义
-
机械臂所需颜色定义
-
基本参数定义
-
六、机械臂xacro建模常用语法
-
xacro常量定义及使用:
-
数学公式计算
-
宏定义及宏调用
-
文件包含
-
七、更多示例
一、机械臂仿真效果图
首先先展示一下完成后的机械臂模型效果图:


二、机器人组成结构图

- 执行机构:类比于人体的四肢,属于直接面向工作对象的机械装置;
- 驱动系统:类比于人体的肌肉和筋骨,负责驱动执行机构,将控制系统下达的命令转换为执行机构需要的信号;
- 传感系统:类比于人体的感官及神经系统,负责完成信号的输入和反馈,包括内部与外部传感系统;
- 控制系统:类比与人体的大脑,负责实现任务及信息的处理调度,输出控制命令信号。
四类系统的协同控制关系如下图所示:

三、URDF基本介绍
- URDF(Unified Robot Description Format),全称为标准化机器人描述格式;
- 属于一类XML格式的模型文件,用于描述机器人关节组成、自由度集合、位姿变换以及工作空间等相关概念;
- 类似于D-H参数的表示方法来表示机器人各个Joint及Link之间的连接关系;
- 是对机器人仿真模型搭建的必经之路。
四、xacro在UDRF上的改进
- 精简模型代码;
- 创建宏定义概念;
- 增加文件include功能;
- 提供包括常量、变量、数学计算、条件语句等内容的编程接口。
五、机械臂xacro建模基本组成部分
robot定义
-
是一个完整机器人模型的最顶层标签;
-
< link >和< joint >标签必须包含在< robot >标签内;
-
一个完整的机器人仿真模型,由一系列的< link >和< joint >标签组成,数量取决于机器人模型的自由度数量。
<robot name="name of robot" xmlns:xacro="http://www.ros.org/wiki/xacro"> <link> ... </link> <link> ... </link>
</robot>1<joint> ... </joint> 2<joint> ... </joint>
link定义
-
描述机器人某个刚体部分的外观属性和物理属性;
-
描述连杆模型的尺寸(size)、颜色(clor)、形状(shape)、惯性矩阵(inertial matrix)、碰撞检测(Collision)等内容;
-
每个Link在机器人模型上会成为一个独立的坐标系。
<link name="link0"> <!-- visual:可视化部分 --> <visual> <origin xyz="0 0 0" rpy="0 0 0" /> <geometry> <cylinder radius="${link0_radius}" length="${link0_length}"/> </geometry> <material name="White" /> </visual> <!-- collision:碰撞检测部分 --> <!-- collision的物理模型和坐标与visual部分保持一致 --> <collision> <origin xyz="0 0 0" rpy="0 0 0" /> <geometry> <cylinder radius="${link0_radius}" length="${link0_length}"/> </geometry> </collision> <!-- 通过函数名cylinder_inertial_matrix来调用之前定义的用来计算惯性矩阵的宏 --> <cylinder_inertial_matrix m="${link0_mass}" r="${link0_radius}" h="${link0_length}"/> </link>
joint定义
-
描述两个Link之间的关系,分为以下6种类型(type):

-
包含了关节运动的位置和速度限制;
-
描述了机器人关节的运行学和动力学的相关属性;
-
Joint和Link的关系如下:
-
<!-- revolute:带上下限的旋转关节 --> <joint name="joint1" type="revolute"> <parent link="link0"/> <child link="link1"/> <origin xyz="0 0 ${link0_length/2}" rpy="0 ${M_PI/2} 0" /> <axis xyz="-1 0 0" /> <!-- 关节限制 --> <!-- effort:关节受力极限 --> <!-- velocity:最大速度 --> <!-- lower/upper:最大旋转角度(弧度制) --> <limit effort="300" velocity="1" lower="${-M_PI}" upper="${M_PI}"/> </joint>
机械臂所需颜色定义
1 <material name="Black"> 2 <color rgba="0 0 0 1"/> 3 </material> 4 <material name="White"> 5 <color rgba="1 1 1 1"/> 6 </material> 7 <material name="Blue"> 8 <color rgba="0 0 1 1"/> 9 </material> 10 <material name="Red"> 11 <color rgba="1 0 0 1"/> 12 </material>
基本参数定义
1 <xacro:property name="M_PI" value="3.14159"/> 2 <!-- link1 参数定义 --> 3 <xacro:property name="link0_radius" value="0.05" /> 4 <xacro:property name="link0_length" value="0.04" /> 5 <xacro:property name="link0_mass" value="1" /> 6 <!-- gripper参数定义 --> 7 <xacro:property name="gripper_length" value="0.03" /> 8 <xacro:property name="gripper_width" value="0.01" /> 9 <xacro:property name="gripper_height" value="0.06" /> 10 <xacro:property name="gripper_mass" value="0.5" />
六、机械臂xacro建模常用语法
xacro常量定义及使用:
1 <!-- 常量定义 --> 2 <xacro:property name="M_PI" value="3.14159"/> 3 4 5 <!-- 常量使用 --> 6 <origin xyz="0 0 0" rpy="0 ${M_PI/2} 0" />
数学公式计算
<origin xyz="${(motor_length + wheel_length)/ 2} 0 0" rpy="0 0 0" />
宏定义及宏调用
1 <!-- 定义宏macro,宏里定义的函数名为cylinder_inertial_matrix,参数为"m r h",关于惯性矩阵的宏--> 2 <xacro:macro name="cylinder_inertial_matrix" params="m r h"> 3 <inertial> 4 <mass value="${m}" /> 5 <!-- 圆柱体惯性矩阵的标准计算公式 --> 6 <inertia ixx="${m*(3*r*r+h*h)/12}" ixy = "0" ixz = "0" 7 iyy="${m*(3*r*r+h*h)/12}" iyz = "0" 8 izz="${m*r*r/2}" /> 9 </inertial> 10 </xacro:macro> 11 12 13 <!-- 通过函数名cylinder_inertial_matrix来调用之前定义的用来计算惯性矩阵的宏 --> 14 <cylinder_inertial_matrix m="${link0_mass}" r="${link0_radius}" h="${link0_length}"/>
文件包含
<xacro:include filename="$(find mbot_description)/urdf/xacro/mbot_base.xacro" />
其中find关键词后加的是功能包的名字(mbot_description)
七、更多示例
参考ROS关于URDF的官方文档,可全面查询URDF及xacro的相关语法及建模方法的详细介绍。