毕设成品 基于单片机的姿态检测与可视化系统(源码+硬件+论文)

文章目录

  • 1 前言
  • 2 设计方案
    • 2.1 MPU6050
    • 2.2 工作原理
    • 2.3 单片机与MPU6050通信
    • 2.4 mpu6050 数据格式
    • 2.5 倾角计算方法
  • 3 核心软件设计
  • 4 实现效果
  • 5 最后

1 前言

🔥
这两年开始毕业设计和毕业答辩的要求和难度不断提升,传统的毕设题目缺少创新和亮点,往往达不到毕业答辩的要求,这两年不断有学弟学妹告诉学长自己做的项目系统达不到老师的要求。

为了大家能够顺利以及最少的精力通过毕设,学长分享优质毕业设计项目,今天要分享的是

🚩毕业设计 基于单片机的姿态检测与可视化系统(源码+硬件+论文)

🥇学长这里给一个题目综合评分(每项满分5分)

  • 难度系数:3分
  • 工作量:3分
  • 创新点:5分

🧿项目分享:见文末!

系统整体框架

本系统将由硬件系统和软件系统构成,其中硬件系统包含微控制器和IIC总线以及惯性传感器等硬件模块,软件系统则包含了下位机主控软件模块、数据采集软件模块、姿态解算软件模块以及上位机可视化软件模块等。其中惯性传感器模块选用MPU6050惯性传感器,软件模块方面,开发板IDE采用Arduino IDE,上位机使用processing平台完成可视化功能的实现。系统整体框架如图

2 设计方案

2.1 MPU6050

MPU6050是一种非常流行的空间运动传感器芯片,可以获取器件当前的三个加速度分量和三个旋转角速度。由于其体积小巧,功能强大,精度较高,不仅被广泛应用于工业,同时也是航模爱好者的神器,被安装在各类飞行器上驰骋蓝天。

随着Arduino开发板的普及,许多朋友希望能够自己制作基于MPU6050的控制系统,但由于缺乏专业知识而难以上手。此外,MPU6050的数据是有较大噪音的,若不进行滤波会对整个控制系统的精准确带来严重影响。

MPU6050芯片内自带了一个数据处理子模块DMP,已经内置了滤波算法,在许多应用中使用DMP输出的数据已经能够很好的满足要求。关于如何获取DMP的输出数据,我将在以后的文章中介绍。本文将直接面对原始测量数据,从连线、芯片通信开始一步一步教你如何利用Arduino获取MPU6050的数据并进行卡尔曼滤波,最终获得稳定的系统运动状态。

2.2 工作原理


加速度计采用压电效应的工作原理,就像上面的图片一样,在一个立方体的盒子里面有一个小球,盒子的四壁是用压电晶体材料,当盒子倾斜时,由于重力的作用,球就会向倾斜的方向移动,当小球碰到墙壁就会产生压电电流。盒子中有上下、左右、前后三对相对的墙壁,每一对墙对应于三维空间中的一个轴:X轴、Y轴、Z轴。根据压电壁产生的电流,我们就可以确定倾角的方向和大小。

2.3 单片机与MPU6050通信

这里以arduino单片机为例

为避免纠缠于电路细节,我们直接使用集成的MPU6050模块。MPU6050的数据接口用的是I2C总线协议,因此我们需要Wire程序库的帮助来实现Arduino与MPU6050之间的通信。请先确认你的Arduino编程环境中已安装Wire库。

Wire库的官方文档中指出:在UNO板子上,SDA接口对应的是A4引脚,SCL对应的是A5引脚。MPU6050需要5V的电源,可由UNO板直接供电。按照下图连线。

2.4 mpu6050 数据格式

我们感兴趣的数据位于0x3B到0x48这14个字节的寄存器中。这些数据会被动态更新,更新频率最高可达1000HZ。下面列出相关寄存器的地址,数据的名称。注意,每个数据都是2个字节。

  • 0x3B,加速度计的X轴分量ACC_X
  • 0x3D,加速度计的Y轴分量ACC_Y
  • 0x3F,加速度计的Z轴分量ACC_Z
  • 0x41,当前温度TEMP
  • 0x43,绕X轴旋转的角速度GYR_X
  • 0x45,绕Y轴旋转的角速度GYR_Y
  • 0x47,绕Z轴旋转的角速度GYR_Z

