2018年3月20日火曜日

PCL関係の素敵なツール!

概要
みなさん、PCL使ってますか?
そう、点群処理ライブラリとして有名なやつです。
LiDARやKinectなどから取得された点群はPCLを使っていろんな処理が可能になるのですが、
点群の回転とか移動をいちいちソースコードで書くのはだるいなと思っていました。
しかし,コマンドを打つだけでそれらが可能になることを知ってしまったので、
僭越ながら、共有させて頂きたいと思います。


実行環境
  • Ubuntu 14.04 (3.13.0-107-generic)
  • PCL 1.7.2
  • ROS Indigo

pcl_tools
pcl_toolsはrosとかを使わなくても点群の処理が簡単にできるツールです。

とりあえずインストールは以下のようにすれば大丈夫だと思います。
sudo add-apt-repository ppa:v-launchpad-jochen-sprickerhof-de/pcl
sudo apt-get update
sudo apt-get install libpcl-all

これから説明するコマンドは,そのコマンドだけ打てばヘルプが表示されるので
よく使うオプションを説明します。


pcl_viewer


pcl_viewer input.pcd <options>

-multiview 0/1           = enable/disable auto-multi viewport rendering (default disabled)

これは,複数のファイルを一つのviewerに表示するか分割されたveiwerに表示するかを選べます。
点群処理する中で、一番重宝するのではないでしょうか。確認用によく使ってます。色は選べません。

pcl_voxel_grid


pcl_voxel_grid input.pcd output.pcd <options>

-leaf x,y,z = the VoxelGrid leaf size (default: 0.010000, 0.010000, 0.010000)

点群が密なときに、ダウンサンプリングとして使います。



pcl_transform_point_cloud


pcl_transform_point_cloud input.pcd output.pcd <options>

-trans dx,dy,dz = the translation (default: 0.0, 0.0, 0.0)
-axisangle ax,ay,az,theta = rotation in axis-angle form (rad)
-scale x,y,z = scale each dimension with these values

点群の回転や移動に使います。
-axisangleは回転したい軸(ax,ay,az)を0/1で指定し,回転角をラジアンで指定します。



pcl_passthrough_filter


pcl_passthrough_filter input.pcd output.pcd <options>

-field X = the field of the point cloud we want to apply the filter to (default: z)
-min X = lower limit of the filter (default: 0.000000)
-max X = upper limit of the filter (default: 1.000000)
-inside X = keep the points inside the [min, max] interval or not (default: 1)

fieldで軸を設定し、その軸のmin,maxで指定した部分以外を削除します。insideは指定する範囲を反転させるかどうか。
軸ごとでしか実行できないので、すこし大変ですが,後述するpcl_rosの方ではもっと楽にできます。



pcl_ply2pcd


pcl_ply2pcd input.ply output.pcd <options>

-format X = ascii, binary, binary_big_endian, binary_little_endian

plyファイルをpcdファイルに変換してくれるやつです。
formatはasciiを指定した方がよさそう?
場合によっては,plyファイルとの相性が悪く変換できてないことが多いです。


pcl_ros

pcl_rosはROSを使って点群を操作するために使われるやつです。
こちらも,ROS使っている人なら重宝するツールが盛りだくさんです。

bag_to_pcd


rosrun pcl_ros bag_to_pcd input.bag topic_name output_folder

bagファイルの全フレームをpcdファイルに変換します。
あんまり必要無いかもしれませんが一応ということで。

pcd_to_pointcloud


rosrun pcl_ros pcd_to_pointcloud input.pcd <interval> <parameters>

_frame_id (default: base_link)
topic_name (default: cloud_pcd)

pcdファイルをpointcloudデータとしてPublishします。
intervalはsleep周期で,0.1にすれば10HzでPublishされます。
ros_parameterは2つで、frame_idはrvizなどで表示するときには必須で,連結リンクの先を原点とする点群の時もそのリンク名を書かないといけないですね。
変更の仕方は、
_frame_id:=<frame_name>
cloud_pcd:=<topic_name>

ですね。

pointcloud_to_pcd


rosrun pcl_ros pointcloud_to_pcd input:=<topic_name> <parameters>

_prefix
_fixed_frame

これは、pcd_to_poincloudの逆ですね。
sensor_msgs/PointCloud2型のtopicをpcdに保存します。注意なのは、sensor_msgs/PointCloudは使えません。
_prefixはフォルダを指定できます。指定しなかった場合,現在のフォルダか.rosフォルダに入ります。
一方、_fixed_frameはtfを使って任意の座標に変換してから保存できます。しかし、apt-getで取得したpcl_rosでは機能しないようです。
自分で作るしかないです。公式のgithubのソースコードにはかいてあったのでそれを参考に作成しました。てか、それをコピペしたら動くと思います。(たぶん)

その他

point_cloud_converter

PointCloud型<->PointCloud2型の相互変換を行いtopicとして配信する。

PointCloud->PointCloud2
rosrun point_cloud_converter point_cud_converter_node points_in:=<PointCloud topic>

PointCloud2->PointCloud
rosrun point_cloud_converter point_cud_converter_node points2_in:=<PointCloud2 topic>

どちらもoutputのトピック名を変更することができる。(詳細





0 件のコメント :

コメントを投稿