概要

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に渡して、マップを生成することができました。

gmappingによるマップ生成

注意事項

このパッケージには注意事項があります。それは、起動時しかスキャントピックを読みに行かない、ということです。(2021年2月現在)そのため、laserscan_multi_mergerが起動した後にマージ対象のスキャントピックが起動すると、そのトピックはマージされません。

この問題は、他の人もプルリクエストを送ってくれているのですが、あまりメンテナンスされていないせいか、一向にマージされる気配がありません。

https://github.com/iralabdisco/ira_laser_tools/pull/33

そのため、対策としては、launchファイルの下の方に記述をするか、下記記事のように、起動タイミングをあえて遅くずらすか、が考えられます。

 

時間差でnodeを立ち上げたい http://wiki.ros.org/ira_laser_tools 例えば上記パッケージの laserscan_multi_merger は複数のscanトピックを組み合わせて1つのscanトピックを吐き出してくれるnodeです。このnodeは起動時にトピックを全て取得して、laserscan_topics で設定した名前と一致していたトピックを組み合わせ用に使用しています。 しかし、組み合わせ用のトピックの取得は起動時にしか選択されないため、このnodeが立ち上がった後に起動されたscanトピックは反映されません。(記事執筆当時) そのため、全てのscanトピックが立ち上がってからnode起動を
 

 もちろん、自分でコードを修正してビルドしても問題ありません。

 

Ros

Related Posts

rosserialでLost sync with device, restarting...と出て接続が切れる時のチェックリスト
rosserialでLost sync with device, restarting...と出て接続が切れる時のチェックリスト
概要 rosserialを用いてArduinoでROSトピックをSubscribeしようとした時に、Lost sync with device, restarting... と表示されて接続が切れてしまう時に確認すべき事項をまとめまし...
Read More
rosserialを使ってArduinoで/cmd_velトピックを受信してロボット台車を動かす
rosserialを使ってArduinoで/cmd_velトピックを受信してロボット台車を動かす
概要 ROSを使って実機でロボット台車を動作させたい時に、Arduinoでシリアル通信経由でROSトピックを受信して、ロボット台車を動作させる方法を説明します。 /cmd_velは、平行移動の速度と回転速度が定義されたgeometry...
Read More
ArduinoとCAN-BUSシールドでCAN通信
ArduinoとCAN-BUSシールドでCAN通信
概要 CAN(Controller Area Network) はドイツのBOSCH社が開発したシリアル通信プロトコルです。信頼性が高く、主に自動車の制御システムに用いられていましたが、最近はIoT、ロボット台車などでもCAN通信を使...
Read More

サイトについて

RoboStationは誰でも手軽にロボットを製作できるようにすることを目的としたEC・ハウツーサイトです。