73
ROS 勉強会 - 林原研究室 < 入門編> 2014年9月5日 千葉工業大学 工学部 4年 ロボット設計・制御研究室 前川大輝

ROS Tutorial 02 - CIT

Embed Size (px)

Citation preview

Page 1: ROS Tutorial 02 - CIT

ROS勉強会 - 林原研究室<入門編>

2014年9月5日 千葉工業大学 工学部 4年 ロボット設計・制御研究室 前川大輝

Page 2: ROS Tutorial 02 - CIT

目次

1.ROSとは2.ディストリビューション3.ROSの歴史4.便利なパッケージを動かしてみよう5.本日の学習範囲6.通信の基本モデル7.ROSのノードについて理解する8.ROSのトピックを理解する9.RVizで図形を可視化しよう

Page 3: ROS Tutorial 02 - CIT

ROS(Robot Operating System)とは

■オープンソースで提供されるロボット向けのメタ・オペレーティングシステム

■ロボット制御用のミドルウェア → ソースをコンパイルするためのビルドシステム → プロセス間通信のための通信ライブラリ

■ロボット工学分野の研究・開発におけるコードの”再利用”を 支援することが目的

ROS = 通信 + ツール群 + 機能群 + エコシステム

Page 4: ROS Tutorial 02 - CIT

PR2のデモ

Page 5: ROS Tutorial 02 - CIT

オドメトリ無しSLAM

Page 6: ROS Tutorial 02 - CIT

ディストリビューション

■ー年周期のリリース(五月までHydro)

■ーつのリリースの開発(Indigo)

■二つのリリースのサポート

Page 7: ROS Tutorial 02 - CIT

ROSの歴史

■2007年 Stanford大学のAI Labが開発

■2008年 WillowGarageが開発を引き継ぎ

■2013年2月からOSRF(Open Source Robotics Foundation)が開発

Page 8: ROS Tutorial 02 - CIT

便利なパッケージを使ってみよう

■オドメトリフリーなSLAMをとりあえず動かしてみよう

理解に必要な知識は後で解説

Page 9: ROS Tutorial 02 - CIT

■パッケージのインストール$ sudo apt-get install ros-hydro-hector-slam

■バグファイル(ログ)のダウンロード$ wget http://tu-darmstadt-ros-pkg.googlecode.com/files/Team_Hector_MappingBox_RoboCup_2011_Rescue_Arena.bag

■hector_slamの起動$ roslaunch hector_slam_launch tutorial.launch

■バグファイルの再生$ rosbag play Team_Hector_MappingBox_RoboCup_2011_Rescue_Arena.bag --clock

■地図の保存$ rostopic pub syscommand std_msgs/String "savegeotiff"

Page 10: ROS Tutorial 02 - CIT

シミュレータへの応用事例

Page 11: ROS Tutorial 02 - CIT

Q : 何から勉強するの?

A : まずは本家のチュートリアルをこなしましょう

本日の学習範囲

Page 12: ROS Tutorial 02 - CIT

本家チュートリアル

初級1.ROS環境のインストールとセットアップ2.ROSのファイルシステムを学ぶ3.ROSパッケージを作る4.ROSのパッケージをビルドする5.ROSのノードを理解する6.ROSのトピックを理解する7.ROSのサービスとパラメータを理解する8.rqt_consoleとroslaunchを使う9.ROSでrosedを使ってファイルを編集する10.ROSのメッセージやサービスなどを作る11.シンプルなパブリッシャとサブスクライバを書く12.データを記録し、リプレイをする

中級

他のライブラリのチュートリアルその他

Page 13: ROS Tutorial 02 - CIT

初級1.ROS環境のインストールとセットアップ2.ROSのファイルシステムを学ぶ3.ROSパッケージを作る4.ROSのパッケージをビルドする5.ROSのノードを理解する6.ROSのトピックを理解する7.ROSのサービスとパラメータを理解する8.rqt_consoleとroslaunchを使う9.ROSでrosedを使ってファイルを編集する10.ROSのメッセージやサービスなどを作る11.シンプルなパブリッシャとサブスクライバを書く12.データを記録し、リプレイをする

中級

他のライブラリのチュートリアルその他

本日の学習範囲

本家チュートリアル

Page 14: ROS Tutorial 02 - CIT

通信の基本モデル

Page 15: ROS Tutorial 02 - CIT

■ソフトウェアの単位: ノード

■ロボットのセンサやアクチュエータ等を別々のノードとして定義 → それを組み合わせ分散システムを構築

Node A

Node B

Node C

Page 16: ROS Tutorial 02 - CIT

■出版-購読型のメッセージング

■異なるプログラミング言語で記述されたノードでもやりとりが可能

Node ANode C

Publish

