利用STM32实现自平衡机器人功能与方法

2023-05-16

       将机器人整体开源,同时总结一下机器人搭建过程中遇到的坑和未来的改进方向。在分享的文件里包含了结构设计、程序控制、电路设计以及其他模块相关资料供大家参考。

第一:机器人原理分析

    首先来看成品图:

    如图所示,该机器人根据陀螺仪的位姿数据,通过三个全向轮驱动底部球体调整自己在球上的位置,保持动态平衡的同时实现全向移动。

    保持动态平衡过程需要对机器人进行运动学分析,这里参考了平衡小车之家的运动学方程:

    自平衡控制问题转化为三步:输入X、Y角度—控制器计算—输出A、B、C电机转速的控制模型。

​第二:控制器设计

    首先考虑参考平衡车控制,球上自平衡机器人本质上依然是一个一阶倒立摆问题。

    这里参考了飞思卡尔直立车的控制方法,采用串级PID控制器,外环PD角度环,内环速度PI环。

    由于我的驱动方案选择的是42步进电机,在速度闭环的时候有些问题。正常的直流电机+编码器的控制方案可以通过编码器将轮子的真实速度计算出来,从而和控制器的理想转速作差,实现速度控制。

    而我这里的速度闭环是通过计算上一个时钟周期时给步进电机的控制量,通过运动学方程分解,得到机器人的虚拟速度,与理想转速作差控制。我认为这种速度闭环方式还是存在一定缺陷的,但是在网上查看论文的时候我发现有很多自平衡机器人都是用42步进电机来实现速度闭环的,不知道是什么方法。

    这里还可以好好思考一下为什么角度环要用PD控制,速度环要PI控制,角度环的P部分和D部分对机器人控制有什么影响?在很多CSDN调试平衡车的博客中都有解释,这里就留给大家思考了。

​第三:硬件及结构设计

自平衡机器人的硬件清单有:

56mm全向轮 45元/个

42步进电机 25/个 

42步进闭环模块 59.8元/个 

LM2596S降压模块 20元 

STM32F103C8T6-4飞控板 59.8元 

GY-521六轴陀螺仪 25元

     用到的模块大致如上所示,C8T6的价格随着最近芯片涨价直线上升,我白嫖了实验室的两块板子,现在买一块实在太贵,可以等芯片价格稳定一些再买。其余开关排针等常见元件不再赘述。

    电路原理图如下所示:

    机器人使用solidworks设计整体结构,底板可在某宝定制6050太空铝切割,蓝色件为正常3D打印件。

​第四:程序部分

    在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;//直接调节PWM            Motor_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);  }

    其余代码不全放出,可在文末点击“阅读原文”下载查看。

​第五:总结与展望

     球上自平衡机器人可以作为算法试验平台, 输入输出固定,更换不同控制器,将数据导入MATLAB进行分析即可比较控制器性能。

     个人认为结构有两个改进方向,一方面参考以下论文:余义. 单球驱动自平衡机器人位姿解算与控制系统研究[D].武汉科技大学,2019。论文中采用的四足式驱动结构更有利于机器人自平衡控制。

     另一方面可以增加球体和机器人固定装置,利用机械结构将机器人与底部驱动球结合成一个整体防止机器人跳轮等问题。同时驱动球对于机器人平衡的影响较大,最好还是定制空心钢球,然后喷漆增大摩擦力,最有利于机器人自平衡控制。

     控制部分的改进,首先是控制原理,本文是针对建立好的运动学方程进行分析,通过串级PID算法来实现自平衡运动。该机器人的控制问题本质上是一阶倒立摆问题,可以采用动力学建模的方式,通过动力学分析算出平衡需要的虚拟力矩,再对电机进行力矩控制。

    其次是控制器,PID控制算法应用广泛但也有一定的缺点,可以考虑采用模糊PID,ADRC自抗扰控制器,强化学习等智能控制算法对机器人自平衡进行控制。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

