2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

micro:bitAdvent Calendar 2024

Day 4

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

Last updated at Posted at 2024-12-03

micro:bitの回転センサー

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

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

https://jp-rad.github.io/amq-weblueth-accelmagiq/
image.png

単位クォータニオン

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

四元数と回転

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

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

micro:bitのプログラミング

プロジェクトの準備

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

拡張機能

  1. amq-pxt-accelmagiq-estimator
  2. amq-pxt-accelmagiq-service
  3. amq-pxt-accelmagiq-math

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

amq-pxt-accelmagiq-serviceは、Bluetooth機能に依存しています。
そのBluetooth機能を有効にするため、Radio機能の方を削除します。

image.png

コーディング

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

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を押しながら起動すると、コンパスの調整ができます
  2. 起動時に、micro:bit本体のホームポジションを指定します
  3. 簡易的なローパスフィルタでセンサー値のノイズを除去しています(値を小さくすると反応が鈍くなります)
  4. 永久ループで、クォータニオンを推定し、オイラー角を計算しています

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

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

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

プロジェクトの設定

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

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

image.png

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

image.png

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

image.png

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

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

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

デモページでの接続

デモページを開き、「CONNECT」ボタンで接続します。ペア設定を要求されますので、接続するmicro:bitを選び、ペア設定してください。

image.png

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

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

それでもうまくできない場合は、共有プロジェクトへアクセスしてください。

共有プロジェクト

おわりに

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

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

参考書籍:四元数(しげんすう)
image.png
(https://amzn.to/3ZmTiZ)

(おまけ)複素数(虚数)って、なぜ習った?

x^2 + 1 = 0
2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?