一、项目简介

1、研究内容:

    本项目将操纵智能小车实现迷宫寻宝的功能,该小车由旭日X3派和STM32F103联合实现。主要研究智能小车能够实现前进、后退、左右转、刹车、上坡等功能,同时在底层增加红外模块进行循迹,增加超声波模块进行探测。在项目研究后期,我们将使用二轮电机进行小车的操控,在小车轮子和摄像头上尝试使用舵机。

2、项目特色:综合学习调用蓝牙模块、遥控模块、红外模块、上坡PID算法调节、超声波模块完成小车的完整操作,使用上下位机器协同操作。适用于多场景的小车。

3、研究意义:

    智能小车可以在各种各样的环境下高效工作,这将为人们的生活提供高质量的服务,甚至代替人类去恶劣的环境下完成一些勘测任务,如本项目将要完成的迷宫寻宝任务

4、X3派与STM32连接框架

(1)旭日X3派作为上位机,主要负责摄像头识别、神经网络识别以及算法编写。

(2)STM32作为下位机,主要负责电机控制与模块操作。

(3)旭日X3派和STM32之间通过有线串口连接。

二、STM32部分开发进度——串口调试与接收、小车位移控制

1、串口调试与接收

针对于寻宝过程可以拆分为几条路径。每条路径中含有多个行动指令,而路径之间需要给上位机反馈信号来达到让上位机判断是否真的有宝藏并进行下一步操作。所以需要小车能够接收一连串指令,并按顺序依次执行。这里接收和存储数据使用了FIFO数据结构,这样就能保证先写入的数据被先读出执行。

但是需要注意的是,数据写入不能使用串口调试助手一次性全部写入。否则读取会有错误。如果是分开写入(既是写入时间间隔很短)也不会有问题。可能是因为使用串口直接写入会中断掉之前一个指令的运行,这样就使数据发生了错误。所以在上位机里,需要将每条路径中的指令分开发送。

在实际测试时,大体上指令接受没有问题,但是在第一组数据接收到之后,小车立刻就给上位机反馈了指令。分析原因应该为队列的元素写入写出过快,使得程序直接运行到反馈的位置。所以这里使用非阻塞延时,将反馈的时间与执行指令分开,这样就能解决这个问题。最终结果符合预期。

2、小车位移控制

在已经有PID对小车的行驶速度进行了精准控制后,为了实现位移控制,即需要对运动时间进行监测,从而较为精准的计算出小车的行驶距离。由于STM32F103只有两个基本定时器,而控制MPU6050数据更新速度的TIM7定时器频率过高又会使得系统卡顿。所以这里选择提高TIM7的频率,再将其分频至合适频率供MPU6050使用。

如果我们使用数字红外传感器进行循迹,就需要考虑在非直行部分的误差处理。因为小车使用差速原地转向,转向时不会前进。所以设置一个标志位,当直行时开启标志位,其他时刻关闭标志位。而定时器中只有当标志位为1时才会开始计时。

而这里的时间就是通过指令T后面输入的距离换算过来的。当计数器满足行驶距离的要求之后,便清零。

三、X3派部分开发进度——识别代码移植与串口发送

由于在x3派的开发过程中,无法完全安装好bluez的蓝牙库,因此对于我们项目来说,利用蓝牙传输数据的策略失效。所以,我们利用usb转ttl有线传输,来解决这一问题。

在与下机位联合调试前,我们已制定好一套规则,用以传输串口:

首先确定指令集:

(1)小车直行:A+速度(-140~-20 || 20~140)(单位cm/s)+空格
指令示例:A100 A-120
(2)小车左转:L+角度(-180~180)(单位:度)+空格
指令示例:L30 
(3)小车右转:R+角度(-180~180)(单位:度)+空格
指令示例:R30 
(4)小车急停:S+空格
指令示例:S 
(5)蜂鸣器响起:B+空格
指令示例:B 
(6)蜂鸣器关闭:b+空格
指令示例:b 
(7)打开OLED并按照模式显示:O+模式(0,1,2···)+空格
指令示例:O0 
(8)红外开关试能:I+使能(0关闭,1开启)+空格
指令示例:I1 
(9)红外循迹试能:T+使能(0关闭,1开启)+空格
指令示例:T1 
(10)通过PID控制小车角度转向:G+旋转角度(-360~360)+空格
指令示例:G90 
注意:角度>0,则向左转;角度<0,则向右转

接着规划八条路径,并按照与下位机的自定义通信协议转换为八条路径指令存放于一个数组里。例如:“RI2 UP1 LE2”

条路径使用延时将操作指令一个一个发给下位机(延时5ms),发完一组路径后上位机自动停止并等待下位机返回'A'再开始延时发送下一条路径。

直到九条路径发完

模拟串口传输效果图如图所示:

从图中可以看出,串口发送已经完整从上机位发出,可以被下机位接收。

四、联合调试与反思

图片为我们联合调试视频中截取的画面,小车正在执行走迷宫的任务,实验效果很完美。但是对于实验任务要在十分钟内走完迷宫,依然需要对算法进行改进。

同时,在细节方面也需要打磨,比如小车初始位置放在哪里,对于找宝藏位置的设定都需要进一步标定。

对于本次调试,依然有需要改进的地方,反思如下:

1、距离测试会有偏差,解决方案:通过数字寻迹补偿
2、数字寻迹安装位置不正,解决方案:底板打孔,重新安装,放在车尾
3、数字寻迹微调算法有问题。解决方案:修改下位机算法,一端按照标准速度,另一端按照速度➕一定偏移量转向。保证正常标准速度运行。
4、运行时间长后,MPU6050陀螺仪有温度漂移。解决方案:拟合近似关系,随着时间偏移加修正系数。