-
Notifications
You must be signed in to change notification settings - Fork 1
shiigi edited this page Apr 4, 2023
·
3 revisions
- タスク : "移動する"や"リフターを動かす"といった粒度の大きい機能
- シナリオ : タスクをシーケンシャルに並べた動作
- waypoint : SEED-Moverの移動目標地点/経由点
各種設定ファイル等は/config
ディレクトリに入っている。
主なファイルは下記の通り。
- maps
自己位置推定用地図(map.pgm/.yaml)、進入禁止エリア用地図(keepout.pgm/.yaml)、ポイントデータ(waypoints.yaml)が含まれる。
新規地図を作成したい場合は、本ディレクトリ以下に新規ディレクトリを作成し、同様のデータを入れること。 - scenarios
.yaml形式のシナリオデータが含まれる。 - screen
/images
ディレクトリ以下に画像データ(.png等)、/videos
ディレクトリ以下に動画/音声データ(.mp4等)が含まれる。
video
タスクやimage
タスクで再生したいファイルは本ディレクトリ内にいれること
下記にツリーを示す。
├── config
│ ├── maps
│ │ ├── {map_name}
│ │ │ ├── keepout.pgm
│ │ │ ├── keepout.yaml
│ │ │ ├── map.pgm
│ │ │ ├── map.yaml
│ │ │ └── waypoints.yaml
│ │ ├── keepout.pgm
│ │ ├── keepout.yaml
│ │ ├── map.pgm
│ │ ├── map.yaml
│ │ └── waypoints.yaml
│ ├── scenarios
│ │ ├── **.yaml
│ │ └── scenario.yaml
│ └── screen
│ ├── images
│ │ └── **.png
│ └── videos
│ └── **.mp4
- GUIで作成したシナリオを保存する
/config/scenarios
ディレクトリに**.yaml
(デフォルトではscenario.yaml
)というYAMLファイルが生成されます。 - 1.で生成されたYAMLファイルをノード
aero_scenario_node
で読み込む
aero_scenario_node
は/scripts/start.py
で定義されており、主にステートマシンの作成と実行を担っています。
ステートマシンとしてはsmachを用いており、詳細はO'REILYの書籍などを参考としてください。 - タスクに応じてステートマシンを実行する
タスクによってはアクションやサービスという通信の仕組みを用いています。- waypointへの移動 : アクションにてノード
/move_base
と通信する - Lifterの操作、マーカーを目標値とした移動 : サービスにてノード
task_controller
と通信する - その他 : ステートマシン内で処理完結
- waypointへの移動 : アクションにてノード
GUIを用いない操作の場合、2.のYAMLファイルを直接編集する事でシナリオを実行できます。
シナリオ実行時のフローチャート例は下図の通りです。赤文字は実際の関数等を表しています。
以下では、/config/scenarios
ディレクトリ内にあるサンプルのシナリオについて説明します。
- action:
task: move
arg: 0
- action:
task: move
arg: 1
- action:
task: move
arg: 2
- action:
task: end
move
タスクでは、引数に記載したwaypointの番号に自律移動します。
end
タスクにてシナリオを終了します。(シナリオの最後には必ずend
タスクを入れてください。)
上記シナリオでは、waypointの0~2まで順番に移動します。
waypointは/config/maps/waypoints.yaml
を読み込んでおり、ゲームパッドを用いて登録/削除可能です。
(新規で地図ディレクトリを作成した場合は、/config/maps/{新規地図名}/waypoints.yaml
が参照されます。)
たとえばサンプルとして入っているwaypointは下記となり、- pose
の値が上から順番に0,1,2,3...と設定されます。
- pose:
position:
x: 0.516944
y: 0.017299
z: 0
orientation:
x: 0
y: 0
z: -0.00483982
w: 0.999988
- pose:
position:
x: 0.541473
y: 0.0605326
z: 0
orientation:
x: 0
y: 0
z: 0.999981
w: -0.00612101
- pose:
position:
x: -0.0215682
y: -0.000560613
z: 0
orientation:
x: 0
y: 0
z: 0.999927
w: -0.0120489
- pose:
position:
x: -0.0371395
y: 0.0483101
z: 0
orientation:
x: -0
y: -0
z: 0.0202621
w: 0.999795
position
はmap原点を[0,0,0]とした絶対座標であり、orientation
はクオータニオン表現の回転座標です。
- action:
task: wait
arg: 3000
- action:
task: led
arg: 3,1
- action:
task: set_inflation
arg: 0.1
- action:
task: set_max_vel
arg: 0.2,0.2,0.4
- action:
task: vel_move
arg: 0.1,0,0,3
- action:
task: wait
arg: -1
- action:
task: move
arg: 0
- action:
task: led
arg: 3,2
- action:
task: set_inflation
arg: 0.3
- action:
task: set_max_vel
arg: 0.5,0.5,0.8
- action:
task: move
arg: 1
- action:
task: end
本サンプルでは、下記のような動作を行います。
- 3秒間時間待ちする
- 右前台車のLEDを黄色点滅させる
- costmapのinflationを0.2に設定する
costmapの詳細はROS wikiを参照してください - SEED-Moverの最大速度をx=0.2[m/sec]、y=0.2[m/sec]、theta=0.4[rad/sec]に設定する
- 直進(x)方向に0.1[m/sec]の速度指令を3秒間SEED-Moverへ与える
- シナリオ再開指令がくるまで待機する
シナリオ再開指令は$ rosparam set /task_programmer/wait_task False
です。 - waypoint0へ自律移動する
- 右前台車のLEDを緑点灯させる
- costmapのinflationを0.3に設定する
- SEED-Moverの最大速度をx=0.5[m/sec]、y=0.5[m/sec]、theta=0.8[rad/sec]に設定する
- waypoint1へ自律移動する