Unity で LiDAR センサー sweep の値を読み取って表示する
こんにちは、たるこすです。
今回は、sweep という小型の LiDAR センサーをお借りしたので、Unity から値を読み取ってみます。
sweep はレーザーを使って全方向に 40m まで距離を測ることができるセンサーです。
sweep.dll のビルド
以下のリポジトリで、sweep の SDK が公開されています。この中の libsweep をビルドすることで、sweep.dll を作成できます。
コードをクローンしたら、README に書かれている手順に従い、コマンドプロンプトを管理者権限で開いて以下のコマンドを実行します。(そうしないとビルドの際にエラーが出ます)
> cd sweep-sdk\libsweep > mkdir build > cd build > cmake .. -G "Visual Studio 14 2015 Win64" > cmake --build . --config Release > cmake --build . --target install --config Release
Visual Studio 2017 でビルドする場合は、
> cmake .. -G "Visual Studio 14 2015 Win64"
の代わりに
> cmake .. -G "Visual Studio 15 2017 Win64"
としてください。
ビルドに成功すると、 build\Release の中に sweep.dll が作成されています。
Unity からの利用
Unity プロジェクトを作成したら、先ほど作成した sweep.dll を インポートします。インポート場所はどこでも大丈夫です。
インポートした sweep.dll を選択し、インスペクターで dll のプラットフォーム設定を 64 bit 用に設定します。
空の GameObject を作成し、名前を Sweep と変更します。以下の Sweep.cs と SweepVisualizer.cs をアタッチします。
Sweep.cs では、sweep.dll のメソッドを呼び出してスキャンデータを取得しています。コルーチン内でスキャンデータの取得を行い、一度取得するたびに Action デリゲートの ScanUpdated を呼んでいます。
SweepVisualizer.cs では、Sweep.cs の ScanUpdated に自身の ScanUpdated メソッドを登録しているため、スキャンデータが取得できるたびに ScanUpdated が呼ばれます。この中で Scan データに基づいてポイントを描画します。各点について角度と距離が得られるのでそれを xz 座標の値に変換し、その位置に PointPrefab を Instantiate で作成しています。
点を表示するためのオブジェクトのプレハブを Sphere などで作成し、Sweep Visualizer の PointPrefab に設定すれば完成です。
実行
実行すると、以下のようにスキャンデータが表示されます。横並びの点が上下に動いている部分があるのは、センサデータが正しく取得できていることを確認するために本で壁を作って動かしていたためです。