CUBLI 简化 一维模型(有bug)

2023-05-16

CUBLI 简化 一维模型(有bug)

文章目录

    • CUBLI 简化 一维模型(有bug)
  • 前言
  • 一、CUBLI是什么?
  • 二、制作步骤
    • 1.MPU6050&&编码器操作
    • 2.什么是PID
    • 3.我的控制策略
    • 4.代码实现
  • 三、存在的问题及可能的解决方法
    • 问题一:电机方向
    • 问题二:平衡时间短(2~5S)
    • 解决方法:
  • 总结
    • 平衡效果
    • 个人总结


前言

简化CUBLI为一维,制作了一个平衡三角(暂且这么叫),淘宝有成品卖。本着学习的态度于寒假期间(21年一月至二月)制作。
现情况如下:
1.MPU6050 获取平衡三角姿态
2.直流电机 以及 光电编码器
3.控制器 STM32 F411RE NUCLEO板
4.PID控制器
5.HAL库 开发
6.3D打印 && SW制图
7.工程代码、文件以及3D模型已打包值BaiDu Pan(按需索取)链接: link 提取码:aw5i
8.存在一些问题于文中述


一、CUBLI是什么?

「Cubli」出身于瑞士苏黎世联邦理工学院动力系统和控制实验室的项目,直译就是「小方块」。它是个15 × 15 × 15 厘米的金属方块,能借助3个转轮来实现多种技巧。最令人印象深刻的是 Cubli 超乎寻常的平衡能力。(出自知乎链接: link.)
将其简化为一维模型,原理类似于平衡小车。
先上靓照(哈哈哈啊哈)
图1

二、制作步骤

1.MPU6050&&编码器操作

Cube MX配置以及代码等已置于下面两篇文章中
HAL库 MPU6050的使用 链接: link
HAL库 AB相编码器链接: link

2.什么是PID

PID即:Proportional(比例)、Integral(积分)、Differential(微分)的缩写。顾名思义,PID控制算法是结合比例、积分和微分三种环节于一体的控制算法,它是连续系统中技术最为成熟、应用最为广泛的一种控制算法,该控制算法出现于20世纪30至40年代,适用于对被控对象模型了解不清楚的场合。实际运行的经验和理论的分析都表明,运用这种控制规律对许多工业过程进行控制时,都能得到比较满意的效果。PID控制的实质就是根据输入的偏差值,按照比例、积分、微分的函数关系进行运算,运算结果用以控制输出。
图2
在工业过程中,连续控制系统的理想PID控制规律为:
图3
式中,Kp——比例增益,Kp与比例度成倒数关系; [2]
Tt——积分时间常数; [2]
TD——微分时间常数; [2]
u(t)——PID控制器的输出信号; [2]
e(t)——给定值r(t)与测量值之差。 [2]
以上关于PID内容摘自百度百科

3.我的控制策略

图4
(1)控制策略如上图,目标是实现平衡三角直立,其角度是固定值;角度控制的输出为速度控制的输入,速度控制的输出为加载至电机的PWM高电平值;系统可反馈实时角度、转速等数据实现反馈。
实际代码中涉及积分限幅、输出限幅。个人理解:积分过大不利于系统稳定;由于输出为PWM高电平值,周期具有固定性,因此输出PWM高电平值应具有是上下限。

(2)系统具有方向性,因此应规定正方向。飞轮起到角动量平衡的作用,加速旋转方向如下图(减速相反)。
图5
(3)保护措施。电机旋转速度快,飞轮具有一定的伤害性,当倾角偏离一定范围(直立目标挽救不回来)时控制电机停车。另外,3D模型设计将飞轮包裹于材料中,可实现一定的保护作用。

4.代码实现

此处仅展示PID控制策略

/**********************************
直立环PD控制器:Kp * Ek + Ki * Ek_S(积分) + Kd * Ek_D

入口:Med:机械中值(期望角度),Angle:真实角度
出口:直立环输出
**********************************/
int Vertical(float Med ,float Angle )
{
	int PWM_OUT ;
	
	Vertical_Err_Last  = Vertical_Err ;		//保存上次偏差
	Vertical_Err       = Angle - Med  ;		//计算偏差
	Vertical_Integral  = Vertical_Integral + Vertical_Err ;		//积分 

	//积分限幅
	if(Vertical_Integral > Vertical_Integral_Max) Vertical_Integral = Vertical_Integral_Max ;
	if(Vertical_Integral <-Vertical_Integral_Max) Vertical_Integral =-Vertical_Integral_Max ;
	
	//pid运算
	PWM_OUT = Vertical_Kp * Vertical_Err + Vertical_Ki * Vertical_Integral + Vertical_Kd * ( Vertical_Err - Vertical_Err_Last ) ;
	
	//PWM_OUT = Vertical_Kp * (Angle - Med ) + Vertical_Kd * (gyro - 0) ;
	
	//输出限幅
	if(PWM_OUT > Vertical_Out_Max ) PWM_OUT = Vertical_Out_Max ;
	if(PWM_OUT <-Vertical_Out_Max ) PWM_OUT =-Vertical_Out_Max ;
	
	return PWM_OUT ;
}

