找回密码
 马上注册

QQ登录

只需一步,快速开始

楼主: grant7788

NXC下用PID算法巡线——算法初步验证成功

 火.. [复制链接]
 楼主| 发表于 2011-2-7 00:25:42 | 显示全部楼层
调整参数后,实测,巡线一圈约耗时13秒。巡线准确。对结果基本满意。
用“传统”的巡线方法(单轮动作),要跑到25秒左右,用PID节省时间一半。
不过我用的电池快没电了,这个测试结果仅供参考吧。

不过我发现这里有一个很棒的巡线算法,是用NXT-G写的,我用同样的测试条件,居然可以跑到11秒。
http://www.nxtprograms.com/NXT2/line_follower/index.html
大致看了一下他的算法,比较有趣...
可以算是只用了比例因子,I / D 都等于0的一个PID算法。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2011-2-7 00:36:45 | 显示全部楼层
前面发的程序中,读取的RGB值转换成亮度值时,用了一个简化。本来应该是:
    Y = 0.299*raw[0] + 0.587*raw[1] + 0.114*raw[2];
因为浮点运算比较耗CPU时间,一般会写成:
    Y = (299*raw[0] + 587*raw[1] + 114*raw[2])/1000;
不过这样还是会有一个耗时间的除法,可以用移位来代替除法。系数也要做相应的调整。最后得到:
    Y = (raw[0]*19595 + raw[1]*38469 + raw[2]*7472) >> 16;
这种优化算法在嵌入式控制,以及DSP中应该是是比较常见的。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2011-2-7 00:38:31 | 显示全部楼层
今天不能搞得象昨天那么迟了... 先去睡了。
明天如果有时间的话,把那个只用P的PID算法用NXC实现了玩。 
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2011-2-7 01:39:25 | 显示全部楼层
本帖最后由 grant7788 于 2011-2-7 01:41 编辑

唉,还是没忍住... 把那个高手的NXT-G程序写成了NXC,并调试了Gain的值,目前工作基本正常。
发现有个小问题... 有些颜色会造成干扰。目前的工作模式下,颜色传感器工作时是亮三色光,是否可设成红光?
明天再试吧... 代码上传如下... 速度和NXT-G差不多。主要是,电池快没电了,感觉测不大准。
  1. // 参数设定值
  2. #define iPower 90   // 初始速度,直线的话,此值越大越快;但若路径复杂的话此值过大会造成偏离。
  3. #define iGain 60    // 增益。数字越大,跟随性越好;但过大的数值会造成振荡,过小的数值无法跟踪曲线。

  4. int ReadSensorColorFast(int iPort)
  5. {
  6.     unsigned int raw[3]={0,0,0};
  7.     int Y;

  8.     ReadSensorColorRaw(iPort, raw);
  9.     // Y = 0.299*raw[0] + 0.587*raw[1] + 0.114*raw[2];
  10.     // Y = (299*raw[0] + 587*raw[1] + 114*raw[2])/1000;
  11.     Y = (raw[0]*19595 + raw[1]*38469 + raw[2]*7472) >> 16;
  12.     return Y;
  13. }

  14. task main()
  15. {
  16.     int iMin = 9999;
  17.     int iMax = 0;
  18.     int iRange, iMid;
  19.     int light;
  20.     float sCorrection;
  21.     long degold, degnew;
  22.    
  23.     // 开传感器
  24.     SetSensorColorFull(IN_3);
  25.     Wait(200);

  26.     OnFwd(OUT_B, 25);
  27.     OnRev(OUT_C, 25);
  28.     degnew = MotorRotationCount(OUT_B);
  29.     degold = degnew;
  30.     while(degnew - degold < 120)
  31.     {
  32.         light = ReadSensorColorFast(S3);
  33.         if (light < iMin) iMin = light;
  34.         if (light > iMax) iMax = light;
  35.         degnew = MotorRotationCount(OUT_B);
  36.     }
  37.     iRange = iMax - iMin;
  38.     iMid = (iMax + iMin) / 2;
  39.    
  40.     OnRev(OUT_B, 25);
  41.     OnFwd(OUT_C, 25);
  42.     light = iMax;
  43.     while(light>iMid)
  44.     {
  45.         light = ReadSensorColorFast(S3);
  46.     }
  47.    
  48.     while (true)
  49.     {
  50.         light = ReadSensorColorFast(S3);
  51.         sCorrection = (iMid - light) * iGain / iRange;
  52.         OnFwd(OUT_B, iPower + sCorrection);
  53.         OnFwd(OUT_C, iPower - sCorrection);
  54.     }
  55. }
复制代码



如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2011-2-7 01:42:21 | 显示全部楼层
这段代码中,包含了自动寻找最高/最暗值的部分。蛮有趣的。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2011-2-7 01:56:07 | 显示全部楼层
本帖最后由 grant7788 于 2011-2-7 03:07 编辑

555... 这段是错的。删了...
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2011-2-7 01:57:17 | 显示全部楼层
汗个... 又这么晚了... 去睡了。
唉,得经常提醒自己,岁月不饶人啊... 不能这么熬夜了。
[g:02]
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2011-2-7 11:53:18 | 显示全部楼层
哎呀!!这个帖子要给精华帖了!!让大家理解PID是一个很重要的内容~~其实我都不是太理解。。很多问题还是很奇怪的
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2011-2-7 15:43:36 | 显示全部楼层
回复 grant7788 的帖子

我得好好看看,特别是Kp、Ki  、Kd的三个参数的调试,试试看,谢LZ。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2011-2-7 15:59:03 | 显示全部楼层
回复 grant7788 的帖子

LZ能否把你看到的那个自平衡机器人的程序共享一下,或者在哪个网上看到的给指条路。我弄了很长时间都没搞出来,有点灰心了。我不是编程高手,有的地方大概没注意,出了问题也没看出来。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2011-2-7 16:23:10 | 显示全部楼层
加精华很正常,请楼主不必惊慌
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2011-2-7 18:50:39 | 显示全部楼层
回复 394069341 的帖子

PID是自动控制领域里非常经典、非常古老、也是非常常用的一个算法,但是真正用好,非常难。难就难在三个参数的调试。
这种巡线的算法调试起来相对简单,不过随车子(轴距、传感器的位置、轮子大小)、路线的不同,也要分别调整。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2011-2-7 18:51:36 | 显示全部楼层
lmd 发表于 2011-2-7 15:43
回复 grant7788 的帖子

我得好好看看,特别是Kp、Ki  、Kd的三个参数的调试,试试看,谢LZ。

是的,不过巡线的小车程序还算比较容易调试。试过控温的程序... 那个调起来简直就是...


如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2011-2-7 18:52:29 | 显示全部楼层
liuxiaoyi002 发表于 2011-2-7 16:23
加精华很正常,请楼主不必惊慌

呵呵,到现在的这个份量,当然加精华我不会觉得惊慌;
可是昨天加精华时,试验还没做呢,当然比较惊慌... 万一程序运行效果不对,不是很那啥...

如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2011-2-7 18:58:00 | 显示全部楼层
lmd 发表于 2011-2-7 15:59
回复 grant7788 的帖子

LZ能否把你看到的那个自平衡机器人的程序共享一下,或者在哪个网上看到的给指条路。 ...

NXTProgram上的,NXT Segway。
http://www.nxtprograms.com/NXT2/segway/index.html
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-23 14:37 , Processed in 0.078345 second(s), 16 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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