2.5 倾角计算方法

Roll-pitch-yaw模型与姿态计算

表示飞行器当前飞行姿态的一个通用模型就是建立下图所示坐标系,并用Roll表示绕X轴的旋转,Pitch表示绕Y轴的旋转,Yaw表示绕Z轴的旋转。



Yaw角的问题

因为没有参考量,所以无法求出当前的Yaw角的绝对角度,只能得到Yaw的变化量,也就是角速度GYR_Z。当然,我们可以通过对GYR_Z积分的方法来推算当前Yaw角(以初始值为准),但由于测量精度的问题,推算值会发生漂移,一段时间后就完全失去意义了。然而在大多数应用中,比如无人机,只需要获得GRY_Z就可以了。

如果必须要获得绝对的Yaw角,那么应当选用MPU9250这款九轴运动跟踪芯片,它可以提供额外的三轴罗盘数据,这样我们就可以根据地球磁场方向来计算Yaw角了,具体方法此处不再赘述。

3 核心软件设计

篇幅有限,不过多复述详细设计细节,详细的设计分享在论文中。。。

关键代码

// 本代码版权归Devymex所有,以GNU GENERAL PUBLIC LICENSE V3.0发布// http://www.gnu.org/licenses/gpl-3.0.en.html// 相关文档参见作者于知乎专栏发表的原创文章:// http://zhuanlan.zhihu.com/devymex/20082486//连线方法//MPU-UNO//VCC-VCC//GND-GND//SCL-A5//SDA-A4//INT-2 (Optional)#include<Kalman.h>#include<Wire.h>#include<Math.h>floatfRad2Deg=57.295779513f;//将弧度转为角度的乘数constintMPU=0x68;//MPU-6050的I2C地址constintnValCnt=7;//一次读取寄存器的数量constintnCalibTimes=1000;//校准时读数的次数intcalibData[nValCnt];//校准数据unsignedlongnLastTime=0;//上一次读数的时间floatfLastRoll=0.0f;//上一次滤波得到的Roll角floatfLastPitch=0.0f;//上一次滤波得到的Pitch角Kalman kalmanRoll;//Roll角滤波器Kalman kalmanPitch;//Pitch角滤波器voidsetup(){Serial.begin(9600);//初始化串口,指定波特率Wire.begin();//初始化Wire库WriteMPUReg(0x6B,0);//启动MPU6050设备Calibration();//执行校准nLastTime=micros();//记录当前时间}voidloop(){intreadouts[nValCnt];ReadAccGyr(readouts);//读出测量值floatrealVals[7];Rectify(readouts,realVals);//根据校准的偏移量进行纠正//计算加速度向量的模长,均以g为单位floatfNorm=sqrt(realVals[0]*realVals[0]+realVals[1]*realVals[1]+realVals[2]*realVals[2]);floatfRoll=GetRoll(realVals,fNorm);//计算Roll角if(realVals[1]>0){fRoll=-fRoll;}floatfPitch=GetPitch(realVals,fNorm);//计算Pitch角if(realVals[0]<0){fPitch=-fPitch;}//计算两次测量的时间间隔dt,以秒为单位unsignedlongnCurTime=micros();floatdt=(double)(nCurTime-nLastTime)/1000000.0;//对Roll角和Pitch角进行卡尔曼滤波floatfNewRoll=kalmanRoll.getAngle(fRoll,realVals[4],dt);floatfNewPitch=kalmanPitch.getAngle(fPitch,realVals[5],dt);//跟据滤波值计算角度速floatfRollRate=(fNewRoll-fLastRoll)/dt;floatfPitchRate=(fNewPitch-fLastPitch)/dt;//更新Roll角和Pitch角fLastRoll=fNewRoll;fLastPitch=fNewPitch;//更新本次测的时间nLastTime=nCurTime;//向串口打印输出Roll角和Pitch角,运行时在Arduino的串口监视器中查看Serial.print("Roll:");Serial.print(fNewRoll);Serial.print('(');Serial.print(fRollRate);Serial.print("),\tPitch:");Serial.print(fNewPitch);Serial.print('(');Serial.print(fPitchRate);Serial.print(")\n");delay(10);}//向MPU6050写入一个字节的数据//指定寄存器地址与一个字节的值voidWriteMPUReg(intnReg,unsignedcharnVal){Wire.beginTransmission(MPU);Wire.write(nReg);Wire.write(nVal);Wire.endTransmission(true);}//从MPU6050读出一个字节的数据//指定寄存器地址,返回读出的值unsignedcharReadMPUReg(intnReg){Wire.beginTransmission(MPU);Wire.write(nReg);Wire.requestFrom(MPU,1,true);Wire.endTransmission(true);returnWire.read();}//从MPU6050读出加速度计三个分量、温度和三个角速度计//保存在指定的数组中voidReadAccGyr(int*pVals){Wire.beginTransmission(MPU);Wire.write(0x3B);Wire.requestFrom(MPU,nValCnt*2,true);Wire.endTransmission(true);for(longi=0;i<nValCnt;++i){pVals[i]=Wire.read()<<8|Wire.read();}}//对大量读数进行统计,校准平均偏移量voidCalibration(){floatvalSums[7]={0.0f,0.0f,0.0f,0.0f,0.0f,0.0f,0.0};//先求和for(inti=0;i<nCalibTimes;++i){intmpuVals[nValCnt];ReadAccGyr(mpuVals);for(intj=0;j<nValCnt;++j){valSums[j]+=mpuVals[j];}}//再求平均for(inti=0;i<nValCnt;++i){calibData[i]=int(valSums[i]/nCalibTimes);}calibData[2]+=16384;//设芯片Z轴竖直向下,设定静态工作点。}//算得Roll角。算法见文档。floatGetRoll(float*pRealVals,floatfNorm){floatfNormXZ=sqrt(pRealVals[0]*pRealVals[0]+pRealVals[2]*pRealVals[2]);floatfCos=fNormXZ/fNorm;returnacos(fCos)*fRad2Deg;}//算得Pitch角。算法见文档。floatGetPitch(float*pRealVals,floatfNorm){floatfNormYZ=sqrt(pRealVals[1]*pRealVals[1]+pRealVals[2]*pRealVals[2]);floatfCos=fNormYZ/fNorm;returnacos(fCos)*fRad2Deg;}//对读数进行纠正,消除偏移,并转换为物理量。公式见文档。voidRectify(int*pReadout,float*pRealVals){for(inti=0;i<3;++i){pRealVals[i]=(float)(pReadout[i]-calibData[i])/16384.0f;}pRealVals[3]=pReadout[3]/340.0f+36.53;for(inti=4;i<7;++i){pRealVals[i]=(float)(pReadout[i]-calibData[i])/131.0f;}}

