Webots搭建麦克纳姆轮底盘教程

ubuntu版本:20.04
webots版本:2021a
ros版本:noetic

0.前言

之前笔者出过ROS联合webots开发教程,在教程中使用的是双轮差动底盘模型,今天笔者将带给笔者麦克纳姆轮的使用教程。

1.模型选取

在Webots中,官方提供了kuka公司推出的youbot机器人作为麦克纳姆轮的案例

  • 实物机器人如下所示:

  • 仿真机器人如下所示:

2.youbot底盘

由上面的两张图可以看到youbot的底盘是麦克纳姆轮底盘,麦克纳姆轮也简称麦轮,与普通的轮子不同,麦轮除了提供前后方向的移动,还能提供左右方向的移动。
麦轮分为两种(A轮和B轮),A轮会产生轴向向左,垂直轴向向前的速度分量,如下图所示:

B轮会产生轴向向右,垂直轴向向后的速度分量,下图所示。

youbot机器人底盘上的麦克纳姆轮为A-B-A-B配置,如下图所示:

3.Webots仿真中的WorldInfo节点

WorldInfo的参数介绍如下所示:

WorldInfo {
  SFString title                          ""         # 给世界取个好听的名字吧
  MFString info                           [ ]        # 介绍世界的信息参数
  SFFloat  gravity                        9.81       # 设置地球引力大小参数
  SFFloat  CFM                            0.00001    # 用于管理接触关节的约束力参数
  SFFloat  ERP                            0.2        # 用于管理接触关节的错误减少参数
  SFString physics                        ""         # 允许用户使用ODE API 编程自定义物理效果的物理插件
  SFFloat  basicTimeStep                  32         # Webots执行的模拟步骤的持续时间
  SFFloat  FPS                            60         # 每秒传输帧数
  SFInt32  optimalThreadCount             1          # 用于计算世界物理的实际线程数
  SFFloat  physicsDisableTime             1          # 物理禁用时间
  SFFloat  physicsDisableLinearThreshold  0.01       # 物理禁用线性阈值
  SFFloat  physicsDisableAngularThreshold 0.01       # 物理禁用角度阈值
  SFNode   defaultDamping                 NULL       # 默认阻尼
  SFFloat  inkEvaporation                 0          # 字段设置为非空值,则地面纹理的颜色将慢慢变为白色。
  SFString coordinateSystem               "ENU"      # 坐标系
  SFString gpsCoordinateSystem            "local"    # GPS坐标系
  SFVec3f  gpsReference                   0 0 0      # GPS参数
  SFFloat  lineScale                      0.1        # 线标尺
  SFInt32  randomSeed                     0          # 随机种子
  MFNode   contactProperties              []         # 允许指定多个 ContactProperties 节点,这些节点定义 Solid 节点碰撞时的行为。
}

4.通过修改worldInfo实现麦克纳姆轮底盘运动

  1. 添加两个ContactProperties节点,通过此节点可以定义Solid节点碰撞时的行为,如下图所示:

    ContactProperties节点参数介绍:
    ContactProperties {
    SFString material1          "default"            # 指定接触材料1,Solid的碰撞节点名
    SFString material2          "default"            # 指定接触材料2,Solid的碰撞节点名
    MFFloat  coulombFriction    1                    # 库仑摩擦系数,0 导致无摩擦接触,无穷大导致接触永不滑动
    SFVec2f  frictionRotation   0 0                  # 允许用户旋转非对称的情况下使用的摩擦方向
    SFFloat  bounce             0.5                  # 恢复系数,表示撞击前后的速度比
    SFFloat  bounceVelocity     0.01                 # 弹跳速度
    MFFloat  forceDependentSlip 0                    # 摩擦的滑移
    SFFloat  softERP            0.2                  # 管理局部接触关节的错误减少参数
    SFFloat  softCFM            0.001                # 管理局部接触关节的软约束力混合
    SFString bumpSound          "sounds/bump.wav"    # any string
    SFString rollSound          "sounds/roll.waw"    # any string
    SFString SlideSound         "sounds/slide.wav"   # any string
    }
    
  2. 第一个ContactProperties节点如下图所示:

    第二个ContactProperties节点如下图所示:

    主要修改material1coulombFriction;frictionRotation;bounceforceDependentSlip参数。
  • material1字段在麦克纳姆轮实体的节点下已经定义,如下图所示:

    大家可以尝试着修改成ExteriorWheelMat试试,可以发现机器人横向移动时会随即带着旋转的姿态,因为这时这个轮子的frictionRotation摩擦方向正好是同向,有一个同向的力导致机器人旋转。
  • coulombFriction字段可以设置4个参数。只有一个参数时摩擦是对称的;两个参数时摩擦是不对称的;三个参数时对material1使用不对称系数,对于material2使用对称系数;四个参数时对material1material2都使用不对称系数。此时我们设置了3个参数,说明对material1是不对称系数,对material2是对称系数。
  • frictionRotation字段中,第一节点设置成-0.965,第二节点设置成0.965
  • bounce字段设置成0,对象会有效的停止在和他碰撞的表面,不会弹跳。
  • forceDependentSlip字段可以设置4个参数。使用一个参数,则该系数适用于两个方向;两个参数时力相关滑移是不对称的,对两个material使用相同的系数;三个参数时对material1使用不对称系数,对于material2使用对称系数;四个参数时对material1material2都使用不对称系数。
    通过使用上面的节点配置,可以实现麦克纳姆轮的运动方式

    效果

    结语

    本文也是基于笔者的学习和使用经验总结的,主观性较强,如果有哪些不对的地方或者不明白的地方,欢迎评论区留言交流~

为了能和读者进一步讨论问题,建立了一个微信群,方便给大家解答问题,也可以一起讨论问题。
加群链接

开源项目mecanum_robotsim正在更新中~~
✌Bye