1.       项目概述

1.1 实现目标

本项目目标在于实现利用计算机自动发布指令控制小车走出迷宫。
其中计算机与摄像头相连,监控小车位置,通过图像处理算法,对小车发布运动指令。
计算机与小车之间的通信为有线串口通讯方式。

 

1.2 所需材料

小车一部,采用双直流电机驱动,由实验室提供并加以适当改造;

         小车控制电路板一套,实验室提供;

         外置摄像头一个,自备;

         迷宫跑道,由上届传承并加以改造;

 

 

1.2-1  小车及控制板照片

 

 

说明: 说明: 说明: E:\科创照片\IMG_20111217_132209.jpg

 

1.2-2  迷宫照片

 

 

 

2.       小组成员及分工

组长:武晓辉,负责图像处理、迷宫、路径等算法。

组员:李卓韡,负责小车控制,上位机、下位机程序编写。


 

3.       项目整体说明

3.1              整体结构

本系统主要有三部分组成:信息采集(摄像头)、数据处理及指令生成(计算机)、指令执行(小车)。
以上三步骤不断往复构成一个闭环控制系统,来实现小车自主走迷宫的功能。

 

3.1-1  整体结构图

 

 

3.2 软件部分

3.2.1 开发环境

         Visual Studio 2010 + Open CV 2.2

         Keil4

 

3.2.2 图像采集

使用Opencv库当中的cvCreateCameraCapture 函数来得到一个指向摄像头的一个CvCapture结构,用于打开摄像头。
cvQueryFrame
从摄像头中抓取并返回一帧。它的返回值是IplImage*,因此就可以从摄像头中取到图像。
在整个程序中使用循环调用,就可以不停地从摄像头当中获取每一帧图像。
每一帧图像实际上就相当于一张图片,我们可以根据我们所需,从图片当中得到有用的信息,从而实现控制。

说明: 初始

 

3.2.3 图像处理

图像处理部分主要有以下几个方面:

1、图像的矩阵透视变换

图像的矩阵变换按照在课程讲义中给出的进行透视变换的函数进行修改,进而能够完成变换的任务。

 

说明: 透视变换后效果

 

2、图像的二值化

图像的二值化采取的方式是在初始设定RGB 阈值,再对采集到的图像进行逐像素的对比,大于此阈值,则显示黑色,
即(R,G,B=(255,255,255),反之,则显示为(R,G,B=(0,0,0),据此来完成图像的二值化变换

说明: 地图二值化完成

 

3、图像的细化及霍夫变换

图像的细化和霍夫变换采用了cvThin 霍夫变换的函数。
由于在走迷宫项目中完成二值化即可将“1”设定为墙的部分,所以此出两个函数在实验实现后在后续程序中就没有使用。

 

3.2.4 路径分析

生成迷宫后,对控制台程序所生成的9*9的点阵进行分析,在手动选择了入口和出口后,可以根据各个点出是0或者1,来自动寻找一个可以走出去的路径。

说明: 迷宫路径生成 

 

3.2.6 上位机程序

小车的上位机程序主要负责根据图像处理后迷宫及跟踪算法生成的最终指令来调用不同的函数,
从而通过串口通信向小车实时的发布当前指令。

         上位机程序主要提供了以下5个接口函数,供生成指令的程序调用:

bool kcTurnLeft(CSerialPort& Port);                  //小车左转

bool kcTurnRight(CSerialPort& Port);               //小车右转

bool kcGoStraight(CSerialPort& Port);             //小车前进

bool kcGoBackwards(CSerialPort& Port);        //小车后退

bool kcStop(CSerialPort& Port);                         //小车停止

         通过调用以上5个函数,来控制小车的运动情况。

         此外,上位机程序要需要完成串口的初始化、通信协议的制定以及异常处理等辅助功能。

 

指令的定义(根据单片机的I/O与电机芯片的连接情况制定)

#define Command_left 32                          //左转单片机指令

#define Command_right 4                          //右转单片机指令

#define Command_straight 36                 //前进单片机指令

#define Command_backwards 0              //后退单片机指令

#define Command_stop 255                      //停止单片机指令

 

 

3.3 硬件部分

3.3.1 概述

硬件部分主要是由实验室提供的双直流电机驱动的小车及控制电路板组成。
控制芯片主要有宏晶科技STC11L02型号单片机以及两片电机控制芯片。
单片机通过串口接收来自上位机的指令并控制电机芯片;
电机控制芯片负责控制直流电机的正反转及停止。

 

3.3.2 串口通讯

         波特率:9600

帧格式:1起始位8数据位1停止位;

  验:无校验位;

3.3.3 下位机程序

         下位机程序通过串口接收来自上位机的指令,并控制I/O端口的电平变化,从而控制电机芯片。

         其中主要部分为串口接收中断服务程序:

void serial_rcv () interrupt 4

{

         RI=0;

                            P1=SBUF;

}

         其功能是将接收到的8bit数据输出到P1端口上。

 

3.3.4 电机控制

单片机控制电机控制芯片在操控左右两个驱动轮。
两轮同向正反转来实现小车的前进与后退;两轮反向传动来实现左右转向。

 

 

4. 项目完成情况

4.1 项目完成度

已经完成图像处理部分工作,计算机能够采集图像并进行透视变换,二值变换,细化和霍夫变幻等工作。
也完成迷宫路径生成和小车的行进方式的分析。

        

完成基于VS2010的小车上位机程序编写;完成基于Keil4STC89C52单片机的下位机程序编写。
实现小车与PC间的串口通信与相关指令调试。
对小车进行了可复原的硬件改装。

4.2 测试情况

小车可自由运动(前后左右,转弯等)             

小车可接受计算机指令                                              

计算机可实时采集小车图像                                    

计算机可抽象出迷宫                                                  

计算机可计算最优路径                                               ×

计算机可控制小车在最优路径上运行                   ×

能较顺利的走出迷宫                                                   ×

4.3 系统不足

         系统中的一个中间环节(指令生成)没有能够顺利实现,导致整个系统最终不能完整运行。

 

5. 心得体会

武晓辉:经过一个学期的实践与学习,经历了很多的困难和挫折,虽然这次科创存有这样或者那样的遗憾,但是还是学到了很多东西。本人负责opencv部分的图像处理,在程序的编写中了解了opencv,学习了图像处理的内容,为以后的学习铺垫了一个更好的基础。同时,也第一次的亲身参与到项目的整个过程,辛苦,刺激,充实。我享受每一次的调试程序和代码,享受在项目中的每一次进步。也感谢组员给与的帮助和支持。

 

李卓韡:在此次项目中,我主要负责硬件及小车方面的程序。通过自学51单片机教程,初步掌握了51单片机的原理及基于keil4的编程,包括中断程序的编写以及串口通信等。在此过程中,我体会到了软硬件交互的乐趣,并且着手在小车原有硬件配置上加以改造,使得性能表现更为完善。总之一切都在摸索中前行,同时感谢老师、助教、同学的帮助。

 

 

6. 致谢

         感谢张士文老师一学期来对项目的支持以及各种答疑解惑;

         感谢王岩老师对图像处理部分的悉心讲解和技术指导;

         感谢实验室助教在系统调试过程中提供的帮助和支持;

         感谢历年小组提供的各种参考资料;

7. 参考资料

         Image_Processing_Instruction_2b  王岩

         历年各小组代码