/**********************************
速度环PI控制器:Kp * Ek + Ki * Ek_S(积分) + Kd * Ek_D

**********************************/
int Velocity(int Target,int encoder)
{
	
	int PWM_OUT ;
	
	Velocity_Err_Last  = Velocity_Err ;		//保存上次偏差
	Velocity_Err       = encoder - Target ;		//计算偏差
	Velocity_Integral  = Velocity_Integral + Velocity_Err ;		//积分 
	
	//积分限幅
	if(Velocity_Integral > Velocity_Integral_Max) Velocity_Integral = Velocity_Integral_Max ;
	if(Velocity_Integral <-Velocity_Integral_Max) Velocity_Integral =-Velocity_Integral_Max ;
	
	//pid运算
	PWM_OUT = Velocity_Kp * Velocity_Err + Velocity_Ki * Velocity_Integral + Velocity_Kd * ( Velocity_Err - Velocity_Err_Last ) ;
	
	//PWM_OUT = Vertical_Kp * (Angle - Med ) + Vertical_Kd * (gyro - 0) ;
	
	//输出限幅
	if(PWM_OUT > Velocity_Out_Max ) PWM_OUT = Velocity_Out_Max ;
	if(PWM_OUT <-Velocity_Out_Max ) PWM_OUT =-Velocity_Out_Max ;
	
	return PWM_OUT ;
}

三、存在的问题及可能的解决方法

问题一:电机方向

情况一
当平衡三角情况如上图所示时实现平衡可逆时针加速或顺时针减速。顺时针减速不可实现,仅可逆时针加速
情况二
当平衡三角情况如上图所示时,实现平衡可逆时针加速或顺时针减速。若当前转速很高,逆时针加速会导致平衡三角瞬间失去平衡。此情况未考虑到。

问题二:平衡时间短(2~5S)

现阶段分析原因如下:
1.没有采用DMP库(小垃圾现在还搞不懂)角度计算方法为加速度简单的积分,系统启动时角度为0,而平衡三角启动时需手扶启动,存在机械中值(即Angle_Target)不准确问题。
2.如问题一中所述,电机方向控制好似存在不合理处,可能在第二种情况时瞬间反向,系统瞬间失衡。
3.调参问题,调参方法不正确,或者参数未找到合适值(可能性较小)。

解决方法:

  1. 完善电机方向控制函数
  2. 不采用角度控制,反而直接利用角速度控制。原因:平衡三角平衡时角速度变化范围小,应在0附近摆动。
  3. 采用MPU9250,可以直接获取角度,避开DMP库(价格昂贵)

总结

平衡效果

VID

B站链接: link.

个人总结

此篇文章记述了作者(单片机业余爱好者)2021新年期间的劳动(哈哈),不完善处较多,时间原因暂且搁置。考研结束后没有进行复习,初试成绩将出,复试势在必行,明天就要进行复习了,祝自己好运,冲冲冲!!!

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

CUBLI 简化 一维模型(有bug) 的相关文章

