ブラウザで描画できるライトな点群ライブラリ作ったよ
概要
世の中にはPCLやOpen3Dなど機能も豊富でものすごく洗練された点群ライブラリが多々あります。
そんな中で今回自作のpython点群ライブラリを作ったので、紹介したいと思います。
githubで公開していて、pipでインストール可能です。
pip install p3dpy
モチベーション
PCLやOpen3Dがあるのになんで点群ライブラリ作ったの? っていう話なのですが、
最近ラズパイやJetsonを使うようになってきて、
- ARMでコンパイルするのめんどくさい
- pipでサクッとライブラリ入れて動確したい
- 描画も遠隔でブラウザから済ませたい
- realsenseとかつないでリアルタイムな描画も行いたい
という思いがありました。
Open3Dであればpipでインストールできてブラウザでの描画もできるのですが、ARM用のバイナリが提供されておらず(2021年7月時点)、コンパイルとなると3rdパーティをいろいろ引き連れてくるので、もうちょっとライトなやつないのかなと思ってました。
他のpythonベースの点群ライブラリ
PCLやOpen3DはベースがC++なのでソースから動かしたい場合はコンパイルが必要になります。上記目的のために簡単にインストールできるpythonベースで書かれたライブラリもいろいろ探してみました。
PyntCloud
おそらくpythonベースの点群ライブラリの中では一番人気のライブラリだと思います。
ブラウザでの描画も可能です。
が、リアルタイム描画には対応してないみたいで、realsenseをつないで描画するのは難しそうなのと、一部Open3Dに依存しています(無くても動くようにはなっている)。
point-cloud-utils
これもベースはC++でそれをラップしてpythonライブラリにしているのですが、依存ライブラリがかなり少なく、コンパイルが楽そうです。
試してないのですが、setup.py
にC++のビルドも含まれているので、ARMでも問題なくpipインストールできるかもしれません。
ビューアが提供されていないっぽいので、pythonの他のビューアを持ってくる必要がありそうです。
ライトな点群ライブラリ作ってみた
以上を踏まえて以下のような観点でライブラリを作りました。
- C/C++を使わずに、numpy/scipyをうまく使ってpythonでもそれなりの速度を目指す
- for文をなるべく使わない、
ufunc
,frompyfunc
などをうまく使う
- for文をなるべく使わない、
- 一般的な点群処理が一通りできる(ファイル処理、フィルタリング、レジストレーションなど)
- ブラウザでリアルタイムな点群描画ができる
- 描画はthree.jsで行う
ライブラリ名のp3dpyについてですが、
p3dはpoint-3Dから来ています。 import p3dpy as pp
みたいな略称が使えると良いいなと思ってこの名前にしました。
以下が点群を読み込んで描画させるサンプルです。
サンプル実行後、ブラウザで localhost:8000
にアクセスしてください。
import p3dpy as pp
from p3dpy import VizClient
pp.vizspawn() # ブラウザ描画用のサーバ起動
client = VizClient() # 描画サーバのクライアントインスタンス
pc = pp.io.load_pcd('data/bunny.pcd') # pcdファイルのロード
pc.set_uniform_color([1.0, 0.0, 0.0]) # 色の設定
res = client.post_pointcloud(pc, 'test') # 描画サーバに点群を送信
pp.vizloop()
こんな感じでブラウザに描画されます。
Realsenseとラズパイを繋げて、ブラウザで描画
ラズパイ4とrealsense L515を繋げて、遠隔PCのブラウザで描画させてみるデモをやってみました。
まあまあリアルタイムに動いているかなと思っています。
処理としては
深度画像・カラー画像取得→3D点群構築→ランダムサンプリング→描画サーバへ送信
となっていて、実際のプログラムはここに置いています。
簡単な動作確認はこれぐらいで大丈夫そうです。
まとめ
ブラウザで描画するライトな点群ライブラリを自作して紹介しました!
ぜひ使ってみて、改善点や問題点などご意見頂けると嬉しいです!
Discussion