找回密码
 马上注册

QQ登录

只需一步,快速开始

查看: 12444|回复: 9

8547颜色传感器测试结果

  [复制链接]
发表于 2009-9-29 10:06:11 | 显示全部楼层 |阅读模式
我利用作者的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再合成是一种很好的方法。以上就是哥们我的浅见,不足之处请见谅。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
发表于 2009-9-29 16:17:16 | 显示全部楼层
不懂,顶个先!
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2009-10-1 16:44:58 | 显示全部楼层
多谢多谢,谢谢鼓励,多交流哈
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2009-10-6 15:25:23 | 显示全部楼层
发一点我的经验。
按照魔方机器人作者的程序,可以在一定程度上识别橙色和红色。不过要做一些参数的调整(比较难调)。
通常,取得精确的颜色值可以用如下代码:
  1.     int colorval = -1;
  2.     unsigned int raw[] = {0, 0, 0};
  3.     unsigned int norm[] = {0, 0, 0};
  4.     unsigned int scaled[] = {0, 0, 0};
  5.     while(ReadSensorColorEx(COLOR_SENSOR, colorval, raw, norm, scaled));
复制代码
以上代码会不断地读,直到读取成功为止。
其中raw[]数组里面保存的是3个0-600之间的数值,分别代表红绿蓝的原始值。
norm[]和scaled[]数组里面保存的值相同,都是经过调整的红绿蓝颜色值,范围在0-255,与一般程序处理颜色的方式相同。
colorval则是楼主帖子里的颜色值。
这些颜色值,在API里面有宏定义。

个人感觉,如果要取得颜色传感器最全的数值,就用ReadSensorColorEx()即可。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2009-10-7 20:58:04 | 显示全部楼层
4# Programus


    实验的数据我测了许多次,发现红色和橙色十分接近,分辨不开,其实这跟材料也很有关系,理论上调整好比例是可以辨别开的,不过我采用了一个最笨的办法,就是用黑色胶布直接更换掉橙色贴纸,哈哈哈
返回的值绝对准确,不过发现8547的颜色传感器不能离目标太近,好像有一个盲区
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2009-10-9 09:49:37 | 显示全部楼层
Programus


    实验的数据我测了许多次,发现红色和橙色十分接近,分辨不开,其实这跟材料也很有关系 ...
不过发现8547的颜色传感器不能离目标太近,好像有一个盲区
jackessence 发表于 2009-10-7 20:58


颜色传感器的盲区跟它的结构有关。你看颜色传感器的前端,会发现有三个孔,呈“品”字形排列。其中有一个是假的,封死的,没有任何作用。另外两个一个是发光的灯,另一个是接受光信号的传感器。如果你把传感器放得距离目标太近了,灯光的照耀区域就无法到达接收器的探测范围,所以就盲区了。我记得魔方机器人的说明里面有提到一个比较合适的值,是2mm还是多少的,记不清了,你可以到魔方机器人主页上找找。或者是下载的压缩文件里面某处。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2009-10-11 22:14:19 | 显示全部楼层
6# Programus

经过多次试验,我 已调到一个最佳值了,呵呵,魔方机器人基本制作完毕,试验了几个简单的,全部可以恢复,呵呵,我会把程序和图片发上来,视频就没有了,因为我的摄像头拍出来的视频太大,空间不够了
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2010-4-14 18:47:10 | 显示全部楼层
应该三个都有用吧?其中有一个是灯,另外两个是传感器
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2012-5-7 18:40:09 | 显示全部楼层
解魔方的机器人 把橙色贴纸改为黑色 能较好的运行吗?
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2013-12-27 10:49:51 | 显示全部楼层
怎么颜色传感能识别出橙色?
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

手机版|中文乐高 ( 桂ICP备13001575号-7 )

GMT+8, 2024-11-21 21:40 , Processed in 0.138766 second(s), 18 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表