概要
ゲームエンジンGodotでROSのノードとして動作する点群ビジュアライザを作ってみました。
作ったもの:https://github.com/ymd-stella/godot_ros_pcviz
Godot
https://github.com/godotengine/godot
Godotはオープンソースのゲームエンジンです。
UnityやUnreal Engine 4に比べて知名度が低いですが、軽量で簡単に使えるという大きな利点があります。
Godotをセットアップ
以下からダウンロードしてunzipしたら実行形式のファイルを入手できます。
https://godotengine.org/download/linux
godot-cpp
https://github.com/GodotNativeTools/godot-cpp
Godotの標準のスクリプト言語はGDScriptというpython似の言語ですが、GDNativeを使うとC++でプラグインを作成できます。
これを利用してGodot上でROSノードを動かします。
バージョン3.1のbranchを使ってCmakeでビルドしました。
Godotのノードとシーン
Godotではカメラ、描画対象などをノードとして扱います。
各ノードにはスクリプトをアタッチして振る舞いを変えることができます。
ノードは子ノードを任意の個数持つことができるので、ツリー構造を作ることができます。
このツリー構造をシーンとして保存することができます。
点群ビジュアライザを作るために描画を行うImmediateGeometryと視点の設定を行うCameraを含むシーンを作成しました。
カメラ操作
GodotのGUI上でカメラ初期位置を設定することが可能です。
良さそうなアセットが見つからなかったのでとりあえず実行中のマウス操作は無しにしました。
カラーマップ
OpenCVを利用してparula(matlabのデフォルトカラーマップ)で色付けしました。
Rvizのrainbowよりも強弱が直感的になって良さそうです。
ROSノードを動かす
Godotのノードのメソッドをオーバーライドして、PointCloud2のSubscriber生成、ros::spinOnce()の実行、ImmediateGeometryの生成・操作をしています。
(コマンドライン引数は取れないのでダミーデータをros::initに渡しました)
最後に
100行程度のC++コードでシンプルな点群ビジュアライザを作ることができました。
後は、rvizと同等のカメラ操作を可能にするスクリプトとtfを処理するプラグインを作れば使えるようになりそうです。