生活随笔
收集整理的這篇文章主要介紹了
恩智浦智能车赛。摄像头处理函数。
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
這套攝像頭處理算法是可以直接使用的。只需要重寫一下void servo()//舵機控制函數(shù)。
輸入的參數(shù)是**extern uint8 image_dec[60][80];**數(shù)組中保存的攝像頭傳過來二值化后的數(shù)據(jù)。
輸出是距離賽道的偏差 保存在整形變量:duojijiaodu 中。把這個變量傳入舵機打腳的pid算法中即可。
講道理這樣基本就可以用了。如果想跑的更順暢,更快的話需要調(diào)整最下面代碼中的
my_piancha
=(int)(mzd2
*currentzhongjian_lk
- mzd1
*B
);
通過修改兩個參數(shù)控制曲率和偏差的融合來實現(xiàn)。
注意:攝像頭循跡不會走賽道中線,尤其在拐彎時。比如再拐一個左彎時,在入彎時車模會貼賽道右側(cè),出彎時會貼賽道左側(cè)。這樣可以保證高速過彎且不會沖出賽道。
這些代碼是我之前上傳文件的一部分。攝像頭四輪
使用時,需要依次調(diào)用函數(shù):
//攝像頭轉(zhuǎn)向控制
lkcongzhongjiansaomiao();
pianchachuli();
servo();
#include "saomiao.h"#include "headfile.h" #include "math.h"
int qianzhan
=29;
int my_piancha
,my_lastzhongjian
=40;
int jiao
, x
,y
,linshi_x
,linshi_right_heixian
,linshi_y
,ruyuanhuan_flag
=0;
extern uint8 image_dec
[60][80];int [60],right_heixian
[60],left_heixian
[60],zhidao_flag
;
int lastpiancha_1
,lastpiancha_2
,lastpiancha_3
,lastpiancha_4
,duojijiaodu
,flag_l
=0,flag_r
=0,linshi_left_heixian
,B
,shaobudaozuo_flag
[60],shaobudaoyou_flag
[60];
int shizidiyidian
,shangshizidiyidian
,S_Z
;
int shizishu
,chazhi
,yy1
,yy2
,rushizi
;
int duandian
,duandianshu
,duandianshu1
,currentzhongjian_lk
;
int xielv_flag
;
int qulv_point
=0,zhangai_right
=0,zhangai_left
=0;
int dian1
,youshi_kuan_flag
=0;
char s_wan_flag
,shizi_flag
,yuanhuan_flag
=0,guai_flag
=0;
int qvlv_quanju
,qulv_jinduan
,qulv_yuandaun
;
int qulv_jinduan_right
=0,qulv_jinduan_left
=0,qulv_yuandaun_right
=0,qulv_yuandaun_left
=0,qvlv_quanju_right
=0,qvlv_quanju_left
=0;
int half_zhi
[60];
int yy1_pinjun
,yy2_pinjun
;static int half_width_group
[60]=
{
0,0,0,0,0,0,0,0,8,
9,10,11,12,12,13,15,16,17,18,
19,20,21,22,23,24,25,25,26,28,
29,30,30,31,32,33,34,35,35,36,
37,38,38,39,39,40,40,40,40,40,
40,40,40,40,40,40,40,40,40,40
};
int regression(int startline
,int endline
)
{if(endline
>56)endline
=56;int i
;int sumX
=0,sumY
=0,avrX
=0,avrY
=0 ;int num
=0,B_up1
=0,B_up2
=0,B_up
,B_down
;for(i
=startline
;i
<=endline
;i
++){num
++;sumX
+=i
;sumY
+=currentzhongjian
[i
];}avrX
=sumX
/num
;avrY
=sumY
/num
;B_up
=0;B_down
=0;for(i
=startline
;i
<=endline
;i
++){B_up1
=(int)(currentzhongjian
[i
]-avrY
);B_up2
=i
-avrX
;B_up
+=(int)(10*(B_up1
*B_up2
));B_up
=B_up
/100*100;B_down
+=(int)(10*((i
-avrX
)*(i
-avrX
)));}if(B_down
==0) B
=0;else B
=B_up
*16/B_down
;return B
;
}int hy
;
void huaxian(int x1
,int y1
,int x2
,int y2
)
{int i
,max
,a1
,a2
;a1
=x1
;a2
=x2
;if(a1
>a2
){max
=a1
;a1
=a2
;a2
=max
;}
for(i
=x1
;i
>0;i
--)
{if((x2
-x1
)!=0){hy
=(i
-x1
)*(y2
-y1
)/(x2
-x1
)+y1
;currentzhongjian
[i
]=hy
;if(hy
<=1||hy
>=79)break;}
}
}
void huaxian2(int xxx1
,int yyy1
,int xxx2
,int yyy2
)
{int i2
,max2
,a12
,a22
;a12
=xxx1
;a22
=xxx2
;if(a12
>a22
){max2
=a12
;a12
=a22
;a22
=max2
;}
for(i2
=xxx1
;i2
<59;i2
++)
{if((xxx2
-xxx1
)!=0){hy
=(i2
-xxx1
)*(yyy2
-yyy1
)/(xxx2
-xxx1
)+yyy1
;currentzhongjian
[i2
]=hy
;}
}
}
void servo()
{
jiao
= Servo_Center
-(int)((duojijiaodu
*16.5/70));
if(jiao
>=Servo_Left
)
jiao
=Servo_Left
;
if(jiao
<=Servo_Right
)
jiao
=Servo_Right
;
servo_PWM(jiao
);
}
void lkcongzhongjiansaomiao()
{int kuan_flag
=0,lo
=0,s_point
=0,S_COUNT
=0,fuduandian
=0,qulv_yuanhuan
=0,chushizi_flag
=0;memset(shaobudaozuo_flag
,0,sizeof(shaobudaozuo_flag
));memset(shaobudaoyou_flag
,0,sizeof(shaobudaoyou_flag
));int zhangai_flag
=0,qulv_s_y
=0,qulv_s_l
=0;shangshizidiyidian
=0;left_heixian
[59]=0;right_heixian
[59]=79; shizishu
=0;rushizi
=0;xielv_flag
=0;shizi_flag
=0;my_lastzhongjian
=39;if(currentzhongjian
[58])currentzhongjian
[59]=my_lastzhongjian
=currentzhongjian
[58];elsecurrentzhongjian
[59]=39;for(y
=58;y
>=0;y
--){for(x
=my_lastzhongjian
;x
<=79;x
++){if(image_dec
[y
][x
]==0){right_heixian
[y
]=x
;shaobudaoyou_flag
[y
]=1; break;}}for(x
=my_lastzhongjian
;x
>=0;x
--){ if(image_dec
[y
][x
]==0){left_heixian
[y
]=x
;shaobudaozuo_flag
[y
]=1;break;} }if(fuduandian
==0){if(y
>48){if(shaobudaoyou_flag
[y
]==0&&shaobudaozuo_flag
[y
]==1){ right_heixian
[y
]=left_heixian
[y
]+2*half_width_group
[y
];}else if(shaobudaoyou_flag
[y
]==1&&shaobudaozuo_flag
[y
]==0){left_heixian
[y
]=right_heixian
[y
]-2*half_width_group
[y
];}else if(shaobudaoyou_flag
[y
]==0&&shaobudaozuo_flag
[y
]==0){left_heixian
[y
]=0;right_heixian
[y
]=79;}}else if(y
<=48){if(shaobudaoyou_flag
[y
]==0&&shaobudaozuo_flag
[y
]==1){ right_heixian
[y
]=right_heixian
[y
+1]+(abs
)(left_heixian
[y
]-left_heixian
[y
+1])-1;}else if(shaobudaoyou_flag
[y
]==1&&shaobudaozuo_flag
[y
]==0){left_heixian
[y
]=left_heixian
[y
+1]-(abs
)(right_heixian
[y
+1]-right_heixian
[y
])+1;}else if(shaobudaoyou_flag
[y
]==0&&shaobudaozuo_flag
[y
]==0){left_heixian
[y
]=0;right_heixian
[y
]=79;}}currentzhongjian
[y
]=(int)((right_heixian
[y
]+left_heixian
[y
])/2); half_zhi
[y
]=(int)((right_heixian
[y
]-left_heixian
[y
])/2); if(currentzhongjian
[y
]-currentzhongjian
[y
+1]>4&&y
<42&&B
<0)
currentzhongjian
[y
]=currentzhongjian
[y
+1]+1;
if(currentzhongjian
[y
]-currentzhongjian
[y
+1]<-4&&y
<42&&B
>0)
currentzhongjian
[y
]=currentzhongjian
[y
+1]-1;
if(y
>30)
{if((currentzhongjian
[y
]-currentzhongjian
[y
+1])>0)
qulv_jinduan_right
++;
else
if((currentzhongjian
[y
]-currentzhongjian
[y
+1])<0)
qulv_jinduan_left
++;
}
if(y
<25&&y
>=7)
{if((currentzhongjian
[y
]-currentzhongjian
[y
+1])>0)
qulv_yuandaun_right
++;
else if((currentzhongjian
[y
]-currentzhongjian
[y
+1])<0)
qulv_yuandaun_left
++;
}
if(y
<=55&&y
>15)
{if((currentzhongjian
[y
]-currentzhongjian
[y
+1])>0)
qvlv_quanju_right
++;
else
if((currentzhongjian
[y
]-currentzhongjian
[y
+1])<0)
qvlv_quanju_left
++;}if(currentzhongjian
[y
]>79)
currentzhongjian
[y
]=79;if(currentzhongjian
[y
]<0)
currentzhongjian
[y
]=0;my_lastzhongjian
=currentzhongjian
[y
];
if(y
<56)
{
if((currentzhongjian
[y
]-currentzhongjian
[y
+2])>0)
qulv_s_y
++;
else
if((currentzhongjian
[y
]-currentzhongjian
[y
+2])<0)
qulv_s_l
++;
if(y
>36&&abs(currentzhongjian
[y
]-currentzhongjian
[y
+2])>0)
qulv_yuanhuan
++;
}
if(y
<58&&y
>=10)
S_COUNT
+=currentzhongjian
[y
];
if(y
>8&&(abs
)(right_heixian
[y
]-currentzhongjian
[y
])<5||(abs
)(left_heixian
[y
]-currentzhongjian
[y
])<5)s_point
=y
;
else
s_point
=0;if(y
<36&&((abs
)(right_heixian
[y
]-currentzhongjian
[y
])<1||(abs
)(left_heixian
[y
]-currentzhongjian
[y
])<1))
{duandian
=y
;fuduandian
=y
;if(y
>15){duandianshu
=y
-15;if(duandianshu
>35)duandianshu
=35;}if(y
>qianzhan
){duandianshu1
=y
-qianzhan
;if(duandianshu1
>25)duandianshu1
=25;}
}
else
{duandian
=0;duandianshu
=0;duandianshu1
=0;
}}}if(right_heixian
[y
]-left_heixian
[y
]<half_width_group
[y
]&&right_heixian
[y
+1]-left_heixian
[y
+1]<half_width_group
[y
+1])break;
S_Z
=S_COUNT
/(48);qvlv_quanju
=abs(qvlv_quanju_right
-qvlv_quanju_left
);qulv_jinduan
=abs(qulv_jinduan_right
-qulv_jinduan_left
);qulv_yuandaun
=abs(qulv_yuandaun_right
-qulv_yuandaun_left
);qvlv_quanju_right
=qvlv_quanju_left
=qulv_jinduan_right
=qulv_jinduan_left
=qulv_yuandaun_right
=qulv_yuandaun_left
=0;if(duandian
<16) {for(int i
=58;i
>7;i
--){ if(i
>45&&(shaobudaozuo_flag
[i
]==1||shaobudaoyou_flag
[i
]==1))rushizi
++;if((i
>9&&i
<=40)&&shaobudaozuo_flag
[i
]==0&&shaobudaoyou_flag
[i
]==0)shizishu
++;if(i
<45&&(shaobudaozuo_flag
[i
]==1||shaobudaoyou_flag
[i
]==1)&&shangshizidiyidian
==0)shangshizidiyidian
=i
;}if(shizishu
>2&&rushizi
>10)