七校联赛题铅笔姿态及笔迹检测装置--mpu6050识别数字

前言

        前几天打完比赛,收获还是挺大的,数字识别部分基本上浪费了绝大部分时间。先将思路简单说明。

1、题目

2、思路

        针对笔迹检测,我们首先考虑的肯定是陀螺仪来测量加速度方向来判断书写的方向,从而得到书写的数字。

        我们的方案是不断记录四个方向的加速度最大值,如果有某个方向的最大值最先达到某个阈值,则判定在该方向上移动。

        但在实际测量的时候会遇到两个问题:

        ①:重力加速度的影响,因为陀螺仪本身会有z轴向下的重力加速度,在书写时难免会有倾斜,而且书写的时候加速度本身就很小,约0.2左右,就会导致重力加速度在x轴或y轴上的分量影响很大;

        ②:在书写的时候,由于惯性,会产生一个反方向的加速度,这个加速度也比较影响书写方向的判断;

        解决方案:

        针对问题①,解决方案也很明显,因为陀螺仪本身就可以检测自身角度,我们只需要根据角度计算出水平方向的分量再将它减掉就行(fAcc[0]表示x轴加速度,fAcc[1]表示y轴加速度)

fAcc[0]=fAcc[0]+sin(fAngle[1]*(M_PI/180));
fAcc[1]=fAcc[1]-sin(fAngle[0]*(M_PI/180));

        针对问题②,我们最终还是没解决,所以我们索性直接判断两个方向,即x轴和y轴。

        识别的思路是:如果笔是倾斜的,会进入一个循环开始不断读取mpu6050数据,如果识别到某个方向移动,则进入另一个循环,如果笔竖直,则退出此循环,并返回该方向。这便记作判断画了一笔,最后根据笔画方向排序判断数字。

