ノードやトピックのリマップと名前空間
Categories:
目的
アプリケーション開発を進めるとノードやトピック等名前が衝突(複数が同一の名前)するケースがあります. このような問題を回避するための方法として,名前を変更するリマップと呼ばれる操作が有効です. また,名前空間を利用することでトピック名に任意の文字列を加えることができます. 今回はコマンドラインによりノードを起動する際にリマップする方法について学びます. より詳細なリマップの方法についてはこちらのドキュメントをご参照ください.
ノード名の変更
2つのターミナルを起動し,それぞれで下記のコマンドラインにより簡易シミュレータであるturtlesim
を起動してみましょう.
|
|
下記のコマンドラインにより起動したノードを確認してみてください.
|
|
全く同じ名前のノードが起動している場合,意図しない問題が発生する可能性があるという警告が表示されます. ノードと同様に,トピックも同じ名前で配信されるため,一方のノードから配信されたトピックを購読できない問題が発声します.
|
|
これを防ぐためには,プログラムを書き換えて実行すれば解決できますが非効率的です.
この問題を解決するために,ノードの名前を変更してノードを起動するリマップと呼ばれる操作があります.
上記で起動したノードの1つを終了し,下記のコマンドラインでturtlesim
を起動してみましょう.
引数に--ros-args --remap __node:=[node_name]
を与えることで,任意のノードの名前(下記はmy_turtle)にリマップできます.
|
|
先ほどと同様に起動しているノードを確認します.
|
|
ノードの名前が変わっていることが確認できました. 複数の同じノードを起動したい場合には,上記のリマップで対応することができますが,同一のトピックが配信,購読される問題は解決できません.
|
|
名前空間の利用
上記の問題を解決する方法の1つとして名前空間(name space)を利用する方法があります.
名前空間を利用すると,ノードやトピックの名前に/
と任意の文字列が付与されます.
名前空間を用いてノードを起動する場合には,コマンドラインでノードを起動する際に__ns:
で任意の文字列を与えます.
|
|
/turtle2
という名前空間を加えてノードを起動することができました.
名前空間を与えた際のノードとトピックの名前を確認してみましょう.
|
|
/turtle2
という名前空間を与えることで,もとのノードの名前の前に/turtle2
という文字列が追加されました.
リマップではノードの名前を任意の文字列に変更することができましたが,
名前空間を利用する方法では,元の名前に任意の文字列を加えることノードを起動することができました.
次にトピックを確認しましょう.
|
|
もとのトピック名の前に/turtle2
という文字列が追加されました.
リマップでは別々のトピックとして区別できませんでしたが,
名前空間を利用することで別々のトピックとして扱うことができます.
購読するトピック名の変更
既存のパッケージに含まれているノードを起動する際には,やり取りするトピック名が決められています. ソースコードをダウンロードして,やり取りするトピック名を変更することもできますが手間がかかります. このような場合には,ノードを立ち上げる際に配信するトピック名を変更する方法が便利です.
簡易シミュレータturtlesimを起動してください.
|
|
次にキーボード操作によりロボットを動かすノードを立ち上げます.
turtlesim
上のロボットを操作するノードが用意されていますが,今回は汎用的なノードを使用することにします.
|
|
上記のノードではキーボードによりロボットを操作することができません.
シミュレータturtlesim
が購読するトピックとteleop_twist_keyboard
が配信するトピックが一致しないためです.
やり取りしているトピックを確認してみましょう.
|
|
teleop_twist_keyboard
はトピック/cmd_vel
を配信していますが,
turtlesim
は/turtle1/cmd_vel
を購読しようとするためトピック名が一致していません.
このような場合には,ノードを起動する際にトピック名を変更して配信しましょう.
teleop_twist_keyboard
を終了して下記を実行してください.
|
|
上記のコマンドラインは,teleop_twist_keyboard
起動する際にトピックcmd_vel
をturtle1/cmd_vel
(/turtle1/cmd_vel
ではないことに注意してください)に変更してノードを起動します.
先ほどは操作できなかったロボットをキーボードで操作することが可能です.
確認のため,teleop_twist_keyboard
が配信するトピックを確認しましょう.
|
|
Publishers
を見ると/cmd_vel
ではなく/turtle1/cmd_vel
が配信されています.
オープンソースソフトウェアを利用する際には,トピック名を適切に設定しなければ動かないことが多いです.
そのような場合には,こちらの方法を採用すると任意のトピック名で配信できるため便利です.