###3-1 何をやったか
2018年EXPOのLightning Talkではモーションセンサを用いたデモを行ないました。
加速度センサとジャイロセンサを組み合わせた手法(Invensense社のDMPなど)を用いると、角度(ロール・ピッチ・ヨー角)に関しては、かなり安定します(少なくともデモを行なう程度の時間なら全然、問題ありません)。
ということで、向きを変えて見せるなら飛行機かなと思いました。
モーションセンサからArduinoにI2Cでデータを拾うプログラムは公開されていて、私が使ったMPU-9250のライブラリはこの辺を参考にさせていただいています。
ArduinoからMATLABにデータを転送するところは、今年のマウスのデモとほぼ同じ手法です。
###3-2 MATLABでいかに見せるか
ちなみにArduinoでもProcessingというプログラミング環境と組み合わせて3Dのデモはできるようになっています。なので、デモをやろうとすると、そうですね、やっぱりどこかで超えないとつまらないかな、は考えました。
3DのAirplaneモデルは、MATLAB File Exchangeのこちらのページから使わせていただきました。
###3-3 苦労した点
実際にモーションセンサのデータに合わせて3Dの描画を行なおうとすると、処理が重くて追従しないことがわかりました。
やっぱりリアルタイムについてこないと、面白くないです。
どうやって解決したかと言うと、「飛行機は動かさない」ということになりました。
1回、飛行機を3Dで描画したら、もう再描画はしません。
飛行機の代わりにカメラ位置とカメラアングルが動いているんです。
カメラを動かす部分のスクリプトを下記に示します。
ax=gca;%現在のfigure
ax.CameraTarget = [0 0 0];%カメラの対象物の座標
d = 7000;%カメラの初期位置
ax.CameraPosition = [d 0 0];%カメラを初期位置に設定
ax.CameraViewAngle = 8;%カメラを初期角度に設定
[Ybias,Pbias,Rbias] = DPMget(s);%飛行機の姿勢の初期位置取得
for t=1:1000
[Y,P,R] = DPMget(s);%飛行機の姿勢を取得
grd=-(Y-Ybias)*(pi/180);
prd=P*(pi/180);
qrd=R*(pi/180);
[Zc,Xc,Yc]=sph2cart(qrd,0,1);
[Yd,Xd,Zd]=sph2cart(grd,prd,d);
ax.CameraPosition = [Xd Yd Zd];%カメラポジション移動
ax.CameraUpVector = [Xc 0 Zc];%カメラ角度変更
drawnow;%すぐに描画
end
%以下、略
というようにして、カメラを飛行機の周りに飛び回らせて、あたかも
飛行機の向きが変わるように見せています。
以下、デモのムービーです。
— Monzo_N (@n_monzo) 2019年6月15日
おつかれさまでした。