動機
rosbagにより記録したPointCloud2
をpcdファイルに保存したい!
↓
pcl_rosならrosbag→pcdの変換が直接できるらしい(参考:[ROS] sensor_msgs::PointCloud2をpcdファイルで入出力するときのメモ)
↓
やってみる
↓
ひとつのbagファイルから大量のpcdファイルが生成
↓
楽しくない…
そこで,pcd結合パッケージを作ってみました.
GitHub: join_pcd
本記事では,pcl_rosによるbag->pcd変換方法と,作成したパッケージの概要および使い方を紹介します.
pcl_rosを使用したrosbag→pcd変換方法
まずはpcl_rosを使用して,bagファイルをpcdファイルに直接変換します.使用するツールはpcl_rosのbag_to_pcd
です.
使い方は下記.
$ rosrun pcl_ros bag_to_pcd <input file>.bag <topic name of PointCloud2> <output directory path> [<target frame >]
例えば,カレントディレクトリ内にあるhoge.bag
から/points
トピックをpcdファイルに変換するときは次のようになります.
$ rosrun pcl_ros bag_to_pcd hoge.bag /points .
上記の方法でpcdファイルは作成できたのですが,なぜか出力ファイルが1つではなく,大量に生成されてしまいました.(サイズが0のトピックが来るとendだと認識されてしまうのかもしれません)
pcd結合パッケージ作成
細切れpcdファイルを大量に所有していても何も楽しくないので,pcdパッケージを結合するパッケージを作ってみました.(リポジトリはこちら)
本記事では,簡単なパッケージ概要と使い方を紹介します.
パッケージ概要
作成したパッケージは,指定ディレクトリ内の指定pcdファイルを結合し,同じディレクトリに出力するだけのパッケージです.
pcdの読み込みおよび結合はここを参考にしました.
動作環境としては,次の2点さえ合致していれば問題ないと思います.
- OS: Ubuntu
- C++11以上
使い方
インストール方法
clone & make のみです.
$ git clone https://github.com/kazuki21057/join_pcd.git
$ cd join_pcd
$ mkdir build
$ cd build
$ cmake ..
$ make
使い方
join_pcdがあるディレクトリパスをJOIN_PCD_PATH
としたとき,下記コマンドで使用できます.
$ JOIN_PCD_PATH/build/join_pcd -i <input file name 1> <input file name 2> ... -o <output file name>
指定キーワード(-i
, -o
)の後に,それぞれの情報を入力します.
引数の指定順番はバラバラで問題ありません.また、パス指定は絶対/相対どちらでも可能です。
指定キーワードの説明は下記.
- -i: 結合したいpcdファイル名
- 拡張子の有無は関係ありません.
- ”*”または”*.pcd”を指定した場合は,指定ディレクトリ内にあるすべてのpcdファイルを入力とします.
- -o: 結合後の出力pcdファイル名
- 拡張子の有無は関係ありません.
たとえば,カレントディレクトリ内にあるa.pcd
, b.pcd
を結合し,c.pcd
を作成したい場合は次のようになります.
$ JOIN_PCD_PATH/build/join_pcd -i a.pcd b.pcd -o c.pcd
また,今回のように大量にpcdファイルが生成されてしまった場合,ディレクトリ内にある全てのpcdファイルを結合するには次のようにします.
$ JOIN_PCD_PATH/build/join_pcd -i * -o c.pcd
まとめ
pcd結合よりもC++でファイル操作するほうが面倒でした.pythonでもpcl使えるっぽいし,pythonで実装すればよかったかもです.