智能车摄像头基本循迹控制

基于摄像头的三种基本巡线控制

开源代码地址: https://github.com/ittuann/Enterprise_E

博客目录:
https://blog.csdn.net/sorcererr/article/details/124989905
https://ittuann.github.io/2021/08/30/Car.html

摄像头的三种基本巡线:

摄像头程序处理后会给出一条中线,使用计算中线与标准值误差,赋予转向环PID。

三行巡线:

类似于线性CCD的控制方案,是最早期使用的方法。不过使用的有效信息太少,中线一旦跳变整个车就会抖动,车速到了一米一左右尤为明显。

aim_line取决于速度和有效行,速度越快aim_line预瞄距离越远,同时限幅在有效行之下。

AngleErr = ((   5 * middleLine[aimLine] +
                3 * middleLine[aimLine + 1] +
                2 * middleLine[aimLine + 2]) / (10.000f)) - middleStandard;

加权计算全图像:

使用了整个图像,对于图像不同区域(行数)给与不同权重。为了防止跳变取近三次输出值加权计算误差。

对于不同元素可以赋予不同权重,如坡道weight3权重整体关注区域更偏向上方,环岛weight2权重关注区域为补线区域,三叉内低速横向循迹weight4权重关注区域更偏下方。

start_row 为补线起始行,valid_row为有效行最顶行,作用相当于限幅。

uint8   weight1[60] = {                        //0为图像最顶行
         0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
         1, 1, 3, 3, 5, 5,10,10,10,10,
        10,10,10,10,10,10,10,10,10,10,
        10,10,10,10,10,10,10,10,10,10,
        10,10,10,10,10, 5, 5, 5, 5, 5,
         3, 3, 3, 1, 1, 1, 0, 0, 0, 0,};    //基础    //注意斜率变化引起的跳变,要平滑

for(i = startRow; i > validRow + 1; i --) {
    weightSum += weight1[i];
    lineSum += weight1[i] * middleLine[i];
}   //从下往上扫

angleErr = (float)lineSum / weightSum - middleStandard;
midline_fff = midline_ff;
midline_ff  = midline_f;
midline_f = angleErr;
angleErr = midline_fff * 0.50f + midline_ff * 0.30f + midline_f * 0.20f;

在这些的基础上增加了最小二乘法对摄像头中线的再拟合,作用也是为了更为了使循迹平滑。

slope = RegressionCal(validRow + 3, startRow); 
angleErr = angleErr * 0.80f + slope * 0.20f;

用部分图像计算偏差:

memset(partErr, 0, sizeof(partErr));
improperRowCount = 0;
memset(improperRow, 0, sizeof(improperRow));

if (startPart > startRow)    startPart = startRow - 2;    //起始行限幅
endPart = startPart - partUsed;
if (endPart < validRow)    endPart = validRow + 2;    //截至行限幅

for (i = startPart; i > endPart; i--) {    //从下往上扫
    partErr[startPart - i] = (float)(middleLine[i] - middleStandard) * 100.0f / ((float)imgRealWidth[i] / 2.0f);
    partAve += middleLine[i];
//        if (i == endPart - 2) {
//            Part_Err[startPart - i] = partErr[startPart - i] * 1.20f;
//        }   //放大截至行误差
}    //某种意义上相当于逆透视
    //partUsed 相当于前瞻,区域越小越灵敏 10行适合低速,高速可以取15

partAve = partAve / partUsed;            //计算范围内中线平均值
for (i = startPart; i > endPart; i--) {
    if (ABS(middleLine[i] - partAve) > 10) {
        improperRow[startPart - i] = middleLine[i];
        partUsed--;
        improperRowCount++;
    }
}   //记录偏离中线均值10以上的点 滤掉跳变点

for (i = 0; i < (partUsed / 5); i++) {
    partErr[i] = 0.000f;
}   //最底下1/5区域置零, 为了平滑

for (i = 0; i < partUsed; i++) {
    if (improperRow[i] == 0) {
        partErrSum += partErr[i];
    }
}   //累加非跳变点

