智能车制作

 找回密码
 注册

扫一扫,访问微社区

查看: 4697|回复: 31
打印 上一主题 下一主题

摄像头软件方面设计思路

  [复制链接]

10

主题

75

帖子

0

精华

高级会员

Rank: 4

积分
709
QQ
威望
346
贡献
257
兑换币
206
注册时间
2014-6-1
在线时间
53 小时
跳转到指定楼层
1#
发表于 2014-11-10 12:57:07 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
摄像头软件设计
                                    

整体框架如右图;

【初始化算法】
v  1.锁相环的设置
#define BUS_CLOCK //总线频率
//初始化锁相环(16M模板)
void pll_init()
{
CLKSEL&=0X7F;//关闭锁相环
PLLCTL&=0X8F;//控制寄存器,关闭锁相环电路
CRGINT&=0XDF;//清除一些标志位
                      //锁相环选择
#if(BUS_CLOCK==40000000)
        SYNR=0X44;
#elif(BUS_CLOCK==32000000)
        SYNR=0X43;
#elif(BUS_CLOCK==24000000)
        SYNR=0X42;
#endif
REFDV=0X81;
PLLCTL=PLLCTL|0X70;//开启锁相环电路
asmNOP;
while(!(CRGFLG&0X08);
CLKSEL|=0X80;//开启锁相环
}
v  2.脉冲宽度调制(PWM)初始化
1)     通道选择PWMEx//使能 PWMCTL_CON//是否级联
2)     时钟设置PWMCLK//时钟选择 PWMPRCLK//预分频 PWMSCLA/B//比例因子
3)     系统设置PWMPOL_POLx//极性寄存器 PWMCAEx//中心对齐设置
4)     Pwm配置PWMPER//周期 PWMDTY//占空比
v  3.定时中断及输入捕捉通道的初始化
设定预分频系数;定时器溢出中断使能;定时器使能。
v  4A/D转换模块初始化
将模拟的视频电压信号转换成对应的数值,以便于后面的黑线提取算法实现。
v  5.外部中端的初始化
用于捕捉视频信号的行同步信号,产生外部中断以进行图像采集。
【图像采集算法】
v  考虑到实际赛道只是在白色KT板上布置黑色引导线,路径识别只需大致提取出黑色引导线即可,不必每行采集。因此,我们可以采用隔行采集思想来压缩图像的数据。
【黑线提取算法】
v  1.二值化算法:设置一个阈值value将数据预期比较,大于它就是1小于它就是0 记下第一次和最后一次出现像素值小于阈值时的像素点的列号,算出两者的平均值,以此作为该行上目标引导线的位置。
v  2.直接边缘检测算法:首先找到从白色像素到黑色像素的下降沿和从黑色像素到白色像素的上升沿(也用阈值比较寻找),然后计算上升沿和下降沿的位置差,如果大于一定的标准值,即认为找到了黑线,并可求平均值算出黑线的中心点。
v  3.跟踪边缘检测算法:利用跑道黑色目标线是连续的线。若已寻找到某行的左边缘,则下一次就在上一个左边缘附近进行搜寻。这种方法的特点是始终跟踪每行左边缘的附近,去寻找下一列的左边缘,所以称为跟踪边缘检测算法
【图像滤波算法】
v  在调试过程中会出现两段黑线情况,这种图像信息比较复杂,这时可能存在三种路况:
§  1)赛道比较密集时,检测到多条赛道;
§  2)大“S”弯道;
§  3字交叉道。
v  另外,由于智能车上安装的摄像头相对于赛道存在一定的倾斜角度,因此会造成采集到的赛道图像具有一定的梯形失真,即图像中的赛道远端窄、近端宽,因而也会对路径的正确识别产生影响。对于这种失真,可以通过对每行提取的赛道位置添加一个线性修正值来消除,一般通过实验的方法确定线性补偿的系数。
v  偏差大的数据要去掉。
【控制策略及控制算法】
v  1.赛道参数的计算
偏差计算偏差量linepos[j] 数组存放Offset

       
  • 最远行黑线位置linepos[topline]
      
  • 黑线平均位置averlinepos
      
  • 全白行行数whiteline_sum
曲率
v  2.转向控制
1)分段比例控制
2)前馈补偿控制
v  3.速度控制
1)模糊控制设定速度
2PID控制调整速度
【摄像头简单程序】
//信号线A0
//行同步接PT2  
//场同步接PT1
#define lie_end  260      /////列结尾
#define hang_end  100   //////行结尾
#define lie  32//51     //////   
#define delay(num)   /////延时函数
  {
    unsigned int i,j;
   for(i=0;i<num;i++)
      for(j=0;j<48;j++);
  }
unsigned char c_lie=0,g_lie=0;/////你要采集的行列数组计数
unsigned int lie_count=0,hang_count=0;///摄像头行列计数
   
unsigned char shuju[lie][hang_end];/////存放数据的数组
unsigned int get_n[]={ 16,29,41,52,62,71,79,86,92,98,/////////////////存放要采集的行数
                        103,108,112,116,120,124,128,132,135,138,
                        141,144,147,150,153,156,159,162,165,168,
                        170,172,174,176,178,180,182,184,186,188,
                         190,192,194,196,198,200,202,204,206,208,
                        210,211,212,242,243,245,246,247,248,249,250};