随机推荐

  • ROS :process has died

    项目场景 xff1a ROS编译报错 问题描述 xff1a 有的时候自己在ROS的框架下写代码会遇到如下的问题 xff1a 以前遇到这种问题基本上心里就觉得凉了 xff0c 因为这种编译之后的运行报错不好定位位置 xff0c 所以之前遇到这
  • PX4无人机-Gazebo仿真实现移动物体的跟踪

    原文链接PX4无人机 Gazebo仿真实现移动物体的跟踪末尾有演示视频 这个学期我们有一个智能机器人系统的课设 xff0c 我们组分配到的题目是 仿真环境下使用无人机及相机跟踪移动物体 xff0c 本文主要记录完成该课设的步骤以及内容 我们
  • nohup 和>/dev/null 2>&1

    一 用途 xff1a nohup表示永久运行 amp 表示后台运行 在应用Unix Linux时 xff0c 我们一般想让某个程序在后台运行 xff0c nohup start mysql sh amp 该命令的一般形式为 xff1a no
  • 【ROS学习笔记10】ROS中配置自定义Cpp头文件和导入自定义Python库

    ROS学习笔记10 ROS中配置自定义Cpp头文件和导入自定义Python库 文章目录 ROS学习笔记10 ROS中配置自定义Cpp头文件和导入自定义Python库一 ROS中的头文件和源文件1 1 自定义头文件调用1 2 自定义源文件调用
  • 【ROS学习笔记13】ROS中的TF坐标变换

    ROS学习笔记13 ROS中的TF坐标变换 文章目录 ROS学习笔记13 ROS中的TF坐标变换前言1 静态坐标变换2 动态坐标变换3 多坐标变换4 坐标系关系查看5 TF坐标变换实操Reference 写在前面 xff0c 本系列笔记参考
  • Android---bitmap优化

    目录 Bitmap 占用内存大小计算 Bitmap Drawable InputStream Byte 之间进行转换 Bitmap 相关方法 BitmapFactory 工厂类 Bitmap 占用内存大小计算 Bitmap 作为位图 xff
  • Linux的基础命令

    一 切换用户 su 用户名 1 切换管理员用户root 需要输入登录时的密码password 密码不显示 2 切换回普通用户 不需要输入密码password 二 目录操作 1 切换目录 1 cd 切换到系统根目录 2 cd 切换到当前用户的
  • uC/OS_II操作系统移植,亲测可用

    uC OS II简介 uC OS II由Micrium公司提供 xff0c 是一个可移植 可固化的 可裁剪的 占先式多任务实时内核 xff0c 它适用于多种微处理器 xff0c 微控制器和数字处理芯片 xff08 已经移植到超过100种以上
  • 树莓派开机出现正确密码循环输入的问题

    树莓派开机出现正确密码无限循环输入的问题 问题状况 树莓派开机后在登录界面输入正确密码后 xff0c 屏幕闪了一下然后还要输入密码 无限循环该现象 问题出现背景 在上一次关机之前进行了Tomcat等环境变量的配置 问题原因 就是最近的一次操
  • 机器人技术(RoboCup 2D)如何进行一场球赛

    合工大RoboCup 2D主要函数注释 以及 机器人技术实验五十题代码已更新 博文连接如下 博文连接点这里 进行一场球赛 xff1a 畅所欲言 欢迎交流 1 启动服务器 打开终端 xff0c 输入rcssserver xff08 tab键自
  • React几种传递参数的方法

    1 父组件向子组件传参 回调函数也是参数的一种 xff0c 也可以传给子组件 xff0c 达到子组件控制父组件的目的 import React from 39 react 39 import ReactDOM from 39 react d
  • Git拉取项目,拉取git更新后的项目

    1 首次拉取git上的项目 这里以idea2020 1展示 1 首先在git上找到克隆链接 2 复制链接之后 回到idea 找到VCS gt Get from Version Control Clone就可以 2 拉取git更新后的项目 第
  • 如何轻松的完成属于自己的一架无人机(免费领取PCB)

    64 翼风室内有刷F1飞控教程 本篇博客的目的 为了让各位无人机爱好者轻松的制作一架属于自己的无人机 xff0c 本篇文章基于翼风室内有刷F1飞控板 xff0c 围绕接口介绍以及使用教程展开介绍 xff0c 希望大家喜欢 xff0c 废话不
  • linux下jps命令找不到的问题

    jps是用来查看进程的命令 搭建rocketmq时 xff0c 常常要用jps来查看名称服务是否已启动 xff0c 但是某些机器报错如下 xff1a bash jps command not found 解决办法如下 xff1a 一 检查基
  • 如何轻松的完成属于自己的一架无人机下篇——调参(免费领取PCB)

    如何轻松的完成属于自己的一架无人机下篇 调参 xff08 免费领取PCB xff09 64 翼风室内有刷F1飞控教程 xff08 QQ群 xff1a 708260375 xff09 本篇博客的目的 上篇主要针对需要的材料以及硬件教程进行了教
  • copy outerHTML、python爬取csdn文章、一键打包个人csdn文章保存到本地

    文章目录 1copy outerHTML复制网站源码法1 1复制源码1 2 遇到的问题 2 python爬取CSDN博客文章 xff08 保存为html xff0c txt xff0c md xff09 2 1 安装依赖2 2 完整代码 3
  • 一、视觉SLAM基础概述

    视觉SLAM主要是以视觉为传感器 xff0c 解决定位与建图的问题 xff0c 其主要可以分为前端 后端 回环检测和建图等四个部分 xff0c 其中各个部分的作用分别为 xff1a xff08 1 xff09 前端 xff1a 前端也称为视
  • HAL库 MPU6050的使用

    HAL库 amp amp MPU6050 HAL库 MPU6050的使用 xff1a 今天在本教程中 xff0c 我们将使用STM32接口MPU6050 xff08 GY 521 xff09 加速度计陀螺仪 同时 xff0c 我将在PC上利
  • HAL库 AB相编码器

    HAL库 AB相编码器 文章涉及Cube MX的配置 Keil代码的编写以及模板存放之BaiDu Pan 用到的软件 xff1a STM32CubeMX amp Keil 5 用到的硬件 xff1a 光电式编码器 F411RE NUCLEO
  • CUBLI 简化 一维模型(有bug)

    CUBLI 简化 一维模型 xff08 有bug xff09 文章目录 CUBLI 简化 一维模型 xff08 有bug xff09 前言一 CUBLI是什么 xff1f 二 制作步骤1 MPU6050 amp amp 编码器操作2 什么是