RTミドルウェアを用いた 移動ロボットの知覚制御 - 長井研究室

RTミドルウェアを用いた
移動ロボットの知覚制御
-イントロダクション-
電気通信大学情報理工学研究科
知能機械工学専攻
長井隆行,中村友昭
趣旨


プログラミングとミドルウェアによるシステムインテグレーション
この流れを体感する↓
2
今日の流れ(予定)
2時間程度
 実験の概要・手順・注意など
 ROSを使ってみる
 音声認識を使ってみる
 タスクの書き方を理解する
 キネクトを使ってみる
 ロボットを動かしてみる
1時間程度
 ソースコードを見ながら色々考える
 グループで最終的に何を作るか考える
3
次回の流れ(予定)
??時間程度
 実装とテスト
 (ロボットの評価実験)
15分程度
 レポートについて議論する
4
注意







安全第一
ロボットやノートPCの扱いに注意する
ロボットを持ち上げる際に持つ位置を注意
ロボットの上に載せたPCを落とさないように注意
故障等は必ず報告する
PCとロボットの充電に気をつける
プログラムなどファイルはファイルサーバーにコピーし
ておく
5
レポート
 レポートはグループ毎に提出
 メールでpdfファイルを添付する
 誰がどの部分を書いたのかを明記する
 分担は話合いで決める
 講評は全員で受ける(連帯責任)
 講評の際にはレポートを印刷したものを
1部持参すること
6
連絡先・情報

レポートの提出先
robotexp@apple.ee.uec.ac.jp

実験の情報 HP


http://apple.ee.uec.ac.jp/ROBOTEXP/
スタッフ(質問・連絡など)
 教員:長井 隆行
tnagai@ee.uec.ac.jp

TA(D1):アッタミミ ムハンマド
m_att@apple.ee.uec.ac.jp
7
ROS (Robot Operating System)

Willow Garageが開発したロボット用OS



Ubuntuで動作しロボット開発に必要な様々な機能を提供
ROSの一部機能(ミドルウェア)はWindowsで実行可能
ミドルウェアとは?



OSとアプリケーションの中間に位置し,様々なソフトが利用可
能な標準化されたインタフェース(通信機能)を提供
アプリケーションが通信するための機能を提供
利点



独立して開発が可能
一部が壊れても
システム全体は停止しない
再利用ができる
カメラ
音声
ミドルェア(ROS)
アーム
台車
ROSによるプログラム間の通信

様々なソフトウェアが様々な情報を通信して送受信する



ソフトウェア=ノード
情報=トピック
ノードやトピックの管理を行うソフトウェア=ROSCore
カメラ
ノード
音声
ノード
台車
ノード
ノード
音声トピック
(音声発話)
画像認識トピック
(人の位置)
人を見つけて
近づいて
挨拶しよう!
ロボット動作トピック
(移動)
行動計画ノード
ROSCoreにより管理
• どんなノードがあるか
• どのノードがどのトピックを
発行(Publish)しているか
• どのノードがどのトピックを
要求(Subscribe)しているか
簡単なサンプルを動かしてみよう!

文字列を送受信するサンプル
1.
「StartRoscore.bat」をダブルクリック
←こんな画面が出れば成功
簡単なサンプルを動かしてみよう!

文字列を送受信するサンプル
2.
3.
「sample¥SimpleSender¥sample.sln」を起動し,
[ビルド]→[デバッグなしで実行]
「sample¥SimpleReciever¥sample.sln」を起動し,
[ビルド]→[デバッグなしで実行]
↓こんな2つの画面が出れば成功↓
簡単なサンプルを動かしてみよう!

文字列を送受信するサンプル
4.
SimpleSenderに文字を入力してEnter
文字列
転送
「こんにちは」
を入力
送信
ノード
文字列トピック
(配列)
文字列トピックのPublish
受信
ノード
文字列トピックのSubscribe
送信側のソースコード

「sample¥SimpleSender¥sample.sln」のsample.cppをダブ
ルクリック
送信側の
ソースコード
送信側のソースコード
ROSを使うための初期設定
(おまじない)
ノードの名前,
Publishするトピックの設定等
ROSCoreに通知
文字列トピック用の
データ(構造体)を準備
型名 ^変数名 = 型名();
コンソールから文字列入力
構造体のdataに文字列を代入
文字列トピックを送信
送信
ノード
文字列トピック
(配列)
文字列トピックのPublish
受信側のソースコード

「sample¥SimpleReciever¥sample.sln」のsample.cpp
受信側の
ソースコード
受信側のソースコード

基本的には送信側と同じ
ノードの名前,
Subscribeするトピックの設定等
ROSCoreに通知
文字列トピック用の
データ(構造体)を準備
型名 ^変数名 = 型名();
データを受信
戻り値:受信が成功したか
受信したデータを
C言語のcharに変換
文字列トピック
(配列)
受信
ノード
文字列トピックのSubscribe
送信(Publish)の基本

