片,主要用于数据的发送和接受。电机驱动模块使用BTN驱动。显示模块显示信息使用OLED显示屏。
总体结构图如图1所示。1.2 主控与驱动模块
图1 整体结构图
图2 主控PCB图
值,传送给主控STM32RCT6并进行PID计算,最终实现控制小车的运动方向和距离。
1 组件硬件
1.1 整体结构图
本系统各模块完成了以下任务:嵌入式模块是使STM32F103RCT6作为主控芯片,主要功能是数据采集、处理、发送,以及控制驱动。测速模块使用的是霍尔编码器,用于直流电机测速。图像数据采集则是使用openmv作为摄像头模块。电源模块使用LM2596和AMS1117作为电源芯片实现电压转换。蓝牙模块使用BC417作为蓝牙主芯
图3 驱动板PCB图
• 113 •
ELECTRONICS WORLD・技术交流STM32F103RCT6是32位微处理器,其flash程序内存为256字节,其最高工作频率为72MHz。主控如图2所示。本设计使用的直流减速电机的工作电压为(7-13)V,采用BTN系列芯片。因为BTN系列芯片工作电压范围宽,从5V到28V,最大工作电流可达70A且外围电路设计简单,驱动模块图3所示。1.3 OPENMV介绍
openmv是基于STM32F4系列单片机和OV2640图像传感器的开源微型机器视觉模块。其自身携带MicroPython解释器,可以利用编辑Python程序来实现各种功能,包括IO端口控制等功能。1.4 信标系统
信标灯由三部分组成:白色圆柱形灯罩、金属底座和固定底盘。灯罩采用圆柱形达到圆形效果,其材质为白色塑料,内部的红色信号能透灯罩。本文用蓝线和白线连接两个带线圈的信号灯。在信标控制器的控制下,灯亮了。当小车到达发光信号灯位置时,在永磁体和线圈的作用下,信标灯熄灭,另一信标灯亮。1.5 AprilTag码介绍
AprilTag是一种视觉基准系统,可以应用于多种任务包括AR、机器人和相机校准。AprilTag标签可直接打印纸上,AprilTag探测器就能计算出与相机相关的精准3D位置、方向和id。AprilTag内容包含三个主要步骤。第一步是根据梯度来检测图像中的边缘。第二步是在边缘图像中找到所需要的四边形图案再进行筛选。AprilTag试图尽可能多地检测边缘。首先,删除非直边,在直边上搜索相邻边。最后是对所获得AprilTag码进行编码和解码。利用单个线性变换矩阵结合多个摄像头的信息,得到二维码的相关姿态信息。
2 软件算法
2.1 openmv追踪小车流程
使用openmv精确定位的三维坐标,视觉的位置有一个相对于相机坐标系建立在地上,在相机图像将更快的计算机生成一个坐标数据的基础上,形成计算机图像及图像坐标系统。事实上,这是因为相机的标签在地上旋转后在一系列的姿态和位置的翻译。实验场景图如图4。
如图4所示,在四旋翼飞行器上连接openmv摄像头,在摄像头的视野范围内放置一定数量的信号灯和贴有AprilTag码的车,openmv通过检测信标灯和小车上的AprilTag码的位置,实现精准定
• 114 •
位,并通过算法来计算两者偏差,通过蓝牙传输给小车主控,然后小车通过位置PID和速度PID输出四个电机的PWM波到达目的地完成对目标的追踪。整体程序流程图如图5所示。
图4 装置场景图
图5 整体程序流程图
2.2 信息发送接收方法
当摄像头检测信号灯时,它先检测到红光,再检测圆形。所以我们首先确定阈值,通过find_blobs函数找到色块相机想要锁定的阈值,用霍夫变换算法进行圆的识别。使用find_circles()方法查找完全位于图像内部的圆。相机就可以准确的定位信标灯。然后再通过摄像头检测AprilTag码的位置值,将其赋给小车,然后将小车与信号灯进行位置比较以判别方向。车头在0°到180°时,从电
ELECTRONICS WORLD・技术交流 图6 受AprilTag码干扰 图7 消除干扰 图8 实物图
脑中串口接收的值为0,2,4,6。当车头在180°到360°时,测得的数据是1,3,5,7。但是一旦超过180°,算法会自动减去180°,传送给小车,这样小车不需要调转车头仍然向信标灯的位置前进。在数据发送之前需要对数据进行处理:将车与目标位置X轴、Y轴、角度偏差放大50倍在除以256换算成16进制数便于处理发送。例如:R1=int(hex(int(abs((car_X-color_X)*50)/256)))。2.3 串口传输
小车通过蓝牙串口获取摄像头发送的目标位置信息后,先读取数据,为了实现数据的真正传输,它将传输的10字节的数据定义为一帧数据,从0xff和0xfe开始。如果检测到,只接收从0xff和0xfe开始的数据帧,才认定其数据为正确数据。通过此协议构造出串口中断服务程序接收数据。将小车上收到的数据解析后通个另一个蓝牙串口发送到电脑上进行验证数据的准确,并将摄像头发送的数据打印在串口终端上进行对比,对比过程中得到摄像头发送的数据:0xff,0xfe,0x01,0x07,0x9e,0x06,0x72,0x00,0x02,0x01,与接收到的数据相同达到了成功通信,根据通信协议处理后得到需要的数据为0x01,0x07,0x9e,0x06,0x72,0x00,0x02。这些数据代表运动模式和X轴Y轴及Z轴的值。小车在接收到数据后进行读取并获得目标位置偏差,以及运动方向,在数据中去掉头部协议字节,后面分别为X轴偏差,Y轴偏差,和车的行驶角度,在得到数据后进行运动分析解算出车的四个轮子的转速,然后将目标值和测量值输入到PID算法分析函数中进行PID运算最后得到PWM波输出。
光问题,扫描信号灯时会对AprilTag码产生误判,这就对分析效果产生很大的影响,如图6所示。
因此,我们需要通过修改门限值来达到信号灯和AprilTag码检测互不影响的效果。使得最终摄像头只识别到了信标灯,虽然会对信号灯的扫描像素有影响但是不受AprilTag码的影响,达到精准定位的效果。如图7所示。现实环境扫描结果如图8所示,红色代表锁定信号灯,绿色代表锁定到车,且各自独立。
4 小结
本系统主要设计了一种基于STM32定位追踪系统,利用了无人机定高加上摄像头openmv对信标灯和AprilTag码经过一系列算法的精准定位来判断小车车头位置,计算小车与信标灯位置的差值并进行合成,再通过配对蓝牙将数据传输给小车,小车的串口接收数据后进行位置解算,确定最终姿态以达到追踪效果。使用python编写使得代码更为简洁,加快了定位速度,增强了定位精度,使用STM32RCT6作为嵌入式平台,体积小重量轻便于携带。
项目名称:一种基于图像识别技术的四旋翼飞行器的设计与实现,项目编号:201813617015。
3 数据误差分析及解决方案
当红色阈值不变时,同时检测到信号灯和ApirlTag码,由于曝
• 115 •
因篇幅问题不能全部显示,请点此查看更多更全内容