前回、PCLの環境構築をやりました。
関連ページ:Point Cloud Library(PCL) 1.8.1の環境構築
今日は、それに引き続いてPCLのコードを書いてみようと思います。
まずは一番基本となるところとして、直接、場所や色を指定して作成したPointCloudをビューワーで見るということをやってみます。
あまり難しい部分もないので、ソースコードを以下に載せます。
今回は「PointXYZRGBA」という型の点群を利用しました。これは位置(XYZ)と、色情報(RGBA)を全て持つことができる点群の型です。
以下のようなコードで10×10のサイズの点群を作成し、
// PointCloudの大きさを決定 p_cloud->width = 10; p_cloud->height = 10; p_cloud->points.resize(p_cloud->width * p_cloud->height);
for文を回して点群を直接作っていくだけです。各要素は「.x」「.r」等でアクセスすることができます。今回は色は全て赤(r=255)とし、zを0.0で固定したため、10×10の点群が正方形になるようにx-y平面に表示されるはずです。
// 直接、値を入力してPointCloudを作成 for (int h = 0; h < p_cloud->height; h++) { for (int w = 0; w < p_cloud->width; w++) { pcl::PointXYZRGBA &point = p_cloud->points[w + h * p_cloud->width]; point.x = w * 0.1; point.y = h * 0.1; point.z = 0.0; point.r = 255; point.g = 0; point.b = 0; point.a = 0; } }
加えてビューワーも作ってみます。
// ビューワーの作成 pcl::visualization::CloudViewer viewer("PointCloudViewer"); viewer.showCloud(p_cloud); // ビューワー起動時の一回だけ呼ばれる関数をセット viewer.runOnVisualizationThreadOnce(viewerOneOff); // ビューワー起動中の毎フレーム実行される関数をセット viewer.runOnVisualizationThread(viewerPsycho); // ビューワー視聴用ループ while (!viewer.wasStopped()) { }
ビューワーを作成し、そこに表示するポイントクラウドを与えます。
その後、「runOnVisualizationThreadOnce」で最初に一回だけ実行される関数を、「runOnVisualizationThread」でビューワー表示中に繰り返し実行される関数を記述します。
最後に、視聴用のループを書きます。
最初に実行すると、ビューワーが開き、 以下のような奇妙な画面が表示されます。「なんだこの三色は?」となるかもしれませんが、マウスのホイールを回して引いていくとわかります。
座標軸を示す赤と緑の線が写っているだけでした。
少々見づらいですが、視点を遠ざけると赤い点が10×10で100個表示されているのがわかると思います。ちゃんと点群を作れているようです。
PCLを用いた点群の作成を行いました。点群の位置を手打ちして、直接点群を入力するということはそうないかもしれませんが、最も基本的な使い方になると思います。
今後は、用意された点群ファイルなどを読み込んで、ビューワーで表示させたり、逆に作った点群を何らかの形式で保存したりする部分に着手してみたいと思います。