groupタグを使って複数のロボットを同じROSスクリプトで動かす
以前2台のマニピュレータをそれぞれ右手用、左手用に分担させて動かした。制御自体はほぼ同じだけど手先位置のtopic名だけ違う名前にする必要がある。topic名だけ異なるスクリプトを2つ書いてもいいけど、roslaunch実行時の引数で切り替えができるようにgroupタグのnamespaceを設定してみた。
動作環境
- Ubuntu 18.04
- ROS Melodic Morenia
以前やったこと
group tag
下記のように記述することでnodeやrosparamにまとめてnamespaceが設定できた。今思えば左右さえ識別できればいいのでparamとnamespaceの両方を指定する必要は無かったけど気にしない。
<?xml version="1.0"?> <launch> <arg name="arm_name" default="raspigibbon"/> <arg name="arm_lr" default="r"/> <group ns="$(arg arm_name)"> <param name="arm_lr" value="$(arg arm_lr)"/> <node pkg="raspigibbon_vr" name="vr_controller" type="vr_controller.py" /> </group> </launch>
下記コマンドでroslaunchを実行すればnodeがpublishするtopicの前に/raspigibbon_r
と/raspigibbon_l
がつくようになる。
$ roslaunch raspigibbon_vr arm_controller.launch arm_name:=raspigibbon_r arm_lr:=r $ roslaunch raspigibbon_vr arm_controller.launch arm_name:=raspigibbon_l arm_lr:=l
namespaceを分けるイメージ
そもそもnamespaceって何という人向けに簡単に絵に書いた。
同じnodeやtopicを異なるロボットが共有した場合、同じ命令を受け取って動くので動きも同じになってしまう。
groupタグのnamespaceを設定することでnodeやtopicの先頭に異なる名前をつけることができ、同じスクリプトでもそれぞれのロボットに命令を送ることができる。
参考
namespaceとrosparamの取得
rospyだとこんなかんじで取得できた。roscppにもgetNamespace()
があるみたい。
ns = rospy.get_namespace()
ちなみにrosparamの取得はこんな感じ。
param = rospy.get_param("param_name")
実際に使用したスクリプトはこちら。
参考
感想
久しぶりに書いたからかなんだか日本語がめちゃくちゃになっている気がするけど許して欲しい。