技术报告副本.docx
《技术报告副本.docx》由会员分享,可在线阅读,更多相关《技术报告副本.docx(33页珍藏版)》请在冰豆网上搜索。
![技术报告副本.docx](https://file1.bdocx.com/fileroot1/2023-2/1/c751c017-ec26-4503-8d2a-dab65e22bc89/c751c017-ec26-4503-8d2a-dab65e22bc891.gif)
技术报告副本
2014中国机器人大赛暨RoboCup公开赛
2014中国工程机器人大赛(RobotatWork)
技术报告
参赛学校
xxx大学
队伍名称
xxx队
参赛队员
xx
带队教师
(姓名/联系方式)
xx
xx
参赛项目
xx
中国机器人大赛暨RoboCup公开赛(工程类项目)组委会
中国工程机器人大赛组委会
2014年8月
填写说明
1、凡参加此次工程机器人大赛比赛的参赛队伍必须填写本技术报告。
2、现场报到时,将申报书的电子档和纸质档提交至大赛组委会。
3、本书应该填写完整、内容详实、表达准确,数字一律填写阿拉伯数字,英文一律为TimesNewRoman。
4、填写本技术报告时,各项内容字数不得少于规定字数。
5、打印格式与装订
(1)纸张为A4大小,双面打印;
(2)文中小标题为四号、仿宋、加黑;
(3)栏内正文为小四号、仿宋;
关于技术报告使用授权的说明
本人完全了解2014年中国机器人大赛暨RoboCup公开赛(工程类项目)&2014中国工程机器人大赛(RobotatWork)关于保留、使用技术报告和研究论文的规定,即:
参赛作品著作权归参赛者本人,比赛组委会所有,比赛组委会可以在相关主页上收录并公开参赛作品的设计方案、技术报告以及参赛模型车的视频、图像资料,并将相关内容编纂收录在组委会出版论文集中。
参赛队员签名:
带队教师签名:
日期:
一、作品简介(研究内容、目标、完成情况概述)
研究内容和目的以及完成情况
第一部分(包括研究内容、目标、完成情况、国内外情况等四部分内容)总计不得多于2页
作品是基于kinetis60芯片控制的摄像头搬运机器人,作品利用CCD采集信息,用32位芯片kinetis60控制,舵机提供动力。
在对该项目进行规划时,我们想要达到的目标是机器人能够正确采集搬运场地信息并反馈给控制器,控制器能够根据接收到的信息做出正确的反应。
截止今日,我们所制作的机器人能够正确识别搬运场地信息,然而由于MCU处理信息的程序存在不足,机器人在不同的光线下表现不稳定,有时对轨迹判断会出错,导致车子运行的轨迹脱离预想的轨迹。
相关研究国内外情况概述
目前利用摄像头采集信息的机器人在工农业生产、军事等方面都有重要运用,利用摄像头采集数据时机器人对物品进行搬运只是其中的一项运用。
就这项运用而言,国内主要朝着更加自动化的方向发展,搬运机器人通过摄像头观察路径,机械手抓住物品,在特定的路线上对物品进行搬运,组成了生产流水线上的重要部分。
在一些危险品的搬运中有着极其重要的作用。
国际上一些这方面技术发达的国家,不仅能够利用这些机器人在特定的路线上搬运东西,而且可以识别物品,将杂乱无章的物品搬到特定的位置。
二、研究技术方案(硬件设计、软件设计、系统调试说明)
硬件设计
第二部分(包括硬件设计、软件设计、系统调试说明三个部分)总计不得多于5页
我们所制作的机器人利用kinetis60芯片控制,CCD作为传感装置。
由于场地较小,为使机器人运动更加精确,驱动电机用的是舵机。
系统整体调试设计
调试上,一方面通过上位机利用电脑观察收集到的图像信息,进行调试。
主要调整CCD的焦距,曝光时间,以达到对场地信息的最好采集效果。
另一方面是通过车上的液晶显示屏来读取图像信息,这样做的最大好处就是能够很方便的观察到图像信息。
三、附录(硬件设计图、电路设计原理图、程序等)
此部分无页数限制。
硬件情况:
/*
*
*
*引脚连接:
*PTA10--SI板子上标为A10c10
*PTA11--CLK板子上标为A11C8
*PTB1--AO板子上标为B1C0
*
*串口显示:
波特率115200
*PTE8--TXD板子上标为E8
*PTE9--RXD板子上标为E9
*
*参数设置:
*PRINT_AD--设置串口打印数据的类型,二值量或模拟量
*THRESHOLD--设置模拟量转二值量的阈值
*WINDOW_WIDTH--设置串口打印采集数据的宽度
*
*/
#include"common.h"
#include"uart.h"
#include"gpio.h"//通用输入输出
#include"OLED.h"
#include"video_xunji.h"
#defineTSL1401_SI(x)nj_gpio_set(PORT_C,9,x)
#defineTSL1401_CLK(x)nj_gpio_set(PORT_C,8,x)
#definePRINT_AD1//设置串口打印数据类型,0:
打印二值化数据,1:
打印AD值
#defineTHRESHOLD100//设置二值化阈值
#defineWINDOW_WIDTH128//设置串口打印的像素个数,最大128,最小0
#defineEXPOSURE_TIME10//设置曝光时间,当觉得太亮时减小此值,太暗时增大70
#defineccdright120//右边缘
#defineccdleft5//左边缘
#defineTIME85
voidSHOW_CCD();
unsignedchargPixel[128];
//全局变量声明
uint8threshold;
uint8leftbreak=55;//采集到的左右边沿
uint8rightbreak=65;
intyi;//离中心的偏移量
uint8centerline=60;//
uint8ccdwide;
uint8start_line;//
uint8end_line;
uint8white_centerline;
uint8tag;
uint8OLED_flag;
uint8flg_place=0;
uint8leftbreak1;
uint8rightbreak1;
uint8leftbreak2;
uint8rightbreak2;
uint8centerline1;
uint8centerline2;
externuint8courl1;
externuint8courl2;
externuint8courl3;
//全局变量声明
/********************************************************************/
/*
*初始化LPLD_K60Card上的GPIO
*/
voidinit_gpio()
{
nj_gpio_init(PORT_C,9,1,0);
nj_gpio_init(PORT_C,8,1,0);
}
/*
*延时几微妙
*/
voiddelay()
{
unsignedinti;
for(i=0;i<10;i++)
{
asm("nop");
}
}
voidTSL1401_GetLine(uint8*pixel)
{
uint8i;
//开始SI
TSL1401_SI(0);
TSL1401_CLK(0);
delay();
TSL1401_SI
(1);
delay();
TSL1401_CLK
(1);
delay();
TSL1401_SI(0);
delay();
//采集第1个点
pixel[0]=LPLD_ADC_SE_Get(ADC1_BASE_PTR,4);
TSL1401_CLK(0);
//采集第2~128个点
for(i=1;i<128;i++)
{
delay();
TSL1401_CLK
(1);
delay();
pixel[i]=LPLD_ADC_SE_Get(ADC1_BASE_PTR,4);
TSL1401_CLK(0);
}
//发送第129个clk
delay();
TSL1401_CLK
(1);
delay();
TSL1401_CLK(0);
delay();
}
voidsend_date()
{
inti;
for(i=(64-WINDOW_WIDTH/2);i<(64+WINDOW_WIDTH/2);i++)
{
#if(PRINT_AD==1)//串口发送AD值,可用于线性CCD调试助手
if(gPixel[i]==0xFF)
gPixel[i]=0xFE;//遇到FF用FE替换即可
uart_putchar(UART5_BASE_PTR,gPixel[i]);
#else//串口发送而值量,方便用串口调试
if(gPixel[i]>THRESHOLD)
printf("1");
else
printf("0");
#endif
}
uart_putchar(UART5_BASE_PTR,0xFF);//此字节用于线性CCD调试助手识别换行
LPLD_LPTMR_DelayMs(EXPOSURE_TIME);//10ms的曝光
//delay(10);
}
//动态阈值
voidyuzhi(void)
{
unsignedchari;
unsignedcharmax=0,min=0;
min=*gPixel;
for(i=ccdleft;i<=ccdright;i++)
{
if(gPixel[i]>250||gPixel[i]<20)
continue;
if(gPixel[i]>max)
max=gPixel[i];
elseif(gPixel[i]min=gPixel[i];
}
threshold=(unsignedchar)((max+min)/2);
}
//滤波
voidccdfilter(void)
{
unsignedchari,cnt=0;
for(i=0;i<=127;i++)
{
if((gPixel[i+1]==0)&&(gPixel[i-1]==0))
{
gPixel[i]=0;
/*cnt++;
if(cnt<=5)
gPixel[i]=1;*/
}
elseif((gPixel[i+1]==1)&&(gPixel[i-1]==1))
{
gPixel[i]=1;
/*cnt++;
if(cnt<=5)
gPixel[i]=0;*/
}
}
}
//求绝对值
charabs(charb)
{
if(b<0)
b=-b;
returnb;
}
voidgetLine(){
unsignedchari;
threshold=110;
//erzhihua
for(i=0;i<=ccdright;i++)
{
if(gPixel[i]>=threshold)//THRESHOLD
gPixel[i]=1;
else
gPixel[i]=0;
}
//unsignedchari;
for(i=5;i<=120;i++)
{
if((gPixel[i]==1)&&(gPixel[i+1]==1)&&(gPixel[i=2]==0)&&(gPixel[i+3]==0))
{
leftbreak=i+1;
break;
}
if((gPixel[i]==0)&&(gPixel[i+1]==0)&&(gPixel[i+2]==0)&&(gPixel[i+3]==1))
{
rightbreak=i-1;
break;
}
}
//centerline=(unsignedint)(leftbreak+rightbreak)/2;
}
//二值化
voiderzhi(void)
{
unsignedchari;
yuzhi();
for(i=0;i<=ccdright;i++)
{
if(gPixel[i]>=threshold)//THRESHOLD
gPixel[i]=1;
else
gPixel[i]=0;
}
//ccdfilter();
//center();
}
voidSHOW_CCD()//单行显示
{
bytetxt[16]="";
uint16start=0,end=0,wide=0;
wide=leftbreak+rightbreak;
LCD_P6x8Str(30,2,"USST_FD_CCD");
/*sprintf((char*)txt,"Whitecenter:
%05d",white_centerline);
LCD_P6x8Str(15,3,txt);
sprintf((char*)txt,"Left:
%05d",leftbreak);
LCD_P6x8Str(30,4,txt);
sprintf((char*)txt,"Right:
%05d",rightbreak);
LCD_P6x8Str(30,5,txt);
sprintf((char*)txt,"Center:
%05d",wide/2);
LCD_P6x8Str(30,6,txt);
sprintf((char*)txt,"Flag:
%05d",tag);
LCD_P6x8Str(30,1,txt);
*/
sprintf((char*)txt,"Center0:
%05d",centerline);
LCD_P6x8Str(30,4,txt);
sprintf((char*)txt,"Center1:
%05d",rightbreak);
LCD_P6x8Str(30,5,txt);
sprintf((char*)txt,"TAG:
%05d",tag);
LCD_P6x8Str(30,6,txt);
LCD_Set_Pos(0,5);
LCD_PutPixel(0,15);
}
/*//二值化后找跳变*/
voidcenter(void)
{
unsignedchari;
yuzhi();
//OLED_flag++;
for(i=0;i<=ccdright;i++)
{
if(gPixel[i]>=threshold)//THRESHOLD180
gPixel[i]=1;
else
gPixel[i]=0;
}
ccdfilter();
tag=0;
for(i=5;i<=120;i++)//115
{
if((gPixel[i]==1)&&(gPixel[i+1]==0)&&(gPixel[i+2]==0)&&(gPixel[i+3]==0))
{
leftbreak=i+1;
}
if((gPixel[i]==0)&&(gPixel[i+1]==1)&&(gPixel[i+2]==1)&&(gPixel[i+3]==1))
{
rightbreak=i-1;
}
if((gPixel[i]==0)&&(gPixel[i+1]==0)&&(gPixel[i+2]==0)&&(gPixel[i+3]==1))
{
start_line=i;
}
if((gPixel[i]==1)&&(gPixel[i+1]==1)&&(gPixel[i+2]==1)&&(gPixel[i+3]==0))
{
end_line=i;
}
if(gPixel[i]==0){
tag++;
}
}
/*
for(i=rightbreak1+1;i<=120;i++)//115
{
if((gPixel[i]==1)&&(gPixel[i+1]==0)&&(gPixel[i+2]==0)&&(gPixel[i+3]==0))
{
leftbreak1=i;
}
if((gPixel[i]==0)&&(gPixel[i+1]==1)&&(gPixel[i+2]==1)&&(gPixel[i+3]==1))
{
rightbreak1=i;
}
}
*/
centerline=(unsignedint)(leftbreak+rightbreak)/2;
white_centerline=(unsignedint)(end_line-start_line);
//SHOW_CCD();
}
voidCDD_ForWard(uint8level)
{
tag=0;
while(centerline>0&¢erline<128){
//0,55,100,128
if(centerline>0&¢erline<50){
turn_left2();
}
if(centerline>=50&¢erline<70){
turn_left();
}
if(centerline>=90&¢erline<105){
turn_right();
}
if(centerline>=105&¢erline<128){
turn_right();
}
if(centerline>=70&¢erline<90)
{
stright();
}
if(tag>level){//615349
break;
}
}
}
voidforward_bend(uint8level){
tag=0;
while(centerline>0&¢erline<128){
if(centerline>0&¢erline<55){
turn_left2();
}
if(centerline>=100&¢erline<128){
turn_right2();
}
if(centerline>=55&¢erline<100)
{
stright();
}
if(tag>level){
break;
}
}
}
voidtime_along(uint32i){
uint32n,m;
for(n=0;n<1000;n++)
for(m=0;m
if(centerline>0&¢erline<50){
turn_left2();
}
if(centerline>=50&¢erline<70){
turn_left();
}
if(centerline>=90&¢erline<105){
turn_right();
}
if(centerline>=105&¢erline<128){
turn_right();
}
if(centerline>=70&¢erline<90)
{
stright();
}
}
}
void_along(inttime){
inti,j;
for(j=0;j<500;j++){
for(i=0;i