3D Sim環境構築(5) 複数機同時飛行①

本記事の要約

  • 複数機同時飛行を行うための手法を調査しました。
  • parsim関数を使って複数機同時飛行を実施してみました。

技術猫たちのおしゃべり

先輩、前回の終わりで不穏なこと言ってたっすけど……。

あぁ、はい。「今回の複数機同時飛行は、本当に実施できるか確証が無い」という話ですね。

下手をすると、頑張っても甲斐なし、って結果になるかもしれないんっすか?

報われる保証はできませんね。

……前回で3DSim環境完成ってことにしません?複数機を同時に飛ばすなんて状況、今後無いっすよ、きっと。

あるので駄目です。なーに、試してみたら意外とアッサリできるかもしれませんよ。

怖いフラグ立てるの、止めて欲しいっす。

はじめに

という訳で、おはようございます、こんにちは、こんばんわ。
サバトラ先輩です。

本記事では、『3DSimで複数のUAVを同時飛行させる方法』を記載しております。
宜しければご覧ください。

なお、前回の『3D Sim環境構築(4) フライトログ取得』からの続きとなっていますので、
宜しければそちらの記事を先にご覧ください。


複数機同時飛行の目的

実はチャ坊主くんが懸念している通り、記事作成時点で複数機を同時に飛ばす状況と言うのはあまりありません。
私が知っている中でも、実用化されているのはドローンショーでの群制御くらいでしょうか。オリンピックの開会式でも行われた演出ですね。
なので、UAVを飛ばす時は大体1台です。周辺空域にいるのは鳥ぐらいです。

しかし、これはあくまで『今まで』の話。先端研究の面では複数機連携や群制御のも積極的に行われています。つまり、小型のUAVを集めて、何か大きなことをしでかそうという試みをしているのです。
また、近年はUAVに関する法整備も進んでおります。この法整備が進んだ先には、数多のUAVによる空の交通網形成が待っていることでしょう。この交通網の中では、UAVは車と同じように各々の都合・思惑で飛行することになります。この場合は連携・協調もへったくりもありません。互いが互いを障害物と認識して、各々が自分で衝突回避を行う他ないでしょう。

つまり、今後のUAV飛行空域では、複数機が同時に飛んでいることが当たり前になってくるのです。となると、これから開発するUAVは、周囲に航空機がいる前提でなければなりません。連携飛行を行うつもりがなくとも、自分に向かって飛んでくるUAVを避けれる機能が必須なのです。

以上のことから、複数機同時飛行を3DSim環境で実装することは必須であると言えます。群制御や交通網を想定するなら、少なくとも4~5台は同時に飛ばせるようになりたいですね。


複数機同時飛行の実装方法案

さて、複数機同時飛行を実装していきたいのですが、ここではまずChatGPTに相談してみることにします。

ChatGPT会話履歴

現在、私はMATLAB/SImulinkを使ってドローン開発をしています。
このSimulinkでは、Unreal Engineと接続してフォトリアリスティックな3Dシミュレーションをできるようにしていますが、動かせる機体は1機だけです。
今後を見据えて、複数機の機体をフォトリアリスティックな3Dシミュレーションで飛行できるようにしたいのですが、どうすれば実現できますか。

MATLAB/SimulinkとUnreal Engineを連携させてドローンのフォトリアリスティックな3Dシミュレーションを行う際に、複数のドローンを動かすためにはいくつかの方法が考えられます。以下に主なアプローチを紹介します。

  1. カスタムコーディング: SimulinkとUnreal Engineの間のインターフェースをカスタマイズして、複数のドローンを制御するためのコードを書く。これには両方のプラットフォームに関する深い理解とプログラミングスキルが必要です。
  2. 既存のSimulinkブロックの拡張: Simulinkには、Unreal Engineと連携するためのブロックがいくつかあります。これらのブロックを使って、複数のドローンに対応するように拡張することも可能です。
  3. Unreal Engineのレベル設計: Unreal Engine側で複数のドローンが操作可能な環境を設計し、Simulinkからの信号を各ドローンに適切にルーティングする方法を考える。この方法では、Unreal Engineのレベル設計とプログラミングスキルが重要になります。
  4. 外部のシミュレーションソフトウェアとの統合: 他のシミュレーションソフトウェアを利用して、Unreal Engineと連携させる。例えば、ROS (Robot Operating System) などのロボットシミュレーション環境を用いることで、より高度な複数ドローンの制御が可能になる場合があります。

どの方法を選択するかは、プロジェクトの要件、利用可能なリソース、およびチームのスキルに依存します。複数のドローンのシミュレーションは複雑なため、関連する技術の文献やフォーラム、専門家の意見を参考にすることも有効です。また、MathWorksのサポートやコミュニティフォーラムで具体的なアドバイスを求めるのも一つの手です。