Publishするトピックを通知する



送信するトピック(構造体)を準備




型名 ^変数名=gcnew 型名();
Robot ^r = gcnew Robot();
変数の宣言がC言語と違うので注意!
データ(構造体)に値を入れる


トピック=データ構造体
client->Publish<***>();
アクセスは「->」
client->Send( *** )で送信
受信(Subscribe)の基本

Subscribeするトピックを通知する



送信するトピック(構造体)を準備




トピック=データ構造体
client->Subscribe<***>();
型名 ^変数名=gcnew 型名();
Robot ^r = gcnew Robot();
変数の宣言がC言語と違うので注意!
データを受信する


client->GetLastMsg( *** )
戻り値がtrueであれば受信成功
音声ノードの使い方 –起動

音声の合成・認識を行うノード
起動方法:「StartAudio.bat」をダブルクリック
認識結果
認識辞書設定
音声ノードの使い方 –認識辞書DIGORO HELLO
に単語が代入され認識される
DIGOROに代入される単語候補
(この場合一つだけ)
この場合...
HELLOに代入される単語候補
•
•
•
•
だいごろう、こんにちは
だいごろう、こんばんは
だいごろう、おはよう
だいごろう、おなかがすいた
が認識可能
音声ノードの使い方 –ソースコード
「sample¥AudioTest¥sampe.sln」を起動してsample.cppを開く
送受信(Publish, Subscribe)する情報の通知
• SpeechInfo:音声認識トピック
• SpeechOrder:音声合成トピック
音声認識トピックSpeechInfoを受信
C言語のchar配列へ変換
文字列の中に「こんにちは」があるか検索
SpeechInfo->utteranceに「こんにちは」を
代入して送信
音声認識トピック
(SpeechInfo)
認識結果の表示
Audio
Test
音声認識トピックのSubscribe
音声合成トピックのPublish
音声
ノード
音声合成トピック
(SpeechOrder)
音声認識トピックのPublish
音声合成トピックのSubscribe
ビジョンノードの使い方 –起動

様々な画像認識を行うノード
起動方法:「StartVision.bat」をダブルクリック

タブで各処理の結果表示を切り替え




VisionROS:骨格検出
FaceDetection:顔検出
ObjectDetection:物体検出
ColorDetection:色検出
タブを切り替えて
F1(F2)キーで検出結果画像表示
骨格(関節位置)検出
物体認識
顔検出
ビジョンノードの使い方 –ソースコード
「sample¥VisionTest¥sample.sln」を起動してsample.cppを開く
骨格検出結果を受信
右手と左手の位置を計算
y
z
x
右手y – 右肩y > 0
:右手上
右手x – 右肩x < -300 : 右手横
右手と左手の位置の表示
•上,横,前
画像認識トピック
(VisionInfo)
Vision
Test
画像認識トピックのSubscribe
ヒジョン
ノード
画像認識トピックのPublish
ビジョンノードの使い方 –ソースコード•
•
•
•
•
•
物体認識結果の受信
顔検出結果の受信
•
•
•
•
•
•
objects->data は配列
objects->data->Count で配列の要素数
objects->data[i] でi個目の物体の情報にアクセス
objects->data[i] ->pos->x : x座標
objects->data[i] -> pos->y : y座標
objects->data[i] -> pos->z : z座標
Faces->data は配列
faces->data->Count で配列の要素数
faces->data[i] でi個目の物体の情報にアクセス
faces->data[i] ->pos->x : x座標
faces->data[i] ->pos->y : y座標
faces->data[i] ->pos->z : z座標
ビジョンノードの使い方 –ソースコード-
物体認識結果の受信
•
•
•
•
•
•
blobs->data は配列
blobs->data->Count で配列の要素数
blobs->data[i] でi個目の物体の情報にアクセス
blobs->data[i] ->pos->x : x座標
blobs->data[i] -> pos->y : y座標
blobs->data[i] -> pos->z : z座標
ロボットノードの使い方 –起動

ロボットを制御するノード
起動方法:「StartRobot.bat」をダブルクリック
ロボット状態トピック
(RobotInfo)
Robot
Test
ロボット状態トピックのSubscribe
ロボット制御トピックのPublish
音声
ノード
ロボット制御トピック
(RobotOrder)
ロボット状態トピックのPublish
ロボット制御トピックのSubscribe
ロボットノードの使い方 –ソースコード
「sample¥RobotTest¥sample.sln」を起動してsample.cppを開く
キー入力があったか?
入力されたキーを取得
入力されたキーに応じて
ロボット制御トピックRobotOrderに代入
直進命令とその速度(m/s)
回転命令とその速度(rad/s)
ロボット制御トピックを送信
ロボットノードの使い方 –ソースコード
「sample¥RobotTest¥sample.sln」を起動してsample.cppを開く
ロボット状態トピックを取得
変数名
ロボット状態を表示
heading
x
(x, y)
y
初期位置
info->posx
info->posy
info->heading
info->ismoving
info->isClisionDetectedL
info->isClisionDetectedC
info->isClisionDetectedR
info->isCliffDetectedL
info->isCliffDetectedC
info->isCliffDetectedR
内容
ロボットの現在位置のx座標(m)
ロボットの現在位置のy座標(m)
ロボットの現在位置の回転方向(rad)
ロボットが動いているかどうか
左バンパーが接触しているどうか
正面バンパーが接触しているどうか
右バンパーが接触しているどうか
左に段差があるかどうか
正面に段差があるかどうか
右に段差があるかどうか
その他のサンプルプログラム

