七校联赛题铅笔姿态及笔迹检测装置--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; // 未检测到显著的运动方向
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【活动感想】CSDN技术沙龙之人工智能的日常应用与技术分享

目录 &#x1f30a;1. 会议详情 &#x1f31e;2. 会议感想 &#x1f3de;️3. 会议总结 &#x1f30a;1. 会议详情 主持人&#xff1a; 大家好&#xff0c;欢迎各位参加我们今天的小型技术沙龙活动&#xff01;今天我们将围绕人工智能的日常应用与技术分享展开讨论。人工智…

kaggle:房价预测

比赛链接 结果展示 结果链接 8848是密码 文章目录 数据处理调包部分拒绝掉包岭回归理论代码实践结果 自助采样理论代码 集成学习前言Bagging理论Bagging代码Bagging-Ridge实践Bagging-Ridge结果 Tricks 数据处理 #打开文件 import pandas as pd dataset1pd.read_csv("tr…

CANDela studio的State

State主要用来查看&#xff0c;点击State Groups&#xff0c;可以看到session和security下面有多少个会话和security level&#xff0c;所以删除和新建都不能在这里操作。 Dependencies没有安装插件&#xff0c;看不到图形不要紧&#xff0c;点击下面那个图标&#xff0c;就能编…

国产打印何去何从?汉印瞄准突破口,推进发展新质生产力

推动发展新质生产力&#xff0c;已成为当前时代的主题&#xff0c;代表着先进生产力的发展方向。 打印行业因其高门槛性和技术复杂性&#xff0c;以及在信息安全领域中的作用&#xff0c;使其在我国“新质生产力”发展中占据关键位置。同时&#xff0c;打印行业融合了高精尖产…

洛谷--链表

约瑟夫问题 约瑟夫问题是一个链表的典型问题,为啥要用到链表呢?因为链表的优越性实在太多了~ 首先,有一个叫"循环链表"的东西非常适合这道题目 比如样例n 3,m10的情况,我们可以建立一个的循环链表: 1->2->3->4->5->6->7->8->9->10 ^ …

SpringCloud整合Seata简易使用(注册中心Nacos)

SpringCloud整合Seata解决分布式事务&#xff08;注册中心Nacos&#xff09; Seata下载与配置在Nacos中配置seata相关配置持久化为db时&#xff0c;需要提前在数据库中创建seata数据库&#xff0c;SpringCloud整合Seata服务GlobalTransactional注解使用 本案例是在windows中运行…

纯血鸿蒙实战开发—如何添加顶部tab页面

1.Tabs组件 Tabs组件的页面组成包含两个部分&#xff0c;分别是TabContent和TabBar。TabContent是内容页&#xff0c;TabBar是导航页签栏. 根据不同的导航类型&#xff0c;布局会有区别&#xff0c;可以分为底部导航、顶部导航、侧边导航&#xff0c;其导航栏分别位于底部、顶…

windows上安装MongoDB,springboot整合MongoDB

上一篇文章已经通过在Ubuntu上安装MongoDB详细介绍了MongoDB的各种命令用法。 Ubuntu上安装、使用MongoDB详细教程https://blog.csdn.net/heyl163_/article/details/133781878 这篇文章介绍一下在windows上安装MongoDB&#xff0c;并通过在springboot项目中使用MongoDB记录用户…

每天五分钟计算机视觉:基于KNN算法完成图片分类任务

本文重点 在数字化和智能化的时代,图片分类作为计算机视觉领域的重要任务之一,已经广泛应用于各种场景,如安防监控、医疗诊断、智能推荐等。传统的图片分类方法往往需要复杂的手工特征提取和繁琐的分类器设计,而机器学习算法的引入为图片分类带来了不同的思路。 KNN算法概…

无人机航迹规划:人工原生动物优化器(Artificial Protozoa Optimizer ,APO)求解无人机路径规划,提供MATLAB代码

一、无人机模型介绍 单个无人机三维路径规划问题及其建模_无人机路径规划场景建模-CSDN博客 参考文献&#xff1a; [1]胡观凯,钟建华,李永正,黎万洪.基于IPSO-GA算法的无人机三维路径规划[J].现代电子技术,2023,46(07):115-120 二、人工原生动物优化算法APO求解无人机路径规…

什么台灯对眼睛好?一文给你分享具体什么台灯对眼睛好!

