2016/11/22

内容• http://irvs.github.io/rosbook_jp/• １〜７章まで• 1 ROS入門• 2 ROSのインストール• 3 ROSの基本知識• 4 ROS コマンド• 5 ROSツール• 6 ROSプログラミングの基本• 7 パッケージの導入方法

実習で学ぶ初めてのROS
九州大学大学院
システム情報科学研究院 教授亮

2016/11/22

2016/11/22

倉爪

ロボットプログラミング

ロボットプログラミング• ロボットの構成機器ごとにプログラムを作成

環境モデル

アクチュエータ

モータ制御

タスク実行

プランニング

モデリング

知覚

センサ

USB

USBserial

RGB-Dカメラ
SmartPal V• 問題点：特定のデバイスに依存したハードコーディング拡張性2016/11/22

異なるデバイス・ロボットを組み合わせないといけない再利用性

その都度作成→非効率

対故障性

RTミドルウェア

RTミドルウェア• ロボットの構成機器をソフトウェアレベルでモジュール化• モジュール間のインターフェースを統一• OpenRTM：産総研が開発

開発が効率化

http://www.openrtm.org/openrtm/ja/content/openrtm-aist-official-website

2016/11/22

2016/11/22

2016/11/22

環境1

2016/11/22

RT Middleware(OpenRTM)とROS• ROS http://www.ros.org/• ロボットの構成機器をソフトウェアレベルでモジュール化• モジュール間のインターフェースを統一• 目指すものは一緒• 機能的にはほぼ差はない！

2016/11/22

2016/11/22

Robot Operating System (ROS)

強力なツール群
Gazebo

地図生成＆位置同定（SLAM）

Rviz

gmapping

2016/11/22

３次元可視化ソフト

2016/11/22

動力学シミュレータ

• 細かい差はある• ROSはトピック通信やサービス通信が定義されている• RT Middlewareはポート間の接続で通信を規定• ROSはOpen Source Robotics Foundation (OSRF) が管理• RT MiddlewareはObject Management Group (OMG) で規格化
• ROSはノード，RT MiddlewareはRTC (RT Component)• OpenRTMはエディタがある• ROSは3D Viewerや物理シミュレータが提供されている••

自律移動と位置同定（Navigation Stack）

Robot Operating System (ROS)

move_base & AMCL

• 歴史

2016/11/22

2016/11/22• M. Quigley (Stanford Univ., AI Lab, 2007.5~)• WillowGarage (2007.11~)• Open Source Robotics Foundation (2011~)• 最新バージョンは Kinetic Kame (2016/5)→本講習では 安定している Indigo Iglooを使用
対応オペレーティングシステム：
Ubuntu 14.04 Trusty Tahr（LTS）

2

2016/11/22

Robot Operating System (ROS)

Robot Operating System (ROS)• 様々なOS上で動く「メタOS」• OS : Ubuntu, OS X, Windows, Debian, Fedoraなど• ソフトウェアプラットホーム• アプリケーション開発のための（疑似的な）オペレーティングシステム• ハードウェア抽象化• 低レベルデバイス制御• ロボットが一般的に利用する機能実装• メッセージ通信• パッケージ管理 など• プログラムを「ノード」としてモジュール化• ノード＝実行ファイル• ノード間の通信手順を取り決め

アプリケーション層

ノードA：車輪のモータを制御
ノードB：経路を計画、など• ロボット開発のための機能部品を、OS層“パッケージ”＝ノード

ハードウェア層“スタック”＋ メッセージ（データ形式）＋
サービス＆トピックス（ROSインターフェース）＝パッケージの集合としてWebで配布• アプリケーション開発を支援するコマンドやツールを提供• コマンド：catkin_make, rostopic, roscore, rosrun, etc..
• ツール：gazebo(シミュレーション), Rviz (ビューア), etc..

• ライブラリ群を容易にシェアできる仕組みを提供

2016/11/22

2016/11/22• オープンソース・BSDライセンス

Robot Operating System (ROS)

Robot Operating System (ROS)• 世界中の研究者・技術者が開発したソフトを利用可能• 多くのセンサ，アクチュエータ，ロボットをサポート• センサパッケージ

2016/11/22

2016/11/22• 1D range finders• 2D range finders• 3D Sensors (range finders & RGB-D cameras)• Audio / Speech Recognition• Cameras• Force/Torque/Touch Sensors• Motion Capture• Pose Estimation (GPS/IMU)• Power Supply• RFID• Sensor Interfaces（マインドストーム、ワンボードマイコンなど）＊ http://wiki.ros.org/Sensors

Robot Operating System (ROS)

Robot Operating System (ROS)• ロボットパッケージ（約120体）• 処理パッケージ• Mobile manipulator• Mobile robot• Manipulator• Autonomous car• Humanoid• UAV（無人飛行機）• AUV（自律型無人潜水機）• UWV（無人航行船）• Others（マインドストームなど）

PR2• 物体認識• 経路計画• 動作計画• スケジューラ• SLAM• その他たくさん＊ http://wiki.ros.org/Robots

TurtleBot Pioneer 2/3-AT• 便利なツール
MarvinNao

Kingfisher

Drone (Quadrotor)

2016/11/22＊ http://wiki.ros.org/Robots
2016/11/22• https://ja.osdn.net/projects/opensource/wiki/licenses%2Fnew_BSD_license• ３次元可視化ソフト rviz
• シミュレータ Gazebo• 管理ソフト rqt• ライブラリ• PCL, OpenCV, OpenRAVE

3

2016/11/22

ROSの日本語解説書• Webで無料公開• http://irvs.github.io/rosbook_jp/
詳説 ROSロボットプログラミング-導入からSLAM・Gazebo・MoveItまで-

ROSのインストール

著者：表 允晳, 倉爪 亮, 渡邊 裕太
出版日：2015年 11月 30日（初版）
ISBNコード：9784990873608
フォーマット：PDF版
2016/11/22

2016/11/22

ページ数：342p

ROSのインストール

ROSのインストール 2.1.2 ROS Indigoの簡単インストール
35ページ「2.1.2 ROS Indigoの簡単インストール」• http://robotics.ait.kyushu-u.ac.jp/books/ROSBOOK_JP.pdf• 29ページから37ページを実行して，ROSをインストールしてみましょう• ROS Indigoのインストール• NTP(Network Time Protocol) 設定• ROSリポジトリアドレスの追加• キーの設定• パッケージインデックスの更新• ROS Indigo Iglooのインストール• rosdepの初期化• rosinstallのインストール• 環境設定ファイルのロード• 作業フォルダの作成と初期化• テスト

・35ページ「2.1.2 ROS Indigoの簡単インストール」が楽・https://github.com/irvs/ros_tms/wiki/installにもあります

2016/11/22

2016/11/22• ROSの開発環境の構築

ROSのインストール 2.1.2 ROS Indigoの簡単インストール

ROSのインストール 2.1.2 ROS Indigoの簡単インストール

https://github.com/irvs/ros_tms/wiki/install$ wget https://raw.githubusercontent.com/irvs/rosbook_jp/master/ros_indigo_install.sh

2016/11/22

2016/11/22$ sh ros_indigo_install.sh

4

2016/11/22

ROSのインストール 2.1.2 ROS Indigoの簡単インストール

ROSのテスト2.2.2 ROSの動作テスト$ source ~/.bashrc

パスワード入力$ roscore

2016/11/22

2016/11/22[Completed!!!]と出たら終了

ROSのテスト