利用STM32实现自平衡机器人功能与方法 的相关文章

  • 嵌入式实时操作系统uC/os-II(十四)-消息邮箱及其操作

    消息邮箱的定义 把数据缓冲区的指针赋给事件控制块成员 OSEventPtr xff0c 同时使事件控制块的成员 OSEventType 为常数 OS EVENT TYPE MBOX xff0c 则该事件控制块就叫做消息邮箱 消息邮箱的数据结
  • iOS Expected ';' after top level declarator

    项目中编译出现iOS Expected 39 39 after top level declarator 原因 xff1a 未导入UIKit框架 转载于 https www cnblogs com StevenHuSir p 1044602
  • 嵌入式实时操作系统uC/os-II(十四)-消息队列

    消息队列 消息队列由三部分组成 xff1a 事件控制块 消息队列 消息 当事件控制块成员 OSEventType 值为 OS OSEVENT TYPE Q 时 xff0c 该事件控制块代表一个消息队列 消息队列的数据结构如图 6 1所示 从
  • 嵌入式实时操作系统uC/os-II(十六)-信号量集

    信号量定义 uC OS II 提供了可处理多个信号量的信号量集 其实意图如图 7 1 所示 图 7 1 信号量集的示意图 从图中可以看到 xff0c 信号量实质上就是一个多输入 多输出的组合逻辑 其输入为其他任务发出的多个信号 xff0c
  • 基于深度学习的图像识别,实现APP自动打麻将

    互联网改变了我们的生活 xff0c 现在连打麻将都在网上打了 进几年发现身边的很多朋友都在网上玩一款四川麻将APP 平时没事的时候我也玩玩 xff0c 我是一个写了几年程序的码龙 xff0c 突然有一天我有个想法我能不能用我的专业来解放我的
  • PHP常用设计模式

    单例模式 单例模式顾名思义 xff0c 就是只有一个实例 作为对象的创建模式 xff0c 单例模式确保某一个类只有一个实例 xff0c 而且自行实例化并向整个系统提供这个实例 单例模式的特点 xff1a 三私一共 xff1a 1 私有的静态
  • 飞行控制器固件项目-对比介绍(Ardupilot、PX4、LibrePilot、OpenPilot)

    ArduPilot与Pixhawk什么关系 https zhuanlan zhihu com p 109639638 无人机开源项目 8个开源无人机项目 https blog csdn net cuml0912 article detail
  • 各种控制方法在抗干扰方面的区别

    一 由来 自适应控制 AdaptiveControl AC xff1a AC旨在处理由结构参数扰动引起的不良影响 AC的思想是首先在线识别受控系统的模型参数 xff0c 然后根据识别的模型参数调整控制参数以获得良好的性能 AC在处理模型参数
  • 【深入理解】export和module.export的区别

    内部原理 exports 61 module exports 61 exports 是module exports的引用 xff0c 怎么理解这句话呢 xff1f 大概就是 var a 61 var b 61 a a 和 b 之间的区别吧
  • 如何保证Service在后台不被杀死?

    一 前期基础知识储备 xff08 1 xff09 为什么要保证后台Service不被杀死 xff1f 提高应用存在感 对于大厂的应用来说 xff0c 其程序 活着 不是问题 xff0c 但是为了带来更好的用户体验 xff0c 提高用户粘性
  • mybatis generator时碰到的错误及解决办法

    这篇博客简单记录下自己使用mybatis generator时碰到的错误及解决办法 本人是在macOS下进行的下列操作 问题1 mybatis generator Cannot connect to database 解决办法 xff1a
  • C# 编写 WinForm 窗体应用程序(第一期)

    C 编写 WinForm 窗体应用程序 第一期 文章目录 C 编写 WinForm 窗体应用程序 第一期 WinForm窗体应用程序简述C 创建WinForm窗体应用程序C 窗体属性 1 创建一个名为 TestForm 的窗体 2 设置 T
  • npm删除项目所有依赖和清缓存

    清缓存的办法 xff0c 一个是 npm cache verify 还有一个方法npm cache clean force 删除项目所有依赖 npm uninstall 转载于 https www cnblogs com jimaww p
  • 【我的前端】CSS在Windows下实现Mac浏览器滚动条

    Windows实现Mac浏览器滚动条 文章目录 Windows实现Mac浏览器滚动条一 自定义滚动条外观二 滑块与滚动容器之间的间距三 将滚动条悬浮在内容之上四 滚动时才出现五 完整代码六 总结说明 x1f496 x1f496 x1f496
  • python经典案例:抓交通肇事者

    抓交通肇事者 x1f496 x1f496 x1f496 x1f495 x1f495 x1f495 欢迎来到本博客 x1f495 x1f495 x1f495 x1f496 x1f496 x1f496 x1f381 支持 xff1a 如果觉得博
  • 【Python初级人工智能精讲】用Paddlehub给一段没有标点符号的文字加上合适的标点符号

    Python初级人工智能精讲 文章目录 Python初级人工智能精讲一 写在前面二 七步精讲三 模型介绍四 进入实战1 源代码2 运行效果 1 cmd方面 2 txt文件运行前后对比 五 休吃霸王餐六 每日一句 一 写在前面 今天给分享的程
  • 深度解读互联网新时代:Web3.0

    文章目录 深度解读互联网新时代 Web3 0一 Web3 中心化网络的新兴名词二 Web3 全家福 三 Web3 是互联网的货币层四 Web3 是互联网的身份层五 Web3 通过售卖数据来牟利的反击六 Web3 还拥有平台本身的一种方式七
  • 《疫情下的编程岁月》第二章:选择学习语言

    文章目录 第二章 选择学习语言 2 1 常见的编程语言介绍 C语言 C Java Python JavaScript 2 2 选择适合自己的语言 考虑自己的兴趣和目标 了解各种语言的特点 尝试不同的语言 2 3 学习路线的规划 找到适合自己
  • 每日一练c++题目日刊 | 第十期

    文章目录 第一题 xff1a 二维矩阵中的最短路径题目描述输入格式输出格式数据范围输入样例输出样例解题思路 amp C 43 43 题解算法状态转移方程 第二题 xff1a 01 串的满足条件的个数题目描述输入格式输出格式数据范围输入样例输
  • 每日一练c++题目日刊 | 第八期

    文章目录 第一题 xff1a 夏洛克侦案题目描述输入格式输出格式输入样例输出样例解题思路 amp C 43 43 题解 第一题 xff1a 夏洛克侦案 题目描述 福尔摩斯接到了一个任务 xff0c 需要帮助一位富有的英国贵族解决一件谋杀案