什么台灯对眼睛好&#xff1f;随着学生们最近陆续返校&#xff0c;家长们和孩子们都忙于开学初的准备工作&#xff0c;而眼睛的健康自然也是他们考虑的一部分。这也是护眼台灯在近年来变得非常普及的原因之一。我自己一直是一个近视的人&#xff0c;而且日常用眼时间也相当长。…

神经网络与深度学习——第15章 序列生成模型

本文讨论的内容参考自《神经网络与深度学习》https://nndl.github.io/ 第15章 序列生成模型&#xff0c;习题还没做先存在这里。 序列生成模型 序列概率模型 序列生成 N元统计模型 深度序列模型 模型结构 嵌入层 特征层 输出层 参数学习 评价方法 困惑度 BLEU算法 ROUGE算法 序…

「网络编程」基于 UDP 协议实现回显服务器

&#x1f387;个人主页&#xff1a;Ice_Sugar_7 &#x1f387;所属专栏&#xff1a;计网 &#x1f387;欢迎点赞收藏加关注哦&#xff01; 实现回显服务器 &#x1f349;socket api&#x1f349;回显服务器&#x1f34c;实现&#x1f95d;服务器&#x1f95d;客户端 &#x1f3…

插入mysql报错:Incorrect string value: ‘\xF0\xAC\x8C\x97\xE5\x9E...‘

原因分析 这个错误通常发生在使用MySQL数据库时&#xff0c;尝试将包含四字节UTF-8字符&#xff08;通常表示为Unicode码点大于UFFFF的字符&#xff09;插入到一个不支持这种字符的字符集列中。一般在插入睡眠emoji表情时容易遇到 解决 -- 设置数据库编码utf8mb4 ALTER DAT…

伦敦金当前行情你真的看懂了吗?

5月中旬&#xff0c;伦敦金价将历史新高再次改写至2450美元/盎司&#xff0c;虽然随后两周出现了反复回落的走势&#xff0c;但整体的升浪仍然受到50天指数移动平均线的支撑。有分析机构预计&#xff0c;随着美联储美联储开始放缓缩表和开启降息周期&#xff0c;来年的伦敦金价…

Spring Boot自动配置原理和应用

我们知道&#xff0c;基于Spring Boot&#xff0c;我们只需要在类路径中引入一组第三方框架的starter组件&#xff0c;就能在Spring容器中使用这些框架所提供的各项功能。这在当下的开发过程中已经习以为常&#xff0c;但在Spring Boot还没有诞生之前却是不可想象的。如果我们使…

【Text2SQL 论文】QDecomp:探索 CoT-style 的 prompt 来解决 Text2SQL

论文&#xff1a;Exploring Chain of Thought Style Prompting for Text-to-SQL ⭐⭐⭐⭐ EMNLP 2023, arXiv:2305.14215 一、论文速读 本文通过对 LLM 使用 CoT-style 的 prompting 方法来解决 Text2SQL 问题&#xff0c;试图回答下面两个问题&#xff1a; 哪种 prompting s…

英伟达GPU架构加速狂飙

NVIDIA首席执行官黄仁勋在台湾大学体育馆发表主题演讲&#xff0c;展示了新一代Rubin架构&#xff0c;这是NVIDIA加速推出新架构的最新成果。 在讨论NVIDIA下一代架构时&#xff0c;黄仁勋提到了Blackwell Ultra GPU&#xff0c;并表示它可能会继续升级。然后他透露&#xff0c…

Zoom | saas企业分销裂变的典范

提到视频通讯&#xff0c;相信大家不会陌生&#xff0c;国外有Skype、Google meeting、Facetime&#xff0c;国内有腾讯会议、钉钉&#xff0c;为什么在如此众多竞争对手的情况下&#xff0c;Zoom能够一马当先&#xff0c;成为行业先锋&#xff1f; 一、公司简介 Zoom是集视频…

【电路笔记】-Sallen-Key滤波器

Sallen-Key滤波器 Sallen-Key 滤波器拓扑用作实现高阶有源滤波器的构建块。 1、概述 Sallen-Key 滤波器设计是一种二阶有源滤波器拓扑,我们可以将其用作实现高阶滤波器电路的基本构建块,例如低通 (LPF)、高通 (HPF) 和带通 ( BPF)滤波器电路。 正如我们在本滤波器部分中…