基于惯性轮倒立摆原理的自行车
来源:互联网 发布:胜利足球欧赔数据库 编辑:程序博客网 时间: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。
- 基于惯性轮倒立摆原理的自行车
- 倒立摆
- 倒立摆
- 倒立摆系统的多种控制器设计
- 倒立摆(一)
- 倒立摆系统说明
- MFC的固高环形倒立摆GRIP2002实验平台
- 倒立摆系统分析及控制
- 我的stm32调试倒立摆的时候遇到奇葩小问题
- PID控制算法+倒立摆控制应用
- Android基于线性加速度计的惯性导航
- 现代控制理论思考题----倒立摆小车控制算法研究
- P、I、D参数分析及倒立摆心得
- 惯性动作捕捉设备的发展和原理初步介绍
- 惯性动作捕捉设备的发展和原理初步介绍
- 倒立
- 基于WEB的自行车租赁管理系统设计与实现
- 基于CC2640的智能自行车(代码+APP)
- Day5
- Zynq-Linux移植学习笔记之21-Linux启动时自动以root账号登录
- 给定一个字符串,问是否能通过添加一个字母将其变为回文串。js实现
- Linux
- Java爬虫入门简介(三)——HttpClient保存使用Cookie登录
- 基于惯性轮倒立摆原理的自行车
- python+学习记录+
- c++等待函数和产生随机数
- 24. Swap Nodes in Pairs。
- 类模板
- GridView
- 第三周项目3
- java课程学习一:Hello World
- CSS总结-----解除浮动