ワントゥーテンCT部エンジニアの服部です。
今回はとある案件にて、”ある明るさの一定でない部屋の各ポイントに、人がいるかいないか”を天井からセンシングする需要があったため、普段は中々手を出せない3DLidarを使ってみました。
3DLidarを使うことにした理由
今回センシング対象となるエリアは、当初の想定では30m×20mとかなり広く、センサの設置高さは8mということでした。
この時点で、カメラなどであれば約124°×104°のFOVが必要ということになり、選定できるものがなかったので、普段は高価でなかなか使うことのない3DLidarを選定しました。
選定したLidar
Hesai Technology QT128
今回は前述した測定条件に合致するものとして、Hesai Technology社のQT128を選定しました。
スペックとしては
- FOV 水平: 360°
- FOV 垂直: 105.2°
- 測定距離: 0.1~50m
- 測定ポイント数: Single:846,000点/秒 Dual:1,728,000点/秒
と、十分過ぎる性能でした。レーザーは垂直128本です。
自動運転用途の製品ですので、角度によってレーザーの密度に偏りがあるため、場所によって検出精度に差が出てしまう可能性がありましたが、128本あれば十分であろうと判断しました。
もう少し安価な性能の低いLidarを二台使ってもよかったのですが、キャリブレーションや運用のしやすさの観点から高性能なLidarを一台の構成にしています。
開発環境
一応公式のAPIが公開されているようでしたが、ドキュメントが少なく、かつSDKなども用意されていませんでした。
自動運転用途のセンサーなので、ROSのパッケージが用意されており、そちらで動かしたほうがシミュレータなども流用できてよさそうだったので、今回はROS2上で動かすことにしました。
https://github.com/HesaiTechnology
稼働PCのOSはWindows10 IoT Enterpriseですので、今回はWindows10上のWSL2内にROS環境を構築します。
ROS2を使うメリット
ROSとは、Robot Operating Systemという、主にUbuntu上で稼働するロボットアプリケーション構築のためのミドルウェアです。2014年ごろから徐々に2への移行が始まっています。
ロボット関連の開発に役立つツール群や、開発環境がモリモリとインストールされるのですが、今回は中でも、Rvizというシミュレータを使ってセンサ値の可視化ができることと、ROS2環境内でのPub/Subによるメッセージングを利用できることが大きなメリットです。
ROS2のメッセージングについて
ROSではPub/Sub、Service、Actionの三つの通信方式が提供されますが、今回はPub/Sub通信を利用します。
ROSでは主なセンサーごとにメッセージの型が決まっており、ROSのパッケージを介してセンサーと通信することで、ROSの型に適応した形でメッセージが配信されます。今回の場合は、3DLidarのデータがPointCloud2型で配信されます。
https://docs.ros.org/en/melodic/api/sensor_msgs/html/msg/PointCloud2.html
つまり、ROSを介することで、別のLidarを用いたり、何らかのダミーのデータを用いたりした場合でも、受信側は変わらず同じソースを使えるということです。また逆も然りで、PointCloud2型を受信しているソースであれば、別のセンサーを用いたプロジェクトのものでもある程度流用できます。
これは大きな利点で、今回のようにデバイスがとても高価で、使っている人がほとんどおらず、参考にするソースもない時など、すごく助かります。
また、これらのメッセージに対して、個別にQoS(Quality of Setvice)が設定でき、リアルタイム性や信頼性の部分など、細かく調整することができます。
https://docs.ros.org/en/rolling/Concepts/Intermediate/About-Quality-of-Service-Settings.html
実際のセンシング
WSL2にUbuntu24.04をインストールし、そこにROS2 Humble を入れ、HesaiLidar_ROS_2.0をビルドしました。
https://github.com/HesaiTechnology/HesaiLidar_ROS_2.0
WSL2上でセンサーの値を受信するためにはネットワークアダプタをブリッジせねばならず、その点が少し面倒ですが、センサーと疎通後は難なく値の表示までできました。
PointCloud2型のSubscribeプログラムはPythonにて作成し、状況確認のためのGRIDなどの表示情報Publishしています。
人の検出は、単純に規定エリア内の点群の高さの値が閾値を超えるかどうかで判断しています。
本来なら、リファレンスとなる値を設定して、そことの差分をとるべきですが、今回要件では必要なさそうでしたので、処理負荷や設定の簡略化を考えてそのようにしました。機会があれば、機械学習でのHuman Detectionなんかも試してみたところですね。
コンテンツとの連動
センシングの状況は逐次コンテンツ表示アプリに送られます。動画はデバッグ用画面のものですが、私の移動に応じて、判定されているポイントが赤く塗られるのがわかると思います。
最後に
ロボットが大好きでROSも勉強したのに、なかなか使う機会がなくて悲しい。センシングばかりじゃなく、アクチュエータも動かしたい。弊社メンバーには、ハードウェアも含めてロボット好きなメンバーも沢山いるので、もっとROS案件来たらいいのに。こういうのを一緒に楽しめる方、ぜひJoinしましょう!