Skip to content
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

シナリオ作成〜実行までの一連の流れ

  1. GUIで作成したシナリオを保存する
    /config/scenariosディレクトリに**.yaml(デフォルトではscenario.yaml)というYAMLファイルが生成されます。
  2. 1.で生成されたYAMLファイルをノードaero_scenario_nodeで読み込む
    aero_scenario_node/scripts/start.pyで定義されており、主にステートマシンの作成と実行を担っています。
    ステートマシンとしてはsmachを用いており、詳細はO'REILYの書籍などを参考としてください。
  3. タスクに応じてステートマシンを実行する
    タスクによってはアクションサービスという通信の仕組みを用いています。
    • waypointへの移動 : アクションにてノード/move_baseと通信する
    • Lifterの操作、マーカーを目標値とした移動 : サービスにてノードtask_controllerと通信する
    • その他 : ステートマシン内で処理完結

GUIを用いない操作の場合、2.のYAMLファイルを直接編集する事でシナリオを実行できます。

シナリオ実行時のフローチャート例は下図の通りです。赤文字は実際の関数等を表しています。

シナリオサンプル

以下では、/config/scenariosディレクトリ内にあるサンプルのシナリオについて説明します。

scenario.yaml

- 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はクオータニオン表現の回転座標です。

test.yaml

- 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

本サンプルでは、下記のような動作を行います。

  1. 3秒間時間待ちする
  2. 右前台車のLEDを黄色点滅させる
  3. costmapのinflationを0.2に設定する
    costmapの詳細はROS wikiを参照してください
  4. SEED-Moverの最大速度をx=0.2[m/sec]、y=0.2[m/sec]、theta=0.4[rad/sec]に設定する
  5. 直進(x)方向に0.1[m/sec]の速度指令を3秒間SEED-Moverへ与える
  6. シナリオ再開指令がくるまで待機する
    シナリオ再開指令は$ rosparam set /task_programmer/wait_task Falseです。
  7. waypoint0へ自律移動する
  8. 右前台車のLEDを緑点灯させる
  9. costmapのinflationを0.3に設定する
  10. SEED-Moverの最大速度をx=0.5[m/sec]、y=0.5[m/sec]、theta=0.8[rad/sec]に設定する
  11. waypoint1へ自律移動する