功能描述
小车可以根据黑色的循迹线行进,对于由分叉路口构成的迷宫状循迹路线,可以自动找到出口
硬件设计
利用TCRT-5000红外传感器进行循迹线的检测。由于黑色的循迹线会吸收传感器发出的红外线,因此反射光较少,可以据此检测出传感器所正对的部分是否有循迹线存在。
为了实现循迹和解迷宫两种功能,设置五个这样的传感器,传感器设置的位置如下图。
2、3、4号传感器用于实现循迹,当小车行进路径偏离循迹线时,可通过2、4号传感器检测到。而1、5号传感器主要用于识别迷宫中的不同路口,例如T字型路口、十字型路口、7字型路口等。
小车有两个独立的驱动轮,通过两轮差速实现转向。
算法设计
循迹算法
利用红外传感器进行循迹线的检测,将检测结果返回到arduino并进行误差判断,通过PID算法实现对小车左右轮转速的控制。
误差判断的原理是:根据各路传感器的位置,对其赋以不同的权值,从sensor2-sensor4分别赋以-1、0、1的权值,并设置变量error用于计算误差,当传感器检测到黑线时,将其对应的权值计入变量error中。当error小于0时,表示车体右偏;当error大于0时,表示车体左偏;当error=0时,表示车体基本没有偏离循迹线。得到的error将用于下一步PID的计算。
PID分为增量式PID和位置式PID,采用位置式PID,公式为:
根据上一步得到的error进行计算即可得到u(k)。起始时,将电机设置为初始速度init_speed,然后将计算得到的u(k)的正负值分别叠加到左右电机的初始速度上,即可实现PID控制。利用u(k)带来的左右轮的转速差实现小车转向的调整,当小车向一侧偏离时,就可以向相反一侧调整方向。
这里比例、积分、微分的系数需要根据实际硬件反复尝试。
解迷宫算法
实际上,我们可以将每一个岔路口或者转角看作一个结点,那么整个迷宫实际上是由结点构成的一个三叉树(可以查一下数据结构中树的概念)。那么解迷宫实际上就是一个树的搜索过程,可以用深度优先搜索、广度优先搜索算法。考虑到迷宫出口一般离入口比较远,采用深度优先搜索。深度优先搜索有两种实现方式:1.栈 2.递归调用。采用栈方式的好处是可以将搜索的结果直接保存在栈里,这样下一次小车再进入迷宫时,可以使用栈里保存的结果直接到达出口,免去了搜索出口的过程。
可以设置一个结构体,保存小车在路口三个方向上的探索情况,标记有三种类型:1.已探索,非出口 2.正在探索 3.未探索。每遇到一个新的路口,就往栈里压入这样一个结构体。
具体的实现和更多的细节见:代码