rosaddress コマンドを更新した話

以前，[複数のPCでROSを使う時の設定](https://qiita.com/RyodoTanaka/items/860c79e76991f7e04ef3)にて，設定をやりやすくするために，`rosaddress`というコマンドを作った話をしました．
作成した当時は，Ubuntu 14.04 LTSの環境であり，有線接続なら`eth0`，無線接続なら`wlan0`というのがデフォルトのインタフェース名だったので，名前を決め打ちにして設定してました．

が！
Ubuntu 16.04 LTS になった現在においては，命名規則が変わったため，この方法ではうまく行かなくなってしまいました...orz

そこで，インターフェース名を自動取得し，ユーザーに一覧を提示したうえで，選んでもらうという方法にアップデートしたので記しておきます．
もちろん，14.04 LTS でも使えます．

とりあえず，下記が今回のソースコードです(MITライセンス)．
https://github.com/RyodoTanaka/.rosaddress
にソースコードがありますので，よろしければどうぞ．

```bash
#!/bin/bash
function _func_rosserver() {
	if [ -z "$ip_addr" ]; then
		echo "No Ethernet connection..."
	else
		echo "There are Ethernet connection"
		export ROS_MASTER_URI=http://${ip_addr}:11311
		export ROS_HOST_NAME=${ip_addr}
		export ROS_IP=${ip_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 "$ip_addr" ]; then
			echo "No Ethernet connection..."
		else
			echo "There are Ethernet connection"
			export ROS_MASTER_URI=http://$1:11311
			export ROS_HOST_NAME=${ip_addr}
			export ROS_IP=${ip_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_choose_ether_interface(){
    ip_name=(`ip link | awk -F: '$0 !~ "lo|vir|^[^0-9]"{print $2;getline}'`)
    echo "Choose the Ethernet interface..."
    select opt in "${ip_name[@]}"
    do
        case $opt in
            $opt )
                ip_addr=$(ip -f inet -o addr show $opt | cut -d\  -f 7 | cut -d/ -f 1)
                break
                ;;
        esac
    done
}


function _func_rosaddress() {
	if [ $1 = "local" ]; then
        _func_choose_ether_interface
		_func_roslocal
	elif [ $1 = "server" ]; then
        _func_choose_ether_interface
		_func_rosserver
	elif [ $1 = "client" ]; then
        _func_choose_ether_interface
		_func_rosclient $2
	elif [ $1 = "exit" ]; then
		_func_rosexit
	fi
	
}

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

使い方は，基本的に以前投稿したものと同じです．
すべてTab補完が効きます．
どのコマンドを実行しても，インターフェースをどれにするか聞かれるので，
![Screenshot from 2018-10-23 10-45-32.png](https://qiita-image-store.s3.amazonaws.com/0/110699/50d72dd7-5e16-0169-d22c-e2b8c4863e38.png)
希望する番号を入れてEnterを押せばOKです．
![Screenshot from 2018-10-23 10-46-26.png](https://qiita-image-store.s3.amazonaws.com/0/110699/acf8dd30-1fc1-6664-3ea4-39a4ddd148c1.png)
上の例では，`rosaddress server`で実行した場合の例です．
`rosaddress`の各コマンドの役割は，以前書いたとおりです．
一応，下記に記載しておきます．

### rosaddress server
実行したPCをROS MASTERとして設定します．


### rosaddress client `<ROS_MASTER_IP>`
`<ROS_MASTER_IP>`の部分に設定したIPアドレスをROS MASTERとして，実行したPCをそのClientとして設定します．

### rosaddress local
実行したPCをローカルのROS MASTERとして設定します．(正直，あんまり使わない...）

### rosaddress exit
`rosaddress`コマンドで設定した環境変数をクリアして，コマンドを抜けます．

# まとめ

Bashを使っている方でROSを使う方には結構便利なコマンドかと思います．
「もっとこうしたほうが良い！」，「`Zsh`版作ったんだけど...」，「動かないんだが...?」等のご意見は，下記リンクのIssueでいただけると嬉しいです！
よろしくお願いします．
https://github.com/RyodoTanaka/.rosaddress/issues