写这篇博文时引用了相当多的资料,在此致以感谢,引用文献于文末给出。
——
由光的作用产生的电叫光电。
简单来讲,线性CCD就是只看到一条线的摄像头。
CCD
CCD的特点是以电荷作为信号,而非电流或电压。
CCD(Charge-coupled Device,电荷耦合原件),是一种半导体器件,用电荷量表示信号大小,并以耦合方式传输信号。
CCD器件按其感光单元的排列方式可分为线阵CCD(或称线性CCD)和面阵CCD两大列。前者可同时储存一行电视信号,后者则可以同时接受一副完整的光像。
本文主要讨论线性CCD。
线性CCD
线性CCD相当于集成了一排灰度模块的传感器。
线性CCD的核心是由一行光电二极管(每个光电二极管都有各自的积分电路,此电路统称为像素)组成的感光阵列,阵列后面有一排积分电容,光电二极管在光能量冲击下产生光电流,构成有源积分电路,那么积分电容就是用来存储光能转化后的电荷。积分电容存储的电荷越多,说明前方对应的那个感光二极管采集的光强越大,当光强接近饱和时,像素点灰度趋近于全白,呈白电平。
由此可知线性 CCD提取信号是被动的接受反射回的光线,因此采集的信号易受外界环境的影响。
每个像素所采集的图像灰度值与它所感知的光强和积分时间(即曝光时间)成正比。
使用线性CCD的好处
线性 CCD 具有高线性、均匀性和宽动态范围低图像滞后等优点,前瞻最远可达 1.2m(TSL1401CL)。
TSL1401CL
经典的线性CCD型号, 128×1 光电二极管阵列。
有多种角度的镜头可选。
引脚
TSL1401CL一共有八个引脚,除去两个没用的空引脚外,还有:
VCC:接电源正极 3.3v-5v
GND:接地
CLK:时钟信号线,控制电荷转移,像素的依次输出和复位,接入单片机的IO引脚
SI:逻辑信号线,控制每一个像素的积分和复位操作,接入单片机的IO引脚
AO:模拟信号输出,直接接入单片机的AD输入引脚
时序
SI信号
SI信号变为高电平后,可在每个CLK信号上升沿到来后进行数据的AD采样,即相应的AO引脚开始不断对外输出电压信号,一直连续输出了128个时钟周期,第129个周期用于结束本次采集。
每个 SI 信号之后采集到的像素均是在这个 SI 信号之前曝光所得到的数据。
复位时间
一个Hold信号产生于SI的上升沿,然后发送给模拟开关,这会导致所有128个采样电容被切断,并启动一个积分器复位时间。
前18个时钟周期是复位时间,不进行积分(曝光),这是因为电容在使用时已被充满,需要将其内部电荷全部释放。
积分时间
第 19 个 CLK 到下一个 SI 开始的这段时间(SI正脉冲和HOLD正脉冲之间的时间-18),就是 CCD 的积分时间,即曝光时间。器件具有最大曝光时间,设置曝光时间超过最大曝光时间是没有意义的做法。
积分时间可被改变,光线越强,积分时间应越短,因此在不同的比赛场地应注意对积分时间的调试。
积分时间的计算公式为:
n是线性CCD一次采集的像素数,此处为128;
18是复位时间;
20us是像素转移时间,即将积分电容储存的电荷经过运算电路转移到AO数据输出的时间。
增加曝光时间,则图像采集周期变长,系统反应能力变弱;相反的,减少曝光时间,图像可能变得模糊,不利于图像处理。即便如此,由于比赛的原因,线阵CCD需采集变化较快的图像,因此应尽量减少曝光时间。
如果竞赛环境各个方向的光线均匀一致,则可以在赛车出发前根据环境光线调节一个合理的曝光时间,以得到合理的输出,这样赛车就能采用一个固定的曝光时间跑完全程。不过由于赛道上方的灯光等光源,投射在赛道上的光线也并不均匀一致,因此需要动态调整曝光参数。
自适应策略为:
曝光量调节器用Kp 乘以e(设定的曝光量减去实际曝光量)再加上次的曝光时间作为新的曝光时间进行曝光。
实际曝光量应该是一段时间和一定像素点强度的函数,一种简单的做法为取一次采集到的128个像素电压的平均值作为曝光量当量,设定的曝光量也就是设定的128像素点平均电压。
虽然如此,我个人认为在室内场地还是觉得没必要动态调整曝光参数,我能想象到的一个好处是从学校场地转移到比赛场地时不需要费力调节曝光时间。(以防万一还是加吧)
线性CCD识别赛道
参考自 智能车线性CCD路径识别方法 胡世林; 韩致信; 崔继强; 兰州理工大学机电工程学院
图像二值化
线性 CCD 如果扫到白线 AD 值即为一个较高的电压值(接近 3v),扫到黑线即为一个较低的电压值。
为了准确判断黑线的位置以及减弱赛道上噪点的干扰,需将 CCD 采集的图像进行二值化处理,把模拟信号转换成 0 和 1 的二值信号,便于后期的数据处理。处于黑线上像素点的模拟量( 灰度值) 远远小于处于白线上像素点的模拟量,故选取处于黑线和白线两个模拟量之间的一个值作为阀值。灰度值大于该阀值为 1,反之为0。
虽然说二值化就是为了呈现黑白图像,而赛道刚好就是黑白的,但考虑到现场光线的影响,黑线也可能因为反光识别成白线,因此对于阈值的确定还是要有所注意的;此外若采用了动态曝光时间,也建议采用动态阈值,道理一样。
识别赛道
识别直道
赛道引导线处于赛道两边,在进行边缘检测时(即扫描像素二值化之后 0 和 1 的跳变沿),可通过从中心向两边扫描的方式实现,从左右两边同时寻找从 1 跳变到 0的像素点位置,具体过程为第 64 个像素点向第 1 个像素点扫描,得到左边引导线的位置Error_L,第 65 个像素点向第 128个像素点扫描,得到右边引导线的位置 Error_R,Error_L和 Error_R 符号相反。从中心到两边分别取值为 64 ~ 1和 - 64 ~ - 1,赛道偏差 Error = Error_L + Error_R。由于线性 CCD 采回的数据在左右两个边沿不准确,所以左右各略去 4 个点,使用 120 个点的数据,此时 60 即为期望的中心值。当小车处于期望的赛道中心位置时 , Error= 0;当赛车位置与期望中心出现偏差时,Error可为正也可为负,通过一个方向 PD 算法就可以得到需要的转向值,来控制舵机转向。
识别弯道
同上面的方法,当小车处于弯道时,Error_L 与 Error_R 绝对值不同,两个值求和之后就可以计算出赛道偏差。
避免丢线
由于小车驱动电机的反应具有滞后性, 高速行驶于弯道时容易出现第 64 个像素点与第 65 个像素点同时落在黑线上的情况, 如下图所示:
此时从中心到两边像素点都没有从 1 到 0 的跳变, Error 就为 0, 从而出现丢线的情况。
为了避免这种情况的发生, 采用浮动中心点的方法, 即扫描并不是固定的从第 64 和 65 个像素点向两边进行, 而是根据上一次的赛道偏差计算出本次扫描的起始位置。如下图所示:
当小车处于左转弯时扫描起始位置向左移动, 反之向右移动,这样可以很好地避免了因扫描中心点落在黑线上而导致的丢线。
参考资料
(排名不分先后)
1.线性CCD——从原理到跑路,适用于Arduino的底层驱动分析
2.【STM32平衡小车】线性CCD( TSL1401CL)巡线
3.TSL1401中文资料
4.快速上手tsl1401线性ccd(编程方法及设计原理与思路)
5.智能车线性CCD路径识别方法 胡世林; 韩致信; 崔继强; 兰州理工大学机电工程学院
6.走过飞思卡尔:软件篇
今天的文章线性CCD基础学习分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/63443.html