今回は野外(公園)にてLight Detection and Ranging (LiDAR)のセンサーによる3Dマッピングと解析を行います。

この実験は林業におけるIT(ドローン+センシング)を活用した生産管理の効率化を目的としており、「どこに、どのくらいのサイズの木があるか」を管理できる仕組みを意識して行いました。例えば下記のような3Dマップを作成し、このデータから木とそのサイズだけを取り出すようなものです。

ビルドした3Dマップのデモ
ビルドした3Dマップのデモ

I. ハードウエア

  • 1.LiDAR

    Light Detection and Ranging (LiDAR)は光を用いたリモートセンシング技術の一つで、パルス状に発光するレーザー照射に対する散乱光を測定し、遠距離にある対象までの距離やその対象の性質を分析するものです。

    LiDARデータの一例
    LiDARデータの一例

    LiDARシステムは小型化・軽量化が進んでいるだけでなく、需要の高まりとともにLiDAR市場への新規参入が増え価格も下落傾向にあるため、UAS (Unmanned Aircraft Systems)にも気軽に搭載できるようになりました。

    LiDARを搭載したUAS
    LiDARを搭載したUAS

    今回はVelodyne Puck(VLP-16)というセンサーを使います。

    重さは約800gと軽量です。

    ドローンにマウントする前にテストとしてドローンのバッテリーとVLP-16のモバイルセットアップを使って、アウトドア環境の3Dマップを作成しました。

    Velodyne Puck(VLP-16)
    Velodyne Puck(VLP-16)
  • 2.ハードウェアセットアップ

    機器接続
    機器接続

    LaserデータはVlp-16からLanケーブルを通じてRaspberry Pi(Raspi)に送信されます。Raspiは受信したデータを保存します。

    Drone batteryをVlp-16の電源として使用するには、DC-DC power converterを使う必要があります。テストで使用したハードウェアは下記の3点です。

    • Drone battery: 22.2 VDC Output, 99Wh
    • Velodyne Puck Lite(Vlp-16): 9-18VDC Input
    • DC-DC power converter: Input voltage: 8-35V, Output voltage: 1.5-24V adjustable
    ドローンバッテリー
    ドローンバッテリー
    DC-DC power converter
    DC-DC power converter

LiDARを搭載したドローンによる対象物撮影

実際に上記のハードウェア構成でLiDARを搭載したドローンで撮影を行いました。この撮影による計測結果は後述します。

II. ソフトウェアセットアップ

  • ROS(Robot Operating System)

    Laserデータをレコードするため、Ubuntu 16.04で動作するRobot Operating System(ROS)のKineticバージョンを使います。Raspi向けROSのインストール済みImagesをダウンロードして利用するのが簡単です。

  • Velodyneデータ保存セットアップ

    以下のコマンドでVelodyneのドライバをインストールします:

    sudo apt-get install ros-kinetic-velodyne

    次に、Velodyneを起動してLANケーブルでRaspiとの接続を設定した後、Velodyneのドライバノードを起動します:

    roslaunch velodyne_pointcloud VLP16_points.launch

    以下のコマンドでLaser scanデータを保存できます:

    rosbag record -a -O velodyne.bag

    また、保存したファイルは後で再生することが可能です:

    rosbag play velodyne.bag –clock
  • 3. PCL(Point Cloud Library)

    3Dマップの表示と計算のため、 「Point Cloud Library」を使います。Point Cloud Library (PCL) は2次元/3次元ポイントクラウド処理を行う、オープンソースのフレームワークです。

III. 3Dマップをビルド

  • SLAM(Simultaneous localization and mapping)

    保存したデータは独立したフレームです。3Dマップをビルドするためには独立したフレームのデータと位置情報を合成しなければなりません。GPSで取得した各フレームに該当するセンサーの位置情報があれば合成しやすいですが、建物や樹木などの遮蔽物が多く存在する環境ではGPS信号の捕捉が難しいため精度が低く、正確なデータとはいえません。

    そこで、各フレームから位置情報を計算することにします。隣接のフレームのデータを比較して、センサーの移動を計算することで位置を測定します。マップをビルドするために位置計算し、そして位置計算をするためにマップを利用します。このような技術をSLAM(Simultaneous localization and mapping)と呼びます。

  • 3Dマッピング結果

    マッピング結果 マッピング結果

    マッピング結果 マッピング結果

    マッピング結果 マッピング結果
  • 3. PCLのノイズフィルターを使う

    上記の結果サンプルにも表れていますが、計測誤差によっていくつかのデータにはノイズが発生します。これによって局所的な点群の3次元特徴を推定するのが困難になることがあります。

    これらの外れ値(outlier)の一部は、各点の近傍に統計分析を行い、一定の基準を満たしていないものをトリミングすることによって除外することができます。

    今回はPCLのRadiusOutlierRemovalを使いました:

    
    pcl::RadiusOutlierRemoval radius_outlier_removal;
    radius_outlier_removal.setInputCloud(cloud);
    radius_outlier_removal.setRadiusSearch(0.05);
    radius_outlier_removal.setMinNeighborsInRadius(50);  
    pcl::PointCloud filtered_cloud;
    radius_outlier_removal.filter(filtered_cloud);
    

    上記のソースコードは任意のポイントの半径0.05以内のポイント数が50以下の場合、そのポイントをoutlierと扱い削除します。

    ノイズフィルター前
    ノイズフィルター前

    ノイズフィルター後
    ノイズフィルター後

IV. 計測結果

メジャーによる実測値 メジャーによる実測値

SLAMによる計測値
SLAMによる計測値: 約229cm/メジャーによる実測値: 約239cm

メジャーによる実測値
SLAMによる計測値: 約68cm

SLAMによる計測値
メジャーによる実測値: 約58cm

まとめ

今回3Dマップをビルドするため、SLAMという技術を用いました。

SLAMはインプットデータのフレームによってはマッピングできない場合もあるため、その時、アウトプットにノイズが増えてしまいます。

そこでPCLを使用します。PCLは様々なポイントクラウドの処理をサポートしています。今回はノイズフィルターを使うことによって多くのノイズを削除できました。今後はPCLのオブジェクト認識も実践していきます。

今回は弊社にて開発した事例のごく一部を紹介いたしました。弊社はシステム開発を会社として、パッケージソフトの販売ではなくお客様のニーズに合わせた”受託開発”を専門としています。本記事に記載された技術に関するご質問や、利活用のご相談などがございましたらお気軽にお問い合わせください。