之前潦草记录了6轮全地形山地车得仿真过程,自己又自学了几天Webots,更改了一下模型,仔细修改了一下物理参数,现在重新写一篇文章来记录此山地车得仿真过程。与此同时,我也在学习ROS和Webots的通信,其中又很多service上的内容我不太熟悉,熟悉后会继续写ROS联合仿真相关的。
准备搭建的小车整车长约4.4米,宽约2米,高约1.4米,重量约2000Kg,如图所示。整车轮距约1.6米,轴距约1.6米。
山地车要满足跨越障碍、跨越沟壑的山地使用条件,所以对其进行受力分析后,采取最简单的每个轮子都有悬架,都为轮毂电机驱动的方案。当山地车跨越障碍时,前轮靠后轮的正向压力产生的驱动力可以向上爬坡。
对每个轮子单独的控制可以更加精确的控制车速、方向,以适应在沙石底面的行走。
首先搭建山地车的车体,长方体。要注意,和学习记录(3)不同的是,这里我们选用的是Transform而非Shape,有它作为基坐标,对后续的车轮、车腿的位置的确定有很大的便利。
左前轮分为两个部分,一个是用于悬架的HingeJoint,一个是用于轮胎的HingeJoint,中间用摇臂连接。
其中axis是是该旋转部件绕哪个轴旋转,anchor是只该旋转部件的旋转原点位置mim/max stop是最大旋转量,springConstant是绕旋转轴的弹性系数,dampingConstant是绕旋转轴的阻尼系数。SuspensionSpringConstant和SuspensiondampingConstant是在suspensionAxis上的悬架的弹性系数和阻尼系数。
我们是要让这个旋转部件做一个悬架,所以应该设置springConstant和dampingConstant两个参数为合适值,然后订好最大最小形变量。Anchor一会儿再设置。
将旋转部件的实体的translation设置在合适的位置,与此同时这个值(0.8 -0.3 -1.1)设置为上面JointParameters中anchor的值。
这个实体节点包含两个子节点,一个是它的形状,一个是它末端的轮胎的hingeJoint节点,先说形状。
形状我们先用transform来构建,因为设计到旋转,所以选用transform。这里的构建方法和车体的方法一样,要注意坐标的相对关系。
在device里面首先要注意name字段的填写,填写name字段才能在控制器里面调用。其次是最大速度,要保证最大速度大于控制器里面的速度。然后是最大扭矩。这些都是和车轮旋转相关的参数。
前后四轮的搭建方式都差不多,就不再列出来了
中轮也是由两个部件组成,一个构成悬架,一个构成轮胎,中间由刚体腿连接。
Solid节点包含两个子节点,一个是leg的形状,一个是轮子的电机。形状节点就不再赘述了。
轮子HingeJoint节点要注意的是,在webots里HingeJoint可以选择是一个悬架,只需要修改SuspensionSpringConstant和SuspensiondampingConstant以及suspensionAxis三个参数就行。
suspensionAxis设置为(0 0.15 0),意思是悬架在Y轴的行程为0.15m。
两个中间轮都是差不多的搭建方法。
boundingObject是实体的边界定义,一般来说,在仿真里面,边界不应该定义得太过复杂,以避免计算出错。在我的模型中,都是以给对应形体的transform填入DEF,然后再boundingObject里面使用USE选择。
在worldInfo里面,有一个CFM参数,这个参数和物体的柔软度相关。将其改小,就能修改减少物体下陷的情况。
控制器大概用到了三个函数
wb_motor_set_position(wheels[i], INFINITY);
wb_motor_set_velocity(wheels[i],
SPEED);
wb_keyboard_get_key()
之后会总结更多的函数用法,专门写一篇文章出来。