毕业设计--球上自平衡机器人
目录
前言
一、机器人原理分析
二、控制器设计
三、程序部分
四、硬件清单
五、电路设计
六、结构设计
七、总结与展望
总结
展望
2021 8.18更新:
看到评论区很多人对这个机器人比较感兴趣,把之前挖好的坑填一下。
这次的主程序更新部分加入了ADRC自抗扰算法部分,一部分直接加入无名飞控的无人机自抗扰文件,另一部分是直接在control.c文件中写的。实际并没有使用ADRC算法。
这次把结构设计及PCB设计全部放在Github上了。有些小伙伴可能github用的还不是太熟练。在这里给大家推荐一些github快速上手的教程。
github使用基本教程
GitHub 和 GitHubDesktop 的使用步骤!!!_houyingshang的博客-CSDN博客_githubdesktop
GitHub分支创建及合并_阳阳丶Sheep的博客-CSDN博客_github创建分支 (与他人协作时经常用到分支功能,这里是分支的创建与合并)
github廖雪峰版完整教程
Git教程 - 廖雪峰的官方网站
最近github连接不太稳定,经常被墙,多进几次或者换个时间段就能进去了。
本次更新内容:
1.结构设计
在SolidWorks软件中完成的全部结构设计,包括3D打印件的模型文件。
2.论文文档
这里存放的是设计过程中参考过的论文。
同时分享一些网页文档: 链接:http://note.youdao.com/noteshare?id=8483919cd10c184ade674151b171b6c4
3.程序设计
参考过的球平衡机器人源码及各种相关传感器源码。由于Github限制单次上传不可超过100个文件,于是全部压缩。
4.电路设计
立创EDA软件导出的PCB设计原理图及电路图,导出为AD格式。由于我是使用立创EDA软件设计的,文件保存云端,本地只有打板的文件,于是使用导出功能导出成AD默认格式。
前言
本次毕业设计过程中,受到过许多人的帮助,收获良多,在此将机器人整体开源,同时总结一下机器人搭建过程中遇到的坑和未来的改进方向。
一、机器人原理分析
首先来看成品图
如图所示,该机器人根据陀螺仪的位姿数据,通过三全向轮驱动底部球体调整自己在球上的位置,保持动态平衡的同时实现全向移动。
保持动态平衡过程需要对机器人进行运动学分析,这里参考了平衡小车之家的运动学方程
自平衡控制问题转化为了输入:X、Y角度—控制器计算—输出:A、B、C电机转速的控制模型。
二、控制器设计
首先考虑参考平衡车控制,球上自平衡机器人本质上依然是一个一阶倒立摆问题。
这里参考了飞思卡尔直立车的控制方法,采用串级PID控制器,外环PD角度环,内环速度PI环。
由于我的驱动方案选择的是42步进电机,在速度闭环的时候有些问题。正常的直流电机+编码器的控制方案可以通过编码器将轮子的真实速度计算出来,从而和控制器的理想转速作差,实现速度控制。
而我这里的速度闭环是通过计算上一个时钟周期时给步进电机的控制量,通过运动学方程分解,得到机器人的虚拟速度,与理想转速作差控制。我认为这种速度闭环方式还是存在一定缺陷的,但是在网上查看论文的时候我发现有很多自平衡机器人都是用42步进电机来实现速度闭环的,不知道是什么方法。
这里还可以好好思考一下为什么角度环要用PD控制,速度环要PI控制,角度环的P部分和D部分对机器人控制有什么影响?在很多CSDN调试平衡车的博客中都有解释,这里就留给大家思考了。
三、程序部分
普通地在keil 5中开发STM32。
控制程序采用定时器0.5ms定时中断的方式进行计算,每触发两次中断计算对电机控制一次,这里还是推荐大家采用外部中断读取GY-521上的INT引脚的方式,控制计算周期。GY-521上的INT引脚每5ms触发一次跳变,采用外部中断的方式可以严格保证读取位姿数据与计算处理同步。
int TIM1_UP_IRQHandler (void)
{u8 key_cal;if(TIM_GetITStatus(TIM1,TIM_IT_Update) != RESET){TIM_ClearITPendingBit(TIM1,TIM_IT_Update); flag_target=!flag_target;key_cal=KEY_Scan(0);if(state_flag==1)//矫正结束{if(flag_target==1)//每读取两次陀螺仪控制一次 {Read_DMP(); //===读取倾角scope();return 0;}}if(key_cal==1)//矫正按键{Angle_Zero_X=Angle_Balance_X;Angle_Zero_Y=Angle_Balance_Y;key_cal=0;Flag_Stop=0;}if(key_cal==2||key_cal==3)//矫正按键{Flag_Stop=1;//关闭速度环I积分key_cal=0;}Angle_Bias_X =Angle_Balance_X-Angle_Zero_X; //获取Y方向的偏差Angle_Bias_Y =Angle_Balance_Y-Angle_Zero_Y; //获取Y方向的偏差if(control_mode==0)//PID控制模式{Encoder_Analysis(Motor_A,Motor_B,Motor_C); //正运动学分析,得到X Y方向的速度Balance_Pwm_X= balance_X(Angle_Bias_X,Gyro_Balance_X);//X方向的倾角控制Balance_Pwm_Y=-balance_Y(Angle_Bias_Y,Gyro_Balance_Y); //Y方向的倾角控制
// if(++flag_target_2==4)//速度环频率慢于加速度环 但是还没加速度环
// {Velocity_Pwm_X=velocity_X(compute_X); //X方向的速度控制Velocity_Pwm_Y=velocity_Y(compute_Y); //Y方向的速度控制
// flag_target_2=0;
// }Move_X =Balance_Pwm_X+Velocity_Pwm_X; //===X方向控制量累加 Move_Y =Balance_Pwm_Y+Velocity_Pwm_Y; //===Y方向控制量累加 Move_Z=0; Kinematic_Analysis(Move_X,Move_Y,Move_Z);//逆运动学分析得到ABC电机控制量}Motor_A=Target_A;//直接调节PWM频率 Motor_B=Target_B;//直接调节PWMMotor_C=Target_C;//直接调节PWM
//以下都是为了速度连续化处理防止突变if(Motor_A==0) Motor_A=motor_a_last;if(Motor_B==0) Motor_B=motor_b_last;if(Motor_C==0) Motor_C=motor_c_last;Xianfu_Pwm(2000);Set_Pwm(Motor_A,Motor_B,Motor_C);Gyro_Balance_X_last=Gyro_Balance_X;Gyro_Balance_Y_last=Gyro_Balance_Y;Gyro_Balance_Z_last=Gyro_Balance_Z;Angle_Balance_X_last=Angle_Balance_X;Angle_Balance_Y_last=Angle_Balance_Y;Angle_Balance_Z_last=Angle_Balance_Z;motor_a_last=Motor_A;motor_b_last=Motor_B;motor_c_last=Motor_C;}return 0;
}
对于电机控制,由于采用的驱动方案是步进电机,调速的方式是改变驱动步进电机的脉冲频率。我这里选择了三个定时器,动态调节定时器的频率,具体方式是在初始化时设定好定时器的预分频系数psc的值,然后在程序里动态更改ARR寄存器的值,从而改变定时器的定时频率。
//这里以A电机的速度控制为例 输入为 电机方向和电机速度
void set_motorA_speed(u8 dir,u16 speed)
{u32 arr;arr=speed;TIM_ARRPreloadConfig(TIM3,DISABLE);TIM3->ARR=arr;//计数到10000在归零重新计数TIM3->CCR4=arr/2;//保持占空比为50%TIM_ARRPreloadConfig(TIM3,ENABLE);TIM_Cmd(TIM3,ENABLE);if(dir==0){GPIO_SetBits(GPIOA,GPIO_Pin_1);}else{GPIO_ResetBits(GPIOA,GPIO_Pin_1);}
}
小车的运动学分解代码实现如下,参考了平衡小车之家的代码:
/**************************************************************************
函数功能:小车运动数学模型
入口参数:X Y Z 三轴速度或者位置
返回 值:无
**************************************************************************/
void Kinematic_Analysis(float Vx,float Vy,float Vz)
{Target_A = Vx + L_PARAMETER*Vz;Target_B = -X_PARAMETER*Vx + Y_PARAMETER*Vy + L_PARAMETER*Vz;Target_C = -X_PARAMETER*Vx - Y_PARAMETER*Vy + L_PARAMETER*Vz;
}
/**************************************************************************
函数功能:小车运动 正运动学分析
入口参数:A B C三个电机的速度
返回 值:无
**************************************************************************/
void Encoder_Analysis(float Va,float Vb,float Vc)
{compute_X=(Va*2-Vb-Vc);compute_Y=((Vb-Vc)*sqrt(3));compute_Z=(Va+Vb+Vc);
}
其余代码不全放出,具体可转到https://github.com/1812598631/graduate-design查看
四、硬件清单
材料 | 价格 | 数量 | 淘宝链接 |
---|---|---|---|
56mm全向轮 | 45元/个 | 3 | https://m.tb.cn/h.4vYp4EC?sm=77a719 |
42步进电机 | 25/个 | 3 | https://m.tb.cn/h.4wpMzLY?sm=eeba97 |
42步进闭环模块 | 59.8元/个 | 3 | https://m.tb.cn/h.4EuBpGe?sm=bb691b |
LM2596S降压模块 | 20元 | 1 | https://detail.tmall.com/item.htm?id=41307963557 |
STM32F103C8T6-4飞控板 | 59.8元 | 1 | https://detail.tmall.com/item.htm?id=615978870514 |
GY-521六轴陀螺仪 | 25元 | 1 | https://m.tb.cn/h.4vYn0xG?sm=c94d34 |
用到的模块大致如上所示,C8T6的价格随着最近芯片涨价直线上升,我白嫖了实验室的两块板子,现在买一块实在太贵,可以等芯片价格稳定一些再买。其余开关排针等常见元件不再赘述。
五、电路设计
使用立创EDA软件进行设计
原理图如下所示:
PCB走线与原理图设计打包放在GITHUB中了
六、结构设计
使用solidworks设计整体结构,底板可在淘宝定制6050太空铝切割,蓝色件为正常3D打印件。
七、总结与展望
总结
球上自平衡机器人可以作为算法试验平台, 输入输出固定,更换不同控制器,将数据导入MATLAB进行分析即可比较控制器性能。
展望
结构部分
个人认为结构有两个改进方向,一方面参考以下论文:
余义. 单球驱动自平衡机器人位姿解算与控制系统研究[D].武汉科技大学,2019.
论文中采用的四足式驱动结构更有利于机器人自平衡控制。
一方面可以增加球体和机器人固定装置,利用机械结构将机器人与底部驱动球结合成一个整体防止机器人跳轮等问题。同时驱动球对于机器人平衡的影响较大,最好还是定制空心钢球,然后喷漆增大摩擦力,最有利于机器人自平衡控制。
控制部分
首先是控制原理,本文是针对建立好的运动学方程进行分析,通过串级PID算法来实现自平衡运动。该机器人的控制问题本质上是一阶倒立摆问题,可以采用动力学建模的方式,通过动力学分析算出平衡需要的虚拟力矩,再对电机进行力矩控制。
其次是控制器,PID控制算法应用广泛但也有一定的缺点,可以考虑采用模糊PID,ADRC自抗扰控制器,强化学习等智能控制算法对机器人自平衡进行控制。
整体工程文件:https://github.com/1812598631/graduate-design
主要参考论文
[1]余义. 单球驱动自平衡机器人位姿解算与控制系统研究[D].武汉科技大学,2019.
[2]刘桐. 基于三全向轮驱动的球轮自平衡机器人的研究与实现[D].北京工业大学,2018.
[3]韩京清.从PID技术到“自抗扰控制”技术[J].控制工程,2002(03):13-18.
毕业设计--球上自平衡机器人相关推荐
- 基于STM32开源项目:球上自平衡机器人
关注+星标公众号,不错过精彩内容 来源 | 达尔闻说 作者 | Jumping润 本次毕业设计过程中,Jumping润受到过许多人的帮助,收获良多,在此将机器人整体开源,同时总结一下机器人搭建过程中遇 ...
- 球机器人 配重_DIY:拥有绝佳移动力的球平衡机器人
机器人一直是我们DIY项目中的分水岭,当一款机器人作品可以完美的完成我们所设定的动作就已经是一款成功的作品. 而这其中,我们所要解决最难的问题就是让机器人获得自如的"行动力".如果 ...
- 以前做的一种特殊的平衡车----三轮球上平衡车
这个项目做了很长的时间,核心算法就是PID,目标就是让一个三轮车(轮子为全向轮)站到足球上并可以进行平移旋转等平面运动. 机械部分 使用三个橡胶全向轮,通过联轴器连接减速电机,斜向下45°连接于车身, ...
- 使用Arduino的DIY自平衡机器人
原文地址:https://circuitdigest.com/microcontroller-projects/arduino-based-self-balancing-robot 使用Arduino ...
- 《单足自平衡机器人》(转)
中山大学南方学院 这个机器人的走路方式很有创意.所以就转了,以后应用应该会非常广. 前言 传统机器人的移动平台,基本上都由三个以上的车轮或履带实现的,在静止状态下,他们有很好的稳定性,但是这 ...
- 两轮平衡机器人送披萨,旋转跳跃!
在过去几个月,国外的街头陆续涌现各式各样的外卖机器人,其中一款神似波士顿动力Handle会旋转会弹跳的机器人成功引起了小编的注意,这波披萨送得666~ 送完一单,开心到飞起~~~ 这是苏黎世团队研发的 ...
- MATLAB/Simulink模型开发乐高EV3 双足平衡机器人
MATLAB/Simulink 2018a 模型开发乐高EV3 双足平衡机器人(含视频) 之前只是用Matlab做一些算法的仿真,数据的计算分析处理,知道MATLAB中包含有Simulink,只知道S ...
- 两轮自平衡机器人(一)---Simscape物理建模
我们将建立和控制一个两轮自平衡机器人的3d模型.我们使用一个PID控制器来实现机器人的直立姿态,并使用两种方法来调整PID控制器:手动和自动调整. 1.通过在命令中键入smnew来进行项目 重心设置为 ...
- 【project】Adruino小型自平衡机器人EVA(+硬件+源代码+3D文件)
文章目录 00-灵感篇 01-设计篇 02-硬件篇 03-原理篇 04-软件篇 05-3D打印篇 06-测试篇 网盘链接 对某个篇章感兴趣的,请直接跳转 00-灵感篇 小型自平衡机器人EVA的 ...
最新文章
- 分享:手把手教你如何免费且光荣地使用正版IntelliJ IDEA
- 移动端自动化测试(一)appium环境搭建
- mybatis3.2.8 与 hibernate4.3.6 混用
- 【数据挖掘】谷歌提出最新时序框架--Deep Transformer
- 使用html元素的getBoundingClientRect来获取dom元素的时时位置和大小
- Android之各个手机版本WiFi热点的创建
- leetcode 190. 颠倒二进制位
- 函数上下文this和参数列表arguments介绍
- 月费10元起!中国移动推年轻人的第一张5G元素电话卡
- 信贷系统学习总结(2)——现金贷之借贷模式与前端产品
- 机器学习第五回——支持向量机SVM
- 当系统出错,win10真难用
- 最新JMeter面试题,紧扣面试实际要求,看完拿下20K
- js彻底解决中文乱码问题
- CTPN OCR目标检测及源码
- 小巧机身 性能强悍 正睿第三代可扩展1U机架式服务器
- 福禄克万用表的硬芯和牛屎芯分别是什么,有什么区别?
- esp32~MP3音频文件学习,app架构
- 5G通信中的TDL模型
- 【麦肯锡系列阅读笔记】学会提问
热门文章
- 三、REPL(交互式解释器)
- 关于双击此电脑、回收站、控制面板等提示找不到应用程序解决方案
- 根据微信公众号关注/取消关注事件,获取用户信息
- 手机计算机dj音乐,教你如何用手机制作电子音乐
- 解读大内老A的《.NET Core框架本质》
- Docker Are you trying to connect to a TLS-enabled daemon without TLS?
- 五猴分桃python_猴子分桃问题 | 学步园
- html实现拼图游戏,html、css、js实现拼图游戏
- Office2019 VOL版本 自定义安装组件
- 何为ISM频段?ISM频段主要频率有哪些? 1