算法与程序
迷宫算法
经过调研与讨论,小组一致认为迷宫的简单走法就是“扶着墙走”,因此我们希望设计合适的算法让小车始终靠右墙走直至走出迷宫。在这里因为所给迷宫入口在右端,因此我们的算法思想是:令小车行进间动作的优先级为前进>左转>右转,具体实现为:先取前方传感器传回的距离值(item1),当item1>d1(d1为某一个临界值)时让小车保持前进,否则(即item1<=d1)再考虑左边传感器传回的距离值(item2),当item2>d2(d2也为某一个临界值)时让小车执行左转,不然(即item2<=d2)让小车右转。
程序实现
由于迷宫每条路宽度为60cm,而小车宽度约为30cm,经过理论上的分析,我们将前方距离的临界值d1设为45,左边距离的临界值d2设为30,而转速和延时都暂定为默认值,分别为90和1000。
理论与实际的差距
在小组实际搭建的如下迷宫场景中进行实验,我们发现了一系列算法和参数上的问题,经讨论后对其做了对应的改进和调整。
算法改进
转弯动作:小车转弯时出现了空间不够转了一半就碰墙了的情况,我们最直观的想法是将前方距离d1调大给小车足够的空间,但发现调大后传感器传回的距离值容易出现不稳定的情况,故我们考虑在每一个转弯前加上一个后退动作,留出足够的空间给小车转;
小车直行时调整:由于万向轮的方向不定,小车直行时仍有偏差故容易走歪,故我们希望使小车保持与左右墙的距离都至少为d3来使小车尽量摆正,具体实现为:当左边传感器传回的距离值item2< d3时,小车做一小角度右转,当右边传感器传回的距离值item3< d3时,小车做一小角度左转。
参数调整
距离:在实际操作中我们发现,前方传感器对距离的感知不够准确,当d1=45时会出现撞前墙和转弯过晚的情况,因此需将距离调大,经调整我们发现d1=60更切合小车改变动作时的时机,而小车与左右墙需保持的距离取d3=15时效果最佳;
轮速:由于小车左右轮转速为90时前进过快,小车来不及判断传感器传回的距离值就直接撞前墙,经试验我们将起调至适中的55,然后我们又发现左右轮实际转速不一导致小车不走直线,故我们再将反应稍慢的右轮转速相对地调大了5,即左轮转速55,右轮转速60;
延时:因为在延时内小车会保持前一动作,一开始延时默认为1000时判断前方传感器传回的距离值过晚,导致小车未执行转弯动作直接撞墙,因此我们将前进延时减为100,而在转弯动作执行时,延时过高会导致转弯的角度过大,因此我们经过反复实验又重新调整了转弯动作(包括后退和转弯)的延时,分别为1000和2500。
程序修正
鉴于以上算法改进和参数调整,我们对Blockly程序做了对应修正。
图10-11.修正后的Blockly程序
我们希望实现小车在迷宫中的运动轨迹如下图:
Last updated