Skip to content
shiigi edited this page Aug 6, 2020 · 3 revisions

目次


用語説明

  • タスク : "移動する"や"リフターを動かす"といった粒度の大きい機能
  • シナリオ : タスクをシーケンシャルに並べた動作
  • waypoint : SEED-Moverの移動目標地点/経由点

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

  1. GUIで作成したシナリオを保存する
    /configディレクトリに**.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ディレクトリ内にあるサンプルのシナリオについて説明します。

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/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へ自律移動する
Clone this wiki locally