4 实现效果

硬件装置展示


姿态检测系统测试

将硬件通过数据线接入电脑usb口后,启动上位机并运行可视化文件。装置位置和上位机三维演示如图所示。

演示视频:

毕业设计 基于单片机的姿态检测与可视化系统 - 嵌入式 物联网

5 最后

包含内容


包含完整详细的设计论文

🧿项目分享:见文末!

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

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

相关文章

基于Django的在线课程学习平台 计算机毕业设计选题 计算机毕设项目 前后端分离【源码-文档报告-代码讲解】

&#x1f34a;作者&#xff1a;计算机毕设匠心工作室 &#x1f34a;简介&#xff1a;毕业后就一直专业从事计算机软件程序开发&#xff0c;至今也有8年工作经验。擅长Java、Python、微信小程序、安卓、大数据、PHP、.NET|C#、Golang等。 擅长&#xff1a;按照需求定制化开发项目…

零成本启动:用免费云端GPU快速运行阿里通义Z-Image-Turbo WebUI

零成本启动&#xff1a;用免费云端GPU快速运行阿里通义Z-Image-Turbo WebUI 作为一名学生党&#xff0c;想要完成AI图像生成相关的课程项目&#xff0c;却苦于个人电脑性能不足&#xff0c;又难以承担高昂的云计算费用&#xff1f;别担心&#xff0c;本文将带你零成本快速上手阿…

