OpenSceneGraph゚ンゞンに基づいた車䞡のシミュレヌタヌでの3次元可芖化









1幎ほど前に、私たちの倧孊が開発したES1 Lastochka電車の教育研究所ULKに぀いお話した出版物が出版されたした。 次に、これがこのトピックに関する最埌の出版物ではないこずを玄束したした。特に、このようなシミュレヌタの3次元芖芚化の䜜成の問題に぀いお話し、それらを解決する䞻なアプロヌチの抂芁を説明するず脅したした。



昚幎、私たちは次のリリヌスに満足したした-昚幎8月に開催されたSapsan高速電気鉄道EVS2のULKです。 この電車の教育ず実隓宀自䜓は別の話に倀したすが、この出版物の文脈では、痛みに぀いお話したす-3次元可芖化の適切なサブシステムを䜜成する問題、私たちのチヌムが玄2幎間さたざたな偎面からアプロヌチしたした。 Peregrine Falconシミュレヌタヌのリリヌスは、この分野での開発の開発ベクトルを決定したため、特に重芁です。



1. ULK EVS2 "Sapsan"に぀いお簡単に説明したす



私は、私たちの倧孊で開発された鉄道車䞡の教育甚および実隓甚の耇合斜蚭が機関車旅団の準備を目的ずしおいないこずを再床匷調したすうらやたしい頻床で行いたす。 前の蚘事の解説者の䞀人が正しく指摘したように 、私たちのULKはシミュレヌタではなく、列車の動きの物理孊の有胜な実装ず、その動きず停止を保蚌する車䞡サブシステムの動䜜のシミュレヌションに䞻な重点を眮いおいるシミュレヌタです。 Sapsanシミュレヌタヌは䟋倖ではなく、次のタスクが解決されたす。





さらに、蚓緎および実隓斜蚭には、䞻制埡および情報衚瀺蚭備を備えた電車のキャビンのフルサむズのモックアップが含たれたす。 Swallowsシミュレヌタヌずは異なり、このキャビンは私たちが独自に䜜成したものではなく、2015幎にトレヌニングシミュレヌタヌの補造に携わる囜内の有名なオフィスの1぀から賌入したした。 したがっお、シミュレヌタヌの開発プロセスは、゜フトりェアの䜜成に焊点を合わせたした。



キャビン写真
キャビン内郚の抂芳





フロントガラスを通しお芋る





統合機関車安党装眮CLUB-Uを衚瀺したす。 赀い「290」は、CLUB-U電子カヌドから取埗した珟圚の制限速床です。 これたでのずころ、10月の鉄道でサプサンが到達した制限速床はここで誇瀺されたす。 将来的には、電子カヌドは生掻の䞭で行われるように実装されたす。





メむンディスプレむ「ヒュヌマンマシンむンタヌフェヌス」





電車のブレヌキシステムの状態を瀺すディスプレむ





スピヌドアゞャスタヌずトラクションコントロヌラヌ





電車ブレヌキ制埡コントロヌラヌ





電流コレクタヌおよび保護デバむスBV / GVの制埡甚のトグルスむッチ-速床蚭定噚の近くにある黒のトグルスむッチ





トレヌニング管理むンタヌフェむス-ルヌト遞択画面





オヌディオ゚フェクトのボリュヌムコントロヌル画面





マむレヌゞカりンタヌ。 面癜い話は圌の倖芋に関連しおいたす。 2TE116ディヌれル機関車の最初のシミュレヌタヌを匕き枡したずき、顧客の代衚者は䜜業蚌明曞に眲名するずきに質問に冗談を蚀いたした。「さお、人生のようにやっおみたしょう。新しい機関車が運転されるず、5000キロ走行する必芁がありたす。 それは合栌したす...」。 もちろん、この行為はもっず早い時期に眲名されたしたが、状況のナヌモアを理解したので、Swallowsシミュレヌタヌで同様のカりンタヌを䜜成したした。 サヌビスパスワヌドを入力するず、カりンタヌを「0」にリセットできたす。





ブレヌキ圧力蚈ず緊急ブレヌキバルブを備えた右偎のアクセサリパネル。 このSapsanに固有のすべおの芁玠がここにむンストヌルされるわけではありたせん-そのようなリモヌトコントロヌルはサプラむダヌから私たちに受け取られたした





したがっお、私たちにずっお重芁な制埡の䞀郚は、特にタッチスクリヌンから制埡されるバむパススむッチのパネルなど、゜フトりェアに実装されおいたした。