SpeechAndRobotTest




VisionAndRobotGestureTest




音声命令でロボットを操作するサンプル
「前に進んで」→ロボットが前進
「右に回って」→ロボットが右回転
ジェスチャによってロボットを操作するサンプル
右手を上げる→前進
右手を横に伸ばす→左回転
VisionAndRobotFollowTest



人の顔を見つけてロボットが追跡をするサンプル
人の顔がロボットの右にある→右回転
人の顔がロボットの正面にある→直進
型一覧

今回の実験で使用する型の一覧


送信:今回の実験で送信(Publish)すべきデータ
受信:今回の実験で受信(Subscribe)すべきデータ
型
説明
送
信
受
信
List^
可変長配列(高機能な配列).
list->Add(*):要素の追加
list->Count:要素の数
list[0]:要素の参照
☓
☓
ByteMultiArray^
Byte(char)のList^.文字列の送受信に利用.Char配列との変換が必要.
char *s = ToChar(list) :C言語用の文字列に変換
arr = ToBytes(“aaa”) :文字列からByte配列に変換
☓
☓
SpeechOrder^
音声合成命令送信用の構造体.
order->uttrance:認識結果文字列(ByteMultiArray^)
○
☓
SpeechInfo^
音声認識受信用構造体.
info->recSpeech:認識結果文字列(ByteMultiArray^)
info->isSpeaking:音声発話中かどうか?(bool)
☓
○
RobotOrder^
ロボットへの命令送信用構造体.
kind:命令の種類(RobotOrder::ORDER_ROTATE等)
data:命令に必要な情報(floatのList^)
○
☓
型
説明
送
信
受
信
RobotInfo^
ロボットの情報受信用構造体.
info->posx:ロボットのx座標(float)
info->posy:ロボットのy座標(float)
info->heading:ロボットの向いている方向(float)
info->ismoving:ロボットが動いているかどうか(bool)
info->isClisionDetectedL:左のバンパーが接触しているか(bool)
info->isClisionDetectedC:正面のバンパーが接触しているか(bool)
info->isClisionDetectedR:右のバンパーが接触しているか(bool)
info->isCliffDetectedL:左側に段差があるか(bool)
info->isCliffDetectedC:正面に段差があるか(bool)
info->isCliffDetectedR:右側に段差があるか(bool)
☓
○
Pos3D^
三次元位置を表す構造体.
pos->x:x座標(float)
pos->y:y座標(float)
pos->z:z座標(float)
☓
☓
ObjectData^
物体又は顔の情報を表す構造体.
obj->id:物体や顔のID(int)
obj->pos:物体や顔の位置(Pos3D^)
☓
☓
Objects
検出された物体情報を受信するための構造体.
objects->data:物体の情報(ObjectData^のList^)
☓
○
Faces
検出された顔の情報を受信するための構造体.
faces^>data:物体の情報(ObjectData^のList^)
☓
○
型
説明
送
信
受
信
SkeltonData^
人の骨格情報が格納されている構造体.
skelton->id:人のID
skelton->joints:各関節の位置(Pos3D^のList^)
☓
☓
Skeltons^
人の骨格情報を受信するための構造体.
skeltons->data:骨格情報(SkeltonData^のList^)
☓
○
ColorBlob^
色検出の結果が格納される構造体.
blob->id:色ID(int)
blob->pos:三次元位置(Pos3D^)
☓
☓
ColorBlobs^
色検出の結果を受信するための構造体.
blobs->data:色検出の結果(ColorBlob^のList^)
☓
○
Joypad^
ジョイパッドの入力状態の受信用構造体.
analog1X:左のアナログ入力のX座標(-1(左)~1(右))(float)
analog1Y:左のアナログ入力のY座標(-1(下)~1(上))(float)
analog2X:右のアナログ入力のX座標(-1(左)~1(右))(float)
analog2Y:右のアナログ入力のY座標(-1(下)~1(上))(float)
up:十字キーの上が押されているかどうか(bool)
down:十字キーの下が押されているかどうか(bool)
right:十字キーの右が押されているかどうか(bool)
left:十字キーの左が押されているかどうか(bool)
butons:その他のボタンが押されているかどうか(boolのList^)
☓
○