8
8

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.

rosaddress コマンドを更新した話

Last updated at Posted at 2018-10-23

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

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

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

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

#!/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
希望する番号を入れてEnterを押せばOKです.
Screenshot from 2018-10-23 10-46-26.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

8
8
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
8
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?