摄像头组很稳定的黑线提取算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
//本程序对黑线提取做了很大的改进,未对十字弯处理
/*******************************************/
//本程序中加入了一些用于显示车模状态的LED灯
/*经实测发现,近处的赛道宽度为60左右,远处为30左右,所以用可变赛道宽度进行搜索*/
#include
#include "derivative.h" /* derivative-specific definitions */
#include
//-----------函数声明-----------------//
void delay(unsigned int t);
#define HighSpeedLimit 40
#define LowSpeedLimit 16
#define SteerLeftLimit -35
#define SteerRightLimit 35
#define COLUMN 90 //采集列数
#define MID_COLUMN 45 // 中间黑线
#define ROW 40//采集行数
#define LeftLED PORTB_PB0//左转方向灯
#define RightLED PORTB_PB1//右转方向灯
#define SpeedUpLED PORTB_PB2//加速指示灯
#define SlowDownLED PORTB_PB3//减速方向灯
#define Crossing_RoadLED PORTB_PB4//十字弯
#define Dashed_RoadLED PORTB_PB5//虚线路段
#define Mid_Route_Width_Factor 0.48 //赛道宽度系数
int steer_dire_label=0;
int SteerDelta=0;//舵机最终的偏转增量
unsigned int Speed=0;//显示当前PWM2占空比大小
unsigned int PreSpeed=0;
float Threshold_Factor=0.9; //阈值系数设置
unsigned int Threshold=120; //初设动态阈值为90,以后每传来一帧数据更新一次float Kp=0.8;//舵机方向比例系数
float Kd=5.0;//舵机方向微分系数
float MotorSpeed_Factor=6.0;//马达控制
unsigned char Image_Data[ROW][COLUMN];
unsigned int Left[ROW],Right[ROW];//左右黑线
unsigned int VisualMiddle[ROW];//虚拟中线
unsigned int Middle[ROW];//最终存放中间黑线值的二维数组
unsigned int Row_Attribute[ROW];//行属性
unsigned int row,column;
int m=0;//计算采集到的行数
unsigned char Line_Flag=0; //奇偶场
unsigned int Line_C=0; //采集行数d int PreSteerDirection=50;//之前的舵机方向,用与前后比较
unsigned int LeftFlag=0,RightFlag=0;//左右黑线标志
unsigned int Left_Start_Flag=0,Right_Start_Flag=0;//左右起始黑线找到标志unsigned int L_lost_count=0;//左黑线丢失计数
unsigned int R_lost_count=0;//右黑线丢失计数
unsigned int L_last_lost=0;//左行上一行丢线标志
unsigned int R_last_lost=0;//右行上一行丢线标志
unsigned int L_last_memory=0;//左行上一次有黑线的黑线所在列数
unsigned int R_last_memory=0;//右行上一次有黑线的黑线所在列数unsigned int HS_Data[ROW]={40,45,50,55,60,65,70,75,80,85,
90,95,100,105, 110,115,120,124,128,132,
136,140,144,148,152,156,160,163,166,169,
172,175,178,181,184,187,189,191,193,194}; unsigned int HS_Pointer=0;//指向行数数组中的数据
int error[2]={0,0};//舵机PD调节时的误差参数
void delay(unsigned int Time)
{ //一般,Time设为10000,可以实现1秒一次
int i,j;
for(i=0;i