SubscribePublish

TopicA

Publisher Publisher

Node BSubscriber

Page 17: ROS Tutorial 02 - CIT

■サービス (リモート関数呼び出し)

■利用側(多くはノード)からリクエストを受け取ると特定の処理を行うもの

Client Service

Arguments

Return Values

Page 18: ROS Tutorial 02 - CIT

■パラメータ

■トピック以外のデータを送受信するための仕組み

■パラメータサーバがデータを保持 → 他のノードからの変更は通知される

Page 19: ROS Tutorial 02 - CIT

■マスター

■ノードやトピックの管理を行う

■roscoreというプロセスにより提供される

Page 20: ROS Tutorial 02 - CIT

■パッケージ

■機能毎に分類されたノードやライブラリの単位のこと

■パッケージを管理するための便利なコマンドが多数提供されている

■ロボット用のオープンソースパッケージが多数公開されている

Page 21: ROS Tutorial 02 - CIT

ROSのノードについて理解する

Page 22: ROS Tutorial 02 - CIT

■ROSを使用する際に一番初めにroscoreを起動する

$ roscore

Page 23: ROS Tutorial 02 - CIT

■rosrunを用いてパッケージに含まれるノードを起動

$ rosrun turtlesim turtlesim_node

Page 24: ROS Tutorial 02 - CIT

■ノードの一覧を表示

$ rosnode list

/rosout/turtlesim

Ctrl - Cでノードを停止

Page 25: ROS Tutorial 02 - CIT

■リマップでコマンドラインから名前を変更

$ rosrun turtlesim turtlesim_node __name := my_turtle

rosnode list

/rosout/my_turtle

Page 26: ROS Tutorial 02 - CIT

■ノードが起動しているか確認

$ rosnode ping my_turtle

rosnode: node is [/my_turtle]pinging /my_turtle with a timeout of 3.0sxmlrpc reply from http://daikimaekawa-ThinkPad-X230:58887/ time=0.523806msxmlrpc reply from http://daikimaekawa-ThinkPad-X230:58887/ time=1.019001msxmlrpc reply from http://daikimaekawa-ThinkPad-X230:58887/ time=1.125097ms

Page 27: ROS Tutorial 02 - CIT

ROSのトピックを理解する

Page 28: ROS Tutorial 02 - CIT

■キーボードによる亀の操作$ rosrun turtlesim turtle_teleop_key

Page 29: ROS Tutorial 02 - CIT

■システムの進行状況・挙動を示すグラフの生成$ rqt_graph

ROSのノードやトピックがハイライトされる

Page 30: ROS Tutorial 02 - CIT

■rostopicはトピックの詳細を調べるコマンド$ rostopic echo /turtle1/cmd_vel

linear: x: 0.0 y: 0.0 z: 0.0angular: x: 0.0 y: 0.0 z: 2.0---linear: x: 2.0 y: 0.0 z: 0.0angular: x: 0.0 y: 0.0 z: 0.0---

Page 31: ROS Tutorial 02 - CIT

■rostopicが /turtle1/cmd_velを購読していることを 確認してみよう

$rqt_graph

Page 32: ROS Tutorial 02 - CIT

■配信者と購読者が通信するためには同じ型のメッセージ を送受信する必要がある

■トピックの型は配信されるメッセージの型により定義される

■rostopicを使って簡単に調べることが可能

Page 33: ROS Tutorial 02 - CIT

■配信-購読されているトピックとその型の情報を調べる

$ rostopic list -v

Published topics: * /turtle1/color_sensor [turtlesim/Color] 1 publisher * /turtle1/cmd_vel [geometry_msgs/Twist] 1 publisher * /rosout [rosgraph_msgs/Log] 3 publishers * /rosout_agg [rosgraph_msgs/Log] 1 publisher * /turtle1/pose [turtlesim/Pose] 1 publisher

Subscribed topics: * /turtle1/cmd_vel [geometry_msgs/Twist] 2 subscribers * /rosout [rosgraph_msgs/Log] 1 subscriber

Page 34: ROS Tutorial 02 - CIT

■rostopic typeで特定のトピックのメッセージ型を調べる

$ rostopic type /turtle1/cmd_vel

geometry_msgs/Twist

Page 35: ROS Tutorial 02 - CIT

■rosmsgを使用してメッセージの詳細を調べる

$ rosmsg show geometry_msgs/Twist

geometry_msgs/Vector3 linear float64 x float64 y float64 zgeometry_msgs/Vector3 angular float64 x float64 y float64 z

Page 36: ROS Tutorial 02 - CIT

■rostopic pubはトピックへデータを配信します

■turtlesimを直線速度2.0, 角速度1.8で移動させる