上記のようにChatGPTは回答してくれましたが、この4つの手法、明らかに一筋縄では行きません。
1は単純に難易度が高く、2は1つのslxファイル内に複数機体の制御則を実装することになるためブロック数の制限に引っかかり、3はSimulinkからの複数UAVの信号を送信する手法が不明であり、4は別のソフトが必要になります。これはいずれも、現在の3DSim環境を大幅に改造することになり、煩雑さが増してバグの温床となりえます。

……先輩、これは僕の脳が溶けちゃうかもしれないっす(絶句)

うーん、準備段階でこれらの手法は、流石に採用したくないですね……

ということで、他に手軽な方法が無いかを探すため、今度はMathWorksさんの公式ヘルプで検索してみました。すると幸いなことに、いくつか興味深い話を見つけることができました。

1.MATLABセッション*1を複数起動する。
まずは、参考にしたページのリンクを記載します。
MATLAB を同期的に起動する(MathWorksさん公式)
MATLAB を非同期的に起動する(MathWorksさん公式)
既存の MATLAB セッションへの接続(MathWorksさん公式)
これらの記事は、複数機同時飛行について述べているものではありませんが、「MATLABセッションを複数起動して、それぞれのセッションでUAV飛行シミュレーションを行えばいい」というヒントを指し示しています。
必要であれば同期も可能なようですし、これは選択肢として有力です。問題があるとすれば、MATLABを複数起動するので、メモリがかつかつになる点でしょうか。

*1:「MATLABセッションとは何か?」を具体的に定義した記述が見つからなかったので推測になりますが、Matlabを起動して立ち上がった物がMATLABセッションなのだと思います。

2.parsim関数を使用する。
ユーザーコミュニティ内で、「これは凄い!」という記事を見つけることができました。
MATLAB + Simulink で複数のシミュレーションを一気に実行!(MathWorksさん公式)
記事を見る限り、モデル名/パラメータ/外部入力を設定して、複数のシミュレーションを一度に実行することが可能なようです。このことから、飛ばしたいUAVのモデルを別々に用意してやれば、parsim関数で複数同時飛行を行える可能性が極めて高いと考えられます。

この1・2の方法は少し経過が異なりますが、どちらも「複数のUAV飛行シミュレーションを実行する」点で同じ物と考えられます。これは既存の3DSim環境をほぼ変更する必要が無さそう(Simulink-UnrealEngine間の通信を除く)な手法であり、実装の手間を考えてもベストな手法なのではないかと思います。

ということで、今回はこの「2.parsim関数を使用する」手法を試してみたいと思います。ちなみに、1ではなく2を選択した理由は「せっかく関数が用意されているので使ってみよう」という好奇心1つです。


parsim関数使用前の準備

今回は、『3D Sim環境構築(1) 導入』で使用したモデルをベースに、3機のUAVをparsim関数で同時に飛行させてみましょう。
そこでまずは、色違いのUAVを用意します。図1に示すのは、元々モデル内にあったUAVの設定ブロック(UAVはBlue)をコピペして、一部設定を変更した追加ブロックです。変更した設定は図2をご参照ください。

次に、Blue、Red、GreenのどのUAVを選択するかを、変数の設定値で決定できるようにします。これはサブシステムの「バリアント」という機能で実現しますが、実はバリアントはサンプル時点で使用されており、今回はそのバリアントの設定を少し変更するだけで作業は完了します。具体的には、図3の通り「isPhotoRealisticSim」という変数で使用するブロックが選択されるようになっていますので、ここにRed、Greenのブロックの設定を追加すればOKです。

また、「isPhotoRealisticSim」は別のサブシステムのバリアント選択肢でも使用されています。図3の変更に合わせて、図4、図5の通りにこちらも変更しておきましょう。

さて、これで基本的な3機のUAVを用意できました。
しかし、ここからシミュレーション実施完了までにいくつかエラーが発生しました。以下に、その内容と対処法をまとめます。

  • Lidar点群情報が描画できず強制終了される。
    :Lidar点群情報はpcplayer関数で実装されていますが、このpcplayer関数がOpenGL対応ではないことが原因のようでした(公式ドキュメントを見ると、figureプロパティのみOpenGLオプションをサポートしているらしいです)。ただ、Lidar点群情報をリアルタイムで描写する必要はないので、今回は図6に示す該当描画ブロックをコメントアウトすることで対応したいと思います。なお、ここではUAV正面画像の描画ブロックはコメントアウトしていませんが、parsimを実行した際は何故か正面画像も描画されなくなっていました。
  • データ ディクショナリには未保存の変更があり、シミュレーションを正常に実施できない。
    :Red、Greenは既存のブロックをコピペしたわけですが、どうやらこの時に「BusPositionVelocity」というバス情報もコピーしているようです。このため、プロジェクトのバス情報などを管理するデータディクショナリに変更が入っていました。ただ、該当のブロックを確認しても「BusPositionVelocity」が見つかりません。恐らくですが、どうもこのバスは制御に影響を与えていないようです。
     なので、今回は追加されていた「BusPositionVelocity」を削除し、元々のデータディクショナリを用いてシミュレーションを実施しました。この対処法が適切かどうか分からないので、要すれば後日検証したいと思います。

