0%

机器人操作系统ROS_3_机器人建模与仿真

机器人统一描述格式urdf

urdf介绍

Unified Robot Description Format, 统一机器人描述(URDF)是种用于描述机器人机器结构, 关节, 自由度等的xml格式文件
ROS中的urdf功能包包含一个URDF的C++解析器, URDF文件使用XML格式描述机器人模型

URDF语法规范见:
http://wiki.ros.org/urdf/XML

urdf中机器人创建以树的格式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<robot name="test_robot">
<link name="link1" />
<link name="link2" />
<link name="link3" />
<link name="link4" />

<joint name="joint1" type="continuous">
<parent link="link1" />
<child link="link2" />
</joint>

<joint name="joint2" type="continuous">
<parent link="link1" />
<child link="link3" />
</joint>

<joint name="joint3" type="continuous">
<parent link="link3" />
<child link="link2" />
</joint>
</robot>

上面urdf代码对应的机器人

urdf文件编写

常见标签

  1. link标签
标签 功能
连接的可视化, 碰撞和惯性属性设置
设置连接的可视化属性
设置连接的碰撞计算属性
设置连接的惯性属性
输入模型的形状; 提供box, cylinder(圆柱), sphere(球体)等形态
设置相对于连接相对坐标系的移动和旋转
设置连接的颜色和纹理
连接重量(单位: kg)的设置
  1. joint标签
标签 功能
与连接的关系和关节类型的设置
关节的父连接
关节的子连接
将父连接坐标系转换为子连接坐标系
设置旋转轴
设置关节的速度, 力和半径(仅当关节是revolutei(后旋的)或prismatic(棱柱)时)
  1. transmission标签

<transmission>是与ROS-CONTROL一起运行所必须的标签, 它输入关节与舵机之间的命令接口

标签 功能
设置关节和舵机之间的变量
设置力的传递方式的形状
设置关节信息设置
设置硬件接口
设置舵机信息
设置舵机与关节之间的齿轮比

物理属性与碰撞属性

如果想要在gazebo或者其他仿真软件上进行机器人仿真, 就需要添加物理属性和碰撞属性
这意味着我们需要设定几何尺寸来计算可能的碰撞, 例如设定重量我们才能够计算惯性等
需要保证模型文件中的所有连接都有这些参数, 否则就无法对这些机器人进行仿真
要为所有连接添加collisioninertial属性, 因为如果不这样做, gazebo将无法使用这些模型

1
2
3
4
5
6
7
8
9
10
11
12
<link name="base_link">
...
<collision>
<geometry>
<box size="0.2 .3 0.1"/>
</geometry>
</collision>
<inertial>
<mass value="100"/>
<inertia ixx="1.0" ixy="0.0" ixz="0.0" iyy="1.0" iyz="0.0" izz="1.0"/>
</inertial>
</link>

3D可视化与仿真

1
2
3
4
5
6
7
8
9
10
11
<launch>
<param name="robot_description" textfile="$(find mrobot_description)/urdf/mrobot_chassis.urdf" />
<!-- 设置GUI参数,显示关节控制插件 -->
<param name="use_gui" value="true"/>
<!-- 运行joint_state_publisher节点,发布机器人的关节状态 -->
<node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher" />
<!-- 运行robot_state_publisher节点,发布tf -->
<node name="robot_state_publisher" pkg="robot_state_publisher" type="state_publisher" />
<!-- 运行rviz可视化界面 -->
<node name="rviz" pkg="rviz" type="rviz" args="-d $(find mrobot_description)/config/mrobot_urdf.rviz" required="true" />
</launch>

运行launch文件, 启动rviz查看自己创建的模型

检查urdf文件语法是否有误
check_urdf smartcar.urdf

查看检查urdf模型的整体结构
urdf_to_graphiz robot.urdf

使用xacro优化urdf

xacro介绍

xacro是一种宏语言(macro language)
xacro程序(xacro program)运行所有宏并输出结果

xacro作用:

  • 精简模型代码: 创建宏定义, 文件包含
  • 提供可编程接口: 常量, 变量, 数学计算, 条件语句

xacro使用

  1. 常量

常量定义 <xacro:property name="M_pi" value="3.14159"/>
常量使用 <origin xyz="0 0 0" rpy="${M_PI/2} 0 0" />

类似于C语言中的宏定义, 在头部定义, 如<xacro:property name="WIDTH" value="0.2" />, 以${WIDTH}的方式进行使用
经常会看到的一个常量定义, <property name="prefix" value="my_" />, 后面关节名字就可以类似的进行更新
<joint name="${prefix}joint" type="revolute" />

  1. 数学计算

<origon xyz="0 ${(motor_length+wheel_length)/2} 0" rpy="0 0 0" />

所有数学计算都会转换成浮点数运行

  1. 宏定义
1
2
3
4
<xacro:macro name="default_origin">
<origin xyz="0 0 0" rpy="0 0 0" />
</xacro:macro>
<xacro:default_origin />
1
2
3
4
5
<xacro:macro name="default_link" params="prefix">
<link name="${prefix}_link1" />
</xacro:macro>
<xacro:default_link prefix="my" />
<xacro:default_link prefix="your" />

不单由这样简单的参数, 还可以使用块参数

  1. 文件包含

很多模型都是以宏的形式进行定义, 并以最小集团分成很多个文件
而最终的机器人描述就变得非常简单了

<xacro:include filename="$(find mbot_description)/urdf/xacro/mbot_base.xacro" />

  1. 显示xacro文件的方法

方法1:
将.xacro文件转化成urdf文件:
xacro --inorder model.xacro > model.urdf

1
2
3
4
5
<!--调用解析器-->
<arg name="model" default="$(find xacro)/xacro --inorder '$(find mbot_description)/urdf/xacro/mbot.xacro'" />
<arg name="gui" default="true" />
<!--将结果放入robot_description参数中-->
<param name="robot_description" command="$(arg model)" />
Thank you for your reward !