angleErr  = partErrSum * errK / (float)partUsed;
angleErr_fff = angleErr_ff;
angleErr_ff = angleErr_f;
angleErr_f = angleErr;
angleErr = angleErr0 * 0.70f + angleErr1 * 0.20f + angleErr2 * 0.10f;
<think>好的,用户的问题是关于智能车摄像头寻迹的动态前瞻算法实现原理。首先,我需要理解什么是动态前瞻。在智能车比赛中,摄像头用于识别路径,动态前瞻应该是根据当前车速或路况调整前瞻距离,以优化控制效果。接下来,我得回忆相关引用内容,看看有没有相关信息。 引用[2]提到了摄像头基本循迹控制,可能涉及巡线方法,但没有直接提到动态前瞻。引用[4]讨论了斑马线识别,涉及到图像处理技术,比如扫描像素跳变次数,这可能对理解路径识别有帮助。但动态前瞻更可能与控制算法相关,比如PID控制结合前瞻距离调整。 动态前瞻的关键点应该是如何根据车速调整前瞻点。车速快时,需要更远的前瞻距离,以便提前转向;车速慢时,可以缩短前瞻距离以提高精度。这可能涉及到实时计算前瞻点的位置,比如在图像中选取不同行作为基准,或者根据速度动态调整目标点的位置。 另外,控制算法可能需要结合前瞻距离来调整参数。例如,PID控制中的比例项可能随着前瞻距离变化而变化,远距离时减小比例系数,避免过冲。还可能涉及到滤波处理,平滑前瞻点的变化,防止抖动。 需要确认用户是否了解基本巡线原理,比如如何从图像中提取中线。动态前瞻通常是在此基础上进行调整,所以可能需要先解释基础,再延伸到动态部分。同时,引用中的代码示例可能帮助说明如何处理图像数据,比如引用[4]中的循环扫描像素,可能类似方法用于确定前瞻点。 还要考虑不同赛道元素的影响,比如弯道和直道可能需要不同的前瞻策略。动态前瞻算法可能需要根据路径曲率进一步调整,结合曲率信息来改变前瞻距离,这可能涉及到路径预测或曲率计算。 最后,总结实现步骤:图像处理获取路径信息,动态调整前瞻点位置,结合控制算法优化参数,可能加入滤波和状态机处理不同情况。需要确保回答结构清晰,分点说明原理、实现方法和优化策略,并引用相关文献中的方法作为参考。</think>### 智能车摄像头寻迹动态前瞻算法实现原理 动态前瞻是智能车摄像头寻迹中的关键技术,通过实时调整目标检测点的位置,使车辆在不同速度或路况下保持稳定跟踪。其核心原理如下: #### 1. **基础原理** - **前瞻距离**:摄像头从图像中选取某一行的像素作为路径中线基准,该行距离车体越远(图像中位置越高),前瞻距离越大。 - **动态调整**:根据车速、路径曲率或路径特征(如直道/弯道)实时改变基准行的位置。例如: $$ L_{前瞻} = k \cdot v + L_{基础} $$ 其中$v$为车速,$k$为调节系数[^2]。 #### 2. **实现方法** **(1) 图像坐标系映射** - 将摄像头图像划分为多行(如0-60行),每行对应实际赛道的前瞻距离: ```c // 示例:根据车速选择基准行 int base_row = 40 - (int)(current_speed * 0.5); ``` - 通过逆透视变换建立图像行号与实际距离的映射关系[^4]。 **(2) 动态调节策略** | 场景 | 调节方式 | 目标 | |------------|------------------------------|--------------------------| | 高速直道 | 增大基准行(远距离检测) | 提高稳定性 | | 低速弯道 | 减小基准行(近距离检测) | 提升转向精度 | | 过渡区域 | 线性插值平滑过渡 | 防止突变导致控制震荡 | **(3) 控制算法结合** - 将动态前瞻点坐标输入PID控制器: ```c error = target_position - current_position; steer_output = KP * error + KI * integral + KD * derivative; ``` 其中$KP$系数随前瞻距离增大而减小,避免过冲[^3]。 #### 3. **优化方向** - **曲率预测**:通过历史路径点计算曲率,提前调整前瞻距离 - **多级前瞻融合**:同时使用近/中/远三个检测点,加权计算最终目标点 - **自适应滤波**:对动态调整过程进行低通滤波,避免高频抖动 - **状态机管理**:根据赛道元素(如十字、坡道)切换调节策略[^1] ###
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值