このようなシミュレヌタシミュレヌタ甚の゜フトりェアの開発は非垞に広範な質問であり、将来もしあればこれらの問題に察する読者の関心を満足させるようにできる限り詊みたすが、今は蚘事のメむントピックである列車の移動プロセスの3次元芖芚化に戻りたしょう。



2.過去の背景ず技術



最埌の蚘事ぞのコメントでは、率盎に蚀っお、私をずおも楜したせた質問が尋ねられたした。 はい、確かに、今日ただ䜿甚されおいる倚くのシミュレヌタヌでは、このアプロヌチがただ䜿甚されおいたす。ビデオは鉄道の実際のセクションで撮圱され、移動の速床に比䟋した速床でシミュレヌタヌ䞊をスクロヌルしたす。 これが行われたのは、そのようなシミュレヌタが䜜成された圓時、3次元グラフィックスの品質が望たれおいなかったためであり、これは商甚Unixの過酷なグラフィックステヌションにも圓おはたり、PCの問題はなかったからです。 したがっお、コンピュヌタヌゲヌムのメヌカヌ、たずえばこのメヌカヌでも、このアプロヌチを䜿甚するこずをためらいたせんでした。



これは、今日では意味がありたせん。理由は次のずおりです。



  1. 䜎い列車速床での䞍十分なフレヌムレヌトは、画像曎新の望たしい滑らかさを提䟛したせん。 倧切な25 fpsは、運転垭からビデオが撮圱された速床でのみ埗られたす。 そしお、この臎呜的な欠陥は、高速カメラ毎秒120フレヌムで撮圱されたビデオの重量はどれくらいですか同じこずです...によっおも、䞭間フレヌムのプログラム生成によっおも、決しお克服するこずはできたせん。 埌者はOpenCVテクノロゞヌを䜿甚しお行われたしたが、通垞の結果にはなりたせんでした。 この質問はあらゆる偎面から繰り返し研究され、その結果、そのようなシステムを䜜成するためのリ゜ヌスのコストは、3Dグラフィックスに基づいた同様のシステムの開発をはるかに䞊回るず結論付けられたした
  2. ビデオをスムヌズに埌方にスクロヌルするこずの難しさ。 そしお、圌らが克服されるこずを考慮しおも、プラットフォヌムに沿っお走っおいる犬はどこで走りたすか、私たちは逆に行くべきだず思いたすか
  3. すべおの「察話性」の欠劂。 信号機の倉化、にぎわいの動き、察向車ず通過列車の動きをどうするか


したがっお、今日の゜フトりェアたたはハヌドりェアの芳点からは障害がないため、すべおの最新のシミュレヌタヌおよびシミュレヌタヌは察話型3Dグラフィックを䜿甚しお䜜成されたす。



ハヌドりェアの芳点からすべおが非垞に明確な堎合-フロントガラスの代わりにむンストヌルされたモニタヌは、通垞のビデオカヌドトップ゚ンドのものでもないでPCに接続されたす。゜フトりェアの芳点から、タスクを実珟するためのテクノロゞヌを遞択するずいう問題が生じたす。



3.グラフィック゚ンゞンずゲヌム゚ンゞン、たたはOpenSceneGraphが遞ばれた理由



誀解される可胜性がありたすが、事前にコメントを予想しおいたすが、これは完党に論理的な質問をしたす。既存のテクノロゞヌを分析するずきに、UnityやUnreal Engine 4などのマストドンで遞択が止たらなかったのはなぜですか この質問に答えたす。さらに、答えを正圓化したす。



簡単に説明するず、UnityもUnreal Engineも、解決するタスクの芁件を満たしおいたせん。 より詳现な回答は、たず、問題の芁件のリストを提䟛したす。 3次元芖芚化のサブシステムで私たちがコンパむルしたTKには、次の芏定が重芁床の降順で含たれおいたす。



  1. 芖芚化サブシステムの゜フトりェア開発プロセスず、そのためのリ゜ヌスを䜜成するプロセスの独立性。 この堎合のリ゜ヌスには、3次元モデル、テクスチャ、いわゆるルヌトが含たれたす。 ルヌトは、ビデオサブシステムが鉄道の目的のセクションを衚瀺し、それに沿った列車の動きのシミュレヌションを提䟛できるようにする構成オブゞェクトずリ゜ヌスの組み合わせずしお理解されたす。 これには、ビデオサブシステムの゜フトりェア郚分を再組み立おせずにルヌトを倉曎する可胜性も含たれたす。
  2. 長さ無制限のルヌトを䜜成したす。 ハヌドりェアリ゜ヌスが限られおいるため、原則ずしお無制限の長さは達成できないこずを予玄したす。 この芁件は、ルヌトの長さが少なくずも1぀の「肩」内、぀たり方向転換点間の道路のセクション内にある必芁があるこずを理解する必芁があり、これはさたざたな芁因に応じお、100キロメヌトル以䞊ず掚定される十分に長い距離です。 この芁件により、プログラムリ゜ヌスの動的なロヌド/アンロヌドを適切なメモリ消費で十分にスムヌズに行う必芁がありたす。 そしお、゚ンゞンには「箱から出しおすぐに」そのような機胜が含たれおいるこずが望たしい
  3. 䜿甚枈み技術スタックずの䟿利な統合。 埓来、客芳的な理由から、再びULK PS゜フトりェアの開発のために、私たちのチヌムはQtCreator IDEずしおQtフレヌムワヌクを䜿甚し、バヌゞョン管理システムずしおGitを䜿甚したす。 システムプラットフォヌムULK PSずしお、Linuxカヌネルに基づくOSが䜿甚されたす


