01【申请技术创新特邀】
一、技术创新点
1、1. 元素转向的"参考线接管 + 闭环退出"状态机(含金量最高)
- 常规做法:直角/十字多靠图像判断后开环打一个固定角,转多少全凭经验,易过转/不足。
- 我的做法:识别到元素后锁定目标转角(yaw_target ±75°),用参考线接管中线引导转向(左转贴左、右转贴右、直行锁中),并以陀螺仪转角/行驶里程闭环判据退出——转够才交还主链路。
- 效果:转向角度精确可控、不依赖经验值,直角处不失控,且软缓冲防误切。
2、2. 双 PD 复合控制(误差平方加权增强)
- 常规做法:单一固定增益 PID,大偏差小偏差一个参数,易顾此失彼。
- 我的做法:两组 PD 并联——主 PD 图像 P + 角速度 D 抑制横摆;辅助 PD 以作 P,偏差越大增益越强、偏差小时细调。
- 效果:大偏差快速纠偏、小偏差不超调,直道稳、弯道跟手。
3、 分块大津法三区自适应二值化
- 常规做法:全局 Otsu 或固定阈值,远处光照/阴影变化就翻车。
- 我的做法:远/中/近三区各自求阈值,区间 2 行线性过渡,阈值每 20 帧更新(Otsu 全图遍历贵)、下限限幅且按键可调。
- 效果:远近光照自适应,省算力,实时不掉帧。
4、 远近三角权重合成单一转向输入
- 常规做法:直接取近处中线或整条中线平均,易抖或前瞻不足。
- 我的做法:把"找边线→中线→远近加权"压缩成一个数大、远区提供前瞻。
- 效果:输入量干净单一,直道稳、弯道跟手,控制环实现简单。
5、5. 三链路调试工具链 + FFT 验证滤波
- 常规做法:改码-编译-下载,调参分钟级;滤波系数凭感觉。作为转向环输入,中区权重最
- 我的做法:无线串口(JustFloat)+ WiFi 图传 + IPS 按键调参三链路并行,车上秒级调参;并用VOFA+ FFT 频谱实测验证一阶低通截止频率(理论 fc≈8Hz 与实测对照)。
- 效果:迭代速度数量级提升,滤波参数从"拍脑袋"变成"有依据"。
视觉识别与循迹:循迹控制量来源于"找边线→求中线→加权→转向输入"的完整链路。选用灰度摄像头,结合赛道视野与处理需求,裁剪图像(94×60)、选定帧率(100fps)与曝光时间/增益,兼顾成像质量与实时性;采用分块大津法按远/中/近三区自适应求阈值完成二值化,稳定提取赛道边线;每帧扫线求取中线,将中线与图像中心的偏差按远近差异化权重加权平均为单一误差量 作为转向环输入(中区权重最大、兼顾远区前瞻,实现直道稳、弯道跟手)。针对直角、十字路口等特殊元素,引入 NONE/DETECTED/TURNING 元素状态机:普通循迹时状态机保持空闲、走"中线加权"主链路;识别到元素后判定转向方向并锁定目标转角,转入转向态用参考线接管中线(左转贴左、右转贴右、直行锁
中),仍沿用同一套加权与转向环逻辑,最终以陀螺仪转角/行驶里程闭环判据确认转向到位后交还主链路,从而规避直角处扫线中线失真导致的转向失控,并以临界帧延迟判定的软缓冲避免误切换。传感器的选择以及算法。
二、搜线代码创新部分:
#define CONT_REF 15ustatic uint8 full_search_none=0;/**全行遍历搜边:search_state1左→右,0右→左;未找到返回默认 col*/static uint8 search_FullLine(uint8 search_state,const uint8*row){uint8 col;int16 col_i;uint8 cont_times=0;if(search_state==SEARCH_LEFTLINE){col=0u;for(col_i=0;col_i+1<(int16)COL;col_i++){if(row[col_i]==BLACK&&row[col_i+1]==WHITE){full_search_none=0;return(uint8)col_i;}WHITE)elseif(col_i<CONT_ZONE&&row[col_i]==WHITE&&row[col_i+1]=={cont_times++;if(cont_times>=CONT_REF){full_search_none=0;returncol;}}}}elseif(search_state==SEARCH_RIGHTLINE){col=(uint8)(COL-1);if(full_search_none==1){returncol;}for(col_i=(int16)COL-1;col_i>=2;col_i--){if(row[col_i]==BLACK&&row[col_i-1]==WHITE){return(uint8)col_i;}elseif(col_i+1>(int16)COL-CONT_ZONE&&row[col_i]==WHITE&&row[col_i-1]==WHITE){cont_times++;if(cont_times>=CONT_REF){break;}}}}full_search_none=1;returncol;}static void search_FullLine_row(uint8*l,uint8*r,const uint8*row){*l=search_FullLine(SEARCH_LEFTLINE,row);*r=search_FullLine(SEARCH_RIGHTLINE,row);}/**中线的种子继承*/static uint8 search_from_mid(uint8 search_state,const uint8*row,uint8 mid){int16 col_i;uint8 col;uint8 col_u;if(search_state==SEARCH_LEFTLINE){col=0u;for(col_i=(int16)mid;col_i>=2;col_i--){if(row[col_i-1]==BLACK&&row[col_i]==WHITE){return(uint8)(col_i-1);}}}elseif(search_state==SEARCH_RIGHTLINE){col=(uint8)(COL-1);for(col_u=mid;col_u+2<COL;col_u++){if(row[col_u]==WHITE&&row[col_u+1]==BLACK){return(uint8)(col_u+1);}}}returncol;}static void search_from_mid_row(uint8*l,uint8*r,const uint8*row,uint8 mid){*l=search_from_mid(SEARCH_LEFTLINE,row,mid);*r=search_from_mid(SEARCH_RIGHTLINE,row,mid);}/***@brief 选择性种子生长法扫线*Success:基于逐行遍历的普适性,结合种子生长法的窗口思想与窄赛道连续的特点*author;任某人*/void search_line_pro(void){int16 row;uint8 mid_prev;uint8 full_scan_next=0u;memset(l_border,0,sizeof(l_border));memset(r_border,COL-1,sizeof(r_border));memset(mid_line,COL/2,sizeof(mid_line));row=(int16)ROW-1;search_FullLine_row(&l_border[row],&r_border[row],bin_image[row]);mid_line[row]=(uint8)((l_border[row]+r_border[row])/2);for(row=(int16)ROW-2;row>=0;row--){if(full_scan_next){search_FullLine_row(&l_border[row],&r_border[row],bin_image[row]);full_scan_next=0u;}else{mid_prev=mid_line[row+1];if(mid_prev>=COL){mid_prev=(uint8)(COL-1);}if(bin_image[row][mid_prev]==BLACK){bin_image[row]);}search_FullLine_row(&l_border[row],&r_border[row],full_scan_next=1u;else{search_from_mid_row(&l_border[row],&r_border[row],bin_image[row],mid_prev);}}mid_line[row]=(uint8)((l_border[row]+r_border[row])/2);}}