$ rostopic pub -1 /turtle1/cmd_vel geometry_msgs/Twist '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'

rostopic pub [topic] [msg_type] [args]

Page 37: ROS Tutorial 02 - CIT

■亀は動き続けるために定期的な1Hzのコマンドが必要

$ rostopic pub /turtle1/cmd_vel geometry_msgs/Twist -r 1 -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]'

Page 38: ROS Tutorial 02 - CIT

■何が起こっているかはrqt_graphでも可視化できる

■rostopic pub node と rostopic echo nodeが通信

$ rqt_graph

Page 39: ROS Tutorial 02 - CIT

■rostopic hzは配信されたデータの更新頻度を調べる

■/turtle1/poseを購読して, turtlesim_nodeの速さがど  の程度か見てみよう

$ rostopic hz /turtle1/pose

subscribed to [/turtle1/pose]average rate: 62.489 min: 0.016s max: 0.016s std dev: 0.00011s window: 62average rate: 62.491 min: 0.016s max: 0.016s std dev: 0.00009s window: 125average rate: 62.496 min: 0.016s max: 0.016s std dev: 0.00009s window: 187

データの更新頻度は60Hz

Page 40: ROS Tutorial 02 - CIT

■コマンドを組み合わせて便利に使える

■rostopic type と rosmsg showを結合して使ってみよう → 普通にパイプが使える

$ rostopic type /turtle1/cmd_vel | rosmsg show

geometry_msgs/Vector3 linear float64 x float64 y float64 zgeometry_msgs/Vector3 angular float64 x float64 y float64 z

Page 41: ROS Tutorial 02 - CIT

■rqt_plotはトピックで配信されている データの時間図を表示する

$ rqt_plot 任意のトピックを追加

Page 42: ROS Tutorial 02 - CIT

■/turtle1/pose/xと/turtle1/pose/yを可視化

Page 43: ROS Tutorial 02 - CIT

■-ボタンで非表示にできる

■/turtle1/pose/thetaを追加

Page 44: ROS Tutorial 02 - CIT

■rosservice listでアクティブなサービスの情報を表示

$ rosservice list

/clear/kill/reset/rosout/get_loggers/rosout/set_logger_level/spawn/turtle1/set_pen/turtle1/teleport_absolute/turtle1/teleport_relative/turtlesim/get_loggers/turtlesim/set_logger_level

Page 45: ROS Tutorial 02 - CIT

■rosservice type でサービスの型を表示します

$ rosservice type clear

std_srvs/Empty

リクエストの作成にデータを送らないレスポンスの受け取りにデータを受け取らない

Page 46: ROS Tutorial 02 - CIT

■rosservice callでサービスを呼び出す

■turtlesimをクリアしよう

$ rosservice call clear

Page 47: ROS Tutorial 02 - CIT

■サービスが引数をとる場合を考えましょう

■spawnサービスは新しい亀を誕生させる

$ rosservice type spawn | rossrv show

float32 xfloat32 yfloat32 thetastring name---string name

Page 48: ROS Tutorial 02 - CIT

■位置と向きを与えて新しい亀を誕生させよう → 名前の指定は任意

$ rosservice call spawn 2 2 0.2 “”

name: turtle2

作成した亀の名前を返す

Page 49: ROS Tutorial 02 - CIT

■rosparamはROSパラメータサーバを用いてデータの 蓄積や操作を実現

$ rosparam list

/background_b/background_g/background_r/rosdistro/roslaunch/uris/host_daikimaekawa_thinkpad_x230__57324/rosversion/run_id

Page 50: ROS Tutorial 02 - CIT

■rosparam setでパラメータの値を変える

$ rosparam set /background_r 255$ rosservice call clear

Page 51: ROS Tutorial 02 - CIT

■rosparam getでパラメータの値を取得する

$ rosparam get /background_r

255

Page 52: ROS Tutorial 02 - CIT

■全てのパラメータサーバの中身を見る

$ rosparam get /

background_b: 255background_g: 86background_r: 255rosdistro: 'hydro

'roslaunch: uris: {host_daikimaekawa_thinkpad_x230__57324: 'http://daikimaekawa-ThinkPad-X230:57324/'}rosversion: '1.10.2

'run_id: 2ec6f1ae-be3f-11e3-986c-b8763fd266b5

Page 53: ROS Tutorial 02 - CIT

■全てのパラメータをファイルに書き出す

$ rosparam dump params.yaml

■yamlファイルをcopyというネームスペース の中に読み込む

$ rosparam load params.yaml copy

■rosparam getで中身を確認する

$ rosparam get copy/background_b

255

Page 54: ROS Tutorial 02 - CIT

RVizで図形を可視化しよう

■通信システムを大まかに理解するためのサンプル