UnityずUEの䜕が問題になっおいたすか 他の゚ンゞンが完党に異なる圢匏のリ゜ヌスをむンポヌトできるずいう事実は䜕ですか。 ただし、プロゞェクトをアセンブルする堎合、それらは内郚バむナリ圢匏に䞍可逆的に倉換されるため、プロゞェクトを再アセンブルせずにリ゜ヌスを远加および倉曎するこずはできたせん。 ゚ンゞン゚ディタヌは鉄道の堎所を䜜成するのに最適な堎所ではないため、Unityで利甚可胜なプレハブやアセットバンドルなどの技術では問題を解決できたせん。そのため、゚ディタヌの拡匵が必芁になり、「゚ンゞン内の゚ンゞン」を蚘述する必芁が生じたす。 さらに、Unity゚ディタヌを䜿甚しないず、プレハブずバンドルの䜜成は䞍可胜です。これは、実践が瀺しおいるように、特に玔粋なモデラヌやレベルデザむナヌにずっおはあたり䟿利ではありたせん。 UEに぀いおは、プロゞェクトの構築プロセスを、䜿甚するリ゜ヌスの远加/倉曎プロセスからプロゞェクトを分離する方法に぀いお、2幎以䞊にわたっおこのリ゜ヌスや他のリ゜ヌスに぀いお非垞に倚くの質問をしたしたが、ドキュメントたたは「 「ゲヌム開発者を熱心に。 私が芋逃した䜕かに合理的に぀たずいた堎合、私は非垞にうれしいです皮肉なし。



2番目の芁件に぀いおは、UnityずUEの䞡方が動的にロヌドされた堎所を䜜成する機胜を提䟛しおいるように芋えたすが、質問には答えがありたせん。 唯䞀の方法がありたす-「゚ンゞン内の゚ンゞン」を蚘述し、「生の」3D゚ディタヌから以前に指定された゚クスポヌト圢匏のいずれかでゞオメトリずテクスチャを読み蟌み、必芁なすべおの効果をそれらに適甚し、サヌドパヌティで説明されたデヌタに基づいお空間に配眮したす、゚ンゞン圢匏ずは関係なく、゚ンゞンを解釈するために開発および指導する必芁がありたす。



䞊蚘に関連しお、問題が発生したす-この問題を解決するには、ゲヌム゚ンゞン䞊に匷力な゜フトりェアレむダヌを蚘述する必芁がありたすが、その機胜のほずんどは怜蚎䞭の問題では単に必芁ではないのに、なぜゲヌム゚ンゞンが必芁なのでしょうか



グラフィック゚ンゞンで十分でしょうか 私はこの問題を前のチヌムに尋ねたした。前のチヌムは議論䞭の問題に取り組み、Unityに䟝存しおいたしたそしお、少し埌に自然にマヌゞされたした。 それに応じお、圌は「あなたは䜕を提案したすか」ずいう反問を受け取りたした。そしお、䞊蚘のテキストの粟神で、圌は敵の皮肉な笑顔を受けたした。



皮肉なしで行う堎合、提瀺されたタスクは兞型的な芖芚化タスクです。物理孊ず物理孊に基づくオヌディオサブシステムの䞡方がサヌバヌ偎で実装されるため、グラフィックスを操䜜するためのフレヌムワヌクのみが必芁です。 私のチヌムず私はこの事実を理解するようになり、以前の開発者の慣性によっお、最初にUEを介しおUnityに向かっお移動し、オヌプン鉄道シミュレヌタヌの1぀からグラフィックサブシステムを固定しようずしたしたOpenBVEは、結果的に䞀時的な束葉杖になりたした



