概要
laserscan_multi_mergerは、ira_laser_toolsというパッケージに含まれる、複数のスキャントピックをマージしてくれるノードです。
複数のスキャントピックがある際に1つのスキャントピックに合わせてくれるのでとても便利です。マップ生成時など1つのスキャントピックだけサブスクライブしているノードに渡す時に最適です。
私はデプスカメラを複数方向に設置し、depthimage_to_laserscanでそれぞれの深度センサの画像をスキャントピックに変換した後にlaserscan_multi_mergerで1つのスキャントピックに変換して、それをgmappingに渡してマップを生成などをしています。
上記はパッケージのROSドキュメントですが、情報が少ないので、Githubレポジトリのlaunchファイルを参考にしましょう。
使い方
<launch> <node pkg="ira_laser_tools" name="laserscan_multi_merger" type="laserscan_multi_merger" output="screen"> <param name="destination_frame" value="cart_frame"/> <param name="cloud_destination_topic" value="/merged_cloud"/> <param name="scan_destination_topic" value="/scan_multi"/> <param name="laserscan_topics" value ="/scandx /scansx" /> <!-- LIST OF THE LASER SCAN TOPICS TO SUBSCRIBE --> <param name="angle_min" value="-2.0"/> <param name="angle_max" value="2.0"/> <param name="angle_increment" value="0.0058"/> <param name="scan_time" value="0.0333333"/> <param name="range_min" value="0.30"/> <param name="range_max" value="50.0"/> </node> </launch>
あまりドキュメントが豊富で無いので、Githubレポジトリのlaunch ファイルを参考にします。
ポイントは laserscan_topics というパラメータで、例えば、マージしたいスキャントピックが /scandxと/scansxだった場合に、 "/scandx /scansx" というように半角スペースで繋げます。
destination_frameはbase_linkなど、カメラがジョイントされている、ロボット本体のlinkを指定すれば良いかと思います。
次の画像は、左右に設置したデプスカメラからスキャントピックをマージしてマップを生成する例です。depthimage_to_laserscanでデプスカメラの画像をスキャントピックに変換し、それをlaserscan_multi_mergerでマージしています。
このマージ後のスキャントピックをgmappingに渡して、マップを生成することができました。
注意事項
このパッケージには注意事項があります。それは、起動時しかスキャントピックを読みに行かない、ということです。(2021年2月現在)そのため、laserscan_multi_mergerが起動した後にマージ対象のスキャントピックが起動すると、そのトピックはマージされません。
この問題は、他の人もプルリクエストを送ってくれているのですが、あまりメンテナンスされていないせいか、一向にマージされる気配がありません。
https://github.com/iralabdisco/ira_laser_tools/pull/33
そのため、対策としては、launchファイルの下の方に記述をするか、下記記事のように、起動タイミングをあえて遅くずらすか、が考えられます。
https://rb-station.com/blogs/article/ros-launch-delayもちろん、自分でコードを修正してビルドしても問題ありません。