最初版的蛋黄就是用mini pro做的,由于当时还没有3D打印机可供差遣,所以所有部件连接基本都是靠万能的万能胶,整体结构十分的粗犷,怎么说呢,这也许就是蒸汽朋克风吧(并不是)。
当时做的一个小视频《蛋黄物语》:
蛋黄的资料发在论坛之后引起了不少关注,很多同学被顺利地带进了自平衡小车的坑…一年多时间还不断有人问我相关的问题,也正因如此,羞愧于靠着这么点干货应付大家许久,加之个人对自平衡系统有了更深刻的理解…于是决定改进初代蛋黄的诸多不足,着手设计制作蛋黄的2.0版本。
当时对于初代的不满情绪主要集中体现在外表(毕竟颜值就是战斗力),速度控制(当时几乎没有用上速度环,只能靠不断手动调节平衡点进行移动),扩展性(初代的外设太简陋,没有完全发挥处理器的性能),以及外表(可以看出我真的很在意…)。
最后就有了Nano啦~
当物体离开垂直的平衡位置之后,便会受到重力与悬线的作用合力,驱动重物回复平衡位置,这个力称之为回复力,其大小为
F = mg*sinθ
在偏移角度 θ很小的情况下, ,所以回复力与偏移的角度之间大小成正比关系, 方向相反,在此恢复力作用下,单摆便进行周期运动。
而考虑在空气中运动的单摆,由于受到空气的阻尼力, 单摆最终会停止在垂直平衡位置。空气的阻尼力与单摆运动的角速度成正比, 方向相反。阻尼力越大,单摆越会尽快在垂直位置稳定下来。
现在来看这样一个等效模型
有意做超迷你平衡车的同学可以选用这款。TB链接就不发了…橙 搜 “N20减速电机 迷你”就能找到的
软件篇
所谓PID就是比例-积分-微分的英文缩写,但并不是必须同时具备这三种算法,也可以是 PD, PI,甚至只有 P算法控制,下面分别介绍每个参数的含义:
首先需要明确一个事实就是,要实现PID算法,必须在硬件上具有闭环控制,就是得有反馈。比如控制一个电机的转速,就得有一个测量转速的传感器,并将结果反馈到控制器中,而在自平衡系统中,常用的有三个控制环 — 角度环、速度环、转向环
大家可以想象出每个闭环的反馈元件分别是什么吗,对就是上面元件清单里面包含的 IMU(陀螺仪+加速度计)、编码器、摄像头(或者其他可以确定方位的元件比如陀螺仪,磁场计等)
P(比例):以小车巡线为例,现在需要让小车跟随一条轨迹前进,用PID算法控制方向环,反馈传感器就假设为摄像头。那么小车行进中有这么几种情况:
于是我们发现,小车转向值的输出可以简单地通过把位置误差乘以一个系数就得到了,而且显然,误差越大,得到的转向值也越大,符合需求。这里面这个系数,就是P了,而系数具体的大小,需要根据实际情况调试确定。
我们有了第一个公式:
如果上面的例子还是不好理解的话,考虑前面的单摆模型:
P相当于重力的作用,让摆左右往复运动,而D则相当于空气阻力,让摆慢慢停在中点。D的大小很理想的情况下,应该是大概摆动左右各一下之后就停在中点,想象把摆放在水中摆动的情况。
I(积分):有的时候我们会发现,系统中存在一些固定的阻力,例如,我们用PID控制一个电机的转速,当给定的目标速度很小的时候,就会出现这样的情况:
根据,由于很小,的输出也很小,而由于摩擦力的存在,此时并不能让电机转动起来;又由,由于电机没有转动,显然始终为0于是D输出也为0,那么问题来了,除非改变目标值,否则电机就永远转不起来了…
I的作用就是消除这样的静态误差,它会将每次的误差都积累起来,然后同样也是乘以一个系数之后作为输出。比如上面的情况,虽然误差很小,但却不是0,于是在每一轮的计算中,I项把逐渐累积,直到超过临界值让电机转起来;而在误差为0的情况下,I项却又不会帮倒忙。
第三个公式:
以上就是PID的全部计算了,最后三者加起来就得到了:
每隔一段固定时间把它运行一遍,就是PID算法了。
可以看出,PID的算法实现其实非常简单,不过只有几行代码而已,所以非常建议自己实现一遍PID代码。Arduino平台上也是有PID库的,但库的名字叫什么我不告诉你,自己去找哦。
制造篇
如果上面的都可以理解的话就可以开始动手制作啦,这里会以Nano的制作过程为例,但是大家可以根据实际情况自行调整。
盘老是链接失效,所有文件(源代码+STL模型文件+APP)都发在与非电路城上(收1元当请我吃辣条了…)
对里面文件说明一下:
1、STL文件是Nano头部和身体的结构件,底座由于大家使用电机不同需要自己确定,按照自己买到的电机的情况制作一个带两个电机的底座就行,有热熔胶枪的帮助应该挺简单的
2、源码建议用1.6.5版本的IDE编译,旧版本的库文件有些区别
原理图
文件打印好之后按原理图组合,头部里面装了超声波,Arduino nano板(不带排针),蓝牙模块,两个LED,摄像头以及蜂鸣器,注意把所有的IO都用导线引出到脖子部位
头部模块都塞完之后先别急着粘合,之后还有身体的导线要连接到主控板,里面的部件可以先用热熔胶固定一下。对了导线选择的话如果技术好可以用漆包线最省空间,没有把握的话就用这种FC排线,比较软去皮容易,比较细而且是整排一起的会美观一些,杜邦线真的很不好用…
然后是舵机,舵机用的是最常见的9g舵机,虽然也有更小的但是怕力矩不够,可以看到由舵机摆臂推动脖子的连接杆就可以让头部运动了。舵机不是很建议采用,一个是小机器人的电池功率比较小,舵机在堵转的时候容易造成死机,另一个头部重量还是相对比较大,所以运动的时候重心变化容易干扰平衡,参数设置会更复杂。
这时候主体就已经快完成啦
现在可以装电机驱动了,我用的是L9110S,直接盖在身体背面
最后是电池包,找块轻薄一点的电池直接粘在背部就行,也可以加上电池盖
首先需要修改的是引脚定义,把引脚改成你实际连接的情况
然后再最上面的调试选项中,取消IMU_OUTPUT的注释,像这样
下载程序到主控里,打开串口监视器,按一下按键,就可以看到输出的角度数据了。
如果数据不正常的话需要检查前面哪里出问题了,这一步是为了获取机器人平衡的自然角度:手动把机器人放正,就是大概在自然重心的平衡角度,读取串口的角度数据,记录下这个值就是的值了,把66行的改成你得到的值。
下一步把重新注释掉,开启的注释,然后用 这个函数放在的最后面来检测电机的正负极是否正确,也就是当给时左轮正转,时左轮反转,时右轮正转,时右轮反转。
上一步也检测成功之后,就可以开始调节角度环的PID参数了
说明一下这里用宏定义了一遍参数的原因是,如果用的mega328p的芯片的话由于整个程序代码量还是挺大的所以会提示动态内存紧张,所以在调试完参数之后就把它们用宏固化了节省SRAM。
总体的参数整定原则是:
1、先后,如果电机响应慢(比如减速级很多的电机),再调I,如果效果足够好的话则不需要I
2、单一变量法,即调整一个参数的时候其他参数都固定不变
3、先定量级再定数值,比如调整P的时候,先从开始,查看小车反应,没有效果的话改为,以此类推,直到确定一个合适的数量级,然后才开始在这个数量级里微调,这样其实就已经把调整的范围缩小到很小了
4、先超调再减小,即所有参数都先尽量加大,直到系统震荡,然后再取这个值的小一点的值作为最合适参数
5、调试过程中尽量让车处于自然状态没有额外的力作用,即尽量用无线调试,有线的话找根软一些的线
好那么调节过程中小车什么表现才算是“好”呢/h4>
在角度环中,当P逐渐增大,小车会开始有恢复力作用,也就是当手扶着往前倒的时候小车也能大概跟着往前走,但是还是走的很,再逐渐增大参数,恢复力越来越大,直到大到一定程度,小车开始前后自主剧烈抖动,电机性能好一点的小车即使手不扶着也能大概站立了。
稍微减小刚刚震荡的参数,作为固定在程序里,开始调节,依然是确定量级之后逐渐增大,在增大的过程中会发现小车的震荡频率逐渐降低了,增大到一定程度小车基本不再震荡,这个值就是需要的了
也会有一部分情况下由于电机性能原因上面的调整过程中始终无法达到很好的效果,那么此时需要加入,在调完值之后,值置0,增加 I值,直到小车的恢复力变得比较“硬”,然后稍微减小值,直到出现比较理想的直立效果;最后再加,视效果增加到震荡为止,再减小到70%左右,这样角度环所有参数就整定完成了。
角度环调好了,小车可以稳定平衡了,可是为啥它一直往一边跑呢/h4>
因为角度环的任务就是维持小车的角度,除此之外就是它能力范围之外了,角度环是不关心小车是静止着平衡的,还是边跑边平衡的 — 如果恰好目标平衡点和小车重心平衡点重合,那么小车可以大概静止,而如果不是,那小车就会在平衡中不断加速,直到轮子的速度超出了电机所能提供的转速,于是小车还是会倒下。
所以我们需要添加一个速度环,用编码器测量速度来作为反馈
在速度环中,首先确定编码器获取的数值是正确的,在程序中分别是和储存计数,打印输出一下转动轮子看数据对不对,正确的话,在调节好角度环的基础上,就可以添加速度环了。
在调试选项中取消的注释,然后这次我们不需要,速度环单纯靠调节,而且先调 再调,对应的表现如下:
先给一个比较小的P值(因为I是P的累加,如果P为0的话I也就没有意义了),随着I值逐渐增大,用手轻推小车,小车会前进之后慢慢后退,就说明参数起作用了。此时你可以决定到底给一个更大的 I值还是小的值,越大的值对应了更快的恢复速度,在偏离之后会更剧烈地后退,在更短的距离内回到原点,但是当然这样也会降低小车的稳定性,而小的参数则于此相反,需要在前进更长的距离之后才会慢慢回到原点,但是也使得抗干扰能力增强,也就是不会被轻易推倒。
只用值的话小车的回复会是往复的,逐渐逼近原点,加上值则可以消除这种来回震荡,与角度环调节值的过程一样,逐渐增加直到推了之后可以在前后各摆动一次就回复到原点静止,此时这个值便是对应于那个 I值的最合适参数。
这里有个我之前做的一个大车的抗干扰视频,该车的电机性能非常暴力,因此可以看到其平衡性能非常好
的调整过程大概如此,总之这是一项既需要细心调整,但自由度也很大的工作,所谓“大胆假设,小心求证”,在多尝试几种参数组合之后,你会找到适合你的小车的的~
关于参数的调整本来还有很多可以说,比如调整的形式上,大家可以在小车上加上几个电位器用读取后作为参数值,这样就可以方便而直观地观察到参数连续变化带来的影响;又比如无线调试的话使用的串口协议方式控制会比使用串口助手方便很多等等。但我想对于参数理解最有效的方式还是亲手去操作,多尝试多对比。
推荐阅读:
专辑|Linux文章汇总
专辑|程序人生
专辑|C语言
我的知识小密圈
欢迎点赞,关注,转发,在看,您的每一次鼓励,我都将铭记于心~
文章知识点与官方知识档案匹配,可进一步学习相关知识Java技能树首页概览91338 人正在系统学习中
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!