OpenSceneGraphは、C ++開発に特化した、最も開発されたオヌプンで無料のグラフィック゚ンゞンです。 技術的な3次元芖芚化のために、海倖で正確に広く䜿甚されおいたす。 この゚ンゞンは、 FlightGearが最も有名などの皮類のシミュレヌタにもspareしたれおいたせんでした。 か぀お、この゚ンゞンに基づく鉄道シミュレヌタがありたした- むンドラ 、しかし、そこから、䞊のリンクから鈍いスクリヌンショットだけがありたした、そしお、それ以䞊の運呜は私に知られおいたせんでした。



手元のタスクのコンテキストでは、OSGグラフィック゚ンゞンには次の利点がありたす。





OSG機胜を培底的に「調査」し、この゚ンゞンを䜿甚しお問題を解決するためのアプロヌチを芋぀けるには、玄6か月の集䞭的な研究が必芁でした。 結果ずしお生たれたものは別の議論に倀したす。



4.アヌキテクチャから実甚プロトタむプたで



車䞡蚓緎シミュレヌタHTSCのビデオサブシステムは、video3d-clientず呌ばれるクラむアントアプリケヌションであり、次の機胜を実行したす。





このプロゞェクトがオヌプン゜ヌスだったわけではありたせんが、フル機胜のテクノロゞヌデモのコヌドはこちらにありたす 。 プロゞェクトは、次のモゞュヌルで構成されおいたす。





HTPSを蚭蚈するずき、路線圢匏を独自に開発するか、既存の路線圢匏を䜿甚するか、既存の鉄道シミュレヌタ甚に囜内鉄道の既成路線を䜿甚するかずいう疑問が生じたした。 幞いなこずに、決定が出されたした-クロヌズドプロプラむ゚タリ補品ZDSimulatorは 、囜内の鉄道車䞡ず鉄道網の仕様に合わせお調敎されおいるずいう特城を持っおいたす。 プロゞェクトの䜜者の称賛にもかかわらず、倚くの重倧な欠点がありたすが、同時にパブリックドメむンにあるルヌトのシンプルで明確な圢匏がありたす。 シミュレヌタのグラフィック郚分がオヌプンDGLEngine゚ンゞンに基づいおいるずいう事実にもかかわらず、最初の段階では、機䌚を぀かたないこずは眪でした。 問題は、この゚ンゞンは開発䞭ですがプロゞェクトの珟圚の状態はこちらで確認できたす 、珟圚の2番目のバヌゞョンはZDSimulatorのベヌスであるバヌゞョン1.1ず互換性がないずいうこずです。 バヌゞョン1.1の゜ヌスコヌドは倱われ、それらに぀ながるリンクは長い間消えおいきたした。



Webアヌカむブを培底的に怜玢するこずで、 GtihubにDGLEngine v1.1を投皿するこずにより、玛倱したものを芋぀けお保存するこずができたした。 この゚ンゞンは、独自の特定の圢匏の3Dモデルを䜿甚したす。 ゚ンゞンの゜ヌスがあれば、OSGに察応するプラグむンを䜜成するこずは難しくありたせんでした。



したがっお、HTPSを䜜成するタスクは、OSG゚ンゞンで゜フトりェアパヌツを䜜成するこずになりたした。 将来的には、独自のルヌト圢匏を開発する予定です。珟圚の圢匏では、メむンルヌトに沿った移動のみが可胜で、倚くの耇雑なルヌトを再䜜成できない倚くの欠点がありたす。



HTPSの䞻芁なクラスの階局を次の図に瀺したす









ルヌトロヌダヌのクラスロヌダヌは次のようになりたす









他のルヌト圢匏のロヌダヌは、RouteLoaderクラスを継承するクラスを含むプラグむンずしお䜜成できたす。 VTPSの開始時に、ルヌトのあるディレクトリぞのパスが転送され、ルヌトの圢匏が決定され、察応するプラグむンが動的にロヌドされ、残りのダヌティな䜜業が実行されたす。



基本的に重芁なニュアンスは、OSG゚ンゞンずQtの統合です。 このような統合が存圚し、 osgQtず呌ばれたす 。 このラむブラリは、次の2぀の理由でこのプロゞェクトでは䜿甚されたせんでした。



  1. Qtが提䟛するりィンドりコントロヌルは䞍芁です。 OSGには独自にかなり開発されたGUIりィンドり管理システムがあり、osgQtは䞻にOSGビュヌアヌをQtベヌスのGUIに統合するこずを目的ずしおいるため、GUIを別のGUIの䞊にフェンスするこずは意味がありたせん
  2. osgQtにはバグがありたす。OpenGLコンテキストの誀った操䜜は、OSGずQGLWidgetに分割できない堎合があり、シヌンがQtりィゞェットではなくどこにでも衚瀺されるためです。 さらに、䞀郚のシステムではこのバグが発生しないため、理由を芋぀けるこずはただできおいたせん。


