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^) ☓ ○
© Copyright 2024 Paperzz