1.机器人的定义
各个国家对机器人的定义各不相同,但总体上,机器人是指能够自动或通过编程的方式协助人类处理一些任务的机械装置。
2.机器人的组成
机器人通常可以由四大部分组成:控制系统、驱动系统、执行机构和传感系统。每个部分功能相对独立,但又密切联系。
对于没有实物机器人的我们,该怎么学习机器人呢?
有人说可以通过仿真环境搭建机器人的模型,那么如何通过代码来搭建我们的机器人仿真模型呢?那就得请我们今天的主角-----URDF出场了!
3.URDF建模
URDF(Unified Robot Description Format)统一机器人模型描述格式,使用xml语言描述,该格式的目的在于提供一种通用的机器人模型描述规范。
从机构学角度讲,机器人通常被建模为由连杆和关节组成的结构。连杆是带有质量属性的刚体,而关节是连接、限制两个刚体相对运动的结构。。通过关节将连杆依次连接起来,就构成了一个个运动链(即机器人模型)。一个URDF文档即描述了这样的一系列关节与连杆的相对关系、惯性属性、几何特点和碰撞模型。具体来说,包括:
-
机器人模型的运动学与动力学描述;
-
机器人的几何表示;
-
机器人的碰撞模型。
在URDF中,我们通常使用link和joint信息来对机器人进行描述。
【link】
-
描述机器人某个刚体部分的外观和物理属性;
-
描述连杆尺寸(size)、颜色(color)、形状(shape)、惯性矩阵(inertial matrix)、碰撞参数(collision properties)等;
-
每个Link会成为一个单独的坐标系。
【joint】
-
描述两个link之间的关系,分为六种类型;
-
包括关节运动的位置和速度限制;
-
描述机器人关节的运动学和动力学属性。
关节类型 | 描述 |
---|---|
continuous | 旋转关节,可以围绕单轴无限旋转 |
revolute | 旋转关节,类似于continuous,但是有选择的角度极限 |
prismatic | 滑动关节,沿某一轴线移动的关节,带有位置极限 |
planar | 平面关节,允许在平面正交方向上平移或旋转 |
floating | 浮动关节,允许进行平移,旋转运动 |
fixed | 固定关节,不允许运动的特殊关节 |
【robot】
-
完整机器人模型的最顶层标签;
-
<link><joint>标签都必须包含在<robot>标签内;
-
一个完整的机器人模型,由一系列<link>和<joint>组成。
比如:
<robot name=”name of the robot”>
<link>……</link>
<link>……</link>
<joint>……</joint>
<joint>……</joint>
</robot>
4.URDF机器人实战
下面,我们将亲自搭建一个简易的URDF机器人模型,来更加深入了解URDF。
在这之前,我们首先需要创建自己的ROS工作空间,创建src文件夹等步骤,然后创建mbot_description功能包。
$ catkin_create_pkg mbot_description urdf xacro
-
urdf: 存放机器人模型的URDF或xacro文件;
-
meshes:放置URDF中引用的模型渲染文件;
-
launch: 保存相关启动文件;
-
config: 保存rviz的配置文件。
上面这些文件夹,其中meshes文件夹这里不会用到,我们编写的mbot_base.urdf文件放在urdf文件夹下。下面我们来看具体的模型搭建步骤。
1.根据xml语言格式创建我们的根元素
一个urdf文件必要包含一个根元素,然后其他标签则放在根元素里面。
<?xml version="1.0"?>
<robot name="mbot">
...
...
</robot>
2.创建base_link底盘
首先,我们需要创建一个底盘base_link,算是搭建房子的“地基”。
<link name="base_link">
<!--可视化部分-->
<visual>
<!--中心点 -->
<origin xyz="0 0 0" rpy="0 0 0"></origin>
<!--几何特征-->
<geometry>
<!--cylinder:圆柱,length:高;radius:半径-->
<cylinder length="0.16" radius="0.20"></cylinder>
</geometry>
<!--材料/颜色-->
<material name="yellow">
<color rgba="1 0.4 0 1"></color>
</material>
</visual>
</link>
3.创建左轮以及左轮关节
接着,创建左轮,相当于机器人的左脚。
<!--左轮旋转关节-->
<joint name="left_wheel_joint" type="continuous">
<!--中心点-->
<origin xyz="0 0.19 -0.05" rpy="0 0 0"></origin>
<!--子母连杆-->
<parent link="base_link"></parent>
<child link="left_wheel_link"></child>
<!--绕y轴旋转-->
<axis xyz="0 1 0"></axis>
</joint>
<!--左轮连杆-->
<link name="left_wheel_link">
<visual>
<origin xyz="0 0 0" rpy="1.5707 0 0"></origin>
<!--几何特征-->
<geometry>
<!--圆柱-->
<cylinder radius="0.06" length="0.025"></cylinder>
</geometry>
<material name="white">
<color rgba="1 1 1 0.9"></color>
</material>
</visual>
</link>
- 创建右轮及右轮关节
创建右轮,相当于机器人的右脚。
<!--右轮连续关节-->
<joint name="right_wheel_joint" type="continuous">
<origin xyz="0 -0.19 -0.05" rpy="0 0 0"></origin>
<parent link="base_link"></parent>
<child link="right_wheel_link"></child>
<axis xyz="0 1 0"></axis>
</joint>
<link name="right_wheel_link">
<visual>
<origin xyz="0 0 0" rpy="1.5707 0 0"></origin>
<geometry>
<cylinder radius="0.06" length="0.025"></cylinder>
</geometry>
<material name="white">
<color rgba="1 1 1 0.9"></color>
</material>
</visual>
</link>
5.创建前后万向轮
考虑到机器人运动的稳定性,我们在底盘的下面添加两个可以360度旋转的球形轮子,半径设置为0.015m。
<!--前轮连续关节-->
<joint name="front_caster_joint" type="continuous">
<origin xyz="0.18 0 -0.095" rpy="0 0 0"></origin>
<parent link="base_link"></parent>
<child link="front_caster_link"></child>
<axis xyz="0 1 0"></axis>
</joint>
<link name="front_caster_link">
<visual>
<origin xyz="0 0 0" rpy="0 0 0"></origin>
<geometry>
<!--球体-->
<sphere radius="0.015"></sphere>
</geometry>
<material name="black">
<color rgba="0 0 0 0.95"></color>
</material>
</visual>
</link>
<joint name="back_caster_joint" type="continuous">
<origin xyz="-0.18 0 -0.095" rpy="0 0 0"></origin>
<parent link="base_link"></parent>
<child link="back_caster_link"></child>
<axis xyz="0 1 0"></axis>
</joint>
<link name="back_caster_link">
<visual>
<origin xyz="0 0 0" rpy="0 0 0"></origin>
<geometry>
<!--球体-->
<sphere radius="0.015"></sphere>
</geometry>
<material name="black">
<color rgba="0 0 0 0.95"></color>
</material>
</visual>
</link>
6.创建摄像头
在底盘的上面靠前添加一个长方形的摄像头,用来充当机器人的眼睛。
<link name="camera_link">
<visual>
<origin xyz="0 0 0 " rpy="0 0 0"></origin>
<geometry>
<!--box:长方体,长宽高-->
<box size="0.03 0.04 0.04"></box>
</geometry>
<material name="black">
<color rgba="0 0 0 0.95"></color>
</material>
</visual>
</link>
<joint name="camera_joint" type="fixed">
<origin xyz="0.17 0 0.1"></origin>
<parent link="base_link"></parent>
<child link="camera_link"></child>
</joint>
7.创建激光雷达
在底盘上添加一个激光雷达模块,可以让我们的机器人感知周围的环境。
<link name="laser_link">
<visual>
<origin xyz="0 0 0" rpy="0 0 0"></origin>
<geometry>
<!--圆柱-->
<cylinder length="0.05" radius="0.05"></cylinder>
</geometry>
<material name="black">
</material>
</visual>
</link>
<!--固定关节-->
<joint name="laser_joint" type="fixed">
<origin xyz="0 0 0.1" rpy="0 0 0"></origin>
<parent link="base_link"></parent>
<child link="laser_link"></child>
</joint>
到此,我们的简易机器人就搭建好了。接下来还有一个工作要做,那就是编写我们的display_mbot_base_urdf.launch文件,用来启动相关的节点,调用我们的rviz(三维可视化工具)模块。
8.编写launch文件
<launch>
<!--启动我们的urdf文件-->
<param name="robot_description" textfile="$(find mbot_description)/urdf/mbot_base.urdf"> </param>
<!--设置GUI参数,显示关节控制插件-->
<param name="use_gui" value="true"></param>
<!--运行joint_state_publisher节点,发布机器人的关节状态-->
<node name="joint_state_publisher" pkg="joint_state_publisher" type="joint_state_publisher"></node>
<!--运行robot_state_publisher节点,发布tf-->
<node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher"></node>
<!--运行rviz可视化界面-->
<node name="rviz" pkg="rviz" type="rviz" args="-d $(find mbot_description)/config/mbot_urdf.rviz" required="true"></node>
</launch>
这里需要注意,在学习古月老师的课程时,他给出的代码有点小错误,这里纠正一下:将type="state_publisher"改为如下形式即可,否则,robot_state_publisher节点启动不成功。
<!--运行robot_state_publisher节点,发布tf-->
<node name="robot_state_publisher" pkg="robot_state_publisher" type="robot_state_publisher"></node>
接下来,终于可以看我们的机器人模型啦!
在工作空间下进行编译:
$ catkin_make
然后执行:
$ roslaunch mbot_description display_mbot_base_urdf.launch
得到我们的机器人模型如下:
看起来还不错!
需要注意的是,这可不是URDF的全部!
这篇文章只是关于URDF的一个非常简单的例子,没有涉及到惯性矩阵,碰撞矩阵之类较复杂的设计,算是与URDF的初识吧。另外,URDF并不完美,在后面的学习中,我们还会继续优化URDF的相关编程。
参考文献
[1].https://class.guyuehome.com/index