parsimで複数機同時飛行を実施

さて、準備も完了したので、早速3機同時飛行を実施してみましょう。
以下のスクリプトを実行して、シミュレーションを開始します。

for i = 3:-1:1
  in(i) = Simulink.SimulationInput("uavPackageDelivery");
  in(i) = in(i).setVariable("isPhotoRealisticSim",i+1);
end
out = parsim(in,'TransferBaseWorkspaceVariables', 'on')

3機同時飛行

動画を見る限り、別々のUnreal Engineシーンで飛行しているものの、3機同時飛行は実現できているようです。このことから、parsim関数を使用した複数機同時が可能であることが確認できたと言えます。

ただ、3機のUAVが別々のシーンで飛行しているのは問題です。この別々のシーンで飛行している原因は、『3D Sim環境構築(3) 飛行環境(Unreal Engine)をカスタマイズ』にも登場した「Simulation 3D Scene Configuration」ブロックの[シーン ソース] パラメータにあると考えられます。
具体的に言うと、現在はこのパラメータを「Default Scene」にしていますが、「Default Scene」の場合は「それぞれのシミュレーションで別々にUnreal Engineを立ち上げているため、同一環境で飛行しないんじゃないか」と想定されます。まあ、同一シーンに接続するためのインターフェース設定も何も無いので、当たり前と言えば当たり前ですね。

また、これ以外にも、1つ気になる問題があります。それは、「各シミュレーションが同時に実施されない場合がある」ということです。
これについては、まず以下の参考動画をご確認ください。

2機飛行後、1機だけ飛行

上記の動画は、3機同時飛行を実施した場合と全く同じ手順でシミュレーションを実施しています。つまり、シミュレーションを実施した時に、全シミュレーションが同時に実施されるかが運任せの状態になっているのです。
これは困りました。可能性としては「CPU&メモリ限界のため、一部シミュレーションが後回しになっている」状態なのではないかと予想していますが、今の所は真相は闇の中です。参考までに、1,2,3機飛行時のCPU、メモリ使用率を以下に記します。

  • 3機飛行:CPU 51%、メモリ16GB 使用(シミュレーション1回目)
  • 2機飛行:CPU 48%、メモリ18GB 使用(シミュレーション2回目)
  • 1機飛行:CPU 25%、メモリ18GB 使用(シミュレーション2回目)

上記のリストを見ると、3機飛行が成功した1回目と比べると、2,1機飛行となってしまった2回目のシミュレーションの方が、1機辺りのCPU/メモリ使用率が多いことが分かります。正確に言うと、メモリはシミュレーション中一貫した使用量ですが、これは予め並列プールが用意されているためだと考えられます。いずれにせよ、1回目よりも2回目の方が使用量が多いことは確かです。
そして、このCPU/メモリ使用率、リストを見ると分かる通り、かなり多いです。すぐCPU&メモリ限界に到達しそうなことは用意に想像できます。2回目のシミュレーションでは、限界に到達したので2機と1機に分けた線はやはり濃厚です。

これは結構由々しき問題ですが、現状ではどうしようもない面もあるので、一旦解決は保留にしたいと思います。もしかしたら、現在は3機を別々に描写しているため、よりCPU/メモリ/GPUが重くなっているのかもしれません。なので、今後に同一環境飛行を実現したら自然と解消されていることを期待しましょう。


次回記事の予定

ん?あれ?今回はこれで終わりっすか?

はい、話が長くなってきたので、一旦ここで切りたいと思います。

了解っす。いや~、ChatGPTの回答を見た時はどうなるかと思いましたが、意外となんとかなりそうで良かったっす。

それはどうでしょうか。

えっ、何故にまだ不穏なことを……。だって、もう複数機飛ばすのはできたじゃないっすか。後一息でしょ?

いえ、最後の「同一環境で飛ばす」というのが一番の難題だと思ってます。ひょっとすると、今回よりも長くなるかも。

……そうっすか。……あっ、僕お腹が痛くなる予定なので、次回はお休みするっす。

腹痛の予定なんて今まで聞いたことないですが。では、次回は12/14(木)に更新予定です。どうぞよろしくお願いします。