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

news2024/9/30 3:34:48

总览

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 19

Adafruit_BNO08x bno;

void setup() {
  Serial.begin(115200);  // 设置串口波特率

  // 初始化 I2C 接口并指定引脚
  Wire.begin(I2C_SDA_PIN, I2C_SCL_PIN);

  // 使用 I2C 地址 0x4B 初始化 BNO085
  if (!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,Z
        Serial.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.7
    public 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.coloradmin.cn/o/2136740.html

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

相关文章

《Exploit temporal cues in multi-camera 3D object detection》论文泛读

ReadPaperhttps://readpaper.com/pdf-annotate/note?pdfId4666749915775385601eId2491528568128599808 针对单帧数据含有的信息太少的问题&#xff0c;提出了一种新的方法&#xff0c;BEVDet4D&#xff0c;这种方法可以访问时间线索&#xff0c;并且取得了较好的表现&#xff…

C++类与对象深度解析(一):从抽象到实践的全面入门指南

文章目录 C 类与对象——详细入门指南前言1. 类的定义1.1 类定义的基本格式示例代码解释 1.2 访问限定符示例代码解释 1.3 类域示例代码解释 1.4 成员命名规范常见的命名约定&#xff1a;示例&#xff1a;拓展&#xff1a; 1.5 class与struct的默认访问权限示例&#xff1a; 2.…

Leetcode 每日一题:Decode String

写在前面&#xff1a; 最近求职季找工作忙的焦头烂额&#xff0c;同时这个学期的助教工作也比之前的工时多了一倍&#xff0c;昨天又拖更了真的对不起大家&#xff5e;&#xff5e; 今天我们来看一道稍微轻松一点的题&#xff0c;这道题目来源于 Valid Parenthesis&#xff0…

房产销售系统:SpringBoot技术优化方案

第三章 系统分析 3.1 系统设计目标 房产销售系统主要是为了用户方便对房源信息管理、房源类型管理、房子户型管理、交易订单管理、预约看房管理、评价管理等信息进行查询&#xff0c;也是为了更好的让管理员进行更好存储所有数据信息及快速方便的检索功能&#xff0c;对系统的各…

ESP32聊天机器人之一

想做情感陪伴机器人&#xff0c;看到B站有个项目很有趣&#xff0c;使用一块esp32复刻了B站MeteWu的ESP32大模型聊天项目。 自己做了一些修改&#xff0c;加了一些简单的表情&#xff0c;角色扮演&#xff0c;切换大模型和温湿度传感器等功能。可以用于玩具&#xff0c;聊天机…

第307题|快速掌握 反常积分敛散性判定的方法|武忠祥老师每日一题

解题思路&#xff1a;先判断这个反常积分的敛散性&#xff0c;再讨论a的取值范围; 判断反常积分的敛散性&#xff0c;我们通常有三个方法&#xff1a; &#xff08;1&#xff09;根据定义&#xff0c;通常在原函数比较好求的情况下&#xff0c;可以根据定义 &#xff08;2&am…

IDEA 常用配置和开发插件

件市场中搜索并安装“Git Integration”插件。 一、前言 在本篇文章中我会为大家总结一些我自己常用的配置和开发插件&#xff0c;此外也给大家提供一个建议&#xff0c;可以根据自己的项目需求和个人偏好选择适合的插件。另外&#xff0c;IDEA 也在不断更新&#xff0c;可能会…

『功能项目』战士职业平A怪物掉血【44】

我们打开上一篇43事件中心的项目&#xff0c; 本章要做的事情是给主角增加一个xxxCtrl.cs脚本&#xff0c;再创建一个xxxOpt.cs调用xxxCtrl.cs机制层利用事件中心再写一个主角战士平A对怪物的伤害 首先创建脚本&#xff1a;PlayerCtrl.cs using UnityEngine; public class Pla…

2024年微电子与纳米技术国际研讨会(ICMN 2024) Microelectronics and Nanotechnology

文章目录 一、会议详情二、重要信息三、大会介绍四、出席嘉宾五、征稿主题六、咨询 一、会议详情 二、重要信息 大会官网&#xff1a;https://ais.cn/u/vEbMBz提交检索&#xff1a;EI Compendex、IEEE Xplore、Scopus大会时间&#xff1a;2024年9月20-22日地点&#xff1a;成都…

Java项目: 基于SpringBoot+mybatis+maven服装生产管理系统(含源码+数据库+任务书+开题报告+毕业论文)

一、项目简介 本项目是一套基于SpringBootmybatismaven服装生产管理系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简…

0基础跟德姆(dom)一起学AI 数据处理和统计分析02-Linux进阶

* vi编辑器 * 权限相关 * 进程,网络相关 * 压缩和解压缩 * 软件安装-yum方式 * 其它命令 --- 1.过滤和管道命令 shell # grep命令, 用来过滤的 # 格式 grep [-n] 关键字 文件路径 # 从文件中过滤出要查找的内容, -n:表示带行号. # | 管道符, 即: 把前边命令的执行结果,…

Ceisum(SuperMap iClient3D for Cesium)实现平面裁剪

1&#xff1a;参考API文档&#xff1a;SuperMap iClient3D for Cesium 开发指南 2&#xff1a;官网示例&#xff1a;support.supermap.com.cn:8090/webgl/Cesium/examples/webgl/examples.html#layer 3&#xff1a;SuperMap iServer&#xff1a;欢迎使用 SuperMap iServer 11…

ArcGIS属性表汉字转拼音

直接复制粘贴现成代码&#xff1a; # -*- coding: utf-8 -*-import arcpyfrom arcpy import envimport osimport pypinyin import sys# 不带声调皿stylepypinyin.NORMAL)def pinyin(word): s for i in pypinyin.pinyin(word, stylepypinyin.NORMAL): s .join(…

idea中java及java web项目的常见问题

1、乱码问题&#xff0c;主要有几处地方&#xff0c;需要检查。 ①确保文件编码&#xff0c;其实主要就是在idea启动文件中&#xff0c;增加了 -Dfile.encodingUTF-8的设置 ②编辑器默认编码&#xff0c;都改为UTF-8 ③Tomcat的运行配置&#xff0c;编码也改为UTF-8,同样使用…

PHP省时省力海报在线制作系统小程序源码

省时省力海报在线制作系统&#xff1a;设计小白也能秒变大师 &#x1f3a8; 开篇&#xff1a;告别繁琐&#xff0c;拥抱高效设计 你还在为设计一张海报而熬夜加班吗&#xff1f;还在为找不到合适的素材而焦头烂额吗&#xff1f;别担心&#xff0c;“省时省力海报在线制作系统”…

Linux python pyinstaller 打包问题

1.环境 系统版本:Linux -4.19.91-24.8.el8.ks8.11.x86_64-x86_64-with-kylin-10-Sun python 版本 &#xff1a;3.11.2 pyinstaller &#xff1a;6.10.0 pyinstaller 安装不在说明 2.打包 [rootlocalhost pythonNacos]# /usr/local/python3.11/bin/pyinstaller --onefile…

AI+代码审核平台CodeSec获CCIA中国网络安全创新创业大赛总决赛三等奖

近日&#xff0c;由中央网信办指导&#xff0c;中国网络安全产业联盟&#xff08;CCIA&#xff09;主办的2024年中国网络安全创新创业大赛总决赛及颁奖典礼在国家网络安全宣传周落下帷幕。开源网安“AI代码审核平台CodeSec V4.0” 凭借在AI方向的技术创新、技术突破及功能应用创…

服务器基础知识拓展( Linux 网络操作系统 03)

1 什么是服务器 服务器就是在网络中为其他客户机提供服务的计算机。 服务器是计算机的一种&#xff0c;它是在网络操作系统的控制下为网络环境里的客户机&#xff08;如PC&#xff09;提供共享资源&#xff08;包括查询、存储、计算等&#xff09;高性能计算机&#xff0c;它…

OpenCV class1-C#+winfrom显示控件并内存管理

OpenCV是一个开源的跨平台计算机视觉库,提供了丰富的图像和视频处理算法。它采用C语言编写,并提供了C、Python、Java等多种语言接口,可广泛应用于各种计算机视觉相关领域。OpenCV具有强大的图像处理能力,包括图像滤波、几何变换、特征提取等,同时也支持视频分析、目标检测与跟踪…

Leetcode 516. 最长回文序列 区间dp C++实现

Leetcode 516. 最长回文序列 问题&#xff1a;给你一个字符串 s &#xff0c;找出其中最长的回文子序列&#xff0c;并返回该序列的长度。 子序列定义为&#xff1a;不改变剩余字符顺序的情况下&#xff0c;删除某些字符或者不删除任何字符形成的一个序列。 算法1&#xff1a…