前言

本篇文章介绍的是ROS高效进阶内容,使用URDF 语言(xml格式)做一个差速轮式机器人模型,并使用URDF的增强版xacro,对机器人模型文件进行二次优化。

差速轮式机器人:两轮差速底盘由两个动力轮位于底盘左右两侧,两轮独立控制速度,通过给定不同速度实现底盘转向控制。一般会配有一到两个辅助支撑的万向轮。

此次建模,不引入算法,只是把机器人模型的样子做出来,所以只使用 rivz 进行可视化显示。

机器人的定义和构成

  1. 机器人定义:机器人是一种自动化的机器,所不同的是这种机器具备一些与人或生物相似的智能能力,如感知能力、规划能力、动作能力和协同能力,是一种具有高级灵活性的自动化机器。目前,自动驾驶汽车也被认为是一种机器人。
  2. 机器人构成:机器人通常分为四大部分,即执行机构,驱动系统,传感系统和控制系统。以自动驾驶汽车为例,执行机构就是油门,转向和刹车;驱动系统就是电动机;传感系统就是各种传感器:lidar,radar,camera,uss,imu,GNSS;控制系统就是智驾算法系统:感知,定位,规划和控制。
  3. 机器人四大部分的控制回路,大致如图:

使用URDF和Xacro构建差速轮式机器人模型_宏函数

URDF建模套路

  1. URDF:Unified Robot Description Format,统一的机器人描述文件格式。urdf 文件使用 xml 格式。
  2. 用 urdf 描述机器人,套路如下:每个机器人都是由多个 link(连杆) 和 joint(关节)组成。这里的 link 和joint 很宽泛,形状不一定是杆和轴。比如桌子,桌面和腿都是link,连接处是固定的 joint。
<?xml version="1.0" ?>
<robot name="name of robot">
	<link> ... </link>
	<joint> ... </joint>
	...
</robot>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.

使用URDF和Xacro构建差速轮式机器人模型_宏函数_02

  1. link:描述机器人某个刚体部分的外观和物理属性。外观包括:尺寸,颜色,形状。物理属性包括:惯性矩阵(inertial matrix)和碰撞参数(collision properties)。在机器人建模中,每个link 都是一个坐标系。下面是差速轮式机器人底盘的建模,底盘一般称为 base。
<link name="base_link">
  	// visual 标签就是外观
    <visual>
      // base_link本身是个坐标系,这也是差速轮式机器人各组成部分的根坐标系,一般会把他的坐标原点设置在rviz的中心处
      // origin表示底盘在其base_link坐标系下的原始位置和旋转状态
      // xyz表示底盘质心在base_link坐标系的偏移位置,rpy(roll,pitch,yaw)是底盘绕base_link的x,y,z三个轴的旋转值
      <origin xyz="0 0 0" rpy="0 0 0"/>
      // geometry是物体几何外形
      <geometry>
      	// 这里的底盘,用圆柱体表示,length值为高度,radius是半径值
        <cylinder length="0.16" radius="0.2"/>
      </geometry>
      // material是材料,这里指定底盘颜色为红色,rgba是三色+透明度表示法,三色的范围是0~1,而不是0-255
      <material name="red">
        <color rgba="1 0 0 1"/>
      </material>
    </visual>
  </link>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.

这里我们只进行外观建模,因此暂不涉及物理属性配置。

  1. joint:描述两个 link 之间的关系,包括运动学和动力学属性,这里暂时只关注运动学属性。通常情况下,两个 link 的关系一般分为六种:

continuous:旋转关节,可以围绕单轴360度无限旋转,比如轮子的轴

revolute:旋转关节,但是有旋转角度的范围限制,比如钟摆

prismatic:滑动关节,也叫活塞关节,沿某一轴线移动的关节,有位置限制,强调一维,比如打气筒

planar:平面关节,允许在平面正交方向上平移或旋转,强调平面,比如抽屉内外滑动

floating:浮动关节,允许进行平移和旋转运动,比如人体的肩关节

fixed:固定关节,比如桌子腿和桌面

下面是差速轮式机器人主动轮与底盘的 joint 样例:

// joint标签就是关节,type表示链接关系
  <joint name="left_wheel_joint" type="continuous">
    // origin表示轮子在base_link坐标系下的偏移和旋转
    <origin xyz="0 0.19 -0.05" rpy="0 0 0" />
    // 根link是底盘,子link是轮子
    <parent link="base_link" />
    <child link="left_wheel_link" />
    // axis描述的轮子相对于其自身坐标系的 y 轴旋转,=
    <axis xyz="0 1 0" />
  </joint>
  
  // 这是轮子link
  <link name="left_wheel_link">
    <visual>
      // 轮子相当于其x轴,旋转90度,也就是立起来
      <origin xyz="0 0 0" rpy="1.5707 0 0"/>
      <geometry>
        <cylinder length="0.06" radius="0.06"/>
      </geometry>
      <material name="white">
        <color rgba="1 1 1 0.9"/>
      </material>
    </visual>
  </link>
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.

使用URDF做一个差速轮式机器人模型

  1. 创建 mbot_description 软件包及相关文件
cd ~/catkin_ws/src
catkin_create_pkg mbot_description urdf xacro

cd mbot_description 
mkdir -p config doc launch meshes urdf/sensor
touch launch/display_mbot_urdf.launch launch/display_mbot_xacro.launch
touch urdf/mbot_base.urdf urdf/mbot_base.xacro
touch urdf/sensor/camera.xacro urdf/sensor/kinect.xacro urdf/sensor/laser.xacro
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  1. mbot_base.urdf :这是整个mbot建模的文件,包括底盘,两个动力伦,两个万向轮,一个camera,一个kinect(深度相机),一个lidar。
<?xml version="1.0" ?>
<robot name="mbot">

  <link name="base_link">
    <visual&g