【Arduino】BNO085 姿态的 3D模型 展示方法(映射到 Unity)

总览

1.arduino 代码和库等…
2.Unity 的部分,创建一个 3D 工程,然后创建一个 cube,绑定一个脚本文件
3.效果预览:

【Arduino】BNO085 姿态的 3D模型 展示方法(映射到 Unity)

一、Arduino 部分

1.使用的硬件

· 单片机:使用了 ESP32S3,当然了,我没拿我的 atmega328P 去试,应该也可以。
· 使用的通讯方式:I2C

· 引脚连接方式:
ESP32S3 ----- ----- BNO085
3V3 ----- ----- VCC
GND ----- ----- GND
19 ----- ----- SDA
18 ----- ----- SCL
6 ----- ----- INT(看情况使用,我没使用)

2.软件部分

在使用此代码前,请搜索安装这个库:

在这里插入图片描述

代码片:

#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BNO08x.h>#define BNO08X_INT_PIN 6  // 使用 GPIO 6 作为中断引脚
#define I2C_SCL_PIN 18
#define I2C_SDA_PIN 19Adafruit_BNO08x bno;void setup() {Serial.begin(115200);  // 设置串口波特率// 初始化 I2C 接口并指定引脚Wire.begin(I2C_SDA_PIN, I2C_SCL_PIN);// 使用 I2C 地址 0x4B 初始化 BNO085if (!bno.begin_I2C(0x4B)) {Serial.println("BNO085 I2C 初始化失败!");while (1);}Serial.println("BNO085 已经初始化");// 启用需要的传感器报告if (!bno.enableReport(SH2_GAME_ROTATION_VECTOR, 2500)) {Serial.println("无法启用旋转向量报告");}
}void loop() {if (digitalRead(BNO08X_INT_PIN) == LOW) {sh2_SensorValue_t sensorValue;// 读取传感器数据if (bno.getSensorEvent(&sensorValue)) {if (sensorValue.sensorId == SH2_GAME_ROTATION_VECTOR) {// 获取旋转向量数据float rotationX = sensorValue.un.gameRotationVector.i;float rotationY = sensorValue.un.gameRotationVector.j;float rotationZ = sensorValue.un.gameRotationVector.k;// 通过串口发送数据到 Unity,格式为:ROTATION:X,Y,ZSerial.print("ROTATION:");Serial.print(rotationX); Serial.print(",");Serial.print(rotationY); Serial.print(",");Serial.print(rotationZ); Serial.println();}}delay(5);  // 添加延迟,越小精度越高且延迟越小,但负载也随之增加,个人建议 5 - 15 ms}
}

二、Unity 部分的操作

1.创建一个 3D 工程

你需要下载安装好 Unity,然后打开 Unity HUB 创建一个 3D 工程。

在这里插入图片描述

2.创建一个 立方体

创建流程:左上角 GameObject >> 3D Object >> Cube

在这里插入图片描述

3.设置立方体位置 && 摄像机位置

你也可以不按照我的来,只是后面的参数你也要自己进行校准了。

· 立方体

在这里插入图片描述

· 摄像机

在这里插入图片描述

4.创建脚本文件

这是一个用于接收串口数据的脚本文件。
它的功能是接收单片机的串口数据,并且将弧度数据转为角度,映射在 cube 立方体上,实现姿态传感器可视化。

文件名:SerialReader.cs

在这里插入图片描述
编辑脚本文件代码(一般来说,我们使用 visual studio 打开它):

在这里插入图片描述

代码片:

using System;
using System.IO.Ports;
using UnityEngine;public class SerialReader : MonoBehaviour
{SerialPort serial = new SerialPort("COM3", 115200);  // 请确认COM端口public GameObject sensorObject;  // 3D模型对象// 放大比// 规则说明:越大,立方体就越容易转动,越小就越不容易转动。// 需要手动调节精度以配合 BNO085 的真实动作。public float rotationMultiplier = 2.2f;// 平滑过渡因子// 规则说明:调节区间为( 0.0 ,1.0 ]// 越大,平滑效果就越差,但是延迟越低;越小,平滑效果越好,但是延迟增高。// 个人建议 0.5,如果觉得卡顿就 0.2,如果想要延迟更低就0.7public float smoothingFactor = 0.5f;     private Quaternion targetRotation;       // 目标旋转角度void Start(){Debug.Log("SerialReader script started!");try{serial.Open();serial.ReadTimeout = 100;Debug.Log("UART has opened!");// 初始化目标旋转targetRotation = sensorObject.transform.rotation;}catch (Exception e){Debug.LogError("Error, can't open UART: " + e.Message);}}void Update(){if (serial.IsOpen){try{string data = serial.ReadLine();Debug.Log("Received data: " + data);if (data.StartsWith("ROTATION:")){string[] values = data.Substring(9).Split(',');// 反转 X 轴,并交换 Y 轴和 Z 轴float rotX = -Mathf.Rad2Deg * float.Parse(values[0]) * rotationMultiplier;  // 反转X轴float rotY = -Mathf.Rad2Deg * float.Parse(values[2]) * rotationMultiplier;   // 将Z轴数据用作Y轴float rotZ = -Mathf.Rad2Deg * float.Parse(values[1]) * rotationMultiplier;   // 将Y轴数据用作Z轴// 计算目标旋转targetRotation = Quaternion.Euler(rotX, rotY, rotZ);}}catch (TimeoutException){}}// 使用 Slerp 平滑过渡到目标旋转sensorObject.transform.rotation = Quaternion.Slerp(sensorObject.transform.rotation, targetRotation, smoothingFactor);}void OnApplicationQuit(){if (serial.IsOpen){serial.Close();}}
}

5.保存,不需要退出 visual studio

6.关联 cube 和 我们刚才创建的脚本文件 SerialReader.cs

点击立方体 >> 点击右侧最下栏的 “Add Component” >> 搜索 serial >> 选择 “Serial Reader”

在这里插入图片描述

点这个小圆点,然后选定我们的 cube

在这里插入图片描述

7.开始 RUN

至此,所有配置已结束,RUN 一下吧
请注意,如果大家在 RUN 的时候发现 cube 的动作太小,请关闭 Unity 程序,重新打开一次再运行

在这里插入图片描述

三、后记

1.如果我们旋转 BNO085 的角度 和 Unity 中 Cube 立方体的角度对不上怎么办?

代码中已经给大家留了可以手动调节放大比的地方。
在这里插入图片描述

2.立方体卡顿 || 有延迟怎么办

卡顿和延迟成反比关系,通过调节平滑因子来调节两者到合适的情况。
代码也预留了:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习和深度学习的常见概念总结(多原创图)

目录 使用说明一、未分类损失函数&#xff08;Loss Function&#xff09;1. **损失函数的作用**2. **常见的损失函数**2.1. **均方误差&#xff08;MSE, Mean Squared Error&#xff09;**2.2. **均方根误差&#xff08;RMSE, Root Mean Squared Error&#xff09;**2.3. **平均…

django-admin自定义功能按钮样式

位置在原来的django-admin 栏中的上方【会因为屏幕大小而变换位置】 <!-- 这里是不会替换掉旧的 添加按钮 &#xff0c;而是添加多一个按钮【点击Crawl Data】--> <!-- /home/luichun/lc/Pyfile/Pywebback/app/paqu/templates/admin/yourmodel_changelist.html -->…

游戏爱好者离不开的录屏工具大赏

你用过录屏工具吗&#xff1f;我在做展示方案或者远程会议的时候经常会用到录屏工具。如果你也有录屏的需求那就接着往下看吧。这篇文章我将介绍几款简单教会我们怎么录屏的工具。 1.福昕录屏大师 链接达达&#xff1a;www.foxitsoftware.cn/REC/ 这个软件的操作极为简便。它…

打包部署若依(RuoYi)SpringBoot后端和Vue前端图文教程

打包后端‘ 1&#xff0c;打开若依&#xff0c;点击右侧的Maven展开Maven管理&#xff0c;选择ruoyi>Lifecycle 先双击clean清除原本启动项目时生成的文件。然后点击package等待项目打包&#xff0c;切记要取消运行再打包 打包完成后会在ruoyi-admin>src>target里面…

Axure RP 11 Beta 测试版 发布了,目前是免费试用阶段

Axure RP 11 Beta 已经发布上线了&#xff01;各位产品同学可以从下面的链接下载测试版&#xff0c;体验新功能。目前RP11处于免费试用阶段&#xff0c;没有授权的用户也可以免费使用试用版。 与 Axure RP 的以往版本一样&#xff0c;在 RP11 中保存文件后&#xff0c;无法在低…

cityengine修改纹理创建模型

数据准备 1、建筑shp面数据 2、安装好cityengine软件 3、Arcgis(非必要) 效果 1、新建工程 路径不要放C盘下 2、复制规则文件和纹理 安装软件后,这些素材在电脑上能找到,默认位置是:C:\Users{计算机名}\Documents\CityEngine\Default Workspace\ESRI.lib,如果找不到…

FP7208+FP5207:升压芯片在太阳能灯串中的应用方案

太阳能灯串是一种利用太阳能发电的高效照明装置&#xff0c;由多个太阳能灯泡串联而成。相比传统的电网供电照明设备&#xff0c;太阳能灯串具有无需外部电源、环保节能、安全可靠等优势&#xff0c;受到越来越多人的追捧和使用。 下面&#xff0c;鱼子酱将为大家介绍一套完整…

分析图形学示例报告

一、实验任务 二、主要功能模块 三、代码 //自定义坐标系模块 CDC* pDC GetDC();//获得设备上下文 CRect rect;//定义矩形 GetClientRect(&rect);//获得矩形客户去大小 pDC->SetMapMode(MM_ANISOTROPIC);//自定义坐标系 pDC->SetWindowExt(rect.Width()/4, rect.He…

深度学习-13-小语言模型之SmolLM的使用

文章附录 1 SmolLM概述1.1 SmolLM简介1.2 下载模型2 运行2.1 在CPU/GPU/多 GPU上运行模型2.2 使用torch.bfloat162.3 通过位和字节的量化版本3 应用示例4 问题及解决4.1 attention_mask和pad_token_id报错4.2 max_new_tokens=205 参考附录1 SmolLM概述 1.1 SmolLM简介 SmolLM…

白话:大型语言模型中的幻觉(Hallucinations)

大型语言模型&#xff08;LLM&#xff09;可是自然语言处理和人工智能的一大步。它们能做的事情可多了&#xff0c;比如生成听起来挺靠谱的文本&#xff0c;翻译语言&#xff0c;总结文档&#xff0c;甚至写诗。但你知道吗&#xff0c;这些模型有时候会出现 “幻觉&#xff08;…

idea。正则

正则替换&#xff0c;$ 变量保持不变 to_char(O.CREATED_TIME,"yyyy-MM-dd HH24:m1:ss) aS CREATED_TIME date format(O.CREATED TIME, %Y-%m-%d %H:%6i:%6s) aS CREATED_TIME. 本次正则的目标是&#xff1a;to_char 》date format 以及"yyyy-MM-dd HH24:m1:ss替换…

源码运行springboot2.2.9.RELEASE

1 环境要求 java 8 maven 3.5.2 2 下载springboot源码 下载地址 https://github.com/spring-projects/spring-boot/releases/tag/v2.2.9.RELEASE 3 修改配置 修改spring-boot-2.2.9.RELEASE/pom.xml 修改spring-boot-2.2.9.RELEASE/spring-boot-project/spring-boot-tools…

<Python>基于python使用PyQt6编写一个延迟退休计算器

前言 这两天关于延迟退休的话题比较火&#xff0c;官方也退出了延迟退休计算器的小程序&#xff0c;我们使用python来实现一个。 环境配置 系统&#xff1a;windows 平台&#xff1a;visual studio code 语言&#xff1a;python 库&#xff1a;pyqt6 程序依据 程序的算法依据…

【linux-Day2】linux的基本指令<上>

【linux-Day2】linux的基本指令<上> 一键查看操作系统的重要地位linux下的基本指令&#x1f4e2;ls&#xff1a;显示当前目录下所有的子目录和文件&#x1f4e2;pwd&#xff1a;显示用户当前所在的目录&#xff0c;在windows中&#xff0c;相当于显示当前目录的绝对路径。…

CesiumJS+SuperMap3D.js混用实现天际线分析

版本简介&#xff1a; cesium&#xff1a;1.99&#xff1b;Supermap3D&#xff1a;SuperMap iClient JavaScript 11i(2023)&#xff1b; 官方下载文档链家&#xff1a;SuperMap技术资源中心|为您提供全面的在线技术服务 示例参考&#xff1a;support.supermap.com.cn:8090/w…

Linux:git

hello&#xff0c;各位小伙伴&#xff0c;本篇文章跟大家一起学习《Linux&#xff1a;git》&#xff0c;感谢大家对我上一篇的支持&#xff0c;如有什么问题&#xff0c;还请多多指教 &#xff01; 如果本篇文章对你有帮助&#xff0c;还请各位点点赞&#xff01;&#xff01;&…

Istio下载及安装

Istio 是一个开源的服务网格&#xff0c;用于连接、管理和保护微服务。以下是下载并安装 Istio 的步骤。 官网文档&#xff1a;https://istio.io/latest/zh/docs/setup/getting-started/ 下载 Istio 前往Istio 发布页面下载适用于您的操作系统的安装文件&#xff0c;或者自动…

远程跨境传输大文件如何做到安全又稳定?

在当今全球化的商业环境中&#xff0c;企业跨境传输大文件的需求日益增长。这不仅涉及到数据的快速迁移&#xff0c;还包括了安全性、稳定性和合规性等多重挑战。本文将探讨企业在跨境传输大文件时可能遇到的问题&#xff0c;以及在传输过程中应注意的事项&#xff0c;并重点介…

AI重塑视觉体验:将图像与视频转化为逼真可编辑的3D虚拟场景

在这个数字化飞速发展的时代&#xff0c;AI技术正以前所未有的方式重塑我们的视觉体验。特别是当AI能够轻松将普通的照片和视频转化为高度逼真、可交互的3D虚拟场景时&#xff0c;它不仅简化了3D内容创作的复杂性&#xff0c;还极大地拓宽了应用场景的边界。今天&#xff0c;我…

测试工具笔记

性能测试是软件测试中非常重要的一部分&#xff0c;它可以帮助识别软件在高负载条件下的性能瓶颈。市面上有许多性能测试工具&#xff0c;它们各有特点和优势。以下是一些流行的性能测试工具&#xff1a; 1. LoadRunner&#xff1a; 由Micro Focus提供&#xff0c;是一个业界广…