智能车控制算法.doc

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实用标准文案

智能车转角与速度控制算法

1.检测黑线中点Center :设黑、白点两个计数数组black 、 white ,从第一个白点开始,检测到一个白点,白点计数器就加1,检测到第一个黑点,黑点计数器就加 1 ,并且白点计数器停止,以此类推扫描每一行;黑线中点= 白点个数 + (黑点的个数 /2 )

2.判断弯直道:

找出黑线的平均位置avg ( 以每 10 行或者 20 作为参照,行数待定)

算出相对位移之和(每一行黑线中点与黑线平均位置距离的绝对值之和)

然后用 Curve的大小来确定是否弯直道(Curve的阀值待定)。

3.控制速度:

根据弯度的大小控制速度大小。

//*****************************弯度检测函数*******************************//

Curvecontrol ()

{

int black[N];// 黑点计数器

int white[N];// 白点计数器

int center[N];// 黑线中点位置

int avg;// 黑线中点平均位置int curve;//N行的相对位移之和

if( 白点 ) ++white[N];// 判断黑白点的个数else++black[N];

center[N]=white[N]+black[N]/2;// 每一行的黑线中点

avg=(center[1]+center[2]+...+center[N])/N;// 求出黑线中点的平均位置

curve=(|avg-center[1]|+|avg-center[2]|+...+|avg-center[N]|)/N// 求出 N 行的相对位移之和

return curve;// 返回弯度大小

}

//***************************** 舵舱转角控制函数 ******************************//

//**** 黑线轨迹会指引小车的行驶方向,所以向左还是向右是由黑线决定的。********// //**** 设 0 为小车正向行驶,-10 为向左的最大转角, +10 为向右的最大转角。 *******// //**** 设小车实际行驶路线中心 A 相对于黑线中线 B 偏移量为 gap ; gap 有正负之分,//gap 为正时,小车在黑线中线的右侧,应该左转;gap 为负时,小车在黑线中线左侧,应 // 该右转。转角的大小由刚刚得到的弯度Curve 确定。 *****************************// Viewpointcontrol()

{

Int gap,A,B;

Int y;//****y为舵舱的转角角度

gap=A-B;

If(gap>0)左转

else if (gap<0)右转

else不变

y= 与 Curve和gap有关的公式;//****y有正负之分

return y;//****返回转角角度

}

//*****************************速度控制函数*********************************//

//******* 根据弯度的大小来改变速度大小*****//

Speedcontrol()

{

Return speed;

}

5.3.1偏航距离的计算

由于已经获得了赛道中心线的位置,所以计算偏航距离的问题是选取何处的中心线的距离

为当前的偏航距离。控制算法的执行周期为40ms ,如果赛车的速度为2m/s ,则在两次控制算法的执行中间,赛车要前进8cm ,赛车所处的环境将发生比较大的改变,所以赛车的

控制只能算是半实时控制,这是所有使用摄像头作为主要寻线传感器的参赛队都避免不了的

问题。因为算法的滞后性,赛车需要将“当前位置”进行适当前移。前移量应该跟赛车当前

速度成正比,但实际中我们发现,适当

增加一些前移距离是有好处的,因为可以在入弯处提前转弯,使得赛车沿弯道内侧行驶,

缩短了过弯距离。

5.3.2偏航角度的计算

计算偏航角度的实质是直线拟合问题,因为赛道中心线所在的直线确定了,而直线的斜率

与偏航角度一一对应。直线拟合最有效的方法是最小二乘法[7] ,但是直接应用存在一个问题,即如何确定进行直线拟合的区间?在整个成功识别出赛道的区间内进行直线拟合显然是

欠缺考虑的,因为在弯道的情况下,这种方法拟合出的是一条弦线,而不是当前该弯道处的切线。摄像头视野越大,弯道曲率越大,弦线偏离切线的程度也就越大。为了能够在直道和

弯道上都能正确的拟合出正确的直线,我们采用了直线检测的方法,即首先根据残差的大小确定直线的范围,然后在这一范围内进行直线拟合。

5.3.3曲率的计算

如果说斜率的计算需要某种技巧的话,计算曲率则更是一种技巧的应用。首届时很多参赛

队针对各自的实际需要,提出了自己的方法。其中最普遍的是根据斜率的导数来计算曲率

[8]。但是斜率的计算本身就很不准确,特别是某个点的斜率,对斜率求导就更不准确,所

以使用这种方法只能得出一个大致的结果。本文作者提出了另外一种方法,首先对获得的路

径进行滤波,使得路径尽可能平滑,然后取其两个端点和中间点,计算这 3 个点组成的三角形的外接圆的半径,半径的倒数就是这段路径的曲率。经过多次实验,这种方法的误差一般不大于 20% ,对智能车的控制来说已经足够了。

让赛车从起跑线开始,在赛道上行驶一圈,记录下每个时刻的曲率,如图 5.9 。

相关文档
最新文档