小型双轮差速底盘三灰度循迹功能的实现
1. 功能说明
在小型双轮差速底盘样机前方安装3个灰度传感器【https://www.robotway.com/h-col-137.html】 ,实现机器人沿下图所指定的跑道路线进行运动的效果。

2. 使用样机
本实验使用的样机为R023样机。

3. 功能实现
3.1 电子硬件
在这个示例中,我们采用了以下硬件,请大家参考:

电路连接说明:
① 左轮直流电机连在D9,D10接口上;
② 右轮直流电机连在D5,D6接口上;
③ 3个灰度传感器从左至右连接在A0,A4,A3端口上。

3.2 编程框架
本实验的编程框架用到了有限状态机。有限状态机(Finite-state machine)简称FSM,表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。它把复杂的控制逻辑分解成有限个稳定状态,在每个状态上判断事件。由于有限状态机有有限个状态,因此可以在实际中实现。有限状态机可以广泛的应用于机器人多个传感器触发组合状态的判断,大大提高检测效率。
状态表
机器人的传感器触发一般用条件判断来做。
这时机器人程序的一般思路是:

所以我们总是要用到大量的 if 语句,比如双轮小车的某个功能:

用伪码写出来就是:
在只有一个传感器的情况下,我们假设这是个开关量传感器。那么我们可以得到一个状态表格:

这个传感器有两个状态。
而当有两个传感器时,则有四个状态。

如果我们用 if 语句写这四个状态,就显得比较长。

在编程的时候,状态罗列的越全,机器人的bug就越少。但是随着传感器的增多,状态数量按2的N次幂增加,大量的if语句使执行效率变得很低,经常出现识别不灵的情况。我们需要换一种高效写法。
多个确定数量的传感器的触发组合,符合有限状态机的概念,有限状态机一般是用Switch语句来实现。如:
不难发现,这段语句实现的关键,就是识别出上页表中的1、2、3、4,四个状态序号。
那么问题就来了:我们如何让机器人知道自己传感器的触发组合对应于1、2、3、4的哪个序号呢?
二进制状态表
下面,我们把每组传感器返回值看成一个二进制数值。

结果我们发现了一种新的、可计算的编码方式:

于是,只要我们知道了传感器们的触发状态,也就知道了序号;知道了序号,也就知道了传感器们的触发状态。用这个序号去写switch语句,再合适不过了。下面我们要做的是,用一种算法,让机器人能够返回自己接收到的传感器组合值的二进制数据。
算法精解
我们可以使用以下算法来实现:
首先设置一个变量s,这个s,将存储传感器组的二进制状态序号。
我们还需要用到一个重要的运算符“<<”,这个运算符的意义是:左移
如:1<<n,意思是1向左移动n位,空出来的数位用0填补。
如:1<<1,结果就是10;1<<2,结果就是100;101<<1,结果就是1010
只要让机器人依次返回各个传感器的状态数值,最早获取的,移到最左;第二获得的,移到“倒数第二左”,……,以此类推。即可获得。
如两个传感器均触发:
先获得1号的数值(真)并左移0位,得

再获得2号的数值(真)并左移1位,得

两数值取“或”,即可得11
数学问题解决了,很容易就可以转化为程序语句:
于是switch语句可以写为:
策略表
下面我们以本实验中的“小型双轮差速底盘-3灰度循迹”程序为例,再来推导一遍。
传感器触发情况、小车行驶状态、对应行为策略表如下:

伪码如下:
这段代码中的动作,完全由策略表分析获得,因此,当状态比较多时,用户要学会利用策略表进行分析,从而确定机器人的动作策略,而不是凭空想象。
3.3 编写程序
编程环境:Arduino 1.8.19
编写并烧录以下程序(Track_Car.ino),该程序将实现演示视频中的动作。
4. 资料下载
资料内容:3灰度循迹-例程源代码
资料下载地址 https://www.robotway.com/h-col-113.html