■RVizでデータを3次元マップ上に可視化

■トピックを送信するプログラムを書いてみよう

Page 55: ROS Tutorial 02 - CIT

■ROSのワークスペースを作成(catkin)

$ mkdir -p ~/catkin_ws/src$ cd ~/catkin_ws/src$ catkin_init_workspace

$ cd ~/catkin_ws$ catkin_make

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

$ source ~/.bashrc

Page 56: ROS Tutorial 02 - CIT

■パッケージ作成

$ cd ~/catkin_ws/src$ catkin_create_pkg marker_publisher roscpp visualization_msgs

Page 57: ROS Tutorial 02 - CIT

■ノードを作成

$ roscd marker_publisher/src$ vi marker_publisher.cpp

Page 58: ROS Tutorial 02 - CIT

■使用するヘッダファイルのインクルード

#include <cmath>#include <ros/ros.h>#include <visualization_msgs/Marker.h>

Page 59: ROS Tutorial 02 - CIT

■初期設定

#define DEFAULT_RATE 20

int main(int argc, char *argv[]){ ros::init(argc, argv, “test”); ros::NodeHandle n; ros::Publisher marker_pub = n.advertise<visualization_msgs::Marker>(“visualization_marker”, 10); ・・・

}

Page 60: ROS Tutorial 02 - CIT

■初期設定

int main(int argc, char *argv[]){ ・・・ visualization_msgs::Marker line_strip; line_strip.header.farme_id = “practice”; line_strip.ns = “practice”; line_strip.id = 1; line_strip.type = visualization_msgs::Marker::LINE_STRIP; line_strip.action = visualization_msgs::Marker::ADD; ・・・

}

Page 61: ROS Tutorial 02 - CIT

■初期設定

int main(int argc, char *argv[]){ ・・・ line_strip.scale.x = 0.1; line_strip.color.b = 1.0; line_strip.color.a = 1.0; float phai = 0.0; n.setParam(“/rate”, DEFAULT_RATE); ・・・}

Page 62: ROS Tutorial 02 - CIT

■図形を作成

int main(int argc, char *argv[]){ ・・・ for(int i=0; i <= 10; i++){ const float radius = i % 2 ? 6.0 : 3.0; const float theta = (72.0 * (i/2) + (i%2) * 36.0) * M_PI / 180.0; geometry_msgs::Point vertex; vertex.x = radius * cos(theta); vertex.y = radius * sin(theta); line_strip.points.push_back(vertex); } ・・・}

Page 63: ROS Tutorial 02 - CIT

■図形の回転int main(int argc, char *argv[]){ ・・・ while(ros::ok()){ int val = DEFAULT_RATE; if(n.getParam(“/rate”, val)){ std::cout << “val = ” << val << std::endl; } ros::Rate r(val); line_strip.header.stamp = ros::Time::now(); line_strip.pose.orientation.z = sin(phai / 2); line_strip.pose.orientation.w = cos(phai / 2); ・・・ } return 0;}

Page 64: ROS Tutorial 02 - CIT

■図形の回転

while(ros::ok){ ・・・ marker_pub.publish(line_strip); phai += 0.05; if(phai > 2 * M_PI) phai -= 2 * M_PI; r.sleep();}

Page 65: ROS Tutorial 02 - CIT

■CMakeLists.txtを編集

$ rosed marker_publisher CMakeLists.txt

Page 66: ROS Tutorial 02 - CIT

■CMakeLists.txtを編集

・・・

add_executable(marker_publisher_node src/marker_publisher.cpp)

target_link_libraries(marker_publisher_node ${catkin_LIBRARIES})

・・・

Page 67: ROS Tutorial 02 - CIT

■パッケージをビルド

$ cd ~/catkin_ws$ catkin_make

Page 68: ROS Tutorial 02 - CIT

■ノードを起動

$ rosrun marker_publisher marker_publisher_node

■rostopic echoでframe_idを確認

$ rostopic echo /visualization_marker

・・・ frame_id: practice ・・・

line_strip.header.frame_id = “practice”

Page 69: ROS Tutorial 02 - CIT

■rvizで図形を可視化

Page 70: ROS Tutorial 02 - CIT

■rqt_graphでノード間通信を可視化

$ rqt_graph

Page 71: ROS Tutorial 02 - CIT

■図形の回転速度を変更

$ rosparam set /rate 100

Page 72: ROS Tutorial 02 - CIT

■rosbagでトピックを記録

$ rosbag record /visualization_marker

■marker_publisher_nodeを停止

$ Ctrl - C

■rosbagでバグファイルを再生

$ rosbag play *.bag

rosbagはデバックの強い味方

Page 73: ROS Tutorial 02 - CIT

ご清聴ありがとうございました。