欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2024-02-23 17:22:10
...

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

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

山地车情况

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

设计思路

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

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

车体

首先搭建山地车的车体,长方体。要注意,和学习记录(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仿真六轮山地车Webots+ROS学习记录(5)——用Webots仿真六轮山地车
  • JointParameters是对该旋转部件的参数设置

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

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

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

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

  • 子节点

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

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

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

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

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

中轮

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

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

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

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

  1. *HingeJoint节点

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

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

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

boundingObject的设置

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

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

遇到的问题

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

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

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

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

控制器的编写

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

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

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

相关标签: 仿真器