void task_4(void)//功能4
{int i=0,direction_now=0;// 初始化数组
//    memset(shu, 0, sizeof(shu));while(1){direction_now=get_direction();if(direction_now==1){shu[i++]='x';u3_printf("page4.t3.txt=\"X\"\xff\xff\xff");u3_printf("page4.n1.val=%d\xff\xff\xff",i);}else if(direction_now==2){shu[i++]='y';u3_printf("page4.t3.txt=\"Y\"\xff\xff\xff");u3_printf("page4.n1.val=%d\xff\xff\xff",i);}else{u3_printf("page4.t3.txt=\"error\"\xff\xff\xff");break;}u3_printf("page4.r0.val=0\xff\xff\xff");printf("第%d次书写成功,书写内容为%d\r\n,",i,direction_now);}show_num=number_ordinary();u3_printf("page4.n0.val=%d\xff\xff\xff",show_num);}
//用来检测笔的移动方向
//返回0~2,表示2个方向
int get_direction(void)
{float accX;float accY;float maxAccX=0.0,minAccX=0.0;float maxAccY=0.0,minAccY=0.0;//进行清零count[0] = 0.0;count[1] = 0.0;printf("开始书写\r\n");printf("%f\r\n", rangle);while (rangle > 15 ){gryo_get(); // 获取传感器数据rangle = 39 - fAngle[0]; // 计算角度if(rangle>50){continue;}// 获取当前加速度值accX = fAcc[0];accY = fAcc[1];// 更新 x 轴的最大值和最小值if (accX > maxAccX) {maxAccX = accX;}if (accX < minAccX) {minAccX = accX;}// 更新 y 轴的最大值和最小值if (accY > maxAccY) {maxAccY = accY;}if (accY < minAccY) {minAccY = accY;}printf("maxAccX = %f mixAccX = %f  maxAccY = %f mixAccY = %f\r\n",maxAccX,minAccX,maxAccY,minAccY);if (max(maxAccX,minAccX) > max(maxAccY,minAccY) && max(maxAccX,minAccX) > 0.25) {while (rangle<70) {u3_printf("page4.r0.val=1\xff\xff\xff");u3_printf("page6.r0.val=1\xff\xff\xff");gryo_get(); // 获取传感器数据rangle = 39 - fAngle[0]; // 计算角度}return 2;} else if ( max(maxAccY,minAccY) > max(maxAccX,minAccX) && max(maxAccY,minAccY) > 0.25){while (rangle<70) {u3_printf("page4.r0.val=1\xff\xff\xff");u3_printf("page6.r0.val=1\xff\xff\xff");gryo_get(); // 获取传感器数据rangle = 39 - fAngle[0]; // 计算角度}return 1;}delay_ms(50);}return 0; // 未检测到显著的运动方向
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/22336.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LLM的基础模型3:Transformer变种

大模型技术论文不断&#xff0c;每个月总会新增上千篇。本专栏精选论文重点解读&#xff0c;主题还是围绕着行业实践和工程量产。若在某个环节出现卡点&#xff0c;可以回到大模型必备腔调或者LLM背后的基础模型新阅读。而最新科技&#xff08;Mamba,xLSTM,KAN&#xff09;则提…

【软件测试】自动化测试如何管理测试数据

前言 在之前的自动化测试框架相关文章中&#xff0c;无论是接口自动化还是UI自动化&#xff0c;都谈及data模块和config模块&#xff0c;也就是测试数据和配置文件。 随着自动化用例的不断增加&#xff0c;需要维护的测试数据也会越来越多&#xff0c;维护成本越来越高&#…

编译 freetype、sdl、sdl_ttf

/* * three lib */ /* 字符串生成位图 */ http://www.libsdl.org/projects/SDL_ttf/release/ http://www.libsdl.org/download-1.2.php https://freetype.org/ /* Freetype 2.13.0 */ ./configure CCaarch64-v01c01-linux-gnu-gcc --buildaarch64 …

一个简约而不简单的记账 App(一刻记账)

前言 在两年多前, 我曾经写过一个本地化的记账 App, 当时没有想过以后的发展. 全程是本地化的, 当时主要是为了练习 Compose 而写的. TallyApp 而现在一个完整的记账 App 它来了 一刻记账 算是圆了我两年前的梦了吧. 也让我可以真正的使用自己的记账软件. 下面是 一刻记账 记…

C++实现简单的线程池

最近在学习音视频的时候&#xff0c;解封装和解码的时候用到了多线程。于是把线程池的知识补了一下。 线程池的这个知识点有会涉及到锁&#xff0c;生产者消费者设计模式&#xff0c;纯虚函数继承等知识。在学习的时候可以根据知识点扩展延伸。 楼主在学习线程池这部分的时候没…

10 -力扣高频 SQL 50 题(基础版)

10 - 每台机器的进程平均运行时间 -- sum(if(activity_type end,timestamp ,-timestamp )) -- 如果activity_type为“end”,值为timestamp&#xff0c;为“start” 为-timestamp&#xff0c;所有数相加end-start -- count(distinct process_id),获取同一机器有几个进行id -- r…

鸿蒙HarmonyOS实战—如何使用Video组件播放视频

1.视频播放 鸿蒙系统中&#xff0c;关于视频播放&#xff0c;可以使用上层视频组件Video。 参数如下 src 支持file:///data/storage路径前缀的字符串&#xff0c;用于读取应用沙箱路径内的资源。需要保证目录包路径下的文件有可读权限。 说明&#xff1a;视频支持的格式是&am…

为何限定项目的 Node.js 版本

首先区分三个概念nvm&#xff0c;npm&#xff0c;nodejs。 Node.js: Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时环境。它允许开发者使用 JavaScript 在服务器端编写应用程序,而不仅限于在浏览器中运行 JavaScript。Node.js 提供了一系列内置的模块和 API,使得开发…

Python中数字比较与获取较大值的深入解析

目录 一、引言 二、Python数字类型概述 三、数字比较操作符 四、获取较大值的逻辑与实现 五、高级话题&#xff1a;使用内置函数和库 六、性能分析与优化 七、案例分析 八、总结与展望 一、引言 在编程世界中&#xff0c;数字的比较和获取较大值是基础且常见的操作。P…

Java 获取和修改期日与时间的各种操作方法

LocalDateTime获取当地日期和时间 import java.time.LocalDateTime; /*LocalDateTime.now() 获取当前时间*/ public class LocalDateTimeDemo {public static void main(String[] args) {LocalDateTime time1 LocalDateTime.now();System.out.println(time1);//2024-06-01T13…

【python】flask相关包依赖关系问题

【背景】 做flask项目时&#xff0c;由于涉及多个包&#xff0c;比如flask&#xff0c;flask-wtf&#xff0c;werkqeug等&#xff0c;不同版本情况下&#xff0c;互相依赖关系的确实会导致报错。比如报某个依赖无法从flask的相关包中导入等。 【解决办法】 实测可用版本搭配…

四川景源畅信:抖音做直播有哪些人气品类?

随着互联网科技的飞速发展&#xff0c;抖音作为新兴的社交媒体平台&#xff0c;已经成为了人们日常生活中不可或缺的一部分。而在抖音平台上&#xff0c;直播功能更是吸引了大量的用户和观众。那么&#xff0c;在抖音上做直播有哪些人气品类呢?接下来&#xff0c;就让我们一起…

目标检测数据集 - 智能零售柜商品检测数据集下载「包含VOC、COCO、YOLO三种格式」

数据集介绍&#xff1a;智能零售柜商品检测数据集&#xff0c;真实智能零售柜监控场景采集高质量商品图片数据&#xff0c;数据集含常见智能零售柜商品图片&#xff0c;包括罐装饮料类、袋装零食类等等。数据标注标签包含 113 个商品类别&#xff1b;适用实际项目应用&#xff…

C++的爬山算法

爬山算法&#xff08;Hill Climbing Algorithm&#xff09;是一种局部搜索算法&#xff0c;它通过迭代搜索的方式寻找问题的局部最优解。在爬山过程中&#xff0c;算法总是选择当前状态邻域中最好&#xff08;即函数值最大或最小&#xff09;的状态作为下一个状态&#xff0c;直…

直播美颜插件详解:美颜SDK的技术原理

美颜SDK作为实现美颜功能的核心技术&#xff0c;已被广泛应用于各种直播和短视频应用中。那么&#xff0c;美颜SDK究竟是如何工作的&#xff1f;它背后的技术原理又是什么&#xff1f;本文将对直播美颜插件及其技术原理进行详解。 一、美颜SDK的概述 美颜SDK包含了各种图像处…

⌈ 传知代码 ⌋ 微表情识别系统

&#x1f49b;前情提要&#x1f49b; 本文是传知代码平台中的相关前沿知识与技术的分享~ 接下来我们即将进入一个全新的空间&#xff0c;对技术有一个全新的视角~ 本文所涉及所有资源均在传知代码平台可获取 以下的内容一定会让你对AI 赋能时代有一个颠覆性的认识哦&#x…

C++ Thread多线程并发记录(3)线程创建总结

1.启动线程传递全局函数 #include <iostream> #include <thread>void Th1(int id){std::cout << "Create global fun. id " << id << std::endl; } void TH1(const int &id){std::cout << "Create global fun. id &…

软件质量保障复习

注&#xff1a;&#xff08;红色字体是作业题&#xff09; 一、软件全方位缺陷检测 1.什么是软件&#xff1f; 2.什么是软件质量&#xff1f; 3.什么是软件缺陷&#xff1f; 4.软件缺陷有哪些类型&#xff1f;&#xff08;软件缺陷的表现&#xff09; 5.为什么需要软件全…

leetcode74搜索二维矩阵

题目 给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a; 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target &#xff0c;如果 target 在矩阵中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 fa…

推荐系统三十六式学习笔记:原理篇.内容推荐|04|画鬼容易画人难:用户画像的“能”和“不能”

目录 什么是用户画像&#xff1f;用户画像的关键因素用户画像构建的方法总结&#xff1a; 今天我来跟你聊一聊用户画像那些事。 什么是用户画像&#xff1f; 用户画像对应的英文是User Profile ,它原本用于营销领域。营销人员需要对营销的客户有更精准的认识&#xff0c;从而能…