使用Micro:bit配合网页蓝牙等前端技术实现姿态检测以及复现。(WebBluetooth、Three.js)

Three.js库介绍

Three.js在Wikipedia中的概述如下:

Three.js是一个跨浏览器的脚本,使用JavaScript函数库或API来在网页浏览器中创建和展示动画的三维计算机图形。Three.js使用WebGL。源代码托管在GitHub。

该JavaScript前端库使用WebGL,将其封装成一系列用于创建或展示三维图形的API。

在本文中我们将使用该库来实现3D模型相关的操作。

Three.js的官方网站>>直达链接<<

关于WebBluetooth

WebBlueTooth项目意在制定一组Web蓝牙API规范,使得人们在浏览器上就能够访问自己的蓝牙设备。目前该项目在Chrome浏览器上以及可以使用部分API,本文将基于这部分API来实现浏览器于Micro:Bit通过蓝牙进行通信。

更多关于WebBluetooth的信息可参见博文:

实现原理

姿态角(欧拉角)

关于姿态角或称欧拉角,在Wikipedia上的概述如下:

莱昂哈德·欧拉用欧拉角来描述刚体在三维欧几里得空间的取向。对于任何参考系,一个刚体的取向,是依照顺序,从这参考系,做三个欧拉角的旋转而设定的。所以,刚体的取向可以用三个基本旋转矩阵来决定。换句话说,任何关于刚体旋转的旋转矩阵是由三个基本旋转矩阵复合而成的。

对于欧拉角在Wikipedia上有“动态的定义”与“静态的定义”在本文中使用其“静态的定义”即:

对于在三维空间里的一个参考系,任何坐标系的取向,都可以用三个欧拉角来表现。参考系又称为实验室参考系,是静止不动的。而坐标系则固定于刚体,随着刚体的旋转而旋转。

关于欧拉角更加详细的描述请参见:>>简书:欧拉角的说明<<

在本文将使用Three.js所提供的API来改变3D模型的欧拉角,实现3D模型的翻转

三轴加速度传感器

加速度传感器有很多种,本文所使用的Micro:Bit上所使用的加速度传感器为三轴加速度传感器,能从三个方向去测量加速度值。

目前的加速度传感器有多种实现方式,主要可分为压电式、电容式及热感应式三种,按输入轴数目分类,有单轴、双轴和三轴加速度计。

关于Micro:Bit的加速度传感器介绍如下图:

演示图_1

  • 当Micro:Bit水平时,其加速度传感器的Z轴值(负)等于重力加速度G
  • 当Micro:Bit左倾时,其加速度传感器的Z轴值(负)与X轴值(负)的平方和开根号等于重力加速度G
  • 当Micro:Bit向其它方向偏转时依此类推

在本文将对Micro:Bit的提供蓝牙发送的加速度值进行处理,使其转换成欧拉角的值(实际上本文只使用了X轴与Y轴)

程序结构

蓝牙部分

  • 使用WebBluetooth API让用户选择要连接到的蓝牙设备
  • 通过Micro:Bit的设备名称服务读取设备名称
  • 启用Micro:Bit的加速度计服务的通知

3D部分

  • 使用Three.js的API读取在本地预先准备好的3D模型
  • 初始化3D模型以及相机的位置
  • 由根据处理后的加速度值即欧拉角改变3D模型的姿态

其它

  • 实现加速度值转换为欧拉角
  • 对加速度值的滤波

核心代码

加速度值滤波器

加速度传感器噪声过多在宏观静止的情况下其值会存在抖动,因此需要使用滤波器滤除抖动。在这里使用的是高通滤波器。

//滤除抖动    x,y为传感器的值   exp为滤波阈值    old_X..Y为上一次传感器的值
function AFilter_Output(x, y, exp) {
    x = (Math.abs(Math.abs(old_X) - Math.abs(x)) < exp) ? old_X : x;
    y = (Math.abs(Math.abs(old_Y) - Math.abs(y)) < exp) ? old_Y : y;

    ChangeModel(x, y);
    old_X = x;
    old_Y = y;
}

加速度值转欧拉角

在这里直接把加速度值转欧拉角并修改3D模型的姿态

function ChangeModel(x, y) {
    obj.rotation.y = (x / 1000) * (Math.PI/2);
    obj.rotation.x = (y / 1000) * (Math.PI/2);
}

结语

完整Demo

Github项目地址>>直达链接<<

一些问题

实际上对于加速度传感器用于检测姿态角实际上会存在许多问题,毕竟加速度传感器终究还是用来测量加速度值的,当加速度传感器在做变速运动时,基本上无法计算姿态角,因此如果要在实际的项目中检测姿态角最好还是使用陀螺仪传感器。

Last modification:May 18th, 2021 at 06:42 pm