一、前言
这算是一个综合应用了,算是对过去多年知识的一个简单总结。在做之前我很焦虑,怕自己半途而废。不过最终还是用7个晚上完成了这个项目,最终的实现并不难,只不过是结合了电子技术和计算机技术的一个应用,算是对过去多年自动化、软件工程的学习和工作的一个集成,算是给自己的一个礼物,也是一个纪念。
演示视频:
https://www.bilibili.com/video/av31008997
二、硬件部分
1、硬件示意图如下:
硬件示意图2、模块说明
模块名称 | 功能说明 |
---|---|
树莓派 | 运行树莓派定制的Debian系统,采用Python的gpiozero库控制树莓派的GPIO。 |
继电器 | 本来可以用L298N电机驱动芯片,不过我的L298N坏了,改用继电器代替。 |
3路寻迹 | 用于检测地上的黑线,检测到黑线时输入0,否则输入1。 |
底盘 | 2个直流电机驱动,考虑到树莓派的供电情况,我没有用树莓派为电机供电,而是通过继电器直接给电机供电。 |
3、实验环境
最终的实验环境就是这样的了:
实验环境
三、软件部分
1、算法描述
由于输入(3个)和输出(3个)的状态都较少,我采用了一个很简单的强化学习的算法,我们就叫Naïve Table Reinforcement Learning Algorithm(朴素表格强化学习算法)吧。
字符说明
字符标识 | 字符说明 | |
---|---|---|
状态 | ||
RS | 寻迹模块右检测器检测到黑线 | |
MS | 寻迹模块中检测器检测到黑线 | |
LS | 寻迹模块左检测器检测到黑线 | |
行为 | ||
L | 小车左转 | |
M | 小车直行 | |
R | 小车右转 |
算法文字描述
每次取L、F、R三个维度的最大值决定行走的方向,程序开始时,因为所有action的值都为1,所以随机选择行走方向,行走后根据寻迹模块的输入更新表格的数据,比如:如果RS=L,选择了L,小车走一步偏离了方向,这时给L一个-1的奖励,加到L上;如果选择了R,小车在正确的道路上,这时给R一个+1的奖励。这个算法真的很Naïve了。值得一提的是,我给MS=L的状态每次都加一个随机选择方向的可能以模拟真实情况。
2、算法伪代码
伪代码3、小车行走代码
以直行代码为例,其它的类似。
直行代码
四、后记
以前在学习和工作的工程中,一直纠结在想要写底层驱动,现在想来那是自己跟自己较劲。Linux嵌入式开发板买过三个,智能小车底盘都买了两个了,还有一堆电子元件,视频教程也看了很多很多,基本的原理是明白,不过一直没有实践,最终也没能把这些东西用起来,一直都是徒劳。那时候不明白自己想要做什么,想着越底层越高端,其实不然,我想要做的用树莓派就可以实现,没必要一直跟底层较劲。在人生的路上,难免会走一些弯路,不过不要紧,要及时调整,找到自己真正适合和感兴趣的,并且自己能够胜任的才是最好的。我们的分工各有不同,不可能都去研究某个领域底层的底层,要能够合理利用有效资源,把自己能够胜任的工作做到最好才好。不过话又说回来,以前学的东西也不是一点用都没有,算是自己知识的一个积累,也许在适当的时候可能会用上。希望在以后的学习和工作中,要明确自己的目标,合理的利用有效资源,实现小小的愿望,这样才会过得不累。
网友评论