随机推荐

  • 00后少年的心力之作(已开源) | heartt(心力算法)

    00后少年的心力之作 已开源 综合性极强的文本摘要算法 heartt 大家好 xff0c 我是 heartt 算法的作者 xff0c 一名热爱编程的学习者 今天 xff0c 我要向大家介绍我的新算法 xff1a heartt 文章目录 一
  • 初读《编程之美》就想秀一下,结果还翻车了

    文章目录 一 前言 二 我的思路 三 Code 四 翻车现场 五 后续问题 一 前言 如何写一个短小的程序 xff0c 让 Windows 的任务管理器显示CPU的占用率为50 这道有趣的面试题我是这两天从 编程之美 电子版中看到的 xff
  • 每日一练c++题目日刊 | 第十二期

    文章目录 第一题题目背景故事题目描述输入描述输出描述输入样例输出样例解题思路C 43 43 参考程序 第二题题目背景故事题目描述输入描述输出描述输入样例输出样例解题思路C 43 43 参考程序 第三题题目背景故事输入描述输出描述输入样例输出
  • 在TypeScript中如何在window上定义对象

    比如我们要在window上定义 Jim 最简单的方法就是将window强制类型转换成any xff0c 但是不推荐 xff01 window as any Jim 61 233 推荐方法 xff1a 在项目中找到 d ts 文件 加上以下代
  • CSDN第25期编程竞赛部分题解报告

    第一题 xff1a 分层遍历二叉树 时间限制 1000ms 内存限制 256M 题目描述 给定一棵二叉树 节点定义如下 structNode span class token punctuation span Node 34 pLeft s
  • PX4飞控导出GPS数据拟合飞行轨迹

    前言 xff1a 想要拟合飞行轨迹 xff0c 百度了一下 xff0c 高人介绍的都是什么百度地图API xff0c 无忧地图 xff0c PYTHON 不是不好 xff0c 是尝试了一下 xff0c 注册非常麻烦 xff0c 结果没拟合出
  • ROS,GAZEBO,PX4视觉仿真

    https gitee com bingobinlw some tree master Overview Simulation Px4 command Slam map image process planning P200 AmovCar
  • PX4无人机飞控开发——第3篇:室内定点之光流一

    PX4无人机飞控开发 第3篇 xff1a 室内定点之光流一 大家好我是Jones 写博客记录一下工作的痕迹 xff0c 同时也对工作做一个总结 xff0c 才疏学浅 xff0c 难免会有很多纰漏 xff0c 还请大家批评指正 PX4无人机飞
  • PX4无人机飞控开发——第4篇:室内定点之光流二

    PX4无人机飞控开发 第4篇 xff1a 室内定点之光流二 大家好我是Jones 写博客记录一下工作的痕迹 xff0c 同时也对工作做一个总结 xff0c 才疏学浅 xff0c 难免会有很多纰漏 xff0c 还请大家批评指正 PX4无人机飞
  • PX4无人机飞控开发——第1篇:仿真工具介绍

    PX4无人机飞控开发 第1篇 xff1a 仿真工具介绍 大家好我是Jones 写博客记录一下工作的痕迹 xff0c 同时也对工作做一个总结 xff0c 才疏学浅 xff0c 难免会有很多纰漏 xff0c 还请大家批评指正 PX4无人机飞控开
  • 5G网络实现自动驾驶车联网——第一篇:5G模块介绍实现上网功能

    5G网络实现自动驾驶车联网 第一篇 xff1a 5G模块介绍实现上网功能 大家好我是Jones 写博客记录一下工作的痕迹 xff0c 同时也对工作做一个总结 xff0c 才疏学浅 xff0c 难免会有很多纰漏 xff0c 还请大家批评指正
  • 5G网络实现自动驾驶车联网——第二篇:5G网络内网穿透

    5G网络实现自动驾驶车联网 第二篇 xff1a 5G网络内网穿透 大家好我是Jones 写博客记录一下工作的痕迹 xff0c 同时也对工作做一个总结 xff0c 才疏学浅 xff0c 难免会有很多纰漏 xff0c 还请大家批评指正 xff0
  • MIT Mini Cheetah仿真 错误处理

    一 编译步骤 git clone https github com mit biomimetics Cheetah Software git cd Cheetah Software mkdir build cd build cmake sc
  • 使用PIXIWell_RF 射频模块 虚拟GPS

    使用PIXIWell RF 射频模块 虚拟GPS 文章目录 使用PIXIWell RF 射频模块 虚拟GPS 前言一 PIXIWell RF射频是什么 xff1f 二 虚拟GPS使用步骤1 硬件连接2 Ubuntu系统使用 三 查看连接情况
  • 如何去除button选中时的阴影效果

    使用box shadow可以去除button选中时四周的阴影 CSS代码如下 xff08 amp 是sass语法 xff0c 即当前button元素 xff09 xff1a button box shadow none webkit box
  • Failed to set attribute: Invalid input data or parameter 解决

    arm64 swconfig 配置vlan 失败问题 Failed to set attribute Invalid input data or parameter 解决 内核版本 xff1a linux 5 20 26 现象 xff1a
  • 使用PIXIWell_RF 射频模块 虚拟GPS windows系统

    使用PIXIWell RF 射频模块 虚拟GPS windows系统 文章目录 使用PIXIWell RF 射频模块 虚拟GPS windows系统 前言一 PIXIWell RF射频是什么 xff1f 二 虚拟GPS使用步骤1 硬件连接2
  • DJI Mavic 2 & AUTEL Evo无人机无线链路_射频_RF测试

    背景 xff1a 出于对DJI大疆无人机的好奇 xff0c 航时上的持久 xff0c 尺寸上的拔尖 xff0c 距离上的长远 xff1b 让我们来看看它的它的无线链路 射频 RF波形长什么样子的 AUTEL Evo无人机可能很多人不太了解
  • 我如何使用iPad作为学习工具

    引言 如果不懂得使用app xff0c 其实iPad就是一块屏幕而已 如果你已经有iPad xff0c 那么 xff0c 恭喜你 xff0c 这篇文章正是为了让它发挥出更大价值 如果你还没有 xff0c 那么你就又多了一个剁手的理由 上我的
  • 利用STM32实现自平衡机器人功能与方法

    将机器人整体开源 xff0c 同时总结一下机器人搭建过程中遇到的坑和未来的改进方向 在分享的文件里包含了结构设计 程序控制 电路设计以及其他模块相关资料供大家参考 第一 xff1a 机器人原理分析 首先来看成品图 xff1a 如图所示 xf