M5Stackで3Dモデリングができるの!?
概要
1.M5stack Fire内蔵のIMU(慣性計測装置)を利用して回転情報を取得
2.M5stackとパソコンをBluetoothでペアリング、予め計測した回転情報を無線通信でパソコンに送る
3.Processingにて3Dモデル制作、回転情報を取得して連動させるプログラムを作成
1.M5stack Fire内蔵のIMU(慣性計測装置)を利用して回転情報を取得
IMUで加速度、角速度を計測 → 3次元ベクトル変換の流れになります。
IMUで加速度、角速度を計測
2022年9月時点で購入できるM5stack Fireでは加速度センサ・ジャイロセンサが実装されたIMU(Inertial Measurement Unit)を利用することになります。
以前は地磁気センサも内蔵されていて方位変化にも対応できたのですが、新バージョンのIMU(今回利用のM5stack FireはMPU6886)では地磁気センサが無くなりました。
float型で変数宣言して、アドレスを関数に入れるだけでIMUの情報が取れます。
float accX, accY, accZ;
float gyroX, gyroY, gyroZ;
M5.IMU.getGyroData(&gyroX,&gyroY,&gyroZ);
M5.IMU.getAccelData(&accX,&accY,&accZ);
回転情報への変換
加速度センサ、ジャイロセンサの計測値から3次元ベクトルの回転情報(ロール・ピッチ・ヨー)に変換します。
変換自体は”MahonyAHRS.h”ライブラリをインクルードして値を入れてやるだけです。理論は難しすぎて分からず…。
ロールはX軸、ピッチはY軸、ヨーはZ軸の回転情報で、地磁気センサの方位変化が分からないので、ヨーが定まらず、常にZ軸は回転がかかった状態になってしまいます。
#include <utility/MahonyAHRS.h>
float pitch, roll, yaw;
MahonyAHRSupdateIMU(gyroX * DEG_TO_RAD, gyroY * DEG_TO_RAD, gyroZ * DEG_TO_RAD, accX, accY, accZ, &pitch, &roll, &yaw);
M5stackの回転情報をパソコンに送る
M5stackとパソコンをBluetoothで接続し、回転情報を無線通信で定期的に送ります。
M5StackのBluetoothモジュールを起動した状態でパソコンから検索すると”M5Stack”と表示されるのでペアリングしましょう。
#include "BluetoothSerial.h"
BluetoothSerial SerialBT;
//Setup()にて
SerialBT.begin("M5Stack"); //引数はBluetoothデバイス名
Serial.begin(115200);
//Loop()にて
SerialBT.printf("%5.1f, %5.1f, %5.1f\r\n", roll, pitch, yaw);
3Dモデルの制作と回転情報の反映
3DモデルはProcessingで作成します。
Processingは3Dモデルを作れるだけでなく、プログラムを組めるので通信が可能となります。
なので、Processing側にBluetoothのポート指定して回転情報を取得して3Dモデルに反映させるプログラムを作ればM5stack Fireの動きが直ちに3Dモデルに展開できます。
Processing側のソースコードは参考文献「パソコン上のM5Stackの3Dモデルを、M5Stackの動きに合わせて動かす」を参照するとよいでしょう。
まとめ
M5Stack FireでPC上の3Dモデルを動かすには、4ステップ。
1.IMUで加速度・角速度を計測
2.ライブラリ使って回転情報に変換
3.BluetoothでPCとペアリング
4.Processingで3Dモデル作成し、回転情報を取得して反映させる
参考文献
本記事は下記参考にして作成しています。
【M5Stack】第4回 M5Stack Fire内蔵のIMU(MPU6886)を使って姿勢角算出
M5Stackの回転データが勝手に回り続けることになる問題の対策
パソコン上のM5Stackの3Dモデルを、M5Stackの動きに合わせて動かす
コメント