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

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

背景

自平衡车有很多种,其中一种是利用惯性轮倒立摆原理,早在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。

原创粉丝点击