ROSではもちろん画像処理のみならず点群処理も扱うことが多い.そこで点群処理用にはpcl_rosで提供されている.
またpcl_rosの他に、Nodeletの仕組みを扱うことでパフォーマンスを低下させない工夫まで準備されている.
Nodeletの役割
Nodeletを使わない場合、点群処理をした時にどういうことが起きるかについて.
Nodeのみでカメラから取り出した点群をmsgにシリアライズして馬鹿でかいデータ(初代Kinectとかだと30万点?とか)をtopicに投げます.
一つ目に通すのが例えば範囲を狭めるPass Throughフィルタだったとします.
Pass Throughで関係ない点群を除去したら、次は法線推定等でしょうか?
二つ目に法線推定するとしたら、先ほど受け取って変換したPassThroughフィルタで再度msgにシリアライズして再度ちょっと小さくなった未だ馬鹿でかいデータを法線推定nodeが待っている次のtopicに投げます.
法線推定Nodeでは法線情報を作ったのでさきほどもらった点群に法線データを付け加えてつぎのnodeに…
以下たくさんのnodeに渡していく…
とやっているとネットワークが点群データでパンクしてロボットは各Nodeで通信できなくなって停止してしまう、ガクガクしてしまうなど…とてもros全体が機能できなくなってしまいます.
そこでNodeleteの登場です.
NodeletはNode間のやりとりをZero Copy Transportによってコピーなくして同じプロセス内でポインタを渡すだけでtopicの受け渡しを実現します.そうすると上記のようなネットワークを圧迫する必要もなくmsgの変換も必要なくなります.点群処理など重たい処理などは最後の抽象的な情報とかを取り出すところまで一つのNodeletに入れておいた方が無駄な転送がなくなります.pclを使って実装しているものは基本的にNodeletの形で提供している気がします.
挙動はNodeとほとんど同じになります.一つのプロセスに複数のNodeを詰め込んだのがNodeletになります.
必要があるかはわかりませんが、Nodeletで実装したものは、Standaloneな通常のNodeとしても使うことができます.(起動時にオプション指定)
ただし、お決まりさえ守れば簡単に書けますが、Nodeletは実装がやや特殊になります.
PCLのNodeletを立ち上げるLaunchファイル
PCLのNodeletを立ち上げるサンプルは以下にあります.
http://wiki.ros.org/pcl_ros/Tutorials/ExtractPolygonalPrismData%20segmentation
見ていただいたらわかりますが、立ち上げているものは全てnodeletのNodeです.
NodeleteManager役が一人
それ以外にManagerに必要なNodeをロードするNodeが複数います.
NodeletManagerには名前がついているので, Nodeではその名前を指定してどのManagerにpcl_rosのNodeletをロードするかを明記します.
<node pkg=”nodelet” type=”nodelet” name=”normal_estimation” args=”load pcl/NormalEstimation pcl_manager” output=”screen”>
このケースの場合は、法線推定のNodeをnormal_estimationの名前でpcl/NormalEstimationのNodeをpcl_managerというNodeletManagerにロードしています.
上記のようなlaunchを書けばNodeletは簡単に立ち上げることができます.
Comments