ROSのテスト2.2.2 ROSの動作テスト

2.2.2 ROSの動作テスト

別のターミナルを開いて「Ctrl+Alt+T」$ rosrun turtlesim turtlesim_node

2016/11/22

2016/11/22

左の画面が出たら成功

ROSのテスト

ROSのテスト2.2.2 ROSの動作テスト

2.2.2 ROSの動作テスト

別のターミナルを開いて「Ctrl+Alt+T」

別のターミナルを開いて「Ctrl+Alt+T」$ rosrun turtlesim turtle_teleop_key$ rosrun rqt_graph rqt_graph

左の画面で矢印キーを押すと⻲が動く

現在実行中のノードの情報を見ることができる2016/11/22

2016/11/22「teleop_turtle」の名でturtle_teleop_keyノードと「turtlesim」の名でturtlesim_nodeノードが実行中
トピックメッセージ通信（/turtle1/cmd_vel）が行われている52016/11/22

ROSの基本用語• マスター（master）• roscoreコマンドで実行されるサーバ（ネームサーバ）• ノード間の接続（通信）を管理• ノード（node）• 最小の実行プログラム• 配信者（publisher）、購読者（subscriber）がある

ROSの基本用語• パッケージ（package）• ノードの集合• パッケージ内のノードを接続することで特定の機能を提供

2016/11/22

2016/11/22• メタパッケージ（metapackage）

ROSの基本用語• パッケージの集合

ROSの基本用語トピックメッセージ通信• メッセージ（message）

一方向の通信• ノード間でやり取りされる情報• トピック通信とサービス通信がある• トピック（topic）• 一方向で非同期方式のメッセージ送受信方式• 送信側＝配信者 ・ 受信側＝購読者• サービス（service）• 配信，配信者（publish and publisher）が送信• 購読，購読者（subscribe and subscriber）が受信

一対一，一対多も可能

2016/11/22

2016/11/22• 双方向で同期方式のメッセージ通信方式• リクエスト（request）とレスポンス（response）

ROSの基本用語

ROSの基本用語
サービスメッセージ通信
双方向の通信• rosrun• １つのノードを起動するコマンド• roslaunch• 複数のノードを一度に起動するコマンド• rostopic

一対一のみ

2016/11/22

2016/11/22• トピック通信を監視するコマンド

62016/11/22

ROSの基本用語• パラメータ（parameter）• ノード実行中に変更可能な変数• パラメータサーバ（parameter server）• 全てのノードのパラメータを一括管理するサーバ• マスターと同時に起動される

2016/11/22

2016/11/22

ROSコマンドROSコマンドROSコマンド• ROSシェルコマンド• roscd：ROSパッケージまたはスタックへ移動• シェル（shell）環境で、コマンドを使って処理を行う
ファイルシステムの利用
ソースコードの編集ビルド & デバッグ
パッケージ管理• ROS実行コマンド• roscore：master（ネームサービス）+ rosout（stdout/ stderr）+ parameter server• rosrun：パッケージの１つのノードを実行• roslaunch ：パッケージの複数個のノードを実行• ROS情報コマンド• rosnode：ROSのノード情報を取得• rostopic：ROSトピックの情報を取得• rosservice ：ROSサービス情報を取得

2016/11/22

2016/11/22• UbuntuでROSを開発するには..
Linuxコマンド ＋ ROSコマンドの習得

ROSコマンド• ROS catkinコマンド• catkin_create_pkg：catkinビルドシステムによるパッケージの自動生成• catkin_init_workspace：catkinビルドシステムの作業フォルダの初期化• catkin_make：catkinビルドシステムをベースにしたビルド命令

ROS実行コマンド
サーバの起動•LinuxのbashシェルコマンドをROSで使用
ros（接頭辞）＋ 接尾辞（cd，pd，d，ls，ed，cp，runなど）•

roscd：ROSディレクトリに移動$ roscd［パッケージ名］•

roscore：ノード間のメッセージ通信時に接続情報を管理するマスタ（ネームサーバ）$ roscore（結果） XMLRPCでサーバを起動 ノード間の接続のためにノードの名前、トピック、サービスの名前、メッセージの形式、URIアドレスとポートを登録
 登録された情報を、要求に応じて他のノードに通知

使用例：$ roscd turtlesim（結果）/opt/ros/indigo/share/turtlesim$

2016/11/22

2016/11/22

マスタ
ノード
情報
ノード
1

ノード
情報
接続情報

メッセージ通信ノード
2

7

2016/11/22

roscoreの動作画面.. logging to /home/#####/.ros/log/****.log←ログを保存するファイル
Checking log directory for disk usage. This may take awhile.
Press Ctrl-C to interrupt←「Ctrl-C」でROSコアを終了できる
Done checking log file disk usage. Usage is <1GB.

ROS実行コマンド
一つのノードの実行•

started roslaunch server http://#####
ros_comm version 1.11.9

2016/11/22

使用例：$ rosrun turtlesim turtlesim_node パッケージ「turtlesim」のノード「turtlesim_node」をデフォルトの「/turtlesim」という名前で実行← /rosdistro および /rosversionのパラメータサーバ

（結果）