非光滑复合优化加速邻近梯度算法【附代码】

✅ 博主简介&#xff1a;擅长数据搜集与处理、建模仿真、程序设计、仿真代码、论文写作与指导&#xff0c;毕业论文、期刊论文经验交流。✅成品或者定制&#xff0c;扫描文章底部微信二维码。(1) 自适应非单调步长策略与惯性加速机制设计邻近梯度算法在求解非光滑复合优化问题时…

教学实践:如何在计算机视觉课程中快速集成Z-Image-Turbo

教学实践&#xff1a;如何在计算机视觉课程中快速集成Z-Image-Turbo 作为一名计算机视觉课程的讲师&#xff0c;我最近在准备生成式AI的教学内容时&#xff0c;发现学生常因本地环境配置差异导致课堂进度延误。经过多次测试&#xff0c;Z-Image-Turbo 凭借其亚秒级图像生成能力…

org.mockito : mockito-core 中文文档(中英对照·API·接口·操作手册·全版本)以4.11.0为例,含Maven依赖、jar包、源码

文章目录完整文档下载地址&#xff08;类、方法、参数说明&#xff09;mockito-core-4.11.0.jar中文-英文对照文档.zip 中包含以下内容使用方法组件信息简介Maven依赖Gradle依赖寒水馨 Java 组件中文文档系列说明版权声明与来源信息本组件包含的 Java package&#xff08;包&am…

进化多目标优化算法设计与实现【附代码】

✅ 博主简介&#xff1a;擅长数据搜集与处理、建模仿真、程序设计、仿真代码、论文写作与指导&#xff0c;毕业论文、期刊论文经验交流。✅成品或者定制&#xff0c;扫描文章底部微信二维码。(1) 基于角度向量的支配准则设计多目标优化问题的求解核心在于如何有效引导种群向Par…

终极对比:本地部署vs云端Z-Image-Turbo镜像,哪种方式更适合你的项目?

终极对比&#xff1a;本地部署vs云端Z-Image-Turbo镜像&#xff0c;哪种方式更适合你的项目&#xff1f; 作为技术负责人&#xff0c;当你计划为团队引入Z-Image-Turbo这类AI图像生成能力时&#xff0c;第一个关键决策就是&#xff1a;选择本地部署还是云端服务&#xff1f;本文…

毕业设计救星:基于预装镜像的Z-Image-Turbo二次开发全指南

毕业设计救星&#xff1a;基于预装镜像的Z-Image-Turbo二次开发全指南 作为一名数字媒体专业的学生&#xff0c;毕业设计答辩时如果能展示AI图像生成能力&#xff0c;无疑会为作品增色不少。但现实往往很骨感——实验室电脑性能不足&#xff0c;个人笔记本又难以搞定复杂的AI环…

Z-Image-Turbo多GPU部署指南:如何实现高并发图像生成

Z-Image-Turbo多GPU部署指南&#xff1a;如何实现高并发图像生成 在当今SaaS平台快速发展的背景下&#xff0c;高并发AI图像生成需求日益增长。Z-Image-Turbo作为阿里开源的6B参数图像生成模型&#xff0c;通过创新的8步蒸馏技术&#xff0c;能在保持照片级质量的同时实现亚秒级…

快速迭代:阿里通义Z-Image-Turbo开发测试环境搭建

快速迭代&#xff1a;阿里通义Z-Image-Turbo开发测试环境搭建 为什么需要快速迭代的开发测试环境&#xff1f; 作为AI研发团队的成员&#xff0c;我深刻体会到频繁测试模型不同版本时的痛点。每次切换模型版本时&#xff0c;环境配置、依赖安装、CUDA版本冲突等问题总会消耗大量…

两通道正交镜像滤波器组系数稀疏优化【附代码】

