|
我利用作者的API函数进行测试,8547颜色传感器分辨能力有限,因为原理和hitachi传感器不同,应该是分别使用三种不同颜色光照耀表面,经反射测出光强,计算出RGB值,然后混合得出颜色值,所以,利用反射原理的颜色传感器测物体的颜色必须考虑物体的材质
我认为,反射最好是完全漫反射,不存在一丝一毫的镜面反射,否则,测量结果完全不正确,比如,这次我用了两个魔方做测试,一个是全塑料材质的,几乎是镜面反射,所以测量的结果误差很大,另外一个是贴纸的,结果就很稳定
下面是测试程序
#define COLOR_SENSOR IN_2
task main()
{ RotateMotorEx(OUT_A,20,100,0,false,false);
SetSensorColorFull(COLOR_SENSOR);
int raw[3]={0,0,0};
int norm[3]={0,0,0};
int scaled[3]={0,0,0};
int colorval;
ReadSensorColorRaw(COLOR_SENSOR,raw);
NumOut(10, 10, raw);
ReadSensorColorEx(COLOR_SENSOR, colorval, raw, norm, scaled);
NumOut(20, 10, colorval);
Wait(SEC_3);
SetSensorColorRed(S2); // 亮紅燈
Wait(SEC_1);
SetSensorColorGreen(S2); // 亮綠燈
Wait(SEC_1);
SetSensorColorBlue(S2); // 亮藍燈
Wait(SEC_1);
SetSensorColorNone(S2); // 不亮燈
Wait(SEC_1);
/* rotateMotorEx(’ports’, ‘speed’, ‘degrees’, ‘turnpct’, ‘sync’, ‘stop’)
其中 degrees为旋转角度
turnpct 为行驶百分比
*/
}
SetSensorColorFull是设置颜色传感器函数
SetSensorColorGreen,red,blue这三个是把颜色传感器设置为彩灯, 没什么用
ReadSensorColorRaw是读颜色传感器原始值,我估计是读反射率,原来不知道raw是一个3维数组,故程序只测出一个值,不过并不影响结果
我测出的raw值为
绿色:94~99之间
蓝色:80~79
红色:162,163,170,190
橙色:193,180,184,177
黄色:190,187,189,175,189,192
白色:199,191,190,175
故我分析,我测得这个raw值应是R(红色)的反射率,因此绿色,蓝色响应比较低,红橙黄白都很大,特别是白,白色如果我推测的正确,他的三个raw值都应是最高的,几乎都是200左右,因为机器没电,不能再测
ReadSensorColorEx(COLOR_SENSOR, colorval, raw, norm, scaled);
这个函数中返回的colorval值就是经处理后的颜色标号
黑色返回1,
蓝:2
绿:3
黄:4
红:5
白:6
多次测量均很稳定
另外,橙色返回的也是5,基本辨不开,有的人说可以修改程序,改变比例,但是我认为那样做不太好,这个不仅是程序的问题,主要是颜色本身的问题,橙和红本来就难以分辨,人眼也是一个主观的仪器,不同人有不同的看法,修改程序可以做到,但是也不能每次都正确,重复性会很差,因为你修改了比例,势必影响其他颜色的识别,所以最好的办法还是更换贴纸,换成黑色的,最省事
不能苛求这个传感器,他做的已经很好了,前些日子本来想用摄像头做,拍来照片识别,没想到一塌糊涂,红和橙分不开,蓝和绿也分不开,很讨厌,现在想想,这个传感器分别测rgb再合成是一种很好的方法。以上就是哥们我的浅见,不足之处请见谅。 |
|