NODES
auto-starting new masterprocess[master]: started with pid [*****]← ROS_MASTER_URI の情報
ROS_MASTER_URI=http://#####:11311/
setting /run_id to *****
process[rosout-1]: started with pid [#####]
started core service [/rosout]← /rosoutのサービス、 /rosoutノードの実行[INFO] [#####.*****]: Starting turtlesim with node name /turtlesim[INFO] [#####.*****]: Spawning turtle [turtle1] at x=[5.544445],
y=[5.544445], theta=[0.000000]

ROS実行コマンド

ROS実行コマンド

一つのノードの実行•

rosrun：指定されたパッケージの一つのノードを実行$ rosrun［パッケージ名］［ノード名］

2016/11/22

SUMMARY========PARAMETERS* /rosdistro: indigo* /rosversion: 1.11.9← roslaunch server の情報

複数のノードの同時実行•

rosrun：指定されたパッケージの一つのノードを名前を変えて実行$ rosrun［パッケージ名］［ノード名］ __name:=[名前]roslaunch：パッケージの複数個のノードを実行
ROSでは、パラメータ設定も同時にできる$ roslaunch［パッケージ名］［ランチファイル名］

_が２つ
使用例：
$ rosrun turtlesim turtlesim_node __name:=my_turtle パッケージ「turtlesim」のノード「turtlesim_node」を「/my_turtle」という名前で実行

使用例：$ roslaunch openni_launch openni.launch 「openni_launch」パッケージの「openni.launch」を実行（結果）
 20以上のノードと10個のパラメータサーバが実行

2016/11/22

2016/11/22＊もしopenNI関連のパッケージが未インストールなら$ sudo apt-get install ros-indigo-openni-camera ros-indigo-opennilaunch••

ROS情報コマンド

ROS情報コマンド

トピック、サービス、ノード、パラメータなどの情報を確認する
rosnode：ROSのノード情報を取得
rostopic：ROSトピックの情報を取得
rosservice：ROSサービス情報を取得
rosparam：ROSパラメータ情報を取得・変更
rosbag：ROSメッセージを記録・再生

rosnodeコマンド

 マスターにノード情報を登録
ノード名、発行者名、加入者名、トピック名、サービス名、メッセージ形式、URIアドレス、ポート 通信方法turtlesim_nodeノードの実行

turtlesim_node：⻘⾊画面に⻲が表⽰
turtle_teleop_key：矢印キーで⻲を操作

turtlesimパッケージのturtle_teleop_keyノードの実行

XMLRPC：マスタ・ノード間の通信
ノード間の接続要求・応答
TCPROS： ノード間の通信、メッセージ通信 （XMLPCとTCP/IP通信系）

2016/11/22

2016/11/22

•
•

ノード
例：ロボット制御
ノード：センサドライブ、モータ駆動、エンコーダ入力、
障害物判断、ナビゲーション、など

現在開いている端末を全て閉じ、新しい端末を開く
以下のコマンドを実行
roscore の実行$ roscore$ rosrun turtlesim turtlesim_node
turtlesimパッケージの$ rosrun turtlesim turtle_teleop_key

別のターミナルを開いて「Ctrl+Alt+T」

rosnode：ノード情報を取得•

 定義：最小単位の実行プロセッサ＝一つの実行可能なプログラム

事前準備
1.
2.

•

8

2016/11/22

ROS情報コマンド

ROS情報コマンド

rosnodeコマンド•

rosnodeコマンド•

rosnode list：ROSコアに接続された全てのノードのリストを表⽰$ rosnode list-------------------------------------------------Node[/turtlesim]
Publications:＊ /turtle1/color_sensor [turtlesim/Color]...省略...

/rosout/teleop_turtle/turtlesim•

rosnode ping [ノード名]：指定されたノードとの接続をテスト$ rosnode ping /turtlesim

Subscriptions:＊ /turtle1/cmd_vel [geometry_msgs/Twist]...省略...
Services:＊ /turtle1/teleport_absolute...省略...
2016/11/22

2016/11/22

rosnode : node is [/turtlesim]
pinging /turtlesim with a timeout of 3.0s
xmlrpc reply from http://####:45470/ time=0.344992ms：＊もしそのノードと接続されていない場合は
ERROR：connection refused to[http://xxx.xxx.xxx.xxx:xxxxx/]のようなエラーメッセージが表⽰

ROS情報コマンド

ROS情報コマンド

rosnodeコマンド•

rostopicコマンド

rosnode machine [PC名またはIP]：PC上で実行中のノードを表⽰$ rosnode machine xxx.xxx.xxx.xxx•

rostopic：ROSトピックの情報を取得•

トピック 定義：発行者ノードが発行するメッセージにつくタグ・キーワード/rosout/teleop_turtle/turtlesim•

 トピックの受信を希望するノードは、そのトピックを発行している発行者ノードの情報を受け取る
 受信した情報に基づいて、受信者ノードは発行者ノードと直接接続して、メッ
セージを送受信または要求・応答受ける

rosnode kill [ノード名] ：指定されたノードの停止$ rosnode kill /turtlesim

 非同期式通信：必要に応じてデータの送受信が可能

killing /turtlesim
killedrosnode cleanup：接続情報が確認できないノードの登録情報の削除$ rosnode cleanup＊端末ウィンドウで、［Ctrl + C］で直接ノードをシャットダウンも可 一度の接続で継続的にメッセージの送受信

一旦実行を停止し、再度実行$ roscore$ rosrun turtlesim turtlesim_node$ rosrun turtlesim turtle_teleop_key

2016/11/22

2016/11/22•

ROS情報コマンド

ROS情報コマンド

rostopicコマンド

rostopicコマンド•

rostopic list：現在アクティブなトピックの一覧を表⽰$ rostopic list•

/rosout/rosout_agg/turtle1/cmd_vel/turtle1/color_sensor/turtle1/pose•

rostopic list -v：現在送受信されている全てのトピックのリストを表⽰$ rostopic list -v•

2016/11/22：

Subscribed topics：＊ /turtle1/cmd_vel [geometry_msgs/Twist] 1 subscriber

rostopic echo [トピック名]：指定したトピックのメッセージの内容をリアルタイムに表⽰$ rostopic echo /turtle1/pose
x：5.35244464874
y：5.544444561
theta：0.0
linear_velocity：0.0
angular_velocity：0.0/Published topics：＊ /turtle1/color_sensor [turtlesim/Color] 1 publisher

2016/11/22

rosnode info [ノード名] ：指定されたノードの情報を確認$ rosnode info /turtlesim← 座標値← 姿勢（向き）
← 速度
← 角速度

rostopic find [タイプ名]：指定したタイプのメッセージを使用するトピックを表⽰$ rostopic find turtlesim/Pose/turtle1/pose

92016/11/22

ROS情報コマンド

ROS情報コマンド

rostopicコマンド•

rostopicコマンド•

rostopic type [トピック名]：指定したトピックのメッセージタイプを表⽰$ rostopic type /turtle1/pose
turtlesim/Pose•

subscribed to [/turtle1/pose]
average rate: 62.502
min: 0.016s max: 0.016s std dev: 0.00005s window: 62…省略...

rostopic bw [タイプ名]：指定したトピックのメッセージデータの帯域幅(bandwidth) を表⽰$ rostopic bw /turtle1/pose•

ROS情報コマンド

ROS情報コマンド

rostopicコマンド

rosserviceコマンド••

rostopic pub [トピック名] [メッセージタイプ] [パラメータ]：指定したトピックの名前でメッセージを発行$ rostopic pub -1 /turtle1/cmd_vel geometry_msgs/Twist -- '[2.0, 0.0,
0.0]' '[0.0, 0.0, 1.8]'

rosservice：サービスの情報を取得
サービス
 種類：要求があった場合に応答をするサービスサーバ
要求して応答を受信するサービスクライアント
 同期式通信：要求があった時のみデータを送受信《オプションの説明》• -1 :メッセージを1回発行• /turtle1/cmd_vel：指定したトピック名• geometry_msgs/ Twist：発行されているメッセージタイプ名• -- '[2.0, 0.0, 0.0]' '[0.0, 0.0, 1.8]' :
並進速度
角速度

 1回限りのメッセージ通信＝サービスの要求と応答が完了すると，ノード間の接続は切断

一旦実行を停止し、再度実行$ roscore$ rosrun turtlesim turtlesim_node$ rosrun turtlesim turtle_teleop_key

2016/11/22

2016/11/22

publishing and latching message for 3.0 second

回転

ROS情報コマンド

ROS情報コマンド

rosserviceコマンド

rosserviceコマンド

rosservice list：アクティブなサービスの一覧を表⽰$ rosservice list
/clear/kill/reset/rosout/get_loggers/rosout/set_logger_level/spawn/teleop_turtle/get_loggers/teleop_turtle/set_logger_level/turtle1/set_pen/turtle1/teleport_absolute/turtle1/teleport_relative/turtlesim/get_loggers/turtlesim/set_logger_level•rosservice type [サービス名]：サービスタイプを表⽰$ rosservice type /turtle1/set_pen
turtlesim/SetPen•

rosservice find [サービスタイプ]：
指定したサービスタイプのサービスを検索$ rosservice find turtlesim/SetPen•

rosservice uri [サービス名]：ROSRPC uriサービスを出力$ rosservice uri /turtle1/set_pen/turtle1/set_pen

rosrpc://xxx.xxx.xxx.xxx:49714
2016/11/22•

2016/11/22

rostopic info [タイプ名]：指定したトピックの情報を表⽰$ rostopic info /turtle1/pose← メッセージタイプ
Type: turtlesim/Pose
Publishers:＊ /turtlesim（http://xxxx:42443/） ← 発行者ノード
Subscribers: None
← 購買者ノード

2016/11/22

2016/11/22

subscribed to [/turtle1/pose]
average：1.27KB/s
mean: 0.02KB min: 0.02KB max: 0.02KB window: 62…省略...

•

rostopic hz [トピック名]：指定したトピックのメッセージ発行周期を表⽰$ rostopic hz /turtle1/pose

10

2016/11/22

ROS情報コマンド
rosserviceコマンド•

rosservice args [サービス名]：サービスパラメータを出力$ rosservice args /turtle1/set_pen
r g b width off•

rosservice call [サービス名] [パラメータ]：
指定したサービスパラメータの設定$ rosservice call /turtle1/set_pen 255 0 0 5 0

ROS 実習2016/11/22

2016/11/22《オプション》• r = 255, g = 0, b = 0 : ペンの⾊
• width = 5：線の太さ• off = 0：線が見えるようにする

パッケージの作成• ワークディレクトリ ~/catkin_ws$ cd ~/catkin_ws$ ls• src ディレクトリ内に irvs_ros_tutorial パッケージを作成$ cd ~/catkin_ws/src$ catkin_create_pkg irvs_ros_tutorials std_msgs roscpp

build
devel
src

build devel src の3つのフォルダがあるパッケージが使うパッケージ

プログラム開発で使うのはsrcフォルダ

srcフォルダの下にCMakeLists.txt
irvs_ros_tutorialフォルダができる

ビルド関連ファイル
msg又はsrvのヘッダーファイルとユーザーパッケージのライブラリ、実行ファイル
ユーザーパッケージ

2016/11/22

2016/11/22

一度リブートしておきましょう

パッケージの作成

パッケージの作成• irvs_ros_tutorialディレクトリ内を見てみる$ cd irvs_ros_tutorials$ ls

includesrc
CMakeLists.txt
package.xml

→
→
→
→

ヘッダーファイルフォルダ
ソースコードフォルダ
ビルド設定ファイルパッケージの設定ファイル

トピック通信の実習
2016/11/22

2016/11/22

Irvs_ros_tutorialの中にはinclude フォルダ
src フォルダ
CMakeLists.txt
package.xmlがある

11

2016/11/22

トピック通信

ROSの基本用語トピックメッセージ通信• パッケージの設定ファイル(package.xml)の確認$ gedit package.xml

2016/11/22

2016/11/22

一対一，一対多も可能

トピック通信

トピック通信$ gedit package.xml• ビルド設定ファイル(CMakeLists.txt)の修正$ gedit CMakeLists.txt

2016/11/22

2016/11/22

依存するパッケージ
catkin_create_pkg で書いたもの
std_msgs， roscpp

CMakeLists.txtの中身（オリジナル）

CMakeLists.txtの中身（オリジナル）

サービス定義ファイル
必要なパッケージ
インクルードディレクトリ、
ライブラリ、catkinビルド、システムに依存するパッケージの指定

add_message_filesで使用するメッセージの依存関係

メッセージ定義ファイル

2016/11/22

2016/11/22

インクルードディレクトリの設定

重要な
設定

12

2016/11/22

CMakeLists.txtの変更

CMakeLists.txtの変更書き換えたものを保存して終了

message_generationを追加
catkin_packageのコメントを外す

generate_messagesのコメントを外す

次頁

add_message_filesのコメントを外して
msgTutorial.msgを追加

2016/11/22

2016/11/22

ros_tutorial_msg_publisherノード
ros_tutorial_msg_subscriberノードを追加の設定

CMakeLists.txtの変更

メッセージファイルの作成

ros_tutorial_msg_publisherノード
ros_tutorial_msg_subscriberノードを追加の設定$ cd ~/catkin_ws/src/irvs_ros_tutorials$ mkdir msg$ cd msg$ gedit msgTutorial.msg## ros_tutorial_msg_publisherノードの設定##実行ファイル、ターゲットリンクライブラリ、追加の依存関係などを設定
add_executable(ros_tutorial_msg_publisher src/ros_tutorial_msg_publisher.cpp)
target_link_libraries(ros_tutorial_msg_publisher ${catkin_LIBRARIES})
add_dependencies(ros_tutorial_msg_publisher irvs_ros_tutorials_generate_messages_cpp)

msgTutorial.msgの中身
int32 data
保存して終了2016/11/22

2016/11/22## ros_tutorial_msg_subscriberノードの設定##実行ファイル、ターゲットリンクライブラリ、追加の依存関係などを設定
add_executable(ros_tutorial_msg_subscriber src/ros_tutorial_msg_subscriber.cpp)
target_link_libraries(ros_tutorial_msg_subscriber ${catkin_LIBRARIES})
add_dependencies(ros_tutorial_msg_subscriber irvs_ros_tutorials_generate_messages_cpp)

配信者ノードの作成

ros_tutorial_msg_publisher.cpp
http://irvs.github.io/rosbook_jp/// ROSメインヘッダーファイル// ROSプログラミングを行う際に必要となるROSファイルのインクルードを行う。
// 後述するROS_INFO関数などを使用できるようになる。
#include "ros/ros.h"$ roscd irvs_ros_tutorials/src（あるいは $ cd ~/catkin_ws/src/irvs_ros_tutorials/src）$ gedit ros_tutorial_msg_publisher.cpp

134頁// ros::ok()はROSの動作が正常であるならtrueを返す関数である。
while (ros::ok()){// msgTutorialメッセージファイル形式でmsg変数を宣言する。
irvs_ros_tutorials::msgTutorial msg;// msgTutorialメッセージファイルのヘッダー// CMakelists.txtでビルド後に自動的に生成されるように設定した// メッセージファイルのヘッダーをインクルードする。
#include "irvs_ros_tutorials/msgTutorial.h"// 変数countを使用して、メッセージの値を定める。
msg.data = count;// ROS_INFOというROS関数を使用して、count変数を表⽰する。
ROS_INFO("send msg = %d", count);// 配信者ノードのメイン関数
int main(int argc, char **argv){// ノード名の初期化
ros::init(argc, argv, "ros_tutorial_msg_publisher");// ROSシステムとの通信のためのノードハンドルを宣言
ros::NodeHandle nh;

http://robotics.ait.kyushu-u.ac.jp/~kurazume/ROS/ros_tutorial_msg_publisher.cpp
ユーザ： temp
パスワード： temp// 配信者ノードの宣言// irvs_ros_tutorialsパッケージのmsgTutorialメッセージファイルを// 利用した配信者ros_tutorial_pubを宣言する。
// トピック名をros_tutorial_msg とし、配信者キュー( queue )の// サイズを100に設定する。
// 配信者キューには、メッセージを送る際、メッセージデータを蓄積する。
// http://wiki.ros.org/msg
ros::Publisher ros_tutorial_pub =nh.advertise<irvs_ros_tutorials::msgTutorial>("ros_tutorial_msg", 100);// メッセージを発行する。約0.1秒間隔で発行される。
ros_tutorial_pub.publish(msg);// 上で定められたループサイクルになるように、スリープに入る
loop_rate.sleep();// count変数に1ずつ増加++count;}
return 0;}

2016/11/22

2016/11/22// ループの周期を設定する。"10"は10Hzを表し、0.1秒間隔で繰り返される// http://wiki.ros.org/roscpp/Overview/Time
ros::Rate loop_rate(10);// メッセージに使用する変数の宣言
int count = 0;13

2016/11/22

配信者ノードの作成

ros_tutorial_msg_publisher.cpp
http://irvs.github.io/rosbook_jp/

return 0;// msgTutorialメッセージファイルのヘッダー// CMakelists.txtでビルド後に自動的に生成されるように設定した// メッセージファ//イルのヘッダーをインクルードする。
#include "irvs_ros_tutorials/msgTutorial.h"}// メッセージを受信したときに動作するコールバック関数を定義// irvs_ros_tutorialsパッケージのmsgTutorialメッセージを受信する
void msgCallback(const irvs_ros_tutorials::msgTutorial::ConstPtr& msg){// 受信したメッセージを表⽰する。
ROS_INFO("recieve msg: %d", msg->data);}// 購読者ノードのメイン関数
int main(int argc, char **argv){// ノード名の初期化
ros::init(argc, argv, "ros_tutorial_msg_subscriber");// ROSシステムとの通信のためのノードのハンドルを宣言
ros::NodeHandle nh;

2016/11/22

http://robotics.ait.kyushu-u.ac.jp/~kurazume/ROS/ros_tutorial_msg_subscriber.cpp
ユーザ： temp
パスワード： temp

2016/11/22

136頁// メッセージが受信されるまで待機し、受信が行われた場合、// コールバック関数を実行する。
ros::spin();// ROSメインヘッダーファイル// ROSプログラミングを行う際に必要となるROSファイルのインクルードを行う。
// 後述するROS_INFO関数などを使用できるようになる。
#include "ros/ros.h"$ roscd irvs_ros_tutorials/src（あるいは $ cd ~/catkin_ws/src/irvs_ros_tutorials/src）$ gedit ros_tutorial_msg_subscriber.cpp// 購読者ノードの宣言// irvs_ros_tutorialsパッケージのmsgTutorialメッセージファイルを// 利用した購読者ros_tutorial_subを宣言する。
// トピック名をros_tutorial_msg とし、購読者キュー( queue )の// サイズを100に設定する。
// 購読者キューには、配信者から送信されてくるメッセージが蓄積される。
ros::Subscriber ros_tutorial_sub = nh.subscribe("ros_tutorial_msg",
100, msgCallback);

トピック通信

トピック通信• ビルド$ cd ~/catkin_ws$ catkin_make• 実行
新しいターミナルを開いて（「Ctrl+Alt+T」）$ roscore

2016/11/22「100%」と表⽰されたら成功

トピック通信

トピック通信• 実行
新しいターミナルを開いて（「Ctrl+Alt+T」）$ rosrun irvs_ros_tutorials ros_tutorial_msg_subscriber• 実行
新しいターミナルを開いて（「Ctrl+Alt+T」）$ rostopic echo /ros_tutorial_msg

データがpublisherからsubscriberへ送られている

2016/11/22

2016/11/22

2016/11/22

新しいターミナルを開いて（「Ctrl+Alt+T」）$ rosrun irvs_ros_tutorials ros_tutorial_msg_publisher

送られているデータを見ることができる

14

2016/11/22

トピック通信• 接続の確認$ rqt_graph2016/11/22

2016/11/22

サービス通信の実習

サービス通信

ROSの基本用語
サービスメッセージ通信

一対一のみ

2016/11/22

2016/11/22• パッケージの設定ファイル(package.xml)の修正$ roscd irvs_ros_tutorials（あるいは $ cd ~/catkin_ws/src/irvs_ros_tutorials）$ gedit CMakeLists.txt

CMakeLists.txtの変更

CMakeLists.txtの変更
ros_tutorial_srv_serverノード
ros_tutorial_srv_clientノードを追加の設定## ros_tutorial_srv_serverサービスサーバノードの設定##実行ファイル、ターゲットリンクライブラリ、追加の依存関係などを設定
add_executable(ros_tutorial_srv_server src/ros_tutorial_srv_server.cpp)
target_link_libraries(ros_tutorial_srv_server ${catkin_LIBRARIES})
add_dependencies(ros_tutorial_srv_server irvs_ros_tutorials_generate_messages_cpp)## ros_tutorial_srv_clientサービスクライアントノードの設定##実行ファイル、ターゲットリンクライブラリ、追加の依存関係などを設定
add_executable(ros_tutorial_srv_client src/ros_tutorial_srv_client.cpp)
target_link_libraries(ros_tutorial_srv_client ${catkin_LIBRARIES})
add_dependencies(ros_tutorial_srv_client irvs_ros_tutorials_generate_messages_cpp)

次頁
ros_tutorial_srv_serverノード
ros_tutorial_srv_clientノードを追加の設定

2016/11/22

2016/11/22

add_service_filesのコメントを外して
srvTutorial.srvを追加

15

2016/11/22

メッセージファイルの作成

サービスサーバノードの作成$ roscd irvs_ros_tutorials$ mkdir srv$ cd srv$ gedit srvTutorial.srv$ roscd irvs_ros_tutorials/src$ gedit ros_tutorial_srv_server.cpp

http://robotics.ait.kyushu-u.ac.jp/~kurazume/ROS/ros_tutorial_srv_server.cpp
ユーザ： temp
パスワード： temp

保存して終了2016/11/22

2016/11/22

srvTutorial.srvの中身
int64 aint64 b--int64 result

ros_tutorial_srv_server.cpp
http://irvs.github.io/rosbook_jp/// サービスサーバ宣言// irvs_ros_tutorialsパッケージのsrvTutorialサービスファイルを利用した// サービスサーバros_tutorial_service_serverを作成する。
// サービス名はros_tutorial_srvで、サービスリクエストがあったとき、// calculationという関数を実行するように設定している。
ros::ServiceServer ros_tutorial_service_server =nh.advertiseService("ros_tutorial_srv", calculation);// ROSメインヘッダーファイル// ROSプログラミングを行う際に必要となるROSファイルのインクルードを行う。
// 後述するROS_INFO関数などを使用できるようになる。
#include "ros/ros.h"// srvTutorial サービスファイルのヘッダー// CMakelists.txtでビルド後に自動的に生成されるように設定した// サービスファイルのヘッダーをインクルードする。
#include "irvs_ros_tutorials/srvTutorial.h"// サービスリクエストがある場合は、以下の処理を実行する。
// サービスリクエストは、req、サービスのレスポンスは、resに設定した。
bool calculation(irvs_ros_tutorials::srvTutorial::Request &req,
irvs_ros_tutorials::srvTutorial::Response &res){// サービスリクエストで受けたaとbの値を加えて、// サービスのレスポンス値に格納する。
res.result = req.a + req.b;

サービスクライアントノードの作成
142頁$ roscd irvs_ros_tutorials/src（$ cd ~/catkin_ws/src/irvs_ros_tutorials/srcと同じ）$ gedit ros_tutorial_srv_client.cpp// サービスサーバが実行したことを表⽰する。
ROS_INFO("ready srv server!");// サービスリクエストを待機する
ros::spin();http://robotics.ait.kyushu-u.ac.jp/~kurazume/ROS/ros_tutorial_srv_client.cpp
ユーザ： temp
パスワード： temp

return 0;}// サービスリクエストで受けたa、bの値の表⽰、および// サービスレスポンスに対応するresultの値を出力する。
ROS_INFO("request: x=%ld, y=%ld", (long int)req.a, (long int)req.b);
ROS_INFO("sending back response: [%ld]", (long int)res.result);
return true;// サービスサーバノードのメイン関数
int main(int argc, char **argv){// ノード名の初期化
ros::init(argc, argv, "ros_tutorial_srv_server");// ROSシステムとの通信のためのノードのハンドルを宣言
ros::NodeHandle nh;

2016/11/22

2016/11/22}

ros_tutorial_srv_client.cpp
http://irvs.github.io/rosbook_jp/

サービス通信
144頁

ros::ServiceClient ros_tutorial_service_client =nh.serviceClient <irvs_ros_tutorials::srvTutorial>("ros_tutorial_srv");// ROSメインヘッダーファイル// ROSプログラミングを行う際に必要となるROSファイルのインクルードを行う。
// 後述するROS_INFO関数などを使用できるようになる。
#include "ros/ros.h"• ビルド$ cd ~/catkin_ws$ catkin_make// srvという名前でsrvTutorialサービスを利用する// サービスのファイルを宣言する。
irvs_ros_tutorials::srvTutorial srv;// srvTutorialサービスファイルのヘッダー// CMakelists.txtでビルド後に自動的に生成されるように設定したサービスファ// イルのヘッダーをインクルードする。
#include "irvs_ros_tutorials/srvTutorial.h"// サービスリクエスト値をそれぞれのa、bに格納する。
srv.request.a = atoll(argv[1]);srv.request.b = atoll(argv[2]);// atoll関数を使用するためのライブラリ#include <cstdlib>// サービスをリクエストし、レスポンスが返された場合、// レスポンス値を表⽰する。
if (ros_tutorial_service_client.call(srv)){
ROS_INFO("send srv request.a and b: %ld, %ld",(long int)srv.request.a, (long int)srv.request.b);
ROS_INFO("receive srv.response.result: %ld",(long int)srv.response.result);}
else{
ROS_ERROR("Failed to call service ros_tutorial_srv");
return 1;}
return 0;// サービスクライアントノードのメイン関数
int main(int argc, char **argv){// ノード名の初期化
ros::init(argc, argv, "ros_tutorial_srv_client");// 入力値エラー処理
if (argc != 3){
ROS_INFO("cmd: rosrun ros_tutorial ros_tutorial_service_client arg0 arg1");
ROS_INFO("arg0: double number, arg1: double number");
return 1;}}// サービスクライアント宣言、// irvs_ros_tutorialsパッケージのsrvTutorialサービスファイルを利用した。
// サービスクライアントros_tutorial_service_clientを作成する。
// サービス名は「ros_tutorial_srv」である。

2016/11/22

2016/11/22// ROSシステムとの通信のためのノードのハンドル宣言
ros::NodeHandle nh;「100%」と表⽰されたら成功

16

2016/11/22• 実行
もしroscoreが一つも動いていなければ新しいターミナルを開いて（「Ctrl+Alt+T」）$ roscore
新しいターミナルを開いて（「Ctrl+Alt+T」）$ rosrun irvs_ros_tutorials ros_tutorial_srv_server• 確認
新しいターミナルを開いて（「Ctrl+Alt+T」）$ rosservice list
/ros_tutorial_srvがあることを確認$ rosservice type /ros_tutorial_srv/ros_tutorial_srvの型が srvTutorialであることを確認

2016/11/22

サービス通信2016/11/22

サービス通信サービス通信• 確認$ rosservice type /ros_tutorial_srv | rossrv show
srvTutorialの型の中身が確認できる
int64 a入力
int64 b--出力
int64 result• 実行
新しいターミナルを開いて（「Ctrl+Alt+T」）$ rosrun irvs_ros_tutorials ros_tutorial_srv_client 2 3
ros_tutorial_srv_clientの画面

2016/11/22

2016/11/22

サービス通信答えの５

ros_tutorial_srv_serverの画面が返ってきたサービス通信• サービスクライアントノードを使わない方法
新しいターミナルを開いて（「Ctrl+Alt+T」）$ rosservice call /ros_tutorial_srv 3 4
ros_tutorial_srv_clientの画面

ros_tutorial_srv_serverの画面

答えの７が返ってきた2016/11/22

2016/11/22

パラメータの実習

172016/11/22

ROSの基本用語

パラメータを利用したノードの作成• パラメータ（parameter）$ roscd irvs_ros_tutorials/src$ gedit ros_tutorial_srv_server.cpp• ノード実行中に変更可能な変数• パラメータサーバ（parameter server）
http://robotics.ait.kyushu-u.ac.jp/~kurazume/ROS/param/ros_tutorial_srv_server.cpp
ユーザ： temp
パスワード： temp

2016/11/22

2016/11/22• 全てのノードのパラメータを一括管理するサーバ• マスターと同時に起動される

ros_tutorial_srv_server.cpp
http://irvs.github.io/rosbook_jp/// srvTutorial サービスファイルのヘッダー// CMakelists.txtでビルド後に自動的に生成されるように設定したサービスファ// イルのヘッダーをインクルードする。
#include "irvs_ros_tutorials/srvTutorial.h"// パラメータのオプション#define PLUS 1 // 加算#define MINUS 2 // 減算#define MULTIPLICATION 3 // 乗算#define DIVISION 4 // 割算// サービスサーバノードのメイン関数
int main(int argc, char **argv){// ノード名の初期化
ros::init(argc, argv, "ros_tutorial_srv_server");// ROSシステムとの通信のためのノードのハンドルを宣言
ros::NodeHandle nh;// ROSシステムとの通信のためのノードのハンドルを宣言(Private)// http://wiki.ros.org/Namesros::NodeHandle nh_priv("~");// パラメータの初期設定, http://wiki.ros.org/rosparamnh_priv.setParam("calculation_method", PLUS);// サービスリクエストがある場合は、以下の処理を実行する。
// サービスリクエストは、req、サービスのレスポンスは、resに設定した。
bool calculation(irvs_ros_tutorials::srvTutorial::Request &req,
irvs_ros_tutorials::srvTutorial::Response &res){// パラメータ値に基づいて演算子を変更し、サービスリクエストを受けた// aとbの値を計算して、結果をサービスレスポンス値に保存する。
switch (g_operator){case PLUS:
res.result = req.a + req.b; break;case MINUS:
res.result = req.a - req.b; break;case MULTIPLICATION:
res.result = req.a * req.b; break;case DIVISION:
if (req.b == 0){
res.result = 0; break;}else{
res.result = req.a / req.b; break;}default:
res.result = req.a + req.b; break;}// サービスサーバ宣言、// irvs_ros_tutorialsパッケージのsrvTutorialサービスファイルを利用した// サービスサーバros_tutorial_service_serverを作成する。
// サービス名はros_tutorial_srvで、サービスリクエストがあったとき、// calculationという関数を実行するように設定している。
ros::ServiceServer ros_tutorial_service_server =nh.advertiseService("ros_tutorial_srv", calculation);// サービスサーバが実行したことを表⽰する。
ROS_INFO("ready srv server!");// ループの周期を設定する。"10"は10Hzを表し、// 0.1秒間隔で繰り返される
ros::Rate r(10);while (ros::ok()){// 演算子をパラメータから取得した値に変更する。
nh_priv.getParam("calculation_method", g_operator);// コールバック関数の処理ルーチン
ros::spinOnce();// 上で定められたループサイクルになるように、スリープに入る
r.sleep();}
return 0;}「100%」と表⽰されたら成功

パラメータの使用例

パラメータの使用例• 実行
もしroscoreが一つも動いていなければ新しいターミナルを開いて（「Ctrl+Alt+T」）$ roscore
新しいターミナルを開いて（「Ctrl+Alt+T」）$ rosrun irvs_ros_tutorials ros_tutorial_srv_server• 実行
新しいターミナルを開いて（「Ctrl+Alt+T」）$ rosparam list

2016/11/22

2016/11/22

2016/11/22

int g_operator = PLUS;// サービスリクエストで受けたa、bの値の表⽰、および// サービスレスポンスに対応するresultの値を出力する。
ROS_INFO("request: x=%ld, y=%ld", (long int)req.a, (long int)req.b);
ROS_INFO("sending back response: [%ld]", (long int)res.result);• ビルド$ cd ~/catkin_ws$ catkin_make

return true;}

2016/11/22// ROSメインヘッダーファイル// ROSプログラミングを行う際に必要となるROSファイルのインクルードを行う。
// 後述するROS_INFO関数などを使用できるようになる。
#include "ros/ros.h"

パラメータの使用例
149頁/ros_tutorial_srv_server/calculation_method というパラメータがあることを確認

18

2016/11/22

パラメータの使用例

パラメータの使用例

答えの5が返ってきた• 実行$ rosparam set /ros_tutorial_srv_server/calculation_method 3→パラメータを乗算に変更$ rosservice call /ros_tutorial_srv 10 5

2016/11/22

2016/11/22• 実行
新しいターミナルを開いて（「Ctrl+Alt+T」）$ rosparam set /ros_tutorial_srv_server/calculation_method 2$ rosservice call /ros_tutorial_srv 10 5 →パラメータを減算に変更

答えの

50

が返ってきたroslaunchを用いた複数ノードの起動• rosrun• 一つのノードを実行するコマンド• roslaunch• 複数のノードを実行するコマンド• roslaunchファイル• *.launch

2016/11/22

2016/11/22

roslaunchを用いた複数ノードの起動

roslaunchを用いた複数ノードの起動

roslaunchファイルの作成• ２つの配信者ノードと２つの購読者ノードを同時に起動したい• それぞれの組を独立に通信させたい
ros_tutorial_msg_publisher

ros_tutorial_msg_subscriber$ roscd irvs_ros_tutorials$ mkdir launch$ cd launch$ gedit union.launch

ros_tutorial_msg_publisher

ros_tutorial_msg_subscriber

http://robotics.ait.kyushu-u.ac.jp/~kurazume/ROS/union.launchユーザ： temp
パスワード： temp

「実行ノード名は，ユニークでなくてはならない」
roslaunchを使う

2016/11/22• 制約
2016/11/22• 起動するノードを設定• ノードの実行時のパラメータの変更• ノード名の変更• ノードの名前空間の設定• ROS_ROOTとROS_PACK• AGE_PATHの設定、環境変数の変更なども可能<launch><node pkg = "irvs_ros_tutorials" type = "ros_tutorial_msg_publisher" name = "msg_publisher1" /><node pkg = "irvs_ros_tutorials" type = "ros_tutorial_msg_subscriber" name = "msg_subscriber1" /><node pkg = "irvs_ros_tutorials" type = "ros_tutorial_msg_publisher" name = "msg_publisher2" /><node pkg = "irvs_ros_tutorials" type = "ros_tutorial_msg_subscriber" name = "msg_subscriber2" /></launch>19

2016/11/22

roslaunchの実行

roslaunchの実行$ cd ~/catkin_ws$ roslaunch irvs_ros_tutorials union.launch --screen

新しいターミナルを開いて（「Ctrl+Alt+T」）$ rosnode list

画面に出力するオプション

2016/11/22

2016/11/22$ rqt_graphroslaunchを用いた複数ノードの起動

roslaunchファイルの作成$ roscd irvs_ros_tutorials/launch$ gedit union-ns.launch
http://robotics.ait.kyushu-u.ac.jp/~kurazume/ROS/union-ns.launchユーザ： temp
パスワード： temp

ros_tutorial_msg_publisher

ros_tutorial_msg_subscriber

ros_tutorial_msg_publisher

ros_tutorial_msg_subscriber

ネームスペースを使う

2016/11/22

2016/11/22• 以下のようになっていない！

roslaunchの実行<launch>ネームスペース１<group ns = "ns1"><node pkg = "irvs_ros_tutorials" type = "ros_tutorial_msg_publisher" name = "msg_publisher" /><node pkg = "irvs_ros_tutorials" type = "ros_tutorial_msg_subscriber" name = "msg_subscriber" /></group>
ネームスペース２<group ns = "ns2"><node pkg = "irvs_ros_tutorials" type = "ros_tutorial_msg_publisher" name = "msg_publisher" /><node pkg = "irvs_ros_tutorials" type = "ros_tutorial_msg_subscriber" name = "msg_subscriber" /></group></launch>roslaunchの実行$ cd ~/catkin_ws$ roslaunch irvs_ros_tutorials union-ns.launch --screen

新しいターミナルを開いて（「Ctrl+Alt+T」）$ rosnode list
ネームスペースの違うトピック

2016/11/22

2016/11/22$ rqt_graph20

2016/11/22

パッケージのインストール• ROSの特徴の一つ• “公開されているパッケージの導入が簡単”• 例えば• PR2を使いたいとき
sudo apt-get install ros-indigo-pr2*
PR2• 北陽電機のレーザレンジファインダを使いたいとき
sudo apt-get intall ros-indigo-urg-node

2016/11/22

2016/11/22

パッケージのインストール

あるいは
cd ~/catkin_ws/src
git clone https://github.com/ros-drivers/urg_node.git

パッケージのインストール

パッケージのインストール• 公開パッケージを探す
http://www.ros.org/browse/list.php• 公開パッケージを探す
http://www.ros.org/browse/list.php

2016/11/22

2016/11/22

クリック

Indigoバージョンで使えるパッケージが表⽰される

パッケージのインストール(find_object_2d)

パッケージのインストール(find_object_2d)• 例 Search： に find object と入れて，物体検出パッケージを探してみる• 例 Search： に find object と入れて，物体検出パッケージを探してみる

数回押す（結果が異なる）

2016/11/22

2016/11/22

これが良さそうなので
クリック

21

2016/11/22

パッケージのインストール(find_object_2d)

パッケージのインストール(find_object_2d)• 例 Search： に find object と入れて，物体検出パッケージを探してみる• 例 Search： に find object と入れて，物体検出パッケージを探してみる

Indogoを押す

依存パッケージ12個

Dependenciesをクリック

2016/11/22

2016/11/22

ソースファイル

パッケージのインストール(find_object_2d)

パッケージのインストール(find_object_2d)• 例 Search： に find object と入れて，物体検出パッケージを探してみる• パッケージの確認方法

依存パッケージが全部インストールされている必要がある

2016/11/22

2016/11/22

12個の依存パッケージが表⽰されるパッケージのインストール(find_object_2d)

パッケージのインストール(find_object_2d)

ros-indigo-cv-bridge• パッケージの確認方法

2016/11/22

2016/11/22

ros-indigo-uvc-camera

22

2016/11/22

パッケージのインストール(find_object_2d)

パッケージのインストール(find_object_2d)

find_object_2dをインストールする

find_object_2dをインストールするスクロール

2016/11/22

2016/11/22

外部リンク
クリック

パッケージのインストール(find_object_2d)

パッケージのインストール(find_object_2d)

find_object_2dをインストールする

find_object_2dをインストールする

Indigoバージョンのインストール方法

2016/11/22

2016/11/22

GitHubへのリンク

パッケージのインストール(find_object_2d)

パッケージのインストール(find_object_2d)

find_object_2dをインストールする

USBカメラを起動する

2016/11/22

2016/11/22

インストール終了！

23

2016/11/22

パッケージのインストール(find_object_2d)

パッケージのインストール(find_object_2d)

find_object_2dを実行する

find_object_2dを実行する

登録画面

2016/11/22

2016/11/22

検出結果

パッケージのインストール方法

パッケージのインストール(urg_node)• 公開パッケージの導入方法• 例 北陽電機のレーザレンジファインダ(URG)を導入• 公開パッケージを探す
http://www.ros.org/browse/list.php• apt-get を使う（コンパイル済みファイルを導入）$ sudo apt-get install ros-indogo-XXXX• git clone を使う（ソースからコンパイルして導入）$ cd ~/catkin_ws/src$ git clone XXX.git$ cd ~/catkin_ws$ catkin_make

URGで検索2016/11/22

2016/11/22• その他（例えば svnとか）パッケージのインストール(urg_node)

パッケージのインストール(urg_node)• 例 北陽電機のレーザレンジファインダ(URG)を導入• 公開パッケージを探す
http://www.ros.org/browse/list.php•例

北陽電機のレーザレンジファインダ(URG)を導入

ソース

クリック

urg_nodeがある

2016/11/22

2016/11/22

Websiteをクリック

24

2016/11/22

パッケージのインストール(urg_node)

パッケージのインストール(urg_node)• 公開パッケージの導入方法①• 公開パッケージの導入方法②• apt-get を使う• git clone（コンパイル済みファイルを導入）を使う（ソースからコンパイルして導入）$ cd ~/catkin_ws/src$ git clone https://github.com/ros-drivers/urg_node.git$ sudo apt-get install ros-indogo-urg-node

途中まで入力したらタブキーを押すと候補が出る

簡単に終了

2016/11/22

2016/11/22

github上のソースのURL

パッケージのインストール(urg_node)

パッケージのインストール(urg_node)• 公開パッケージの導入方法②• 公開パッケージの導入方法②• git clone• git clone

を使う（ソースからコンパイルして導入）を使う（ソースからコンパイルして導入）• laser_procの導入

dependencies を見ると，laser_proc, urg_cを入れる必要あり• urg_cの導入

2016/11/22

2016/11/22

dependencies

パッケージのインストール(urg_node)

パッケージのインストール(urg_node)• 公開パッケージの導入方法②• 実行例• git clone• TOPURG（UTM-30LX）をUSBに接続して接続ポートを確認を使う（ソースからコンパイルして導入）$ cd ~/catkin_ws （または cd ..）$ catkin_make$ dmesg• /dev/ttyACM0に接続されているので，パーミッションを設定

2016/11/22

2016/11/22$ sudo chmod a+rw /dev/ttyACM025

2016/11/22

パッケージのインストール(urg_node)

パッケージのインストール(urg_node)

• 実行例

• 実行例

• roscoreを起動し，rosrunで実行• トピックの中身を見る$ roscore$ rosrun urg_node urg_node _serial_port:=/dev/ttyACM0$ rostopic echo /scan• rvizで確認• トピックを確認$ rosrun rviz rviz （$ rviz のみでもいい）2016/11/22

2016/11/22$ rostopic list

urg_node関連

パッケージのインストール(urg_node)

パッケージのインストール(urg_node)

Fixed Frameをlaserに変更
トピックに/scanを選択
LaserScanを選択

Addボタンを押す

2016/11/22

2016/11/22

計測結果が表⽰される

Kobukiを用いたシミュレーション• kibukiシミュレータをインストール$ sudo apt-get install ros-indigo-kobuki-soft

2016/11/22

2016/11/22

Kobukiを用いたシミュレー
ション$ sudo apt-get install ros-indigo-kobuki-keyop

26

2016/11/22• kibukiシミュレータを実行$ roslaunch kobuki_softnode full.launch --screen• キーボード操作用ノードを実行$ roslaunch kobuki_keyop keyop.launch

2016/11/22

Kobukiを用いたシミュレーション

2016/11/22

Kobukiを用いたシミュレーション

Kobukiを用いたシミュレーション• キーボード操作用ノードを実行$ roslaunch kobuki_keyop keyop.launch• 可視化ソフト rviz を起動$ rosrun rviz rviz

mapをodomに変更

2016/11/22

2016/11/22

Kobukiを用いたシミュレーション

Kobukiを用いたシミュレーション

Kobukiを用いたシミュレーション
roslaunch kobuki_keyop keyop.launchを実行しているターミナルで矢印キーを押す

ADDを押してRobotModelを選択

kobukiが動く

2016/11/22

2016/11/22

kobukiが現れる

27

2016/11/22

Kobukiを用いたシミュレーション

Kobukiを用いたシミュレーション

rostopic list でトピックを確認/mobile_base/commands/velocityを出力

rqt_graphで接続を確認

roslaunch kobuki_keyop keyop.launchを実行しているターミナルで矢印キーを押す

2016/11/22

2016/11/22/mobile_base/commands/velocity
トピックがある

Kobukiを用いたシミュレーション

Kobukiを用いたシミュレーション

rostopic type /mobile_base/commands/velocity で型がわかる• 課題「/mobile_base/commands/velocityを出力する配信者を作りなさい」

2016/11/22

2016/11/22

rosmsg show geometry_msgs/Twist で型の中身が見えるパッケージの作成

CMakeLists.txt• src ディレクトリ内に my_pkg パッケージを作成$ cd ~/catkin_ws/src

cmake_minimum_required(VERSION 2.8.3)
project(my_pkg)## Find catkin macros and libraries## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz)## is used, also find other catkin packages
find_package(catkin REQUIRED COMPONENTS
geometry_msgs
roscpp)…
## Generate messages in the 'msg' folder# add_message_files(# FILES# Message1.msg# Message2.msg#)$ catkin_create_pkg my_pkg geometry_msgs roscpp$ cd my_pkg$ gedit CMakeLists.txt

2016/11/22

2016/11/22… あとは自由に

add_executable(my_pkg_msg_publisher src/my_pkg_msg_publisher.cpp)
target_link_libraries(my_pkg_msg_publisher ${catkin_LIBRARIES})…

## Generate services in the 'srv' folder# add_service_files(# FILES# Service1.srv# Service2.srv#)…
catkin_package(
INCLUDE_DIRS include
LIBRARIES my_pkg
CATKIN_DEPENDS geometry_msgs roscpp
DEPENDS system_lib
)
…
…

28

2016/11/22

my_pkg_msg_publisher.cpp

Kobukiを用いたシミュレーション
roslaunch kobuki_keyop keyop.launch を停止$rosrun my_pkg my_pkg_msg_publisher#include "ros/ros.h"#include "geometry_msgs/Twist.h"
int main(int argc, char **argv){
ros::init(argc, argv, "my_pkg_msg_publisher");ros::NodeHandle nh;

kobukiが動く

ros::Publisher my_pkg_pub =nh.advertise<geometry_msgs::Twist>("/mobile_base/commands/velocity", 100);ros::Rate loop_rate(1);while (ros::ok()){
geometry_msgs::Twist msg;
msg.linear.x = 0.1;
msg.linear.y = 0;
msg.linear.z = 0;
msg.angular.x = 0;
msg.angular.y = 0;
msg.angular.z = 0;
ROS_INFO("send msg = %lf", msg.linear.x);
my_pkg_pub.publish(msg);
loop_rate.sleep();

2016/11/22

2016/11/22}
return 0;}29