フライトシミュレータでいつか実現したいものに、フォースフィードバックとモーションシミュレータがあります。
OpenStickのフォースフィードバック対応については私の技術力と英語力では苦戦している事を何度か書きました。
一方、モーションシミュレータはというと敷居が高そうで今まであまり検討しませんでした。置き場所も問題ですし。
でも今回急にやりたくなったんですよね。いきなり人間が乗れるものを作るのは大変なので、まずはシミュレータからデータを取出してラジコンサーボを動かしてみるというところから始めました。
使用するシミュレータはマイクロソフトのFlightSimulatorXです。ここからデータを取出すには、世の中ではFSUIPCという追加ソフトで取出すパターンが多い様です。これはこれで気になりますが、まずは今あるものを使ってみてから考えるという事で今回はFlightSimulatorXに標準で入っているSimConnectを使用してみます。(たぶんFSUIPCも内部でSimConnectを使っているのだと思います)。
SimConnect
SimConnectはFlightSimulatorXに標準で付いているSDK(ソフトウェア開発キット)の一部で、シミュレータ内の各種数値を読み書きする事で計器やコントローラ等を制御できるツールです。FlightSimulatorXのDVDにSDKのインストーラが含まれており、これをインストールしました(もしかするとFSXと共にインストール済なのに上書きインストールをしたのかもしれませんが今となっては判りません)。このSDKの中にはSimConnect以外にも色々な機能が含まれており、これらもいつか試してみたいと思います。
で、SimConnect の実体はSimConnect.hとSimConnect.libで、VisualStudioC++からインポート&リンクして使用します。
VisualStudio
ウチのPCにはVisualStudio2010 ExpressEdition(要はお金のかからないヤツね)がインストール済なのでこれを使います。SDKのマニュアルによるとVisualStuio2005以降に対応しているとの事なので大丈夫でしょう。
サンプルソース
SDKには多数のサンプルが付いています。この中の’Request Data’というサンプルを元にして必要な情報が取れる様に修正していきます。
プロジェクト作成/コンパイル
まずVisualStudioでWin32コンソールアプリケーションとしてプロジェクトを作成します。そしてSDKの説明に従いヘッダとライブラリを指定します。そしてコンパイルするとプリコンパイル済ヘッダのエラーが出たので安直にプリコンパイル済ヘッダを使用しない設定に変えてしまいました。これでとりあえずはコンパイルも通ってプログラムを実行できる様になりました。
→実験プログラム(VisualC++のプロジェクトツリー一式です。色々関係ないデータも取出していますが結局ロール、ピッチ、方位しか使っていません)
データ取得
‘Request Data’はシミュレータと通信し、高度、緯度、経度を取出してDOS窓に表示するサンプルプログラムです。これを変更して機体のピッチ、ロール、方位を取出し、カンマ区切りで出力します。これらの値は浮動小数点型で単位はラジアンですが、このままArduinoに送っても扱い辛いので単位を度数に変換し、更に数値を10倍して少数以下を切り捨てました。これによりArduino側では整数で扱えます。
また’Request Data’サンプルは一回データを出力したら終りでしたが、これを定期的に出力する様に変更しました。
データをArduinoに転送
これまた安直にDOS窓状で’コマンド名>COM3:’ を実行し、リダイレクトにより仮想シリアルポートに送ります。最終的にはもうちょっとマトモなやり方に変えたいと思いますが、まずは実験です。
Arduinoでの処理
カンマ区切りを分解してロールとピッチのデータを得ます(今回2軸なので方位データは捨てています)。 そして各値をサーボ用の値に変換してサーボライブラリに送ります。
→実験プログラム
サーボ
サーボは随分前にロボットを製作した時の残りのGWSのMicro2BBMGを使用しました。これはかなりトルクがあるサーボなので今回の用途にはちょっと無駄です。実は4グラムサーボも手持ちがありますが、こちらはラジコン飛行機に乗せたいので取っておきます。
リンケージ
サーボから釣り糸をリンケージに使って棒の上の円盤を傾けます。棒と円盤とは熱収縮チューブで接続しているので自由に傾ける事ができます。円盤の上には模型のセスナ172(ThingiVerseからダウンロードしてプリントしました)を乗せています。
Fusion360でレンダリングしてみました。
そして実体化。動画です。
この後・・・
今回は機体の傾きをそのままサーボの角度で表していますがモーションシミュレータとなると体にかかる加速度(重力も含めて)を再現しなければなりません。SimConnectで取り出せる変数には加速度データもあるのですが、表示させると何だか思ったものと違う様です。もしかすると速度を微分して計算するしかないのかもしれません。また本当に人が乗れるヤツを作ろうと思ったらアクチュエータをどうするか、また置き場所をどうするかという大問題もあります。
・・・という事で、これまたぼちぼちやります(多分途中でくじけます)。
モーション・フライトシミュレーター関連の投稿一覧
フライトシムのモーションシミュレータ化~9~
Microsoft Flight Simulator 2020 + モーション機構
モーションフライトシミュレータ強化~2~
モーションフライトシミュレータ強化
Maker Faire Kyotoにモーションシミュレータを持っていきたい
フライトシムのモーションシミュレータ化~8~
フライトシムのモーションシミュレータ化~7~
フライトシムのモーションシミュレータ化~6~
フライトシムのモーションシミュレータ化~5~
フライトシムのモーションシミュレータ化~4~
フライトシムのモーションシミュレータ化~3~
フライトシムのモーションシミュレータ化~2~
フライトシムのモーションシミュレータ化
フライトシムからデータを取出しアクチュエータを動かす。