本記事の要約
- Simulink上でのフライトログ取得方法について、いくつか検証しました。
- 結果として、今後は「ToWorkSpaceブロック」を使用することに決定しました。
目次
技術猫たちのおしゃべり
それじゃあ先輩、今回もMathWorksさんの公式ドキュメントを見ながら、チャチャっと進めちゃいましょう!
そうですね。ただ、フライトログはデバック作業の根幹でもありますから、丁寧に見ていきましょう。
大丈夫っすよ! シミュレーションのデータ保存するだけっすよね? きっと2,3の操作でできるようになってるっすよ!
そうだといいですけど。(……あれ? この流れ、前にも見ましたね……?)
はじめに
という訳で、おはようございます、こんにちは、こんばんわ。
サバトラ先輩です。
本記事では、「Simulink 3Dシミュレーション環境でのフライトログ取得」について記載しております。
宜しければご覧ください。
なお、前回の『3D Sim環境構築(3) 飛行環境(Unreal Engine)をカスタマイズ』からの続きとなっていますので、
宜しければそちらの記事を先にご覧ください。
フライトログ取得の目的
制御則を開発/設計を行う上で、何よりも重要なのはログデータです。
「本当にこの機能は動作するのか?」「何が悪くて動作してないんだ?」「パラメータはどのくらいが適切なんだ?」といった数々の疑問は、ログデータを見ることなしには解決しません。概要設計が終わったら、後は完成までずっとログデータを見ていると言っても過言ではないでしょう。
そして、UAV、というより航空機においては、飛行中のログデータのことを「フライトログ」と呼びます。なので、UAV制御則の開発/設計を行うためにフライトログ取得は必須なんですね。
そこで今回は、『3D Sim環境構築(1) 導入』で導入した3Dシミュレーションを利用して、UAVのフライトログ取得方法を確立したいと思います。
3Dシミュレーションの様子(5倍速)
一先ず、フライトログ取得の目標は以下の通りとします。
- 3Dシミュレーション中における、UAV位置(Lat/Lon)、高度、姿勢、速度を取得する。
- 取得したフライトログを可視化する。
本当は、制御コマンド(目標姿勢/速度、アクチュエータコマンドなど)も取得し、また取得したフライトログをMavlink*1メッセージの書式に落とし込むところまで進めた方が後々楽になるんですが、それは作業が多くなるので今回は省きます。
*1:UAV ー地上コントローラ間でメッセージを送受信するための通信 プロトコル。Mavlinkを利用すれば、フライト中でも簡単にデータ確認できるという認識でいいです。
フライトログの保存形式検討
さて、チャ坊主くん。ここで残念なお知らせです。
え、何すか怖い。
MathWorkさんの公式ドキュメントから、フライトログを保存する直接的な例を見つけられませんでした。なので、今回は自力で方法を探して実践します。
何ですと!?
ということで、今回はChatGPTに伺いつつ、良さそうな方法をいくつか自分で調査しました。
以下では、調査をして採用候補に挙がったフライトログ取得形式を、一覧表で掲示します。
ログ保存形式 | 解説 | メリット | デメリット |
---|---|---|---|
ToWorkSpaceブロック を使う | Simulinkシミュレーション中に得られたデータを、 MATLABのワークスペースに保存します。 WorkSpaceのログデータは、csv形式などで出力できます。 | ・欲しいデータ が取りやすい。 | データ数が 多くなるほど 作業が煩雑 |
Mavlinkパケットから tlog形式で保存 | Simulinkシミュレーション中にQGCへ送った Mavlinkパケットを、tlog形式で保存します。 tlogデータは、Matlabのコマンドで解析可能です。 | ・既存の書式 を流用できる。 ・解析ツール が豊富 | ・欲しいデータ が無いかも。 ・Mavlink通信 が必須。 |
PX4 ULogブロックから ulog形式で保存 | Simulinkシミュレーション中にULogブロックに 入力したデータを、ulog形式で保存します。 ulogデータは、Matlabのコマンドで解析可能です。 | ・既存の書式 を流用できる。 ・解析ツール が豊富 | ・欲しいデータ が無いかも。 ・PX4*2の使用 が必須 |
*2:UAV向けフライトコントローラー「Pixhawk」に搭載するファームウェアの1つ。
先輩、眩暈がしてきたっす
早すぎます。まだ一覧を載せただけですよ。
でも、馴染みの無い単語が既に一杯出てるっす。僕としては、最終的に使うやつだけ教えて貰えばいいんすけど。
ふむ。それは今から検証するつもりなんですよね。だから一覧を載せました。
ヴェッ!?
形式1:ToWorkSpaceブロックを使う
ToWorkSpaceブロックは、Simulinkを使う方がみんなお世話になっているブロックだと思います。(個人の主観)
なので、使い方についてここでは省略します。必要であれば、以下の公式ドキュメントをご参照ください。
・To Workspaceブロックのドキュメント(MathWorksさん公式)
今回はこのブロックで、「UAVState」データを取得することにします。
以下の画像の通り、UAVStateにはUAVの姿勢(EulerZYX)/姿勢レート(BodyAngularRate)/位置、高度(WorldPosition)/速度(WorldVelocity)が、attitude、pos_vel、gpsという名称で含まれています。これだけの情報があれば、ひとまずの目標は達成できそうです。
そして、ToWorkSpaceブロックを追加してシミュレーションを実施した結果、取得できたデータが以下の物となります。
UAVState構造体には、図2の緑枠で示した各構造体が格納されています。そして、各構造体には、さらにtimeseries型の各種データが格納されています。
これで、シミュレーション中のフライトログを取得できました。
しかし、図3だけ見ても、ちゃんとデータが取得できているのかはよく分かりません。そこで、確認のためにピッチ、ロール、ヨー姿勢をplotコマンドで可視化したものが以下の図となります。
図4単体では分かりにくいですが、『目的』の項に掲載した動画を見ると、確かにヨー姿勢は0⇒90⇒0degと変化しています。(図4はrad単位なので、degに変換すると1.6rad≒90degです。)
ヨー姿勢が変化するタイミングも、動画とデータでおおよそ同じなので、フライトログは正しく取得できていると考えて良さそうです。
さて、フライトログをワークスペースに持ってくることはできましたが、後もうひと手間必要です。というのも、このフライトログデータは、他の解析ソフトや表計算ソフトに読み込ませたい、という需要が想定されます。
そこで、「WorkSpaceのUAVStateログデータをcsvファイルに書き込む」スクリプトを用意しました。csv以外の形式で出力したい人や、UAVState以外のログデータを出力したい人はスクリプトの調整が必要ですが、基本的には以下のtxtファイルに記載したスクリプトの要領で、フライトログデータをファイル出力して頂ければよいかと思います。
形式2:Mavlinkパケットからtlog形式で保存
「Mavlink?tlog?聞きなれない単語だなぁ……。結局、何をすればいいのか全然見当つかないや」という人も多いのではないかと思います。が、実は今回の3Dシミュレーション環境の場合、フライトログのtlog形式保存は既に完了しています。
というのも、Mavlinkが「UAV ー地上コントローラ間でメッセージを送受信するための通信 プロトコル」であることは先に記載しましたが、このMavlinkはサンプルの時点でSimulink-QGC間の通信プロトコルとして既に使用されています。そして、QGCはMavlinkを介したフライトが行われた場合、その時のフライトログをtlog形式で保存する機能がデフォルトで備わっているようなのです。
実際、フライト終了後にQGCをシャットダウンすると「(QGCインストールフォルダ)/Telemetry」フォルダにtlogが生成されることを、今回確認しております。
という訳で、フライトログをtlog形式で保存できましたので、このログを解析したいと思います。Matlabには「FlightLogAnalyzer」というフライトログ解析アプリがあるので、データの可視化が非常に簡単です。「FlightLogAnalyzer」の使い方については、以下の公式ドキュメントをご参照ください。
・Flight Log Analyzer(MathWorksさん公式)
そして、今回取得したtlogをFligntLogAnalyzerで可視化したものが以下の図になります。
図5でピッチ、ロール、ヨー姿勢の波形を確認したところ、図4と同じであることが分かりました。これにより、tlogとToWorkSpaceブロックは同じログデータを取得できていることが確認できました。なお、図4と図5では時間の値が異なっていますが、これはシミュレーションを一時停止している時間が反映されているかいないかの違いだと推測されます。(今回のフライトでは、動画撮影のために最初一時停止した時間がありました)
また、tlogはFligntLogAnalyzerを使わなくても可視化できます。その方法は、やはり公式ドキュメントにまとめられており、手厚くサポートされていることが分かります。興味がある方は、そちらの方法もご参照ください。
・MAVLink フライト ログの可視化と再生(MathWorksさん公式)
……あれ? こんなに簡単な方法があるなら、最初からこれで良かったんじゃないっすか?
はい、その疑問は最もです。しかし、本形式には大きな問題があります
先ほど、QGCでtlogが保存されると説明しましたが、これは言い換えると「QGCと通信をしないとtlogは保存できない」ということになります。今後のUAV制御則開発において、これは結構由々しき問題です。
「開発の肝はトライ&エラーにある」と私は考えており、当然トライ&エラーの回数は膨大になります。その度にQGCを起動&シャットダウンするのは手間がかかりますし、そもそもQGCと連携しないシミュレーションが実施できなくなります。なので、QGCとの通信が必須になる本形式は、基本的に採用したくありません。
一応、QGC(またはSimulink以外の他のアプリ)無しでtlogを保存する方法が無いかは調査しましたが、今の所は見つかっておりません。Simulink内でログデータからtlogを生成する関数を自作することも考えましたが、これも手間が大きそうです。
以上のことから、便利な方法ではあるんですが、「今の所ちょっと使いにくいかな」というのが本音です。
形式3:PX4 ULogブロックからulog形式で保存(省略)
形式3として特出ししたものの。申し訳ありませんが、タイトルに(省略)と記載している通り、今回は本形式を深堀しません。
……というのも味気なさすぎるので、少しだけ解説をしたいと思います。
まず、ulogというのは、フライトログを特定の書式でまとめているという点で、かなり大雑把に言うとtlogの親戚のようなものです。
そして、ulogはtlogと同様にFligntLogAnalyzerが対応しています。さらに、ulog形式でログを保存するためのSimulinkブロックも存在するため、Simulink内でulogを生成することも可能そうに見えます。アドインが必要とか、実機用のブロックにも見えるという問題点はありますが。
・PX4 ULog(MathWorksさん公式)
ただし、ここで大前提の問題に当たります。このPX4、実は今後の開発で使用する予定がありません。
ハードウェアとしてPixhawkは使う予定なのですが、ファームウェアはPX4ではなく、Ardupilotを使用する予定なのです。
ネットで調べる限り、日本で活動する場合はPX4よりもArdupilotの方が都合が良さそう、というのがその理由です。
このことについては、ネットで見つけた以下の記事をご参照頂ければと思います。
・Vol.47 日本の産業用ドローンで急速に浸透するArdupilot[春原久徳のドローントレンドウォッチング](Drone Explore the Futureさん)
なお、「Pixhawk、PX4、Ardupilotって何?」と気になる方は、下記の記事をご参照ください。
私が個人的に、分かりやすいなと思った記事のリンクを掲載させていただいております。
・Pixhawkでの機体製作【1】ファームウェアについて(DAYSCAPEさん)
という訳で。将来使わない物を採用するのも勿体無いので、今回は検討を見送りたいと思います。今後、「ArudupilotではなくPX4をやっぱり使うことにした」となった場合は、改めて検討の機会を設けることにします。
結論:今後はToWorkSpaceブロックを使用する
ここまで、形式1~3について調査・検討を行いました。
その結果、今後は「形式1:ToWorkSpaceブロックを使う」の方式を採用したいと思います。
そのため、以降の記事ではToWorkSpaceブロックをシレっと追加して、特に説明なく特定のデータを確認している場合があります。
予めご了承ください。
次回記事の予定
チーン……(ざんねん。わたしの ぼうけんは これで おわってしまった。)
まだ準備段階です。始まってすらいません。
先輩の嘘つき!「もう大変なのは無い」ってモデル置換の時に言ってたじゃないっすか!
多分、とも言ってましたよ、私は。それに、ログ取得が簡単だとは一言も言ってません。
- ☑UAVモデル&制御則の変更
- ☑Unreal Engineシーン(可視化状況)の調整
☑障害物や風況などのフライト周辺環境を設定(Unreal Editorで設定できそうなので、上の『シーン調整』に統合)- ☑フライトログの取得
- 複数機同時飛行
それはそうと、タスクも残り1つっすか。……やっと、3D Sim環境構築が終わるんすね……。
まあ、この「複数機同時飛行」が本当に実施できるか、今の所はなにも確証が無いんですけどね。
!?
では、次回は12/8(金)に更新予定です。どうぞよろしくお願いします。