Python
C++
ROS

学科の授業でROS(Robot Operating System)の勉強をし始めたので, その整理も兼ねて記事にしていきます. 自分はROSに触れたこともないレベルなので誤り等は是非コメントにお願いします.

参考にしているのは授業のプリントとROSの公式サイト, ROSの解説サイトです.

< 環境 >
Ubuntu 16.04LTS (他のversion, Macでの仮想環境, デュアルブートなどでは動作未確認)

ROSの環境構築

$ sudo apt-get update
$ sudo apt-get install ros-kinetic-desktop

ROSには環境変数というものが存在する.

・ROS_PACKAGE_PATH : ROSのPACKAGEを検索するPATHを設定する.
・ROS_MASTER_URI : ROSのMASTERを指定する. ここを変更すれば他人のPCのMASTERを指定することも可能.
・ROS_IP/ROS_HOSTNAME : ROSのノードのネットワークアドレスを指定する.

これを設定するが, ターミナルの起動時に自動的に環境変数の設定がなされるように.bashrcに書き込んでおく.

$ echo "source /opt/ros/kinetic/setup.bash" >> ~/.bashrc
$ source ~/.bashrc

次にワークスペースを作成し, 練習用にPackageを作る.
今回は"beginner_tutorials"というPackageにした.

$ mkdir ~/catkin_ws/src
$ cd ~/catkin_ws/src
$ catkin create pkg beginner_tutorials --catkin-deps std_msgs geometry_msgs rospy roscpp message_generation message_runtime
$ (cd ~/catkin_ws/; catkin build)

環境変数を更新しなければならない.

$ echo "source ~/catkin_ws/devel/setup.bash" >> .bashrc
$ source .bashrc

ROSの基本概念

以下のいくつかは, 最初に挙げたサイトから説明を借用させて頂きました.

ノード

ノードはLinuxのプロセスに相当し, ノード毎の独立したメモリ空間内でプログラムが動作します. ノードにはROS独自のノード間通信手段(メッセージ, サービス, パラメーターサーバー)が用意されています. ノード生成時, 各ノードには通信時の識別のために固有の名前を付ける必要があります.

マスター

マスターはノードやトピック等の名前を管理しており, ノード間通信を始める前にノードがどのトピックに繋がっているかを解決する手段を提供しています. 接続先・接続元のノードが見つかった後, 両ノードは1対1で通信を行います. マスターは, このような機能を持つために他のノードより先に起動していなければならず, かつ, システムの中に複数のマスターが存在してはいけません.
複数のマシンが接続されているシステムの場合でも, その中の1台のマシンだけでマスターが動いていなければなりません.

メッセージ

他ノードに伝えたいデータはメッセージという形にパッキングして送信側ノードがトピック上に送信し, 受信側ノードはノードに流れてくるメッセージのうち必要なもののみを拾い上げます.

トピック

トピックはノード間を繋ぐ通信の伝送路です. ノードはトピックにメッセージを発行, 受信することにより通信を行います. トピックへは, どのノードからでも接続することが出来ます.

出版 / 購読

メッセージはトピック上を流れる. 出版ノードは各メッセージをどのトピックに流すかを定義する. 購読ノードは購読しているトピック向けに出版された全メッセージを受信する.

サービス

サービスはクライアントサーバー型の同期通信の仕組みです. クライアントがサーバーへリクエストを送り, サーバーがそれを受け取ったらリクエストの処理を行い, 結果をレスポンスとしてクライアントへ返します.
同期通信はデータ通信のリクエストを出してからレスポンスが来るまでほかの処理を行わずにレスポンスを待ち続けるが, 非同期通信ではレスポンスを待っている間にほかの処理を行える. ほかの処理を行っている際に, レスポンスを受信すると受信処理を実行する.

Packageの構造

Package
    └── bin/: コンパイル済みバイナリ
    └── include/: C++ヘッダファイル
    └── msg/: メッセージ型ファイル
    └── src/: ソースファイル(C++ファイルは基本ここに)
    └── scripts/: 実行可能スクリプト(Pythonファイルは基本ここに)
    └── srv/: サービス型ファイル
    └── CMakeLists.txt: CMake ビルド ファイル(C++ファイル関連でいじる)
    └── package.xml: Packageのマニフェスト 

