techno_memo

個人用の技術メモ。python・ROS・AI系のソフトウェア・ツールなどの情報を記載

ROS入門 (概要/用語/コマンド)

この記事の目的

 ROSを使った開発の考え方、手順(チュートリアルを通じたコマンドの使い方)についてまとめる

ROSの考え方/用語の整理

ROSの特徴や利点については下記サイトに細かく記載されている。

myenigma.hatenablog.com

特に、自動運転・ロボット関連の試作に便利なライブラリ(自己位置推定など)やデバッグ用のツールが充実しており、それらに関する試作を行う場合には非常に便利なフレームワークといえる。

ROSのプロセス/通信の概念・用語

上記のようにROSは便利なフレームワークではあるが使い方や固有の用語がかなり多い。 公式チュートリアル (http://wiki.ros.org/ja/ROS/Tutorials)を参考にしても良いが、 初級の時点でファイルシステムやパッケージファイルの詳細の説明をしており、直観的な 理解が難しいと感じた。そこで、今後説明しやすいように下記にROSでアプリケーションを 構築する際のプロセス/通信に関する概念と用語をまとめてみた。

参考 http://forestofazumino.web.fc2.com/ros/ros_basics.html

用語 内容
Node プロセス(処理)
Message ノード間の送受信
Master ノード・メッセージの名称管理をする
Topic 非同期で送受信するノード間信号
Subscriber Topicを受信する側のノード
Publisher Topicを送信する側のノード
Service 同期型(受信してすぐ処理を実行する)のノード間通信
Service Server Serviceを受けて実行結果を出力するノード
Service Client Serviceを要求して結果を受理するノード

上記については下記参考書の解説を読むとわかりやすい。


ROSではじめるロボットプログラミング―フリーのロボット用「フレームワーク」 (I・O BOOKS)

ROSコマンドの使い方 (チュートリアルを利用)

ROSではノードの起動や通信内容の確認、可視化をROSコマンドを用いて行う。 基本的には、下記の順で使用することが多い。 公式のチュートリアルにあるturtlesimを用いて使い方をまとめる。

1.roscoreの起動

roscore

各ノード・送受信信号の名前の管理、標準入出力処理を行う ROS上で処理を動作させる場合は必ず起動する必要がある (起動していない状態で別ノードを起動させようとするとroscoreの起動待ちになる)

2.ノードの起動

下記の2つの方法で起動できる。 オプションが多い場合はlaunchファイルを作っておくと良い。

rosrunコマンド

rosrun turtlesim turtlesim_node
# rosrun [package_name] [node_name]
rosrun turtlesim turtle_teleop_key
# turtlesim_nodeとは別のターミナルで起動する

コマンド rosrunを使いパッケージ名とノード名を指定して起動する apt-getで入れたライブラリでは問題ないが、自作で作ったパッケージの 場合パスを通しておく必要がある。

複数のノードを立ち上げる場合はそれぞれターミナルを立ち上げて実行する。

roslaunch

roslaunch beginner_tutorials turtlemimic.launch
#事前に下記チュートリアルに従った準備が必要
#roslaunch beginner_tutorials turtlemimic.launch

launch ファイル内に立ち上げたいノードと起動時のオプション (パラメータの有効/無効など)を渡すと1つのターミナルでノードをまとめて起動できる。ライブラリによっては最初からlaunchファイルで起動できるように提供されているものがある。(turtlesimはないのでチュートリアルに従って記述する必要がある)

3.動作結果の確認

ノードを立ち上げたあと、各ノードの状態・通信内容は下記のコマンドで確認する。

コマンドによる確認

送受信中の信号一覧の表示には下記を利用する。 rostopic list では信号の送受信が成立していなくても、 受信待ちの状態となるだけでリストに出力されることに注意する必要がある。 信号が狙いの周期で更新できているかは rostopic hzなどを用いたほうが良い。

# ROSで通信している全信号リスト
rostopic list

# ROSで通信している信号の出力
# rostopic echo [topic名]
rostopic echo /turtle1/pose

#表示例
---
x: 5.544444561
y: 5.544444561
theta: 0.0
linear_velocity: 0.0
angular_velocity: 0.0
---


# ROSで通信している信号の更新周期の出力
# rostopic hz  [topic名]
rostopic hz /turtle1/pose

#表示例
subscribed to [/turtle1/pose]
average rate: 62.515
    min: 0.015s max: 0.017s std dev: 0.00047s window: 61
average rate: 62.519
    min: 0.014s max: 0.017s std dev: 0.00052s window: 123

GUIによる確認

コマンドによる確認の他に、rosのGUI機能rqt_graphでノードとトピックの関係を 可視化して接続関係を確認することができる。

# GUIツール rqt_graphを用いたノードの通信状態の可視化
rosrun rqt_graph rqt_graph

f:id:sd08419ttic:20190619225134p:plain

また、各トピックの波形 (時系列変化)を表示することもできる。

# GUIツール rqt_graphを用いた波形の時間変化の可視化
rosrun rqt_plot rqt_plot

f:id:sd08419ttic:20190619225554p:plain

rvizによる確認

ROSで用意された形式に従って位置や速度情報を出力するとロボットが空間でどのような動きをしているかをrvizを使って確認することができる。 (tfの発行なども必要なので下記チュートリアルに従う)

wiki.ros.org

rviz

f:id:sd08419ttic:20190619231201p:plain

4.動作結果の保存

動作中のノード間でどのような信号の送受信が行われたのかを保存することができる。この機能を用いることで同じカメラ信号のrosbag信号を流しながら自己位置推定処理のデバッグをシミュレーションで行うなどの使い方が可能になる。

#全ての送受信信号の保存 (ターミナルのパスにbagファイルが生成される)
rosbag record -a
#bagファイルを再生する
#再生中は記録時と同じタイムスタンプでトピックの送受信が行われる
rosbag play recorded1.bag  

よく使うコマンドリストのまとめ

https://qiita.com/tomoyafujita/items/13076d37bcac05a83530

https://raspimouse-sim-tutorial.gitbook.io/project/ros_tutorial

用語 内容
roscore マスターノードの起動 (rosを使用する際は必須)
rosrun [ノード名] ノードの起動
roslaunch [launchファイル名] launchファイルを用いたノード起動
rostopic list ros上で通信しているtopicのリスト出力
rostopic echo [topic名] topic名の内容の出力
rostopic hz [topic名] topicの更新周期の出力
rosbag record -a ros上で通信しているtopicをbagファイルに保存
rosrun rqt_graph rqt_graph rqt_graphの起動
rviz rvizの起動

次回はpythonを使ったノードの開発・トピックの通信例についてまとめる。