“Tracker Sensor”的版本间的差异
(创建页面,内容为“<div class="tabber"> <!--<div class="tabbertab" title="说明"></div>--> <div class="tabbertab" title="资料"> {{外围模块|colorscheme=blue |name = Tracker Senso…”) |
|||
第1行: | 第1行: | ||
<div class="tabber"> | <div class="tabber"> | ||
− | |||
− | |||
{{外围模块|colorscheme=blue | {{外围模块|colorscheme=blue | ||
|name = Tracker Sensor | |name = Tracker Sensor | ||
− | |img=[[File:Tracker-Sensor-1.jpg|360px |alt=Tracker Sensor |link=http:// | + | |img=[[File:Tracker-Sensor-1.jpg|360px |alt=Tracker Sensor |link=http://{{SERVERNAME}}/shop/Tracker-Sensor.htm | Tracker Sensor]] |
|category1=AlphaBot | |category1=AlphaBot | ||
|category2=光传感器 | |category2=光传感器 | ||
第12行: | 第10行: | ||
| interface1 =I/Os | | interface1 =I/Os | ||
}} | }} | ||
+ | <div class="tabbertab" title="说明"> | ||
+ | |||
+ | ==产品概述== | ||
+ | Tracker Sensor是红外循迹传感器,常用于制作循迹智能小车。<br /> | ||
+ | Tracker Sensor采用ITR20001/T红外反射传感器,ITR2001/T传感器的红外发射二极管不断发射红外线,当发射出的红外线被物体反射时,被红外接收器就收,并输出模拟值。输出模拟值和物体距离以及物体颜色有关。通过计算五路输出的模拟值,判断循迹线位置。 | ||
+ | |||
+ | ==规格== | ||
+ | *工作电压:3.3V ~ 5V | ||
+ | *产品尺寸:78mm × 18mm | ||
+ | *探头间距:16mm | ||
+ | *固定孔尺寸:3mm | ||
+ | *感应距离:1cm ~ 5cm | ||
+ | ==主要用途== | ||
+ | 智能小车或机器人寻线,避悬崖防跌落等<br /> | ||
+ | ==小车循迹原理简介== | ||
+ | Tracker Sensor有五路模拟输出,模拟量输出和距离,物体颜色有关。红外反射越强(白色)时,输出越大,红外放射越弱(黑色),输出越小。探测器离黑色线越近输出越小,由此可以通过输出模拟量判断黑线的距离远近。数值越小的传感器离黑线越近。相对于其他只能输出高低电平的轨迹传感器而言,本产品的5路模拟量输出可以反馈黑线的距离,反馈更为准确。<br /> | ||
+ | 小车算法可以分为3部分: | ||
+ | ===第一部分:归一化校准=== | ||
+ | 相同的颜色,距离,不同的探测器输出会有所不同,而且不同环境输出的模拟量范围也不一样。如果采用10位AD采集。理论上输出范围会在0~1023之间。但是实际上输出最小Min会大于0,最大值Max会比1023小。由此为了减少传感器自身以及环境的影响,作归一化处理,归一化处理实际上就是将Min~Max的数值范围转为 0~1范围线性转换如下:<br /> | ||
+ | y = (x - Min) / (Max - Min) | ||
+ | (其中x为探测器输出值,y为转换后的值,Max、Min分别为输出的最大值和最小值)<br /> | ||
+ | 为了数据处理方便可以将数据放大1000倍。则 | ||
+ | y = (x - Min) * 1000 / (Max - Min) | ||
+ | 转换后数据范围为0~1000.其中1000表示探测器远离黑线,0表示探测器在黑线正中。<br /> | ||
+ | 其中Min和Max的值是由程序在运行过程中多次采集传感器的值而获得,并保存起来,采集过程中不断移动小车,使得采集到的最大最小值更加接近实际情况。<br /> | ||
+ | |||
+ | ===第二部分:加权平均=== | ||
+ | 将五个探测器输出数据通过归一化处理后,得到五个反应探测器离黑线相对距离的数据。为了尽可能准确地确定路线的中心线。通过加权平均的方式将这5个数值转变成一个数值。公式如下:<br /> | ||
+ | y = (0 * value0 + 1000 * value1 + 2000 * value2 + 3000 * value3 +4000 * value4) / (value0 + value1 + value2 + value3 + value4) | ||
+ | 其中0, 1000, 2000, 3000, 4000分别为从左到右5个探测器的权,value0~value4为探测器归一化后的数据。<br /> | ||
+ | 则经过出后的数值范围为0~4000。代表黑线的位置。例如2000则表示黑线在模块的正中间。0表示在黑线在模块的最左侧,4000表示黑线在最右侧。<br /> | ||
+ | 为了使模块探测的精度更高,对模块的高度和黑线有所要求。黑线应该等于或略小于探测器的距离(16mm)。高度为黑线在两个传感器正中间时,两个传感器都能够刚好探测到为宜。<br /> | ||
+ | |||
+ | ===第三部分:PID控制=== | ||
+ | 由第二部分可得到黑线的位置,为了使小车一直沿着黑线走,则必须保证黑线在小车正下方,此时加权平均后的输出应该为2000。为了使小车走的更加平滑,减少左右摇摆。采用位置式PID控制。关于PID算法网上有很多介绍,此处不再详细讲解,只是大概介绍一下。<br /> | ||
+ | PID是指通过比例(P),积分(I),微分(D)对误差进行反馈调节。主要算法如下:<br /> | ||
+ | proportional = position - 2000; | ||
+ | derivative = proportional - last_proportional; | ||
+ | integral += proportional; | ||
+ | |||
+ | last_proportional = proportional; | ||
+ | |||
+ | power_difference = proportional * Kp + integral * Ki + derivative * Kd; | ||
+ | 其中:<br /> | ||
+ | 理想情况下,加权平均后的输出数据为2000,即黑线在正中间。<br /> | ||
+ | 比例项(proportional)为当前的位置(Position)减去目标位置(2000),表示位置误差,正数表示小车偏右,负数表示小车偏左。<br /> | ||
+ | 积分项(integral)数据为每次误差的总和,绝对值越大,表示误差累积值越大,表示小车越偏越远了。<br /> | ||
+ | 微分项(derivative)为当前误差和上次误差的差值,反映小车的响应速度,数值越大,响应速度越快。<br /> | ||
+ | 调节Kp, Ki, kd三个参数可获得最佳性能。先调节Kp参数,Ki, Kd设为0,不断调整Kp值使得小车可以循线,然后调节Ki和Kd值,参数可以设小一点,或者为0。<br /> | ||
+ | |||
+ | ==AlphaBot 循迹模块示例程序分析== | ||
+ | 下面结合AlphaBot智能小车讲解一下Tracker Sensor循迹程序。这里以Arduino的程序作为示例,Tracker Sensor的库文件主要包含TRSensors.cpp和TRSensors.h两个文件。<br /> | ||
+ | TRSensors.cpp主要包含下面这几个函数<br /> | ||
+ | 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值。<br /> | ||
+ | AnalogRead()函数为读取五路探测器的模拟值,AlphaBot是通过TLC1543 AD芯片进行AD转换,而非Arduino芯片的AD管脚。如果将Tracker Sensor接到Arduino的A0~A4管脚需修改此函数。<br /> | ||
+ | calibrate()函数为校准函数,通过多次采集数据,确定Max,Min值。故校准阶段时,小车需在黑线中紧贴地面左右摇晃。确保取得的Max,Min准确。 | ||
+ | readCalibrated()函数为归一化校准,对应原理的第一部分,通过归一化线性转换,将数据转为0~1000范围内,其中1000表示探测器远离黑线,0表示探测器在黑线正中。<br /> | ||
+ | readLine()函数为读取循迹线的位置,对应原理中的第二部分。通过加权平均算出寻迹线的位置。数值范围为0~4000,0表示在黑线在模块的最左侧,4000表示黑线在最右侧。<br /> | ||
+ | 原理中第三部分在循迹主程序Infrared_Line_Tracking.ino中实现,主要代码如下。<br /> | ||
+ | [[File:Ttacker Sensor-1.png|800px]]<br /> | ||
+ | <br /> | ||
+ | 通过readline()函数读取寻迹线的位置,然后算出比例项proportional,微分项derivative,<br /> | ||
+ | 此处只用了PD算法,没有积分项,而非PID。可以修改对应的PD参数,使性能更佳。<br /> | ||
+ | [[File:Tracker Sensor-2.png|800px]]<br /> | ||
+ | 最后一步就是通过PD算得的修改项power_difference去调节小车左右轮的PWM值,实现小车沿着寻迹线运动。<br /> | ||
+ | |||
+ | ==操作与现象== | ||
+ | 本节只是介绍模块的简单测试程序,关于AlphaBot使用Tracker Sensor实现循迹的操作以及示例程序可以参考[http://www.waveshare.net/wiki/AlphaBot AlphaBot的相关资料]。<br /> | ||
+ | 下面,以接入微雪[http://www.waveshare.net/shop/XNUCLEO-F103RB.htm XNUCLEO-F103RB (STM32F103R) ]和 [http://www.waveshare.net/shop/UNO-PLUS.htm Arduino UNO]开发板为例。<br /> | ||
+ | ① 将配套程序下载到相应的开发板中。<br /> | ||
+ | ② 将串口线和模块接入开发板,给开发板上电,打开串口调试软件。<br /> | ||
+ | 模块与开发板连接如下表所示:<br /> | ||
+ | {|border=2 style="width:800px" | ||
+ | |-align="center" | ||
+ | |+表1. 模块接入STM32开发板 | ||
+ | |- align="center" style="background:#fde" | ||
+ | |端口||XNUCLEO_F103RB引脚 | ||
+ | |-align="center" | ||
+ | |IR1~IR5||A0~A4 | ||
+ | |-align="center" | ||
+ | |GND||GND | ||
+ | |-align="center" | ||
+ | |VCC||3.3V | ||
+ | |} | ||
+ | <br /> | ||
+ | {|border=2 style="width:800px" | ||
+ | |-align="center" | ||
+ | |+表2.模块接入Arduino | ||
+ | |- align="center" style="background:#fed" | ||
+ | |端口||Arduino引脚 | ||
+ | |-align="center" | ||
+ | |IR1~IR5||A0~A4 | ||
+ | |-align="center" | ||
+ | |GND||GND | ||
+ | |-align="center" | ||
+ | |VCC||5V | ||
+ | |} | ||
+ | <br /> | ||
+ | 串口配置如下表所示:<br /> | ||
+ | {|border=2 style="width:800px; background:#eff" | ||
+ | |- align="center" | ||
+ | |+表3. 串口配置 | ||
+ | |-align="center" | ||
+ | |style="width:400px"|Baud rate||9600 | ||
+ | |-align="center" | ||
+ | |Data bits||8 | ||
+ | |-align="center" | ||
+ | |Stop bit||1 | ||
+ | |-align="center" | ||
+ | |Parity bit||None | ||
+ | |} | ||
+ | <br /> | ||
+ | ③串口会显示5串数据,分别对应IR1~IR5传感器。数据随着反射距离的远近而改变。当模块没有遮挡时,输出的大概为几十,当模块接近台面时,输出为八九百左右。<br /> | ||
+ | </div> | ||
+ | <div class="tabbertab" title="资料"> | ||
+ | |||
===文档=== | ===文档=== | ||
− | *[http:// | + | *[http://{{SERVERNAME}}/w/upload/2/2d/Tracker-Sensor-UserManual.pdf 用户手册]<br> |
− | *[http:// | + | *[http://{{SERVERNAME}}/w/upload/b/bc/Tracker-Sensor-Schematic.pdf 原理图/尺寸图]<br> |
===程序=== | ===程序=== | ||
− | *[http:// | + | *[http://{{SERVERNAME}}/w/upload/4/45/Tracker_Sensor_Demo.7z 示例程序]<br> |
===数据手册=== | ===数据手册=== | ||
− | *[http:// | + | *[http://{{SERVERNAME}}/w/upload/7/78/ITR20001-T.pdf ITR20001-T_EN]<br> |
===软件=== | ===软件=== | ||
− | *[http:// | + | *[http://{{SERVERNAME}}/w/upload/5/5f/Sscom.7z 串口调试助手] |
<br /><big>批量下载教程——请戳<big><big><big>☛</big></big></big></big>[[File:download-icon.png|link=批量下载教程]] | <br /><big>批量下载教程——请戳<big><big><big>☛</big></big></big></big>[[File:download-icon.png|link=批量下载教程]] | ||
2019年11月14日 (四) 09:35的版本
| ||||||||||||||||||||
| ||||||||||||||||||||
| ||||||||||||||||||||
|
目录
产品概述
Tracker Sensor是红外循迹传感器,常用于制作循迹智能小车。
Tracker Sensor采用ITR20001/T红外反射传感器,ITR2001/T传感器的红外发射二极管不断发射红外线,当发射出的红外线被物体反射时,被红外接收器就收,并输出模拟值。输出模拟值和物体距离以及物体颜色有关。通过计算五路输出的模拟值,判断循迹线位置。
规格
- 工作电压:3.3V ~ 5V
- 产品尺寸:78mm × 18mm
- 探头间距:16mm
- 固定孔尺寸:3mm
- 感应距离:1cm ~ 5cm
主要用途
智能小车或机器人寻线,避悬崖防跌落等
小车循迹原理简介
Tracker Sensor有五路模拟输出,模拟量输出和距离,物体颜色有关。红外反射越强(白色)时,输出越大,红外放射越弱(黑色),输出越小。探测器离黑色线越近输出越小,由此可以通过输出模拟量判断黑线的距离远近。数值越小的传感器离黑线越近。相对于其他只能输出高低电平的轨迹传感器而言,本产品的5路模拟量输出可以反馈黑线的距离,反馈更为准确。
小车算法可以分为3部分:
第一部分:归一化校准
相同的颜色,距离,不同的探测器输出会有所不同,而且不同环境输出的模拟量范围也不一样。如果采用10位AD采集。理论上输出范围会在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;
其中:
理想情况下,加权平均后的输出数据为2000,即黑线在正中间。
比例项(proportional)为当前的位置(Position)减去目标位置(2000),表示位置误差,正数表示小车偏右,负数表示小车偏左。
积分项(integral)数据为每次误差的总和,绝对值越大,表示误差累积值越大,表示小车越偏越远了。
微分项(derivative)为当前误差和上次误差的差值,反映小车的响应速度,数值越大,响应速度越快。
调节Kp, Ki, kd三个参数可获得最佳性能。先调节Kp参数,Ki, Kd设为0,不断调整Kp值使得小车可以循线,然后调节Ki和Kd值,参数可以设小一点,或者为0。
AlphaBot 循迹模块示例程序分析
下面结合AlphaBot智能小车讲解一下Tracker Sensor循迹程序。这里以Arduino的程序作为示例,Tracker Sensor的库文件主要包含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()函数为读取五路探测器的模拟值,AlphaBot是通过TLC1543 AD芯片进行AD转换,而非Arduino芯片的AD管脚。如果将Tracker Sensor接到Arduino的A0~A4管脚需修改此函数。
calibrate()函数为校准函数,通过多次采集数据,确定Max,Min值。故校准阶段时,小车需在黑线中紧贴地面左右摇晃。确保取得的Max,Min准确。
readCalibrated()函数为归一化校准,对应原理的第一部分,通过归一化线性转换,将数据转为0~1000范围内,其中1000表示探测器远离黑线,0表示探测器在黑线正中。
readLine()函数为读取循迹线的位置,对应原理中的第二部分。通过加权平均算出寻迹线的位置。数值范围为0~4000,0表示在黑线在模块的最左侧,4000表示黑线在最右侧。
原理中第三部分在循迹主程序Infrared_Line_Tracking.ino中实现,主要代码如下。
通过readline()函数读取寻迹线的位置,然后算出比例项proportional,微分项derivative,
此处只用了PD算法,没有积分项,而非PID。可以修改对应的PD参数,使性能更佳。
最后一步就是通过PD算得的修改项power_difference去调节小车左右轮的PWM值,实现小车沿着寻迹线运动。
操作与现象
本节只是介绍模块的简单测试程序,关于AlphaBot使用Tracker Sensor实现循迹的操作以及示例程序可以参考AlphaBot的相关资料。
下面,以接入微雪XNUCLEO-F103RB (STM32F103R) 和 Arduino UNO开发板为例。
① 将配套程序下载到相应的开发板中。
② 将串口线和模块接入开发板,给开发板上电,打开串口调试软件。
模块与开发板连接如下表所示:
端口 | XNUCLEO_F103RB引脚 |
IR1~IR5 | A0~A4 |
GND | GND |
VCC | 3.3V |
端口 | Arduino引脚 |
IR1~IR5 | A0~A4 |
GND | GND |
VCC | 5V |
串口配置如下表所示:
Baud rate | 9600 |
Data bits | 8 |
Stop bit | 1 |
Parity bit | None |
③串口会显示5串数据,分别对应IR1~IR5传感器。数据随着反射距离的远近而改变。当模块没有遮挡时,输出的大概为几十,当模块接近台面时,输出为八九百左右。