基于惯性轮倒立摆原理的自行车

来源:互联网 发布:胜利足球欧赔数据库 编辑:程序博客网 时间:2024/04/30 02:43

背景

自平衡车有很多种,其中一种是利用惯性轮倒立摆原理,早在2003年,日本的村田顽童就已经问世,它采用的就是惯性轮倒立摆原理。后来其他研究组织和个人纷纷效仿,制作出了五花八门的基于惯性轮倒立摆原理的直立机器人。

在2015年8月的飞思卡尔(现在是恩智浦)全国大学生智能车竞赛的创意组比赛中,规则就是要用任何直立车完成一圈比赛。其中有学校使用的方案就是惯性轮倒立摆。
北科惯性轮倒立摆自行车

还有一些其他的例子:
https://edgetriggered.wordpress.com/2012/02/22/its-alive/,这是有人在2012年2月实现的利用惯性轮倒立摆原理的独轮车。
http://www.guokr.com/post/713382/,2015年12月实现。

我目前在做的工作也和此相关,不过是把独轮车换成自行车,靠舵机转把来转向。该方案目前仍有很多问题,所以我把我的所有机械尺寸参数和硬件选型以及控制算法列出,如果有在做同样工作的朋友欢迎与我交流。

目前能实现的效果:

稳定直立5min以上:

https://v.qq.com/x/page/w0532v1s3zg.html

可以直行走一段距离:

https://v.qq.com/x/page/r0532ium7xw.html

机械结构

示意图:

平衡自行车示意图

实物图:

平衡自行车实物图

尺寸及重量:

自行车高(从地面到飞轮中心)320mm,长450mm,自行车重1.8kg。飞轮半径75mm,质量0.3kg。电池绑在自行车侧面,重0.2kg。

硬件选型

1.电机rs540 70t电机
https://item.taobao.com/item.htm?spm=a230r.1.14.257.ebb2eb2jEGU9c&id=15498785922&ns=1&abbucket=6#detail,选择的是70T,用来驱动飞轮。(不是打广告,从视频里可以看出,我确实用的就是这款电机)

2.180线AB相编码器,用来测量飞轮转速。

3.mpu6050,检测自行车的倾斜角度和角速度,没有用DMP功能,直接读取原始值用程序滤波。

控制程序

两个关键的函数:

1.飞轮转速补偿:(如果没有,飞轮转速在平衡过程中会一直上升,不能长时间稳定平衡)

void speed(void){        speed_feedback = 0 - Encoder;                 //Encoder是飞轮转速        speed_feedback_derror = speed_feedback - speed_feedback_pre;        speed_feedback_pre = speed_feedback;        speed_integral += speed_feedback * speed_i;        Run = speed_feedback * speed_p + speed_integral + speed_d * speed_feedback_derror; //得到飞轮转速的补偿量,在后续计算过程中会用到。}

2.电机转速计算:

void balance(void){    //gyro_x是横滚角速度,gyro_xx是其微分    gyro_xx = gyro_x-pre_gyro_x;    pre_gyro_x = gyro_x;    Angle_Balancenormal += gyro_x * kgyo1 + (accangle_x-Angle_Balancenormal) * gbtg1;     //正常互补滤波,需要调的参数有kgyo1和gbtg1    Angle_Balancecal += gyro_x * kgyo2 + (accangle_x-Angle_Balancecal) * gbtg2 + Run;     //计算控制量用的互补滤波,需要调的参数有kgyo2和gbtg2    Motor = Angle_Balancecal * stand_p + gyro_x * stand_d + gyro_xx * stand_i;            //计算最终电机转速。}

最终控制是定时中断程序,定时中断间隔5ms,首先进行飞轮转速,车身横滚角速度和角度的采集,然后计算飞轮转速的补偿量,最后计算平衡需要的电机转速,通过pwm信号输出来控制电机。具体代码如下:

int TIM1_UP_IRQHandler(void)  {        if(TIM1->SR&0X0001)                     //5ms定时中断    {           TIM1->SR&=~(1<<0);              //===清除定时器1中断标志位 智能硬件置位,软件复位                Encoder=Read_Encoder(2);        //采集飞轮转速,采用的是AB相编码器        Get_Angle();                    //采集mpu6050返回的角速度和角度        speed();        balance();        Set_pwm(-Motor);                //===赋值给PWM寄存器      }               return 0;     } 

关于控制程序中参数的调试问题

重要的参数有5个:

两个互补滤波参数,直立的pd,速控的p。

第一步:先调直立p,可以在平衡位置摆动,即偏离平衡位置可以轻微的越过平衡位置到另一边。

第二步:把第一步调好的p给0,再调直立d,感觉在平衡位置摆动有轻微阻力。加上第一步调好的p,可以直立2到3s甚至更长就算调好了d,这时飞轮转动不会收敛,最后会因转动速度过快倒下。

第三步:调试飞轮转速的p,调到可以直立1min甚至更长时间。

曾经推倒过数学模型,但是能力有限,还不能把数学模型直接转换为算法,参考了一些资料,按照自己的想法写了简单的控制算法,不足之处肯定会有,但还是实现了直立的功能。

欢迎有兴趣或者做过这方面东西的同道找我交流,QQ:1006325356。

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 4岁宝宝不爱学习怎么办 4岁宝宝不爱写字怎么办 孩子调皮老师不让上学了怎么办 小学生写字握笔握出剪子来怎么办 儿子6岁不会写字怎么办 宝宝在幼儿园不说话怎么办 孩子上幼儿园不说话怎么办 幼儿写数字不写怎么办 小孩不吃饭怎么办 十个月 十个月小孩不爱吃饭怎么办 十个月的小孩不吃饭怎么办 家长要调幼儿园监控怎么办 自己带孩子婆婆生气怎么办 婆婆老是觉得我奶水不够怎么办 1岁小儿特别懒怎么办 17的孩子很懒怎么办 上大班的孩子不愿写字怎么办 快上中班的小朋友不爱学习怎么办 小学生两边肩膀不平应该怎么办 写字右肩膀疼是怎么办 开车久了肩膀疼怎么办 3岁宝宝撕书怎么办 孩子上幼儿园不爱写字怎么办 一年级小孩不爱做作业怎么办 小孩不愿多做作业怎么办 小孩一年级不自觉做作业怎么办 小孩会读不会写怎么办 好多字都不会写怎么办 写作业怎么办才能写快 五周宝宝爱玩不写字怎么办 爱玩手机的小孩怎么办? 一年级学生记不住生字怎么办 一年级小孩记不住生字怎么办 配镜度数高了怎么办 宝宝两岁半不肯坐马桶拉臭臭怎么办 儿子字写得不好 怎么办 小孩不听话不爱读书和写字怎么办 两岁宝宝不愿意穿衣服怎么办 做题粗心不认真怎么办 5岁宝宝不会写字怎么办 四岁宝宝不会写字怎么办