#初めのスラッシュは必要なの?
ROSのパブリッシャーやサブスクライバーを作成する時に、
パブリッシャーなら、「どんな名前でパブリッシュするか」、
サブスクライバーなら、「何という名前のものをサブスクライブするのか」を必ず決めると思います。
コードで言うと
pub = rospy.Publisher("pub_name", Image, queue_size=1)
sub = rospy.Subscriber("sub_name", Image, img_cb)
の"pub_name"と"sub_name"にあたる部分です。
この時のパブリッシャ名やサブスクライバ名の頭にスラッシュが入ったり入らなかったりする場合があって、なんの意味があるのかな?と思っていました。
"/pub_name"
"pub_name"
"/sub_name"
"sub_name" こんな感じです
入れても入れなくても動作が変わらないので、何のためなのか分からなかったのですが、つい最近判明しました。
#結論
launchで呼び出して起動するときに、パブリッシャー名やサブスクライバ名にネームスペースをつけることができるのですが、これを反映させるかさせないか、と言うものでした。
スラッシュをつけたならば、ネームスペースが適用されません。
逆に、スラッシュをつけない場合のみ、ネームスペースが反映されます。
#具体例
具体例を交えて説明しますと、
#!/usr/bin/env python
#coding: utf-8
import rospy
from sensor_msgs.msg import Image
def img1_cb(a):
print "1"
def img2_cb(b):
print "2"
if __name__ == '__main__':
rospy.init_node('hoge') #node作成
pub1 = rospy.Publisher('/pub_name1', Image, queue_size=1)
pub2 = rospy.Publisher('pub_name2', Image, queue_size=1)
sub1 = rospy.Subscriber("/sub_name1", Image, img1_cb)
sub2 = rospy.Subscriber("sub_name2", Image, img2_cb)
while not rospy.is_shutdown():
rospy.spin()
と記述して、パブリッシャとサブスクライバを2つずつ作ります。
そして、launchファイルで
<launch>
<group ns="namespace">
<node pkg="tttest" name="new_name" type="hoge.py" />
</group>
</launch>
としたものを記述し、
ネームスペースをnamespace、ノード名をnew_nameとして起動するようにします。そしてこれを
roslaunch test hoge.launch
で起動します。
なんという名前をパブリッシュ、サブスクライブしているか確認するために、
rosnode info /namespace/new_name
と実行して確認してみると、
Node [/name_space/new_name]
Publications:
* /pub_name1 [sensor_msgs/Image]
* /rosout [rosgraph_msgs/Log]
* /name_space/pub_name2 [sensor_msgs/Image]
Subscriptions:
* /name_space/sub_name2 [unknown type]
*
* /sub_name1 [unknown type]
となっています(一部抜粋)。
スラッシュをつけたものは、hoge.pyで設定した名前そのままになっており、
スラッシュをつけないものは、hoge.launchで設定したネームスペースが頭についていることが分かります。
ずっと疑問に思っていたものが分かってすっきりしました。
同じように疑問に思っている人の疑問が晴れたなら幸いです。