クワマイでもできる

クワマイでもわかる

groupタグを使って複数のロボットを同じROSスクリプトで動かす

f:id:kuwamai:20200828183007p:plain 以前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って何という人向けに簡単に絵に書いた。

f:id:kuwamai:20200829022940j:plain

同じnodeやtopicを異なるロボットが共有した場合、同じ命令を受け取って動くので動きも同じになってしまう。

f:id:kuwamai:20200829023002j:plain

groupタグのnamespaceを設定することでnodeやtopicの先頭に異なる名前をつけることができ、同じスクリプトでもそれぞれのロボットに命令を送ることができる。

参考

namespaceとrosparamの取得

rospyだとこんなかんじで取得できた。roscppにもgetNamespace()があるみたい。

ns = rospy.get_namespace()

ちなみにrosparamの取得はこんな感じ。

param = rospy.get_param("param_name")

実際に使用したスクリプトはこちら。

参考

感想

久しぶりに書いたからかなんだか日本語がめちゃくちゃになっている気がするけど許して欲しい。