Ros机械臂仿真建模基础:URDF模型进化版本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>
<joint> ... </joint>
<joint> ... </joint>
</robot>
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>
机械臂所需颜色定义
<material name="Black">
<color rgba="0 0 0 1"/>
</material>
<material name="White">
<color rgba="1 1 1 1"/>
</material>
<material name="Blue">
<color rgba="0 0 1 1"/>
</material>
<material name="Red">
<color rgba="1 0 0 1"/>
</material>
基本参数定义
<xacro:property name="M_PI" value="3.14159"/>
<!-- link1 参数定义 -->
<xacro:property name="link0_radius" value="0.05" />
<xacro:property name="link0_length" value="0.04" />
<xacro:property name="link0_mass" value="1" />
<!-- gripper参数定义 -->
<xacro:property name="gripper_length" value="0.03" />
<xacro:property name="gripper_width" value="0.01" />
<xacro:property name="gripper_height" value="0.06" />
<xacro:property name="gripper_mass" value="0.5" />
六、机械臂xacro建模常用语法
xacro常量定义及使用:
<!-- 常量定义 -->
<xacro:property name="M_PI" value="3.14159"/>
<!-- 常量使用 -->
<origin xyz="0 0 0" rpy="0 ${M_PI/2} 0" />
数学公式计算
<origin xyz="${(motor_length + wheel_length)/ 2} 0 0" rpy="0 0 0" />
宏定义及宏调用
<!-- 定义宏macro,宏里定义的函数名为cylinder_inertial_matrix,参数为"m r h",关于惯性矩阵的宏-->
<xacro:macro name="cylinder_inertial_matrix" params="m r h">
<inertial>
<mass value="${m}" />
<!-- 圆柱体惯性矩阵的标准计算公式 -->
<inertia ixx="${m*(3*r*r+h*h)/12}" ixy = "0" ixz = "0"
iyy="${m*(3*r*r+h*h)/12}" iyz = "0"
izz="${m*r*r/2}" />
</inertial>
</xacro:macro>
<!-- 通过函数名cylinder_inertial_matrix来调用之前定义的用来计算惯性矩阵的宏 -->
<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的相关语法及建模方法的详细介绍。