複数のPCでROSを使う時の設定


この記事の内容には最新版があります!

コマンドが更新されている(便利になっている)ので,

https://qiita.com/RyodoTanaka/items/0791044a4780543f58fa#_reference-25aeb4b4049b1195b4e1

上記記事をご覧ください!!


はじめに。。。

はじめまして。RyodoTanakaと申します。

Qiitaで初めての投稿です。QiitaはMarkdownで書けるということで、始めてみました。

Qiitaでは、ROSとかLinux(主にUbuntu)辺りで手に入れたTipsを備忘録として記していきたいと思います。

よろしくお願いします。


早速

さて、最初の投稿ですが・・・


複数台のPCでROSを使うことって無いですか?

ROSを始めてすぐの時は、あまり考えていないと思いますが、いろいろ使っていくと、



  • Gazeboを走らせるPCとプランニング(MoveIt!)を走らせるPCを分けたいなぁ

  • 移動ロボットに載せるPCをサーバーにして、手元のPCで状態を確認したいなぁ

なんていう欲求が出てくると思います。いや、出るはずです。。!

そんな時、ROSを使えば、環境変数の設定だけで簡単に実現できるのですが、

それでも設定が面倒くさいです。。。orz

で、結論から言うと、mu-777さんと全く同じ発想だったんですが、これを自動化したいなぁと思って以前作った

rosaddressコマンドを紹介したいと思います。


本体

ということで、早速本体です。

コピペして使ってみてください。

使い方とかは、次項で触れます。


rosaddress.bash

#!/bin/bash

function _func_rosserver() {
if [ -z "$eth0_addr" ]; then
echo "No eth0 connection..."
if [ -z "$wlan0_addr" ]; then
echo "No wlan0 connection..."
export ROS_MASTER_URI=http://localhost:11311
unset ROS_HOST_NAME
unset ROS_IP
echo ""
echo " !!CAUTION!! "
echo " There're no Ethernet connection."
echo " We CAN NOT set this PC to ROS server."
echo ""
else
echo "There are wlan0 connection"
export ROS_MASTER_URI=http://${wlan0_addr}:11311
export ROS_HOST_NAME=${wlan0_addr}
export ROS_IP=${wlan0_addr}
export PS1="\[\033[41;1;33m\]<ROS_server>\[\033[0m\]\w$ "
fi
else
echo "There are eth0 connection"
export ROS_MASTER_URI=http://${eth0_addr}:11311
export ROS_HOST_NAME=${eth0_addr}
export ROS_IP=${eth0_addr}
export PS1="\[\033[41;1;33m\]<ROS_server>\[\033[0m\]\w$ "
fi

env | grep "ROS_MASTER_URI"
env | grep "ROS_HOST_NAME"
env | grep "ROS_IP"
}

function _func_rosclient() {
if [ -z "$1" ]; then
echo $1
echo "Input the ROS server's IP address.'"
else
if
[ -z "$eth0_addr" ]; then
echo "No eth0 connection..."
if [ -z "$wlan0_addr" ]; then
echo "No wlan0 connection..."
export ROS_MASTER_URI=http://localhost:11311
unset ROS_HOST_NAME
unset ROS_IP
echo ""
echo " !!CAUTION!! "
echo " There're no Ethernet connection."
echo " We CAN NOT set this PC to ROS client."
echo ""
else
echo "There are wlan0 connection"
export ROS_MASTER_URI=http://$1:11311
export ROS_HOST_NAME=${wlan0_addr}
export ROS_IP=${wlan0_addr}
export PS1="\[\033[44;1;33m\]<ROS_client>\[\033[0m\]\w$ "
fi
else
echo "There are eth0 connection"
export ROS_MASTER_URI=http://$1:11311
export ROS_HOST_NAME=${eth0_addr}
export ROS_IP=${eth0_addr}
export PS1="\[\033[44;1;33m\]<ROS_client>\[\033[0m\]\w$ "
fi
env | grep "ROS_MASTER_URI"
env | grep "ROS_HOST_NAME"
env | grep "ROS_IP"
fi
}

