同一のノードを複数起動する方法

目的

アプリケーション開発を進めると,同じノードを複数起動したいケースが出てきます.単純に同じノードを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

それでは,こちらのノードでロボットを動かすことができるか確認しましょう.