匿名
未登录
登录
丢石头百科
搜索
查看“树莓派智能车AlphaBot教程5:红外循迹”的源代码
来自丢石头百科
名字空间
页面
讨论
更多
更多
页面选项
查看
查看源代码
历史
←
树莓派智能车AlphaBot教程5:红外循迹
因为以下原因,您没有权限编辑本页:
您所请求的操作仅限于该用户组的用户使用:
用户
您可以查看与复制此页面的源代码。
循迹从来都是智能小车中一个重要的功能。有红外循迹,摄像头循迹,电磁循迹,激光循迹等。 常见红外循迹的有两路,三路,四路,五路怎么七路,九路循迹。多少路表示传感器的数量。 又分为数字输出型和模拟输出型,比较常用的是数字输出型。即每个传感器只能输出高低电平,检测该点,是否有黑线,不能判断黑线的远近。而模拟输出型输出的是模拟量通过模拟电压可以反映出黑线的远近,结合PID算法。模拟输出循迹效果更好。 [[File:110315jqhpvhvnunnl2zvs.png]] 以上为循迹传感器部分的原理图,IR1~IR5端为模拟输出,模拟量输出和距离,物体颜色有关。红外反射越强(白色)时,输出越大,红外放射越弱(黑色),输出越小。探测器离黑色线越近输出越小,由此可以通过输出模拟量判断黑线的距离远近。数值越小的传感器离黑线越近。而数字型输出则将输出的模拟值经过比较器得到数字量。由此可知通过5路模拟输出获得相对五路数字输出更高的精度。 而模拟输出循迹算法根据复杂,下面详细讲一下算法部分。算法可以分为3部分。 算法分析 第一部分:归一化校准 相同的颜色,距离,不同的探测器输出会有所不同,而且不同环境输出的模拟量范围也不一样。如果采用10AD采集。理论上输出范围会在0~1023之间。但是实际上输出最小Min会大于0,最大值Max会比1023小。由此为了减少传感器自身以及环境的影响,作归一化处理,归一化处理实际上就是将Min~Max的数值范围转为 0~1范围线性转换如下: y=(x-Min)/(Max-Min) (其中x为探测器输出值,y为转换后的值,Max、Min分别为输出的最大值和最小值) 为了数据处理方便可以将数据放大1000倍。则 y=(x-Min)*1000/(Max-Min) 转换后数据范围为0~1000.其中1000表示探测器远离黑线,0表示探测器在黑线正中。 其中Min Max的值有程序开始中多次采集传感器的值获得,并保存起来,采集过程中不断移动小车,使得采集到的最大最小值更加接近实际情况。 第二部分:加权平均 将五个探测器输出数据通过归一化处理后,得到五个反应探测器离黑线相对距离的数据。为了尽可能准确地确定路线的中心线。通过加权平均的方式将这5个数值转变成一个数值。公式如下: y = (0 * value0 + 1000 * value1 + 2000 * value2 + 3000 * value3 +4000 * value4) /(value0 + value1 + value2 + value3 + value4) 其中0 ,1000,2000,3000,4000分别为从左到右5个探测器的权,value0~value4为探测器归一化后的数据。则经过出后的数值范围为0~4000。代表黑线的位置。例如2000则表示黑线在模块的正中间。0表示在黑线在模块的最左侧,4000表示黑线在最右侧。 为了使模块探测的精度更高,对模块的高度和黑线有所要求。黑线应该等于或略小于探测器的距离(16mm)。高度为黑线在两个传感器正中间时,两个传感器都能够刚好探测到为宜。 第三部分:PID控制 由第二部分可得到黑线的位置,为了使小车一直沿着黑线走,则必须保证黑线在小车正下方,此时加权平均后的输出应该为2000.为了使小车走的更加平滑,减少左右摇摆。采用位置式PID控制。关于PID算法网上有很多介绍,此处不再详细讲解,只是大概介绍一下。 PID是指通过比例(P),积分(I),微分(D)对误差进行反馈调节。主要算法如下: proportional = position - 2000; derivative = proportional - last_proportional; integral += proportional; last_proportional = proportional; power_difference = proportional*Kp + integral*Ki + derivative*Kd; 其中: 比例项(proportional)为当前的位置(Position)减去目标位置(2000),表示位置误差,正数表示偏右,负数表示偏左。 积分项(integral)数据为每次误差的总和,绝对值越大,表示误差累积值越大,表示小车越偏越远了。 微分项(derivative )为当前误差和上次误差的差值,反映小车的响应速度,数值越大,响应速度越快。 调节Kp,Ki,kd三个参数可获得最佳性能。先调节Kp参数,Ki,Kd设为0,不断调整Kp值使得小车可以循线,然后调节Ki,Kd值,参数可以设小一点,或者为零。 例如我们的目标是使黑线能在正中间,则加权平均后的输出数据为2000. 示例程序分析 下面结合AlphaBot2智能小车讲解一下循迹程序。这里以Arduino的程序作为示例,首先程序中用到TRSensors库,主要包含TRSensors.cpp,TRSensors.h两个文件。 TRSensors.cpp主要包含下面这几个函数 TRSensors(); void AnalogRead(unsigned int *sensor_values); void calibrate(); void readCalibrated(unsigned int *sensor_values); int readLine(unsigned int *sensor_values, unsigned char white_line = 0); 其中TRSensors()为初始化函数,初始化相应的管脚,已经申请内存用作存储各个传感器的Max,Min值。 AnalogRead()函数为读取五路探测器的模拟值,AlphaBot2是通过TLC1543 AD芯片进行AD转换,而非arduino芯片的AD管脚。如果将Tracker Sensor接到arduino的A0~A4管脚需修改此函数。 calibrate()函数为校准函数,通过多次采集数据,确定Max,Min值。故校准阶段时,小车需在黑线中紧贴地面左右摇晃。确保取得的Max,Min准确。 readCalibrated()函数为归一化校准,对应原理的第一部分,通过归一化线性转换,将数据转为0~1000范围内,其中1000表示探测器远离黑线,0表示探测器在黑线正中。主程序中通过控制小车左右旋转通过采集100次数据校准。 [[File:110315yv99kn656vizotnc.png]] readLine()函数为读取循迹线的位置,对应原理中的第二部分。通过加权平均算出寻迹线的位置。数值范围为0~4000,0表示在黑线在模块的最左侧,4000表示黑线在最右侧。 [[File:110315cg3oyrl55nzty6ce.png]] 原理中第三部分在循迹主程序Infrared_Line_Tracking.ino中实现,主要代码如下。 [[File:110316rgxeg4gex9uxde9p.png]] 通过readline()函数读取寻迹线的位置,然后算出比例项proportional,微分项derivative, 此处只用了PD算法,没有积分项,而非PID。可以修改对应的PD参数,使性能更佳。 [[File:110316zdqe8ffwvdqdbf33.png]] 最后一步就是通过PID算得的修改项power_difference去调节小车左右轮的PWM值,实现小车沿着寻迹线运动。 树莓派的程序和arduino类似,这里不再详细分析。
返回至
树莓派智能车AlphaBot教程5:红外循迹
。
导航
导航
首页
最近更改
随机页面
MediaWiki帮助
首页
首页
树莓派
主机
配件包
外壳
键鼠
电源
扩展板
显示屏
墨水屏
摄像模块
通信模块
继电器
电机驱动板
游戏机
产品分类
树莓派
Arduino
micro:bit
STM32
Espressif
WiFi模块
蓝牙模块
无线模块
LoRa模块
4G模块
GSM
GPRS
以太网
导航模块
北斗卫星
GPS
LCD
墨水屏
OLED
摄像头
USB模块
串口模块
RS232
RS485
CAN
传感器
温度模块
湿度模块
气压模块
继电器
电机模块
指纹模块
电平转换
音频模块
编程器
Wiki工具
Wiki工具
特殊页面
页面工具
页面工具
用户页面工具
更多
链入页面
相关更改
页面信息
页面日志