LoginSignup
8
8

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