34
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-01-29

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

コマンドが更新されている(便利になっている)ので,
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使いになろうかな)?と思っていますので、またその時に投稿したいと思います。

34
20
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
34
20

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?