当前位置: 首页 > news >正文

智能手表:MPU6050和水平仪,动态表情包

MPU6050

一,姿态解算

1.简介

2.计算 

陀螺仪优点:响应快(能实时跟踪姿态变化)
陀螺仪缺点:长期漂移(积分误差会累积)

为什么漂移

陀螺仪在测量角速度时,存在细小的误差,yaw[k]=yaw[k-1]+gz*Delta_t ,每次 gz 的误差经积分积累,随时间推移,计算角度会大幅偏离真实值,产生漂移

加速度计优点:无长期漂移(靠重力参考,角度计算不累积误差)
加速度计缺点:高频噪声大(运动冲击、振动会让加速度计输出跳变)

加速度计,只能计算Roll、Pitch的值

Yaw是绕z轴旋转,ax,ay等于0,az总是等于9.8,无法计算Yaw

3.滤波器解决方法

陀螺仪数据(高频信号)通过低通滤波,保留其动态响应好的特性

陀螺仪擅长 短期动态(α 大负责 “跟得上运动”) 把噪声屏蔽掉

加速度计数据(低频信号)通过高通滤波,利用其无累积误差的特性

加速度计擅长 长期校准(α 小负责 “纠正漂移”)把漂移除去

融合公式:最终角度 = a×陀螺仪角度 + (1-a)×加速度计角度

当α等于0.9时,漂移基本消失,噪声不明显

4,程序

1.先计算欧拉角

int16_t ax,ay,az,gx,gy,gz;//MPU6050测得的三轴加速度,角速度
float roll_g,pitch_g,yaw_g;//陀螺仪解算的欧拉角
float roll_a,pitch_a;//加速度计解算的欧拉角
float Roll,Pitch,Yaw;//互补滤波后的欧拉角
float a=0.9;//互补滤波器系数
float Delta_t=0.005;//采样周期
double pi=3.1415927;
void MPU6050_Calculation(void)
{Delay_ms(5);MPU6050_GetData(&ax,&ay,&az,&gx,&gy,&gz);//陀螺仪解算的欧拉角roll_g=	Roll+(float)gx*Delta_t;//用互补滤波后的欧拉角,这样误差就能及时修正pitch_g=Pitch+(float)gy*Delta_t;yaw_g=Yaw+(float)gz*Delta_t;//加速度计解算的欧拉角pitch_a=atan2((-1)*ax,az)*180/pi;roll_a=atan2(ay,az)*180/pi;//互补滤波后的欧拉角Roll=a*roll_g+(1-a)*roll_a;Pitch=a*pitch_g+(1-a)*pitch_a;Yaw=a*yaw_g;}

先读取三轴加速度和角速度,用陀螺仪积分计算角度(roll_g、pitch_g、yaw_g),用加速度计通过反正切函数解算角度(roll_a、pitch_a),最后按 0.9:0.1 的比例融合得到最终姿态角(Roll、Pitch、Yaw),采样周期 5ms。 

2.欧拉角页面

void Show_MPU6050_UI(void)
{OLED_ShowImage(0,0,16,16,Return);OLED_Printf(0,16,OLED_8X16,"Roll:%.2f",Roll);OLED_Printf(0,32,OLED_8X16,"Pitch:%.2f",Pitch);OLED_Printf(0,48,OLED_8X16,"Yaw:%.2f",Yaw);
}

3.应用

int MPU6050(void)
{while(1){KeyNum=Key_GetNum();if(KeyNum==3){OLED_Clear();OLED_Update();return 0;}OLED_Clear();MPU6050_Calculation();Show_MPU6050_UI();OLED_ReverseArea(0,0,16,16);OLED_Update();}
}

二,水平仪

基于 MPU6050 的水平仪实现:让小球随姿态灵动 “滚动”

借助 MPU6050 传感器获取设备的欧拉角(反映姿态倾斜状态 ),结合 OLED 屏幕,在屏幕上呈现一个 “水平仪” 场景:小球初始坐标设为 (64, 32) ,会依据设备实际晃动产生的姿态变化(由 MPU6050 测得欧拉角体现 ),在屏幕上模拟出相应方向的移动,就像真实小球在倾斜平面滚动,直观呈现设备姿态。

程序

代码实现了一个基础的水平仪功能:Show_Gradienter_UI函数通过 MPU6050 获取姿态数据,在 OLED 屏幕中心绘制半径 30 的圆形外框,并根据 Roll/Pitch 角度在 (64-Roll, 32+Pitch) 位置绘制半径 4 的小球,模拟水平仪效果;Gradienter主循环实时刷新界面,检测到按键 3 按下则清屏退出,实现了姿态可视化与基本交互控制。

void Show_Gradienter_UI(void)
{MPU6050_Calculation();OLED_DrawCircle(64,32,30,0);  //绘制外面的圆框OLED_DrawCircle(64-Roll,32+Pitch,4,1); //绘制小球
}int Gradienter(void)
{while(1){KeyNum=Key_GetNum();if(KeyNum==3){OLED_Clear();OLED_Update();return 0;}OLED_Clear();Show_Gradienter_UI();OLED_Update();}
}

三:动态表情包

通过调用绘制椭圆的函数,实现眼睛的图案

调用for循环实现眼睛的睁眼,闭眼

http://www.dtcms.com/a/311940.html

相关文章:

  • 第14届蓝桥杯Python青少组中/高级组选拔赛(STEMA)2023年1月15日真题
  • Qemu-NUC980(二):时钟clock代码添加
  • 驾驶场景玩手机识别:陌讯行为特征融合算法误检率↓76% 实战解析
  • 如何修复非json数据
  • 兰空图床部署教程
  • 从C++0基础到C++入门(第十五节:switch语句)
  • 工具包:位图格式一键生成可无限放大的矢量图SVG/EPS及CAD文件DXF
  • 我的世界模组开发教程——物品item(1)
  • 建筑施工场景安全帽识别误报率↓79%:陌讯动态融合算法实战解析
  • 深入 Vue v-model
  • SpringBoot启动项目详解
  • MC0351区间询问和
  • MybatisPlus-自动生成代码
  • 【走遍美国精讲笔记】第 1 课:林登大街 46 号
  • 深入 Go 底层原理(四):GMP 模型深度解析
  • 编译器与解释器:核心原理与工程实践
  • Linux I/O 系统调用完整对比分析
  • linux source命令使用详细介绍
  • [qt]QTreeWidget使用
  • JAVA国际版同城服务同城信息同城任务发布平台APP源码Android + IOS
  • 【设计模式】 原则
  • AI驱动SEO关键词智能进化
  • 具身智能VLA困于“数据泥潭”,人类活动视频数据是否是“破局之钥”?
  • 【Python修仙编程】(二) Python3灵源初探(10)
  • Spring 全局异常处理机制:多个 @ControllerAdvice 与重复 @ExceptionHandler
  • CMake 命令行参数完全指南 (1)
  • 数据结构1-概要、单向链表
  • JVM中的垃圾回收暂停是什么,为什么会出现暂停,不同的垃圾回收机制暂停对比
  • 知识随记-----用 Qt 打造优雅的密码输入框:添加右侧眼睛图标切换显示
  • Ubuntu系统间SSH控制详细指南