✅ 博主简介&#xff1a;擅长数据搜集与处理、建模仿真、程序设计、仿真代码、论文写作与指导&#xff0c;毕业论文、期刊论文经验交流。✅成品或者定制&#xff0c;扫描文章底部微信二维码。(1) 基于信赖域迭代梯度搜索的初优化方法两通道正交镜像滤波器组的设计核心在于确定原…

ue 编译

"D:\Program Files\Epic Games\UE_5.6\Engine\Build\BatchFiles\Build.bat" ^ MetahumanHeiXiEditor Win64 Development ^ -Project"D:\soft\ue\MetahumanHeiXi_56_dong\MetahumanHeiXi_56_dong\MetahumanHeiXi.uproject"

毕业设计救星:基于预置镜像的Z-Image-Turbo二次开发实战

毕业设计救星&#xff1a;基于预置镜像的Z-Image-Turbo二次开发实战 作为一名数字媒体专业的学生&#xff0c;你是否正在为毕业设计中的AI图像生成功能发愁&#xff1f;实验室电脑性能不足&#xff0c;本地搭建环境又总是卡在依赖安装和配置环节&#xff1f;今天我要分享的Z-Im…

AI绘画工作坊必备:15分钟搭建Z-Image-Turbo教学环境

AI绘画工作坊必备&#xff1a;15分钟搭建Z-Image-Turbo教学环境 作为一名经常开设AI绘画课程的技术讲师&#xff0c;我深知教学过程中最头疼的问题就是学员的电脑配置参差不齐。有些同学用着高性能显卡轻松跑图&#xff0c;而另一些同学则卡在依赖安装或显存不足的环节。最近我…

教学实践:如何在计算机课堂快速部署Z-Image-Turbo实验环境

教学实践&#xff1a;如何在计算机课堂快速部署Z-Image-Turbo实验环境 作为一名高校教师&#xff0c;你是否遇到过这样的困境&#xff1a;想要将前沿的AI绘画技术引入计算机课程教学&#xff0c;但实验室电脑配置参差不齐&#xff0c;导致学生无法获得一致的实验体验&#xff1…

程序员的终身学习:如何应对技术迭代的加速?

程序员的终身学习&#xff1a;如何应对技术迭代的加速&#xff1f;关键词&#xff1a;程序员、终身学习、技术迭代、学习策略、职业发展摘要&#xff1a;在当今科技飞速发展的时代&#xff0c;技术迭代的速度不断加快&#xff0c;这对程序员提出了极高的要求。程序员需要进行终…

同城配送一致性车辆路径优化模型【附代码】

✅ 博主简介&#xff1a;擅长数据搜集与处理、建模仿真、程序设计、仿真代码、论文写作与指导&#xff0c;毕业论文、期刊论文经验交流。✅成品或者定制&#xff0c;扫描文章底部微信二维码。(1) 多场景协同优化的一致性概念框架与时空网络建模同城配送作为物流服务的末端环节&…

通达信MACD公式

{}MCD:"MACD.MACD"(12,26,9); REF(ABS(MCD),1)<0.02 AND CROSS(MCD,0);

快速内容生产:自媒体如何用Z-Image-Turbo云端环境保持日更创作

快速内容生产&#xff1a;自媒体如何用Z-Image-Turbo云端环境保持日更创作 对于知识付费创作者和自媒体运营者来说&#xff0c;持续产出高质量的视觉内容是一项巨大挑战。Z-Image-Turbo作为阿里通义实验室开源的6B参数图像生成模型&#xff0c;仅需8步推理即可实现亚秒级图像生…

成本优化指南:按需使用Z-Image-Turbo云端GPU的聪明方法

成本优化指南&#xff1a;按需使用Z-Image-Turbo云端GPU的聪明方法 对于小型工作室来说&#xff0c;AI工具的使用成本往往是最大的痛点之一。Z-Image-Turbo作为一款高性能的文生图模型&#xff0c;能够帮助团队快速生成创意图像&#xff0c;但长期租赁昂贵GPU显然不是最优解。本…