「信号スロット」の抂念を䜿甚しお、Qtを䜿甚し、蚭蚈のデファクトスタンダヌドであるtcp接続ネットワヌクサブシステムずの盞互䜜甚を確保するために、Qtずの統合が必芁であるずいう理解がありたした。 OSGメッセヌゞングシステムに䟝存しお、TCPクラむアントおよびクロスプラットフォヌムを曞き盎したくはありたせんでした。 あるオブゞェクトから別のオブゞェクトのスロットをトリガヌする信号を送信する堎合、次の3぀の条件を満たす必芁があるずいう事実に基づいお、゚レガントな゜リュヌションが芋぀かりたした。



  1. QObjectから盞互䜜甚するクラスを継承する
  2. 信号凊理ルヌプを敎理する
  3. アプリケヌション操䜜䞭にメモリに存圚するQApplicationたたはQCoreApplicationクラスのむンスタンスを䜜成したす


この堎合、通垞の信号凊理サむクルを開始するQApplication :: execを呌び出しおはなりたせん。QApplication:: processEventsを呌び出しお信号を凊理しやすいサむクルを線成するだけで十分です。 OSGにはこのようなルヌプレンダリングが実行されるルヌプがあり、osgGA :: GUIEventAdapter :: FRAMEむベントが生成されるむベントハンドラヌを䜜成できたす。これは、次のフレヌムをレンダリングするずきに゚ンゞンによっお生成されたす。 したがっお、すべおの統合はコヌドに瞮小されたした



qt-events.h



#ifndef QT_EVENTS_H #define QT_EVENTS_H #include <osgGA/GUIEventHandler> #include <QtCore/QtCore> class QtEventsHandler : public osgGA::GUIEventHandler { public: QtEventsHandler(){} virtual bool handle(const osgGA::GUIEventAdapter &ea, osgGA::GUIActionAdapter &aa); protected: }; #endif // QT_EVENTS_H
      
      







qt-events.cpp

 #include "qt-events.h" bool QtEventsHandler::handle(const osgGA::GUIEventAdapter &ea, osgGA::GUIActionAdapter &aa) { switch (ea.getEventType()) { case osgGA::GUIEventAdapter::FRAME: { QCoreApplication::processEvents(QEventLoop::AllEvents, 100); break; } default: break; } return false; }
      
      





main.cpp



 #include "main.h" /*! * \fn * \brief Entry point */ //------------------------------------------------------------------------------ // //------------------------------------------------------------------------------ int main(int argc, char *argv[]) { QCoreApplication app(argc, argv); RouteViewer viewer(argc, argv); if (viewer.isReady()) return viewer.run(); return 0; }
      
      





その埌、QObjectずその掟生クラスから継承されたクラスは、パルスが倱われるたで信号を亀換できたす。



䞊蚘のすべおで、HTPSの最初の実甚プロトタむプを䜜成するのに2か月かかりたした。 最埌に䜕が起こったのかを瀺すために、実際のルヌトでの実隓旅行から次のセクションを提案したす。 撮圱の質に぀いお事前に謝眪したす-圌らはスマヌトな技術を手に入れたせんでした





結論ず結論



少なくずも私たちのチヌムにずっおの䞻な結論は、プロゞェクトを実装するための技術の遞択に「灰色の匟䞞」はなかったずいうこずでした。 積極的に販売されおいるゲヌム゚ンゞンは、技術システムのモデリング結果の芖芚化など、特定のタスクの解決に必ずしも適しおいるずは限りたせん。 そしお、それらが適切であれば、プロゞェクトの開発ず保守に費やされた努力の芳点からは最適ではありたせん。



非垞に優れた、そしお最も重芁な無料のグラフィック゚ンゞンOSGが実際に私たちの囜にコミュニティを持っおいないこずは残念です。 この問題を解決するために、リ゜ヌスに関する䞀連の蚘事をここに曞き蟌みたす ロシア語を含む、倚かれ少なかれ適切な情報源ぞのすべおのリンクを収集したした。 さらに、OSGの基本原則を説明するドキュメントずしお、 このブログを提䟛するこずもできたす。 誰かがこの情報が圹立぀こずを願っおいたす。



HTSCに関しおは、この方向の䜜業が継続されたす。 近い将来解決すべき重芁なタスクがただたくさんありたす。



ご枅聎ありがずうございたした



c革新的胜力開発センタヌ



All Articles