ROSのCommand

よく使う基本のCommand.
$ Command (check) --helpで使用法を確認できる.
Optionまで載せると長くなるので内容の説明と引数の部分だけ載せておく.

roscore

ROSのコアとなるものを実行する. Masterなどもこれにより実行されるので, これがないと基本ROSは動作しない.

Usage: roscore [options]

roscore will start up a ROS Master, a ROS Parameter Server and a rosout
logging node

roscd

ROS概念上のcd. Unixのdir構造でcdすると面倒な場合もroscdで簡単に移動可能.

usage: roscd package

Jump to target package.

rosrun

任意のPackage内の実行ファイルを移動することなく実行する.
Pythonファイルは$ chmod u+x FILENAMEでユーザーに実行権限を与えて置かなければならない.

Usage: rosrun [--prefix cmd] [--debug] PACKAGE EXECUTABLE [ARGS]
  rosrun will locate PACKAGE and try to find
  an executable named EXECUTABLE in the PACKAGE tree.
  If it finds it, it will run it with ARGS.

rosmsg

メッセージのデータ構造を表示する.

rosmsg is a command-line tool for displaying information about ROS Message types.

Commands:
    rosmsg show Show message description
    rosmsg info Alias for rosmsg show
    rosmsg list List all messages
    rosmsg md5  Display message md5sum
    rosmsg package  List messages in a package
    rosmsg packages List packages that contain messages

rostopic

実行中のtopicの情報, topicに送られたメッセージの表示など.

rostopic is a command-line tool for printing information about ROS Topics.

Commands:
    rostopic bw display bandwidth used by topic
    rostopic delay  display delay of topic from timestamp in header
    rostopic echo   print messages to screen
    rostopic find   find topics by type
    rostopic hz display publishing rate of topic    
    rostopic info   print information about active topic
    rostopic list   list active topics
    rostopic pub    publish data to topic
    rostopic type   print topic or field type

rosnode

実行中のノード情報やノード間の接続を確認する.

rosnode is a command-line tool for printing information about ROS Nodes.

Commands:
    rosnode ping    test connectivity to node
    rosnode list    list active nodes
    rosnode info    print information about node
    rosnode machine list nodes running on a particular machine or list machines
    rosnode kill    kill a running node
    rosnode cleanup purge registration information of unreachable nodes

rospack

Package関連の情報を取得できる. よく使うのはfindとdepend.

USAGE: rospack <command> [options] [package]
  Allowed commands:
    help
    cflags-only-I     [--deps-only] [package]
    cflags-only-other [--deps-only] [package]
    depends           [package] (alias: deps)
    depends-indent    [package] (alias: deps-indent)
    depends-manifests [package] (alias: deps-manifests)
    depends-msgsrv    [package] (alias: deps-msgsrv)
    depends-on        [package]
    depends-on1       [package]
    depends-why --target=<target> [package] (alias: deps-why)
    depends1          [package] (alias: deps1)
    export [--deps-only] --lang=<lang> --attrib=<attrib> [package]
    find [package]
    langs
    libs-only-L     [--deps-only] [package]
    libs-only-l     [--deps-only] [package]
    libs-only-other [--deps-only] [package]
    list
    list-duplicates
    list-names
    plugins --attrib=<attrib> [--top=<toppkg>] [package]
    profile [--length=<length>] [--zombie-only]
    rosdep  [package] (alias: rosdeps)
    rosdep0 [package] (alias: rosdeps0)
    vcs  [package]
    vcs0 [package]
  Extra options:
    -q     Quiets error reports.

rossrv

Serviceのデータ構造を表示する.

rossrv is a command-line tool for displaying information about ROS Service types.

Commands:
    rossrv show Show service description
    rossrv info Alias for rossrv show
    rossrv list List all services
    rossrv md5  Display service md5sum
    rossrv package  List services in a package
    rossrv packages List packages that contain services