【ROS】一つのlaunchファイルで複数のロボット・PCを動かす

Sat Jul 6 11:24:11 JST 2019 (modified: Sat Jul 6 17:36:48 JST 2019)
views: 8463, keywords:ROS この記事は最終更新日が5年以上前のものです。

 このまえ、ロボットとPCで動かすノードのlaunchファイルを一つにまとめようとして、こちらの記事を参考にさせていただいたのですが、ネットワークで少しハマったので手順の実例を出しておきます。.bashrcを一切いじらなかったからかもしれません。

やりたいこと

 PC側で動かすノードとロボット側で動かすノードを、PC側から一斉に立ち上げたい。

前提

 ロボット側、PC側の別々のlaunchファイルでちゃんとシステム全体が動くように、ネットワークが設定済み。

launchファイル

 まず、こんな感じでlaunchファイルを用意します。この例はRaspberry Pi MouseでCartographerを利用してSLAMをするためのlaunchファイルです。

大事なのは、ロボット側のノードを立ち上げている部分で、抜粋すると、

  <!-- ROBOT SIDE -->
     <machine name="raspimouse" address="raspimouse" env-loader="/home/ubuntu/env.bash" user="ubuntu" password="ubuntu" />

     <node machine="raspimouse" pkg="raspimouse_ros_2" name="motors" type="motors" required="true" />

     <node machine="raspimouse" pkg="joy" name="joy_node" type="joy_node" required="true">
       <param name="autorepeat_rate" value="3" />
     </node>

     ・・・以下略・・・

となります。詳しい話は私が参考にした上記ブログの記事に詳しいですが、要点は、

  • machineというノードを準備して通信の設定
    • addressのホスト名は/etc/hostsに書いた通りに
  • machineenv-loader属性で、ノードを立ち上げる前に呼び出すスクリプトを指定
    • ロボット側でsource ~/.bashrcをする操作に相当
  • ロボット側(この例だとraspimouse)で立ち上げたいノードに、machine属性を加える

ssh

 で、これでroslaunchしてうまくいくこともありますが、最初に試したときはうまく通信できませんでした。次のようなエラーが出ます。

Unable to establish ssh connection to [ubuntu@raspimouse:22]: Server u'raspimouse' not found in known_hosts

ということで調べたら次のようなページに当たりました。

どうやら~/.ssh/known_hostsに記録があるとダメなことがあるようで、ロボットのIPアドレスやホスト名に関する記録を全部消した上で、

ssh ubuntu@raspimouse -oHostKeyAlgorithms='ssh-rsa' 

と手でログインして、RSAアルゴリズムを使うように指定なおさないといけないとのことです。

ロボット側で起動するシェルスクリプトを書く

 最後に、launchファイルで指定した/home/ubuntu/env.bashというスクリプトを書きます。

#!/bin/bash -xv

   exec 2> /tmp/remote_kick_log.txt

   source /opt/ros/melodic/setup.bash
   source /home/ubuntu/catkin_ws/devel/setup.bash
   export ROS_HOSTNAME="raspimouse"
   exec "$@"

こちらを参考にしました。

これで、たぶんちゃんと立ち上がるようになります。

もう少し詳しい解説

 こんなシェルスクリプトを書かなくても~/catkin_ws/devel/env.shでよさそうなのですが、

error launching on [raspimouse-0, uri http://ubuntu:39355/]: Connection refused
   Launch of the following nodes most likely failed: raspimouse_ros_2/motors, joy/joy_n
   ode, raspimouse_game_controller/logicool_cmd_vel.py, urg_node/urg_node

というようにノードをうまく見つけてくれません。

 また、env.bashの最終行のexec "$@"は、env.bashに与えられた引数をそのまま実行して、さらにこのシェルスクリプト自体を実行したプログラムでexecして置き換えてしまうという意味を持ちます。

 PC側のログを見ていると、

launching remote roslaunch child with command: [env ROS_MASTER_URI=http://note:11311
   /home/ubuntu/env.bash roslaunch -c raspimouse-0 -u http://note:43485/ --run_id 1639c
   576-9f94-11e9-82c0-001c420e53eb]

env.bashを呼び出しているところがありますが、env.bash$@には、このログ中の「roslaunch -c raspimouse-0 -u http://note:43485/ --run_id 1639c576-9f94-11e9-82c0-001c420e53eb」という文字列が入ります。で、exec "$@"roslaunch -c ...が実行されます。環境はenv.bashsourceしたものが読み込まれているので、これがroslaunchに伝わって、roslaunchがノードを見つけてくれます。

 env.bashにしかけた/tmp/remote_kick_log.txtを見ると、

exec "$@"
   + exec roslaunch -c raspimouse-0 -u http://note:43485/ --run_id 1639c576-9f94-11e9-82c0-001c420e53eb

と、roslaunchexecで実行されている様子が分かります。execについては、私の講義資料をご参考ください。

ということで

 ロボットをいじるのにはネットワークとシェルの知識が必要という典型的な例だと思います。これをロボットの人が勉強するのは大変なのですが・・・とてもいい本があります。bashでウェブサイトを作るという本で、シェルとネットワークの話が一緒に出てきます。

photo
フルスクラッチから1日でCMSを作る_シェルスクリプト高速開発手法入門 改訂2版 (アスキードワンゴ)
[上田 隆一 後藤 大地]
ドワンゴ 2019-07-05 (Release 2019-07-05)

(powered by amazon-item v0.2.1)

宣伝すみません!おしまい。

ノート   このエントリーをはてなブックマークに追加 
 

prev:梅雨こそ読みたい技術書10選 next:日記(2019年7月6日)

やり散らかし一覧

記事いろいろ