目的
アプリケーション開発を進めると,同じノードを複数起動したいケースが出てきます.単純に同じノードを2つ立ち上げると,同一のノードが起動したことを検知して,早く起動したノードが自動的に終了します.この問題を回避するための方法として,ノードの名前を変更するリマップと呼ばれる操作が有効です.ここでは,rosrunによりノードを起動する際に,ノード名及びトピック名を変更する方法について学びます.
ノード名の変更
通常のノードの起動方法では,同一のノードを複数立ち上げることができません.同一のノードを複数立ち上げるためには,ノードの名前を変更する必要があります.この操作をリマップと呼びます.
例えば,パッケージ「turtlesim」の「turtlesim_node」を2つ起動する場合には,下記のように実行します.2つ目のコマンドの「__」はアンダーバーが2つ連続していますので注意してください.
ターミナル1
$ rosrun turtlesim turtlesim_node
ターミナル2
$ rosrun turtlesim turtlesim_node __name:=my_turtle
__nameは,ノードの名前を表すオプションです.2行目のコマンドでは,ノードの名前をmy_turtleに変更しています.それでは,ノードの一覧を出力するコマンドにより,起動しているノードを確認しましょう.
名前空間の利用
先ほどの方法では,turtlesimのノードを2つ立ち上げることができました.それでは,どちらか1つのturtlesimだけをトピック通信(rostopic pubを使用)により動かしましょう.おそらく2つのturtlesimが同じように動いたはずです.その理由は,2つのノードの名前を区別することができましたが,トピック名は全く同じであるためです.試しに下記のコマンドでトピック名を確認しましょう.
$ rostopic list /rosout /rosout_agg /turtle1/cmd_vel /turtle1/color_sensor /turtle1/pose
配信する際には,ノードを指定することができないため,このままではどちらか一方のturtlesimのみを動かすという操作ができません.このような問題を解決するには名前空間(name space)を使用する必要があります.名前空間を使用する場合には,下記のようにオプション「__ns」を用いて名前空間を与えます.それでは,先ほど立ち上げたturtlesimを終了して下記のコマンドを実行しましょう.なお,実行する際にはroscoreを立ち上げ直しましょう(rosnode killでturtlesimを終了している場合には不要です).
ターミナル1
$ rosrun turtlesim turtlesim_node
ターミナル2
$ rosrun turtlesim turtlesim_node __ns:=my_turtle
上記コマンドを実行した後,起動しているノードを確認してください.3つのノードが起動していれば正常です.次に,トピックの一覧を確認しましょう.turtlesimに関する2つのロボット分のトピックが表れていることが確認できます.
トピック名を変えてノードを起動する方法
既存のパッケージに含まれているノードを起動する際には,やり取りするトピック名が決められていることがあります.ソースコードをダウンロードして,やり取りするトピック名を変更することもできますが面倒です.そこで,ノードを立ち上げる際にトピック名を変更する方法を学びましょう.まずはキーボード操作によりロボットを動かすノードを立ち上げます.turtlesim上のロボットを操作するノードが用意されていますが,今回は汎用的なノードを使用することにします.
$ rosrun teleop_twist_keyboard teleop_twist_keyboard.py
こちらのノードを起動するとロボットの操作方法が表示されますが,こちらの方法ではturtlesim上のロボットを動かすことができません.次に,こちらのノードが購読,配信するトピックを確認してください.こちらのノードが配信するトピック名は「/cmd_vel」,turtlesimが購読するトピック名は「/turtle1/cmd_vel」と,配信及び購読するトピック名が一致しないため,このままではturtlesim上のロボットを動かすことできないことがわかります.このような場合には,ノードを起動する際にトピック名を変更する必要があります.トピック名を変更する場合には先ほどのリマップ操作と似ており,変更したいトピック名:=変更後のトピック名とします.
$ rosrun teleop_twist_keyboard teleop_twist_keyboard.py cmd_vel:=/turtle1/cmd_vel
それでは,こちらのノードでロボットを動かすことができるか確認しましょう.