function _func_roslocal() {
export ROS_MASTER_URI=http://localhost:11311
unset ROS_HOST_NAME
unset ROS_IP
export PS1="\[\033[42;1;33m\]<ROS_local>\[\033[0m\]\w$ "
env | grep "ROS_MASTER_URI"
env | grep "ROS_HOST_NAME"
env | grep "ROS_IP"
}

function _func_rosexit(){
export ROS_MASTER_URI=http://localhost:11311
unset ROS_HOST_NAME
unset ROS_IP
export PS1="\u@\h:\w\\$ "
}

function _func_comp_rosaddress(){
local cur=${COMP_WORDS[COMP_CWORD]}
if [ "$COMP_CWORD" -eq 1 ]; then
COMPREPLY=( $(compgen -W "server client local exit" -- $cur) )
fi
}

function _func_rosaddress() {
# Get now eth0 or wlan0 IP address
eth0_addr=$(ip -f inet -o addr show eth0|cut -d\ -f 7 | cut -d/ -f 1)
wlan0_addr=$(ip -f inet -o addr show wlan0|cut -d\ -f 7 | cut -d/ -f 1)

if [ $1 = "local" ]; then
_func_roslocal
elif [ $1 = "server" ]; then
_func_rosserver
elif [ $1 = "client" ]; then
_func_rosclient $2
elif [ $1 = "exit" ]; then
_func_rosexit
fi

}

alias rosaddress=_func_rosaddress
complete -o default -F _func_comp_rosaddress rosaddress



使い方

まずは、前項にあるリンクから、bashスクリプトをコピペしてください。

ここでは、rosaddress.bashとしてコピペしたとします。

$ source rosaddress.bash

まずは上記コマンドでrosaddressコマンドを有効にしてください。

もし、毎回sourceコマンドを打つのが面倒なら、~/.bashrcに追加してください。

使い方は以下の通りです。それぞれのコマンドを打った時の様子も一緒に載せておくので、ご覧ください。




  • rosaddress local

    実行したPCのIPをROS_MASTER_URIに設定し、ROS_IPとROS_HOST_HOSTNAMEを消去します
    Screenshot from 2016-01-29 23:16:43.png





  • rosaddress server

    実行したPCのIPをROS_MASTER_URIに、ROS_IPとROS_HOSTNAMEも実行したPCのIPに設定します
    Screenshot from 2016-01-29 23:17:00.png




  • rosaddress client <server_IP>

    <server_IP>をROS_MASTER_URIに、ROS_IPとROS_HOSTNAMEを実行したPCのIPに設定します
    Screenshot from 2016-01-29 23:17:48.png




  • rosaddress exit

    実行したPCのIPをROS_MASTER_URIに設定し、ROS_IPとROS_HOST_HOSTNAMEを消去した後、rosadressコマンドを抜けます


尚、第2引数まではTab補完が効きますので、コマンドの詳細は覚えなくてOKです。


やってること

まず、PCのwlan0に設定されているIPを確かめに行きます。

これが設定されていなかった場合、eth0に設定されているIPを確かめに行きます。

wlan0もしくはeth0にIPが設定されていた場合には、wlan0のIP優先で、取得したIPアドレスを自身のPCをのアドレスとして環境変数を設定してゆきます。

wlan0eth0のどちらにも設定が無かった場合には、自身のIPアドレスを取得できないものとしてエラーを返します。(rosaddress local コマンドはエラーを返しません)

紹介したコマンドを動かすエイリアス設定を行い、各エイリアスの引数等で環境変数を設定。更に、それぞれのエイリアスに補完機能をつけているといった感じです。


まとめ

ってことで、僕は非常に便利に使っているわけですが、zshは無いのか?という声が聞こえてきます。

残念ながら、現在はありません(僕がzshを使ってないからです)。。。orz

次の春休みにでも書こうかな(zsh使いになろうかな)?と思っていますので、またその時に投稿したいと思います。