工程实践与科技创新IIb设计报告 |
小车走迷宫 |
M20组 |
2012/1/7 |
目录
本项目目标在于实现利用计算机自动发布指令控制小车走出黑线。其中计算机与摄像头相连,监控小车位置,通过图像处理算法,对小车发布运动指令。计算机与小车之间的通信为有线串口通讯方式。
小车一部,采用双直流电机驱动,由实验室提供并加以适当改造;
小车控制电路板一套,实验室提供;
外置摄像头一个,自备;
跑道,由上届传承并加以改造;
图1.2-1 小车及控制板照片
图1.2-2 跑道照片
组长:武煜;负责跑道简化算法的设计、跟踪算法的设计,单片机的程序设计、串口通讯的编程实现、上位机控制程序(控制小车)的设计
组员:吴佳峻;负责跑道简化算法的设计、上位机控制程序的设计
本系统主要有三部分组成:信息采集(摄像头)、数据处理及指令生成(计算机)、指令执行(小车)。以上三步骤不断往复构成一个闭环控制系统,来实现小车自主走黑线的功能。
图3.1-1 整体结构图
(1)此为双面板,元器件应统一放置在印有白色的元器件名称的一面,切勿放在反面。
(2)此板包含较多的贴片元件,对焊接技术要求较高.对于贴片元件,可先在其中一个贴片上上好锡,然后将元器件的一端先焊接在该贴片上,再将剩下的一端焊上去.贴片元件都较小,可用镊子辅助。
(3)焊接应基本遵循元器件由矮到高的原则,先焊接电阻和电容和U1 和D1,然后焊接J1-J4,接着焊接JP1,JP2 和S1,最后焊接U2 的底座。
(4)JP1 和JP2 的3pin 跳针,连接12 是开启蓝牙功能,连接23 是串口,所以我们还需要把23 连上。
(5)开关S1 焊接的时候将开关上的一个蓝点(用记号笔做了记号的)对准板子上的一个点即可,同理,J1-J4 的底座方向也要与板子上画的相同,C3,C5,C7 上有一个竖线的一端是正极,D1 上有一个绿色的小箭头与板上方向一致即可.U2 的一段有一个凹进去的内圆,对准即可。
Visual Studio 2010+ Open CV 2.2
Keil4
使用Opencv库当中的cvCreateCameraCapture 函数来得到一个指向摄像头的一个CvCapture结构,用于打开摄像头。cvQueryFrame 从摄像头中抓取并返回一帧。它的返回值是IplImage*,因此就可以从摄像头中取到帧图像。在整个程序中使用循环调用,就可以不停地从摄像头当中获取每一帧图像。每一帧图像实际上就相当于一张图片,我们可以根据我们所需,从图片当中得到有用的信息,从而实现控制。
图像处理部分主要有以下几个方面:
1、图像的矩阵透视变换
图像的矩阵变换按照在课程讲义中给出的进行透视变换的函数进行修改,进而能够完成变换的任务。
2、图像的二值化
图像的二值化采取的方式是在初始设定一RGB 阈值,再对采集到的图像进行逐像素的对比,大于此阈值,则显示黑色,即(R,G,B)=(255,255,255),反之,则显示为(R,G,B)=(0,0,0),据此来完成图像的二值化变换。
3、图像的细化及霍夫变换
图像的细化和霍夫变换采用了cvThin和 霍夫变换的函数。
将跑道抽取出一条条线段,依次首位相接排列,并记录各个线段首尾坐标,实际中将通过这些坐标来控制小车的行进方向。
小车的上位机程序主要负责根据图像处理后的黑线及跟踪算法生成的最终指令来调用不同的函数,从而通过串口通信向小车实时的发布当前指令。
上位机程序主要提供了以下5个字符常量代表小车的行进方向:
unsigned char left='z';
unsigned char *Command_left=&left; //左转单片机指令
unsigned char right='c';
unsigned char *Command_right=&right; //右转单片机指令
unsigned char straight='w';
unsigned char *Command_straight=&straight; //前进单片机指令
unsigned char backwards='s';
unsigned char *Command_backwards=&backwards; //后退单片机指令
unsigned char stop='p';
unsigned char *Command_stop=&stop; //停止单片机指令
通过调用以上5个字符常量,来控制小车的运动情况。
此外,上位机程序要需要完成串口的初始化、通信协议的制定以及异常处理等辅助功能。
硬件部分主要是由实验室提供的双直流电机驱动的小车及控制电路板组成。控制芯片主要有宏晶科技STC11L02型号单片机以及两片电机控制芯片。单片机通过串口接收来自上位机的指令并控制电机芯片;电机控制芯片负责控制直流电机的正反转及停止。
波特率:600;
帧格式:1起始位8数据位1停止位;
校 验:无校验位;
下位机程序通过串口接收来自上位机的指令,并控制I/O端口的电平变化,从而控制电机芯片。
void act(){
switch(ctr){
case 'w':
move(0,1,0,1);
break;
case 's':
move(0,0,0,0);
break;
case 'z':
move(0,0,0,1);
break;
case 'c':
move(0,1,0,0);
break;
default:
move(1,1,1,1);
break;
}
}
其功能是将接收到的8bit数据输出到P1端口上。
单片机控制电机控制芯片在操控左右两个驱动轮。两轮同向正反转来实现小车的前进与后退;两轮反向传动来实现左右转向。
软件需要一定的设置工作,并需对车、板进行一定的配合动作,需要人工调节图像之类的参数。硬件为有线控制方式,系统整体运行顺利,较为灵敏。
小车可自由运动(前后左右,转弯等) √
小车可接受计算机指令 √
计算机可实时采集小车图像 √
计算机可抽象出黑线 √
计算机可计算最优路径 √
计算机可控制小车在最优路径上运行 √
能较顺利的走黑线 √
由于准备时间比较晚,仓促之中并没实现小车的全自动控制,以及无线通讯,甚感遗憾。
武煜:由于本学期专业课压力比较大,还有事先对此项目认识不足,导致过于忽视。结果期末时仓促准备,并没有完美实现自动控制及无线通讯功能,深感遗憾。不过还是学习到了opencv这个图像处理库的一些知识,对opencv有了基本的了解,也帮我弄明白了其和opengl的区别。同时通过51单片机的编程再次深入的学习到嵌入式编程的方法。同时进一步学到了通过c++进行串口通讯编程的方法。收获良多,感谢期间老师、助教和同学的帮助。
吴佳峻:在此次项目中,我主要负责抽象跑道的程序以及小车控制中部分程序的设计。通过和同学的讨论了解到了硬件编程与软件编程的区别,感觉各有乾坤。总之一切都在摸索中前行,同时感谢老师、助教、同学的帮助。
感谢张士文老师一学期来对项目的支持以及各种答疑解惑;
感谢王岩老师对图像处理部分的悉心讲解和技术指导;
感谢实验室助教在系统调试过程中提供的帮助和支持;
感谢历年小组提供的各种参考资料;
24组的报告;
《Visual C++/TurBo C串口通信编程实践》
《OpenCV教程_基础篇》