Webots+ROS学习记录(5)——用Webots仿真六轮山地车

Webots+ROS学习记录(5)——用Webots仿真六轮山地车

之前潦草记录了6轮全地形山地车得仿真过程,自己又自学了几天Webots,更改了一下模型,仔细修改了一下物理参数,现在重新写一篇文章来记录此山地车得仿真过程。与此同时,我也在学习ROS和Webots的通信,其中又很多service上的内容我不太熟悉,熟悉后会继续写ROS联合仿真相关的。

山地车情况

准备搭建的小车整车长约4.4米,宽约2米,高约1.4米,重量约2000Kg,如图所示。整车轮距约1.6米,轴距约1.6米。
Webots+ROS学习记录(5)——用Webots仿真六轮山地车_第1张图片

设计思路

山地车要满足跨越障碍、跨越沟壑的山地使用条件,所以对其进行受力分析后,采取最简单的每个轮子都有悬架,都为轮毂电机驱动的方案。当山地车跨越障碍时,前轮靠后轮的正向压力产生的驱动力可以向上爬坡。

对每个轮子单独的控制可以更加精确的控制车速、方向,以适应在沙石底面的行走。

车体

首先搭建山地车的车体,长方体。要注意,和学习记录(3)不同的是,这里我们选用的是Transform而非Shape,有它作为基坐标,对后续的车轮、车腿的位置的确定有很大的便利。

  1. Geometry-box-size (4.4 1.4 2)
  2. PBRAppearance中可以调整仿真的材质、颜色等,我选了一个自己认为比较好看的url,为textures/steel_floor.jpg。

左前轮

左前轮分为两个部分,一个是用于悬架的HingeJoint,一个是用于轮胎的HingeJoint,中间用摇臂连接。

  • 用于悬架的Front_Left_Joint
    当HingeJoint用于非电机的设备(单纯的旋转部件)时,应该把device设置为空缺。
    Webots+ROS学习记录(5)——用Webots仿真六轮山地车_第2张图片在这里插入图片描述
  • JointParameters是对该旋转部件的参数设置

其中axis是是该旋转部件绕哪个轴旋转,anchor是只该旋转部件的旋转原点位置mim/max stop是最大旋转量,springConstant是绕旋转轴的弹性系数,dampingConstant是绕旋转轴的阻尼系数。SuspensionSpringConstant和SuspensiondampingConstant是在suspensionAxis上的悬架的弹性系数和阻尼系数。

我们是要让这个旋转部件做一个悬架,所以应该设置springConstant和dampingConstant两个参数为合适值,然后订好最大最小形变量。Anchor一会儿再设置。

  • 接下来将endPoint设置为solid,这就是旋转部件的实体。
    Webots+ROS学习记录(5)——用Webots仿真六轮山地车_第3张图片

将旋转部件的实体的translation设置在合适的位置,与此同时这个值(0.8 -0.3 -1.1)设置为上面JointParameters中anchor的值。

  • 子节点

这个实体节点包含两个子节点,一个是它的形状,一个是它末端的轮胎的hingeJoint节点,先说形状。

形状我们先用transform来构建,因为设计到旋转,所以选用transform。这里的构建方法和车体的方法一样,要注意坐标的相对关系。
Webots+ROS学习记录(5)——用Webots仿真六轮山地车_第4张图片

  1. 用于轮胎的Front_Left_Wheel_Joint
    HingeJoint轮胎的参数和学习记录(3)的设置过程一样,这里把截图贴上来。
    在这里插入图片描述
    Webots+ROS学习记录(5)——用Webots仿真六轮山地车_第5张图片

在device里面首先要注意name字段的填写,填写name字段才能在控制器里面调用。其次是最大速度,要保证最大速度大于控制器里面的速度。然后是最大扭矩。这些都是和车轮旋转相关的参数。

前后四轮的搭建方式都差不多,就不再列出来了

中轮

中轮也是由两个部件组成,一个构成悬架,一个构成轮胎,中间由刚体腿连接。

  1. 在这里我把中间轮腿当作一个刚体,所以用了solid节点。

Webots+ROS学习记录(5)——用Webots仿真六轮山地车_第6张图片

Solid节点包含两个子节点,一个是leg的形状,一个是轮子的电机。形状节点就不再赘述了。

  1. 轮子HingeJoint节点

轮子HingeJoint节点要注意的是,在webots里HingeJoint可以选择是一个悬架,只需要修改SuspensionSpringConstant和SuspensiondampingConstant以及suspensionAxis三个参数就行。
Webots+ROS学习记录(5)——用Webots仿真六轮山地车_第7张图片

suspensionAxis设置为(0 0.15 0),意思是悬架在Y轴的行程为0.15m。

两个中间轮都是差不多的搭建方法。

boundingObject的设置

boundingObject是实体的边界定义,一般来说,在仿真里面,边界不应该定义得太过复杂,以避免计算出错。在我的模型中,都是以给对应形体的transform填入DEF,然后再boundingObject里面使用USE选择。

Webots+ROS学习记录(5)——用Webots仿真六轮山地车_第8张图片

遇到的问题

  1. 车体陷下地面
    不知道大家在仿真的时候有没有遇见过车体陷下地面的情况。这是由于Webots的world设置问题。Webots+ROS学习记录(5)——用Webots仿真六轮山地车_第9张图片

在worldInfo里面,有一个CFM参数,这个参数和物体的柔软度相关。将其改小,就能修改减少物体下陷的情况。

  1. 车头上扬
    起步的时候,会有车头上扬的情况,这是由于汽车加速时,作用于悬架的向前的力的作用点比车的重心低。所以,不管前驱后驱,加速时车头都会上扬。相反,制动时车会点头。这问题是不分驱动形式的。悬架越软,重心越高的车这种现象越明显。至于轴荷转移是这种现象的结果。

我的处理方式是将车的重心调低。Webots+ROS学习记录(5)——用Webots仿真六轮山地车_第10张图片

控制器的编写

控制器大概用到了三个函数

wb_motor_set_position(wheels[i], INFINITY);
wb_motor_set_velocity(wheels[i],
SPEED); 
wb_keyboard_get_key()

之后会总结更多的函数用法,专门写一篇文章出来。

你可能感兴趣的:(Webots+ROS学习记录(5)——用Webots仿真六轮山地车)