#define uchar unsigned char
#define uint unsigned int;
void chaopin(void);    ///锁相程序     
void TIM_init(void);  /////定时器程序(行场中断)
void shijian(void);
void atd_init(void);            
void pwm_init(void);      
#pragma CODE_SEG NON_BANKED
voidinterrupt 10 IC2ISR(void) { //行中断
    TFLG1_C2F=1;
if(lie_count==get_n[c_lie]) {  //定距采集图像的判断条件
   delay(1);   //黑线中心矫正,确保不采集到消隐信号
   for(hang_count=0;hang_count<=hang_end;hang_count++){  //读取一行的数据
      shuju[c_lie][hang_count]=PORTA_PA0;//采集数据的接口
    }
     
  c_lie++; //二维数组行自加
  }
lie_count++; //摄像头行自加
}
void interrupt 9 IC1ISR(void){ //场中断,各数据清零              
  TFLG1_C1F=1;
  hang_count=0;
  lie_count=0;
  c_lie=0;   
  }  
#pragma CODE_SEG DEFAULT
///////////输入捕捉初始化///////////////////////
void TIM_init(void)
{   
PACTL=0X50;
PACNT=0X0000;
  TIOS=0x00;//定时器通道01 为输入捕捉
  TSCR1=0x80;//定时器使能
  TCTL4=0x18;//通道 1 捕捉下降沿通道 2 捕捉上升沿
  TIE=0x06;  //通道 12 中断使能
  TFLG1=0xFF;//清中断标志位
}
void shijian(void) {
  PITCFLMT_PITE=0;      
  PITCE_PCE0=1;         
  PITLD0=9999;  //1  毫秒
  PITMTLD0=5;      
  PITMUX=0X00;
  PITINTE_PINTE0=1;     
  PITCFLMT_PITE=1;
}
void chaopin(void)
{  
   CLKSEL=0X00;   
   PLLCTL_PLLON=1;   
   SYNR =0xc0 | 0x07;                       
   REFDV=0xc0 | 0x01;
   POSTDIV=0x00;      
   _asm(nop);         
   _asm(nop);
   _asm(nop);
   _asm(nop);
   while(!(CRGFLG_LOCK==1));   
    CLKSEL_PLLSEL =1;                    
}

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复

使用道具 举报

10

主题

463

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2134
威望
1053
贡献
523
兑换币
693
注册时间
2014-1-10
在线时间
279 小时
32#
发表于 2014-11-14 23:32:00 | 只看该作者
回复 支持 反对

使用道具 举报

6

主题

1037

帖子

1

精华

跨届大侠

Rank: 10Rank: 10Rank: 10

积分
9108

优秀会员奖章活跃会员奖章在线王奖章论坛元老奖章

威望
4514
贡献
2400
兑换币
2952
注册时间
2014-7-18
在线时间
1097 小时
毕业学校
合肥工业大学
31#
发表于 2014-11-14 22:51:38 | 只看该作者
540440016飘飘雨 发表于 2014-11-14 20:36
。。。。。。。。。哪都能见到你

:lol
回复 支持 反对

使用道具 举报

0

主题

126

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1308

优秀会员奖章活跃会员奖章

QQ
威望
641
贡献
439
兑换币
429
注册时间
2014-7-30
在线时间
114 小时
30#
发表于 2014-11-14 20:36:32 | 只看该作者
支点305 发表于 2014-11-13 19:40
楼主说的不错~受教了~
能不能把算法的程序也分享一下呢

。。。。。。。。。哪都能见到你
回复 支持 反对

使用道具 举报

17

主题

215

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1668
威望
863
贡献
459
兑换币
545
注册时间
2014-3-2
在线时间
173 小时
29#
发表于 2014-11-14 17:57:51 | 只看该作者
大赞
回复 支持 反对

使用道具 举报

1

主题

102

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1490
威望
760
贡献
468
兑换币
469
注册时间
2013-11-6
在线时间
131 小时
28#
发表于 2014-11-14 12:43:29 | 只看该作者
:lol:lol
回复 支持 反对

使用道具 举报

3

主题

66

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1472
QQ
威望
752
贡献
470
兑换币
448
注册时间
2014-7-7
在线时间
125 小时
毕业学校
湖北工业大学
27#
发表于 2014-11-14 11:05:05 | 只看该作者
刚开始学K60   有些不太懂  但还是谢谢了
回复 支持 反对

使用道具 举报

7

主题

196

帖子

0

精华

常驻嘉宾

Rank: 8Rank: 8

积分
3629
威望
1774
贡献
1063
兑换币
1191
注册时间
2014-9-22
在线时间
396 小时
26#
发表于 2014-11-14 08:41:27 | 只看该作者
回复 支持 反对

使用道具 举报

1

主题

137

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1989
威望
890
贡献
795
兑换币
574
注册时间
2014-6-13
在线时间
152 小时
毕业学校
江苏科技大学
25#
发表于 2014-11-14 08:04:26 | 只看该作者
回复 支持 反对

使用道具 举报

14

主题

84

帖子

0

精华

高级会员

Rank: 4

积分
933
威望
454
贡献
255
兑换币
288
注册时间
2014-10-10
在线时间
112 小时
毕业学校
合肥学院
24#
发表于 2014-11-13 21:42:56 | 只看该作者
怒赞
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

关于我们|联系我们|小黑屋|智能车制作 ( 黑ICP备2022002344号

GMT+8, 2026-2-23 12:40 , Processed in 0.049539 second(s), 31 queries , Gzip On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表