智能小车汇报.docx
《智能小车汇报.docx》由会员分享,可在线阅读,更多相关《智能小车汇报.docx(17页珍藏版)》请在冰点文库上搜索。
智能小车汇报
目录
目录1
第一章引言2
第二章智能车整体设计思路和方案2
第三章智能车机械部分安装和调试3
3.1前轮部分3
3.2底盘部分3
第四章智能车的电路设计与实现3
4.1电源部分3
4.2电机驱动4
第五章智能车的控制策略和算法5
5.1目标识别算法5
5.2电机的控制6
第六章智能车控制软件的编写6
6.1初始化程序6
6.2控制主程序6
第七章运行调试部分6
7.1arm-linux-gcc交叉编译开发环境6
附件程序7
第一章引言
随着汽车工业的迅速发展,关于汽车的研究也就越来越受人们的关注,而汽车的智能化已成为科技发展的新方向。
本设计就是在这样的背景下提出来的。
此次设计的简易智能小车是基于arm11控制及传感器技术的,实现的功能是小汽车可自动识别目标(比如一个小球),,利用电两个电机的差动调节,控制电动小汽车的自动避障、寻光及自动停车。
通过摄像头采集视野范围图像并对图像处理进行目标识别,并由arm系统来控制智能车的行驶状态。
第二章智能车整体设计思路和方案
控制芯片:
ARM11(128M内存主频533MHz,最高667Mhz。
32bit数据总线。
LCD显示)
小车驱动模块:
两个5V直流电机,通过l9110h电机驱动芯片控制小车的前进,转向方向。
图像采集模块:
USB1.0摄像头,500万像素,LCD显示实时图像。
识别模块:
OPENCV1.0级联分类器。
设计思路:
opencv通过USB摄像头采集图像,通过级联分类器识别目标,通过目标在图像中的大小和位置,通过GPIO输出高低电平控制小车的前进,转向。
图1.1系统结构框图
第三章智能车机械部分安装和调试
3.1前轮部分
通过两个电机控制小车,前进的时候两个电机都向前转,后退的时候两个电机向后转。
左转时候左边电机不转,右边电机转动,又转时右边电机不转,左边电机旋转。
3.2底盘部分
采用三轮底盘,方便小车灵活转向。
第四章智能车的电路设计与实现
4.1电源部分
直流电机使用三节五号电池供电,在车的底盘下方,ARM板单独的供电。
4.2电机驱动
图4.4l9110h驱动电路原理图
图4.5电路实物图
每个电机通过一对高低电平控制。
第五章智能车的控制策略和算法
5.1目标识别算法
Opencvhaar特征级联分类器,将目标的样本图像载入并进行训练,训练出基于haar的级联分类器,可以识别特定的目标(小球)。
然后判断识别目标在整幅图像中的大小,识别目标的大小在整幅图像中的比例较小的话,可以判断数目标在车的前方而且距离比较远。
识别的目标用圆形进行标注,以图像的横向中间为界限,如果圆心在界限的左边,则小球在车的左边,反之在车的右边,中间可以给适当的缓冲区。
5.2电机的控制
直流电机是通过电机驱动芯片控制的,电机驱动芯片连接到ARM的GPIO接口,通过给GPIO接口输出高低电平来控制电机。
由于AMR上使用的是LINUX操作系统,程序想要控制电机,先要加载GPIO驱动,通过驱动程序控制GPIO输出的电平。
本程序使用GPIO的M0-M3接口,M0,M1控制左边的电机,M2,M3控制右边的电机。
第六章智能车控制软件的编写
6.1初始化程序
初始化程序主要包括:
载入OPENCV级联分类器特征数据,加载USB摄像头驱动打开USB摄像头,加载GPIO驱动,打开GPIOM0-M3。
6.2控制主程序
启动linux的定时器,定时器每隔1毫秒执行一次。
定时器的执行函数包括opencv摄像头数据采集和haar特征分类器的目标识别,这两个过程是串行的,将摄像头采集的每一帧数据载入级联分类器,如果识别出了小球,就通过识别目标图像的大小和圆心的位置判断小球的位置,如果小球是在正前方,则通过驱动程序给GPIO输出前进的信号,如果在左边,右边,则给出左转右转的信号。
第七章运行调试部分
7.1arm-linux-gcc交叉编译开发环境
交叉编译这个概念的出现和流行是和嵌入式系统的广泛发展同步的。
我们常用的计算机软件,都需要通过编译的方式,把使用高级计算机语言编写的代码(比如C代码)编译(compile)成计算机可以识别和执行的二进制代码。
比如,我们在Windows平台上,可使用VisualC++开发环境,编写程序并编译成可执行程序。
这种方式下,我们使用PC平台上的Windows工具开发针对Windows本身的可执行程序,这种编译过程称为nativecompilation,中文可理解为本机编译。
然而,在进行嵌入式系统的开发时,运行程序的目标平台通常具有有限的存储空间和运算能力,比如常见的ARM平台,其一般的静态存储空间大概是16到32MB,而CPU的主频大概在100MHz到500MHz之间。
这种情况下,在ARM平台上进行本机编译就不太可能了,这是因为一般的编译工具链(compilationtoolchain)需要很大的存储空间,并需要很强的CPU运算能力。
为了解决这个问题,交叉编译工具就应运而生了。
通过交叉编译工具,我们就可以在CPU能力很强、存储控件足够的主机平台上(比如PC上)编译出针对其他平台的可执行程序
附件程序
#include"main_form.h"
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#ifdef_EiC
#defineWIN32
#endif
staticCvMemStorage*storage=0;
staticCvHaarClassifierCascade*cascade=0;
IplImage*detect_and_draw(IplImage*image);
constchar*cascade_name="/home/plg/data.xml";
IplImage*pFrame=NULL;
CvCapture*pCapture;
inttimes=0;
intleftwheel;
intrightwheel;
intfd;
inttimedeny=0;
voidinitdevice()
{
pCapture=cvCreateCameraCapture
(2);
//pCapture=cvCaptureFromAVI("/home/plg/1.avi");
cascade=(CvHaarClassifierCascade*)cvLoad(cascade_name,0,0,0);
if(!
cascade)
{
fprintf(stderr,"ERROR:
Couldnotloadclassifiercascade\n");
fprintf(stderr,
"Usage:
facedetect--cascade=\"\"[filename|camera_index]\n");
}
storage=cvCreateMemStorage(0);
}
QImagemybegin()
{
charpaths[10][30]={"/home/plg/imgs/1.jpg","/home/plg/imgs/2.jpg","/home/plg/imgs/3.jpg","/home/plg/imgs/4.jpg","/home/plg/imgs/5.jpg","/home/plg/imgs/6.jpg","/home/plg/imgs/7.jpg","/home/plg/imgs/8.jpg","/home/plg/imgs/9.jpg","/home/plg/imgs/10.jpg"};
pFrame=cvQueryFrame(pCapture);
if(pFrame)
{
//if(detect_and_draw(pFrame)==1)
//{
//}
//cvSaveImage("/home/plg/pang.jpg",pFrame);
//QImageimage((uchar*)pFrame->imageData,pFrame->width,pFrame->height,8,0,1,QImage:
:
IgnoreEndian);
if(times<10)
{
//cvSaveImage(paths[times],pFrame);
}
if(times<10)
{
cvSaveImage(paths[times],pFrame);
}
times++;
IplImage*pFrame2=detect_and_draw(pFrame);
intx,y;
inti=0;
QImageimg;
QRgb*point;
intr,g,b;
if(img.create(pFrame->width,pFrame->height,32,0,QImage:
:
IgnoreEndian))
{
for(x=0;xheight;x++)
{
for(y=0;ywidth;y++)
{
r=(int)(uchar*)pFrame2->imageData[i+2];
g=(int)(uchar*)pFrame2->imageData[i+1];
b=(int)(uchar*)pFrame2->imageData;
point=(QRgb*)img.scanLine(x)+y;
*point=qRgb(r,g,b);
i+=3;
}
}
}
returnimg;
}
returnNULL;
}
IplImage*detect_and_draw(IplImage*img)
{
intbm=0;
staticCvScalarcolors[]=
{
{{0,0,255}},
{{0,128,255}},
{{0,255,255}},
{{0,255,0}},
{{255,128,0}},
{{255,255,0}},
{{255,0,0}},
{{255,0,255}}
};
fprintf(stderr,"detect_and_draw\n");
doublescale=1.3;
IplImage*gray=cvCreateImage(cvSize(img->width,img->height),8,1);
IplImage*small_img=cvCreateImage(cvSize(cvRound(img->width/scale),
cvRound(img->height/scale)),
8,1);
inti;
cvCvtColor(img,gray,CV_BGR2GRAY);
cvResize(gray,small_img,CV_INTER_LINEAR);
cvEqualizeHist(small_img,small_img);
cvClearMemStorage(storage);
if(cascade)
{
doublet=(double)cvGetTickCount();
CvSeq*faces=cvHaarDetectObjects(small_img,cascade,storage,
1.1,2,0/*CV_HAAR_DO_CANNY_PRUNING*/,
cvSize(10,10));
if(faces->total>0)
{
t=(double)cvGetTickCount()-t;
for(i=0;i<(faces?
faces->total:
0);i++)
{
CvRect*r=(CvRect*)cvGetSeqElem(faces,i);
CvPointcenter;
intradius;
center.x=cvRound((r->x+r->width*0.5)*scale);
center.y=cvRound((r->y+r->height*0.5)*scale);
radius=cvRound((r->width+r->height)*0.25*scale);
cvCircle(img,center,radius,colors[i%8],3,8,0);
printf("center%d:
radius%d\n",center.x,radius);
if(center.x>170)
{
ioctl(fd,7);
timedeny=0;
while(timedeny<10000000)
{
timedeny++;
}
ioctl(fd,0);
}
elseif(center.x<150)
{
ioctl(fd,1);
timedeny=0;
while(timedeny<10000000)
{
timedeny++;
}
ioctl(fd,0);
}else
{
if(radius>=110)
{
ioctl(fd,4);
timedeny=0;
while(timedeny<10000000)
{
timedeny++;
}
ioctl(fd,0);
}
else
{
ioctl(fd,3);
timedeny=0;
while(timedeny<10000000)
{
timedeny++;
}
ioctl(fd,0);
}
}
}
//go();
printf("gettarget\n");
//cvSaveImage("/home/plg/pang.jpg",img);
//cvShowImage("result",img);
bm=1;
}
else
{
///////停止峰鸣器
//stop_buzzer();
printf("keepdedect\n");
ioctl(fd,0,0);
bm=0;
}
}
//cvShowImage("result",img);
//cvSaveImage("/home/plg/pang.jpg",img);
cvReleaseImage(&gray);
cvReleaseImage(&small_img);
returnimg;
}
QImage&cvxCopyIplImage(constIplImage*pIplImage);
voidTMainForm:
:
timerEvent(QTimerEvent*)
{
QImageimg=mybegin();
//img.load("/home/plg/pang.jpg");
QPixmapmp;
mp.convertFromImage(img);
m_led4->setPixmap(mp);
}
TMainForm:
:
TMainForm(QWidget*parent,constchar*name,WFlagsf)
:
TMainFormBase(parent,name,f)
{
:
:
system("kill-sSTOP`pidofled-player`");
m_fd=:
:
open("/dev/leds0",O_RDONLY);
if(m_fd<0)
{
m_fd=:
:
open("/dev/leds",O_RDONLY);
}
fd=open("/dev/ledtest",0);
if(fd<0){
fd=open("/dev/ledtest",0);
}
if(fd<0){
perror("opendeviceleds");
}
system("modprobehello");
fprintf(stderr,"keepdetect\n");
connect(m_led1,SIGNAL(clicked()),this,SLOT(checkBoxClicked()));
connect(m_led2,SIGNAL(clicked()),this,SLOT(checkBoxClicked()));
connect(m_led3,SIGNAL(clicked()),this,SLOT(checkBoxClicked()));
connect(m_led4,SIGNAL(clicked()),this,SLOT(checkBoxClicked()));
checkBoxClicked();
IplImage*frame;
frame=cvLoadImage("/home/plg/pang.jpg");
initdevice();
startTimer
(1);
}
TMainForm:
:
~TMainForm()
{
:
:
close(m_fd);
:
:
close(fd);
ioctl(fd,0,0);
}
voidTMainForm:
:
checkBoxClicked()
{
ioctl(m_fd,int(m_led1->isChecked()),0);
ioctl(m_fd,int(m_led2->isChecked()),1);
ioctl(m_fd,int(m_led3->isChecked()),2);
ioctl(m_fd,int(m_led4->isChecked()),3);
}