空間における回転センサーとしてのmicro:bit

# micro:bitの回転センサー

micro:bitには、回転センサーというものは、備わって**いません**。
そこで、micro:bitの加速度センサーとコンパス（磁場センサー）とを使って、**空間での回転を表すこともできるクォータニオン**を推定します。

:::note info
**デモページ**
次のデモページで試すことができますので、micro:bitが推定した**単位クォータニオン**をながめてみてください。

[https://jp-rad.github.io/amq-weblueth-accelmagiq/
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252891/e3c3b292-20e7-9031-5fe6-666855bd6253.png)](https://jp-rad.github.io/amq-weblueth-accelmagiq/
)
:::

# 単位クォータニオン

クォータニオン（Quaternion）は、日本語で、「四元数（しげんすう）」とも呼ばれています。一般的に、計算を容易にするため、空間における回転を表現できる**単位クォータニオン**を用います。

:::note info
**四元数と回転**
> 空間の点を指定されたベクトルの周りに回転させる表現が四元数を用いて表せる。この表現を使うと、３次元のコンピュータグラフィックスや航空機の制御への応用が容易となる利点がある。

[【引用】今野紀雄：四元数、森北出版株式会社（2016）、p.81 L.L.3-6
(https://amzn.to/3ZmTiZO)](https://amzn.to/3ZmTiZO)

:::

# micro:bitのプログラミング

## プロジェクトの準備

Microsoft MakeCode for micro:bit で、**新しいプロジェクト**を作成し、次の**拡張機能**を追加します。


**拡張機能**
1. [amq-pxt-accelmagiq-estimator](https://github.com/jp-rad/amq-pxt-accelmagiq-estimator/)
1. [amq-pxt-accelmagiq-service](https://github.com/jp-rad/amq-pxt-accelmagiq-service/)
1. [amq-pxt-accelmagiq-math](https://github.com/jp-rad/amq-pxt-accelmagiq-math/)

:::note warn
**「radioを削除します」を選択してください**

[amq-pxt-accelmagiq-service](https://github.com/jp-rad/amq-pxt-accelmagiq-service/)は、Bluetooth機能に依存しています。
そのBluetooth機能を有効にするため、Radio機能の方を削除します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252891/932ad409-1c52-cfa2-450a-f8be270b009a.png)

:::

## コーディング

次のようにコーディングします。

```js:JavaScript

let angle: accelmagiq.EulerAngles = null
let estimated: number[] = []
if (input.buttonIsPressed(Button.B)) {
    input.calibrateCompass()
}
accelmagiq.setCoordinateSystem(accelmagiq.CoordinateSystem.BASIC)
accelmagiq.setLowPassFilterAlpha(0.2)
basic.forever(function () {
    estimated = accelmagiq.estimate()
    accelmagiq.notifyData(estimated)
    angle = accelmagiq.rpyFromQuat(accelmagiq.quatFrom(estimated))
    serial.writeNumbers([
        accelmagiq.intDeg(accelmagiq.angle(angle, accelmagiq.AngleRPY.Roll)),
        accelmagiq.intDeg(accelmagiq.angle(angle, accelmagiq.AngleRPY.Pitch)),
        accelmagiq.intDeg(accelmagiq.angle(angle, accelmagiq.AngleRPY.Yaw)),
        accelmagiq.intDeg(accelmagiq.angle(angle, accelmagiq.AngleRPY.Azimuth))
    ])
})

```

**解説**
1. ボタンBを押しながら起動すると、コンパスの調整ができます
1. 起動時に、micro:bit本体のホームポジションを指定します
1. 簡易的なローパスフィルタでセンサー値のノイズを除去しています（値を小さくすると反応が鈍くなります）
1. 永久ループで、クォータニオンを推定し、オイラー角を計算しています

推定されたクォータニオンは、Bluetooth機能で通知され、オイラー角は、シリアル通信で出力されます。

:::note info
LEDディスプレイの面が上空になるように水平にし、USBコネクタが、北を向くようにすると、クォータニオンの値が、`(-1.0, 0.0, 0.0, 0.0)`に近づきます。

値がおかしいと思った場合は、**ボタンBを押しながら再起動**し、 **「コンパスの調整」** を行ってみてください。
:::


## プロジェクトの設定

Bluetooth機能を有効にし、デモページで接続できるようにする為、「プロジェクトの設定」を行います。このプロジェクトの設定には、コツがいるようですので、次の手順で行ってください。

### 1. 「Reset Bluetooth Enabled」を有効にし、「保存」します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252891/82a2111f-ef61-0ecb-4357-23ebdb85f069.png)

### 2. 「No Pairing Required」を有効にし、「保存」します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252891/ed16c39b-ca66-e689-ea93-97fbc17d89e0.png)

### 3. 「Disable Bluetooth Xxxx Service」を全て有効にし、「保存」します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252891/04afb637-fa58-eb98-5438-75a8099dbbce.png)

### 4. 「設定をテキストで編集する」で、設定内容を確認します。

"bluetooth"の設定が次のとおりになっていることを確認します。
特に、`"enabled": 1,`が先頭にあることを確認します。

```json: pxt.json
    "preferredEditor": "blocksprj",
    "yotta": {
        "config": {
            "microbit-dal": {
                "bluetooth": {
                    "enabled": 1,
                    "open": 1,
                    "whitelist": 0,
                    "security_level": null,
                    "device_info_service": 0,
                    "dfu_service": 0,
                    "partial_flashing": 0,
                    "event_service": 0
                }
            }
        }
    }
```

## ダウンロード

「ダウンロード」で、micro:bitにダウンロードします。
初回のダウンロードでは、コンパイルが実行されることがあります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252891/1f4daeae-cb60-0050-457a-a7dd0459d089.png)

## デモページでの接続

[デモページ](https://jp-rad.github.io/amq-weblueth-accelmagiq/)を開き、「CONNECT」ボタンで接続します。ペア設定を要求されますので、接続するmicro:bitを選び、ペア設定してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252891/b3d84db5-c8f9-7024-3152-9d938ad110f5.png)

:::note warn
**ペア設定でmicro:bitが表示されない場合**

プログラムを正しくダウンロードしても、ペア設定にmicro:bitが表示されない場合があります。
「プロジェクトの設定」を手順通りに行ってください。

それでもうまくできない場合は、[共有プロジェクト](
https://makecode.microbit.org/_8oMUYM32rRzd)へアクセスしてください。

:::

**共有プロジェクト**

https://makecode.microbit.org/_8oMUYM32rRzd

# おわりに

micro:bitでクォータニオンを推定することができました。

「ところで、クォータニオンって何！？」って思った方は、是非、micro:bitを片手に学んでみてください。

[**参考書籍：四元数（しげんすう）**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252891/31da878d-e68b-2663-81ed-0d79ae84e152.png)
(https://amzn.to/3ZmTiZ)
](https://amzn.to/3ZmTiZO)

## （おまけ）複素数（虚数）って、なぜ習った？

```math
x^2 + 1 = 0
```