找回密码
 马上注册

QQ登录

只需一步,快速开始

查看: 88543|回复: 37

EV3单光感PID巡线程序

    [复制链接]
发表于 2016-1-23 23:58:45 | 显示全部楼层 |阅读模式
本帖最后由 豆豆儿 于 2016-1-24 00:00 编辑

最近大家都对PID巡线很感兴趣。本人就做了一个PID巡线的程序供大家分享交流。


以上两张图片为主程序

P项

I项

D项
本人其实认为乐高巡线无须PID算法。因此这是本人第一次用PID算法来做巡线程序,不过效果还算不错。但是用在中小学机器人教学当中就难度略高了。
下面是效果视频:


测试结果表明D项(微分项)修正效果还是比较显著的。I项(积分项)修正效果不明显。


下面为算法公式:
设:马达参考速度为50,速度差为Y,光值差为X。
两个马达的速度分别为50+Y和50-Y
PID公式为:Y=a*x+b*x对t的积分+c*dx/dt
积分符号不会写,大家凑活看吧。
abc为关联性系数。表示该项对Y值的影响程度。

这只是一种简单的算法,还可以设更为复杂的公式,稳定性也会更高。有兴趣的朋友可以做一做。我就暂时先不做了。


附上程序:
35785.rar
乐币是干什么用的,加一下试试。


最后吐槽一下自己,之前由于情绪激动,大言不惭不再发帖子了。这算不算自己打自己脸。


img_0584.jpg
img_0585.jpg
img_0586.jpg
img_0587.jpg
img_0588.jpg

pidxunxian.rar

10.68 KB, 下载次数: 5133

如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
发表于 2016-1-24 08:34:21 | 显示全部楼层
在D的计算中引入时间,充分体现了变化率这一概念,高!

但:
1、数据线的走向有些凌乱,不利于新手读程序了;
2、计算模块完全可以再合并化简;
3、预设光值从何而来?应该是前期测光的结果吧?
4、I清零的依据(光值<10),从何而来,可否交代一下。

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

使用道具 举报

发表于 2016-1-24 09:03:45 | 显示全部楼层
绕着这种线走证明不了什么
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2016-1-24 17:28:13 | 显示全部楼层
我想知道楼主这个车子是如何搭建出来的
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2016-1-25 17:12:47 | 显示全部楼层
楼主你好啊,我下载你的程序学习了一下,没有头绪啊。简单说一下我的疑惑,希望你能解答。
先给i d 两个变量赋值为0,重置定时器从零开始,ysgz赋值为20,小车以50w功率行驶,这些都可以理解,
然后一个大循环,循环内第一个切换,反射光强度小于10,相当于照在黑色上,假如小于10,这时候还是给变量i赋值为0啊,跟一开始的赋值有什么区别吗?
在切换结束后,用传感器1号测量反射光强度值,减去ysgz,即20,赋值给gzc,光照差。
在p阶段,用gzc乘以-3,结果作为变量1,这一步就开始看不懂了。假如光照强度 为50,gzc就是30,变量1就是-60.不知道为什么这么做,但先放下;
在i阶段,测量定时器1,这个应该测量的应该是程序开头重置定时器1到现在的时间吧,假设2s,(不知道是否合理,先假设,)这样就是30*2=60,60+i=60,然后i现在赋值成为60+i=60,变量2就是60*0.2=12,这一步也不太明白
在d阶段,同样,测量从程序开始到现在的定时器2的值,感觉2的值应该比1的值大一些,假设为3,变量d现在应该还是0吧,这样是30-d=30-0=30,在给d赋值为gzc,即30,然后30除以定时器2的sj,结果为30/3=10,10*c=10*-200=-2000,变量3为-2000
然后把他们相加,结果为-1000多,不对劲啊
然后其他的疑惑是p i d这几个模块程序不太能理解,里面出现了最开始的变量i和d,但是这两个变量的值没有变过,都是0,不知道为什么这么做,希望楼主有时间可以指点一下,谢谢
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2016-1-27 00:34:23 | 显示全部楼层
xuexile
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2016-1-29 23:27:42 | 显示全部楼层
图片看不清··
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2016-1-30 21:51:42 | 显示全部楼层
冀·闲庭信步 发表于 2016-1-24 08:34
在D的计算中引入时间,充分体现了变化率这一概念,高!

但:

谢谢回帖。
1.随便做的所以有些凌乱,这样也能看完程序,感谢支持。另外本人喜欢拉线,看着呗爽
2.的确这样,谢谢指出。
3.不想测试,我就直接写了个差不多的值。
4.积分项本应做成一段时间内的区间积分。为了测试做成了全积分。程序运行时,长时间处于手中的话,积分项积分项会累积,因此做看到黑线之后先清零。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2016-1-30 22:11:31 | 显示全部楼层
伊森亨特 发表于 2016-1-25 17:12
楼主你好啊,我下载你的程序学习了一下,没有头绪啊。简单说一下我的疑惑,希望你能解答。
先给i d 两个变 ...

i变量是积分项最后得出的值。由于我做的是全积分,积分项会累积。比如开始巡线之前拿在手里的时候我就打开了程序,积分项会累积数值。因此看到黑线后先清零一下。
首先abc是系数,是通过测试得出的值,并不是直接赋予的。我没有进行太多次的测试得到的这三个值。或许你可以经过测试得到比我更合理的abc三个值。
计时器每次计时的时间会非常小。因此积分项是非常小的,因为积分项的目的是为了当机器人接近黑线的时候不至于矫枉过正,超过黑线。
d阶段,就是微分项。你计算的是第一个瞬时。在后边的时刻,一般出现的光偏会是1而不是30。为了放大这个微小的光偏,我就设置了一个很大的比例系数。当然也不是说我的参数就是唯一正确的,你可以自己测试测试,或许也能得到一些更好的参数。
i和d一直都是在变化的,你可以再仔细看看。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2016-2-2 15:01:46 | 显示全部楼层
楼主,ysgz是什么???
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

 楼主| 发表于 2016-2-4 20:41:18 | 显示全部楼层
lkt 发表于 2016-2-2 15:01
楼主,ysgz是什么???

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

使用道具 举报

发表于 2016-2-24 17:46:39 | 显示全部楼层
初学者,看的有些凌乱,看到楼主的回帖稍微明白点。还需要多测试几遍来理解
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2016-3-13 01:46:44 | 显示全部楼层
下来看看
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2016-3-26 12:03:01 | 显示全部楼层

初学者,看的有些凌乱,看到楼主的回帖稍微明白点。还需要多测试几遍来理解
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2016-3-29 11:17:51 | 显示全部楼层
程序好复杂,程序中abc是怎么出来的啊?
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-23 19:25 , Processed in 0.100817 second(s), 27 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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