# 秋キャンプ2022:レスキュー講習会
## 本日の内容
自分が受けたい方を選択していただく形になります.
- 災害シナリオの作成方法
- 本資料で進めていきます.
- JapanOpenの決勝で使用する災害シナリオを各チームが作成するということになったため作成方法の説明をおこないます.
- RRSの研究の実験などをおこなうとき役に立つ情報にもなります.
- RoboCupRescue Simulation (RRS)チュートリアル
- RRSについて知らない方,初めて触る方はこちらを選択することをおすすめします
- [AIT_Rescue]上原温揮,[AIT_Rescue]Matsunagaの指示に従って,以下の資料を進めてください.
- [チュートリアル資料](https://maslab.aitech.ac.jp/codimd/s/WHMBWe7Wb)
おそらく時間が余ると思うので,余った時間はJapanOpenへ向けたエージェント開発とJapanOpen決勝の災害シナリオ制作の時間としたいと思います.
また,日頃のRRSに関する悩みやエージェント開発の相談など[AIT-Rescue]のメンバーが聞きますので,ありましたら声を掛けてください
## 災害シナリオの作成方法
### MAPフォルダの構成
RRSのマップ(災害シナリオ)は以下のようなディレクトリで構成されています.
```
"MAP_NAME" # kobeなどのMapの名前が入ります
├── config # 災害の規模などシミュレーションの設定について.cfgでまとめられています以下で解説します
│ ├── civilian.cfg
│ ├── clear.cfg
| └── ...
└── map
├── map.gml # 地図の情報
└── scenario.xml # エージェントの配置やその他オブジェクトをどこに配置されるかが記載
```
### ScenarioEditorの使い方
scenario.xmlの中身をScenarioEditorを使って変更することができます.
https://hackmd.io/@fujisawajoe/r1FJzL_wo
### configディレクトリの中身
testマップのconfigをもとに説明します.
#### civilian.cfg
市民が発行するメッセージについて記述されています.
```
# 埋没した市民が助けを呼ぶ(helpを発行)確率
civilian.help.probability : 0.1
# ダメージを受けた市民が助けを呼ぶ(ouchを発行)確率
civilian.ouch.probability : 0.1
# HPがこの値以下になると,助けを呼ばなくなる
civilian.conscious.threshold : 2500
```
市民は埋没している状態でhelpを,ダメージを受けている状態でouchを発信します.
これらは救助隊エージェントがメッセージとして受信することができます.
救助隊には受信したメッセージをもとに,通信の有効範囲から埋没した市民の場所を推測させることができます.
#### clear.cfg
瓦礫の啓開についての設定が記述されています.
```
# 1タイムステップに土木隊が啓開できる瓦礫の量(単位は平方メートル)
clear.repair.rate: 15
# 啓開する瓦礫からの最大距離(単位はミリメートル)
clear.repair.distance: 10000
```
#### collapse.cfg
建物の倒壊についての設定が記述されています.
```
# 木造建築の被害分布(合計は1)
collapse.wood.p-destroyed: 0.2
collapse.wood.p-severe: 0.15
collapse.wood.p-moderate: 0.15
collapse.wood.p-slight: 0.1
collapse.wood.p-none: 0.4
# 鉄骨建築の被害分布(合計は1)
collapse.steel.p-destroyed: 0.2
collapse.steel.p-severe: 0.2
collapse.steel.p-moderate: 0.2
collapse.steel.p-slight: 0.2
collapse.steel.p-none: 0.2
# コンクリート建築の被害分布(合計は1)
collapse.concrete.p-destroyed: 0.35
collapse.concrete.p-severe: 0.25
collapse.concrete.p-moderate: 0.2
collapse.concrete.p-slight: 0.1
collapse.concrete.p-none: 0.1
```
建物には木造(wood),鉄骨(steel),コンクリート(concrete)の3種類があります.
それぞれどの倒壊度になるかを設定することをできます.
建物の倒壊度には以下の5種類があります.
- destroyed
- severe
- moderate
- slight
- none
noneは倒壊していないことを表します.
`collapse.*.p-none`を1に設定すると,建物の倒壊が発生しない環境を作成できます.
```
# 倒壊度ごとの損害度
# それぞれ正規分布に従う乱数で,meanは平均,sdは標準偏差を意味
collapse.destroyed.mean: 100
collapse.destroyed.sd: 5
collapse.severe.mean: 75
collapse.severe.sd: 5
collapse.moderate.mean: 50
collapse.moderate.sd: 5
collapse.slight.mean: 25
collapse.slight.sd: 5
# 道路に瓦礫を生成するかどうか(true/false)
collapse.create-road-blockages: true
# 階高(単位はメートル)
collapse.floor-height: 7
# 瓦礫の広がり具合
# それぞれを最小値・最大値ととる連続一用分布に従う乱数が重みとして利用される
collapse.wall-extent.min: 0.4
collapse.wall-extent.max: 1
```
#### common.cfg
すべてのコンポーネントに共通する設定が記述されています.
```
# 乱数生成器のシード値
random.seed: 1023
# Humanに対して割り当てるIDをランダムにするか(true/false)
scenario.human.random-id: true
# サーバのホスト名
kernel.host: localhost
# サーバのポート番号
kernel.port: 27931
```
#### comms.cfg
通信に関する設定が記述されています.
```
#!include comms/comms-01-full.cfg
#!include comms/comms-02-unreliable.cfg
#!include comms/comms-03-mixed.cfg
#!include comms/comms-04-many.cfg
!include comms/comms-05-medium.cfg
#!include comms/comms-06-none.cfg
#!include comms/very-limited.cfg
```
commsディレクトリ内のいずれかのファイルを選択しています.
#### commsディレクトリ
以下の7種類が配置されていおり,comms.cfgでいずれかが選択されます.
- comms-01-full.cfg
- comms-02-unreliable.cfg
- comms-03-mixed.cfg
- comms-04-many.cfg
- comms-05-medium.cfg
- comms-06-none.cfg
- very-limited.cfg
今回はtestマップのcomms.cfgで選択されているcomms-05-medium.cfgを例に説明します.
```
# 通信チャンネルの数
comms.channels.count: 4
# チャンネル0に関する設定
# チャンネルのタイプ(voice/radio)
comms.channels.0.type: voice
# 通信の有効範囲(単位はミリメートル)
comms.channels.0.range: 30000
# 1メッセージあたりの最大サイズ(単位はバイト)
comms.channels.0.messages.size: 256
# 1エージェントが1タイムステップに送信できるメッセージの最大個数
comms.channels.0.messages.max: 1
# 受信するメッセージに対して脱落を発生させるかどうか(yes/no)
comms.channels.0.noise.input.dropout.use: yes
# メッセージの脱落が発生する確率
comms.channels.0.noise.input.dropout.p: 0.1
# チャンネル1に関する設定
comms.channels.1.type: radio
# 1ステップあたりのメッセージの合計サイズ(単位はバイト)
comms.channels.1.bandwidth: 1024
# 受信するメッセージに対して失敗を発生させるかどうか(yes/no)
comms.channels.1.noise.input.failure.use: yes
# メッセージの失敗が発生する確率
comms.channels.1.noise.input.failure.p: 0.1
# 送信するメッセージに対して脱落を発生させるかどうか(yes/no)
comms.channels.1.noise.output.dropout.use: yes
# メッセージの脱落が発生する確率
comms.channels.1.noise.output.dropout.p: 0.05
# チャンネル2に関する設定
comms.channels.2.type: radio
comms.channels.2.bandwidth: 1024
comms.channels.2.noise.input.failure.use: yes
comms.channels.2.noise.input.failure.p: 0.1
comms.channels.2.noise.output.dropout.use: yes
comms.channels.2.noise.output.dropout.p: 0.05
# チャンネル3に関する設定
comms.channels.3.type: radio
comms.channels.3.bandwidth: 1024
comms.channels.3.noise.input.failure.use: yes
comms.channels.3.noise.input.failure.p: 0.1
comms.channels.3.noise.output.dropout.use: yes
comms.channels.3.noise.output.dropout.p: 0.05
```
通信チャンネルには音声(voice)と無線(radio)の2種類があります.
基本的にチャンネル0には音声が設定され,それ以外に無線が設定されます.
メッセージには脱落(dropout)と失敗(failure)を発生させることができます.
脱落とは送信先でメッセージが受信されないことを意味します.
失敗とは空のメッセージを受信することを意味します.
失敗は無線通信のみで発生させることができます.
```
# 救助隊が登録可能なチャンネルの最大個数
comms.channels.max.platoon: 1
# 司令所が登録能なチャンネルの最大個数
comms.channels.max.centre: 2
```
無線通信によるメッセージの受信には,メッセージが送信された通信チャンネルへの登録(subscribe)が必要です.
エージェントと司令所には登録できるチャンネル数に制限があります.
#### kernel.cfg
カーネルの設定が記述されています.
```
# シミュレーションのタイムステップ数
kernel.timesteps: 300
# 各タイムステップでエージェントがコマンドを発行しなければならない制限時間(単位はミリ秒)
kernel.agents.think-time: 1000
```
#### misc.cfg
埋没度やダメージに関する設定が記述されています.
```
# 建物の種類と倒壊レベルごとの埋没度
misc.buriedness.wood.none.value: 0
misc.buriedness.wood.partial.value: 20
misc.buriedness.wood.half.value: 30
misc.buriedness.wood.all.value: 60
misc.buriedness.steel.none.value: 0
misc.buriedness.steel.partial.value: 20
misc.buriedness.steel.half.value: 35
misc.buriedness.steel.all.value: 70
misc.buriedness.concrete.none.value: 0
misc.buriedness.concrete.partial.value: 35
misc.buriedness.concrete.half.value: 60
misc.buriedness.concrete.all.value: 80
```
倒壊レベル(level of collapse / severity)には以下の4種類があります.
- none
- partial
- half
- all
倒壊レベルが何で決まるのかは現状わかっていません.
```
# 建物の種類と倒壊レベルごとのエージェントが埋没する割合
misc.buriedness.wood.none.rate: 0
misc.buriedness.wood.partial.rate: 1
misc.buriedness.wood.half.rate: 1
misc.buriedness.wood.all.rate: 1
misc.buriedness.steel.none.rate: 0
misc.buriedness.steel.partial.rate: 0.008
misc.buriedness.steel.half.rate: 0.008
misc.buriedness.steel.all.rate: 0.008
misc.buriedness.concrete.none.rate: 0
misc.buriedness.concrete.partial.rate: 0.008
misc.buriedness.concrete.half.rate: 0.008
misc.buriedness.concrete.all.rate: 0.008
```
建物の種類と倒壊レベルの組み合わせごとに,建物内のエージェントが埋没する確率が設定されています.
```
# 建物の種類と倒壊レベルごとのエージェントが各倒壊ダメージの度合いになる確率
misc.injury.collapse.wood.none.slight: 0
misc.injury.collapse.wood.none.serious: 0
misc.injury.collapse.wood.none.critical: 0
misc.injury.collapse.wood.partial.slight: 0.5
misc.injury.collapse.wood.partial.serious: 0.3
misc.injury.collapse.wood.partial.critical: 0.02
misc.injury.collapse.wood.half.slight: 0.5
misc.injury.collapse.wood.half.serious: 0.3
misc.injury.collapse.wood.half.critical: 0.02
misc.injury.collapse.wood.all.slight: 0.5
misc.injury.collapse.wood.all.serious: 0.3
misc.injury.collapse.wood.all.critical: 0.02
misc.injury.collapse.steel.none.slight: 0
misc.injury.collapse.steel.none.serious: 0
misc.injury.collapse.steel.none.critical: 0
misc.injury.collapse.steel.partial.slight: 0.1
misc.injury.collapse.steel.partial.serious: 0.03
misc.injury.collapse.steel.partial.critical: 0.005
misc.injury.collapse.steel.half.slight: 0.1
misc.injury.collapse.steel.half.serious: 0.03
misc.injury.collapse.steel.half.critical: 0.005
misc.injury.collapse.steel.all.slight: 0.1
misc.injury.collapse.steel.all.serious: 0.03
misc.injury.collapse.steel.all.critical: 0.005
misc.injury.collapse.concrete.none.slight: 0
misc.injury.collapse.concrete.none.serious: 0
misc.injury.collapse.concrete.none.critical: 0
misc.injury.collapse.concrete.partial.slight: 0.1
misc.injury.collapse.concrete.partial.serious: 0.03
misc.injury.collapse.concrete.partial.critical: 0.005
misc.injury.collapse.concrete.half.slight: 0.1
misc.injury.collapse.concrete.half.serious: 0.03
misc.injury.collapse.concrete.half.critical: 0.005
misc.injury.collapse.concrete.all.slight: 0.1
misc.injury.collapse.concrete.all.serious: 0.03
misc.injury.collapse.concrete.all.critical: 0.005
# 倒壊ダメージの度合いごとの初期倒壊ダメージ
misc.injury.collapse.slight: 2
misc.injury.collapse.serious: 10
misc.injury.collapse.critical: 10000
# 各救助隊エージェントに対する倒壊ダメージへの乗数
misc.injury.collapse.multiplier.ambulance: 0.2
misc.injury.collapse.multiplier.police: 0.2
misc.injury.collapse.multiplier.fire: 0.2
# 建物の種類と倒壊レベルごとのエージェントが各埋没ダメージの度合いになる確率
misc.injury.bury.wood.none.slight: 0
misc.injury.bury.wood.none.serious: 0
misc.injury.bury.wood.none.critical: 0
misc.injury.bury.wood.partial.slight: 0.4
misc.injury.bury.wood.partial.serious: 0.5
misc.injury.bury.wood.partial.critical: 0.1
misc.injury.bury.wood.half.slight: 0.4
misc.injury.bury.wood.half.serious: 0.5
misc.injury.bury.wood.half.critical: 0.1
misc.injury.bury.wood.all.slight: 0.4
misc.injury.bury.wood.all.serious: 0.5
misc.injury.bury.wood.all.critical: 0.1
misc.injury.bury.steel.none.slight: 0
misc.injury.bury.steel.none.serious: 0
misc.injury.bury.steel.none.critical: 0
misc.injury.bury.steel.partial.slight: 0.4
misc.injury.bury.steel.partial.serious: 0.5
misc.injury.bury.steel.partial.critical: 0.1
misc.injury.bury.steel.half.slight: 0.4
misc.injury.bury.steel.half.serious: 0.5
misc.injury.bury.steel.half.critical: 0.1
misc.injury.bury.steel.all.slight: 0.4
misc.injury.bury.steel.all.serious: 0.5
misc.injury.bury.steel.all.critical: 0.1
misc.injury.bury.concrete.none.slight: 0
misc.injury.bury.concrete.none.serious: 0
misc.injury.bury.concrete.none.critical: 0
misc.injury.bury.concrete.partial.slight: 0.4
misc.injury.bury.concrete.partial.serious: 0.5
misc.injury.bury.concrete.partial.critical: 0.1
misc.injury.bury.concrete.half.slight: 0.4
misc.injury.bury.concrete.half.serious: 0.5
misc.injury.bury.concrete.half.critical: 0.1
misc.injury.bury.concrete.all.slight: 0.4
misc.injury.bury.concrete.all.serious: 0.5
misc.injury.bury.concrete.all.critical: 0.1
# 埋没ダメージの度合いごとの初期埋没ダメージ
misc.injury.bury.slight: 3
misc.injury.bury.serious: 15
misc.injury.bury.critical: 100
# 各救助隊エージェントに対する埋没ダメージへの乗数
misc.injury.bury.multiplier.ambulance: 0.2
misc.injury.bury.multiplier.police: 0.2
misc.injury.bury.multiplier.fire: 0.2
```
倒壊,埋没ダメージの度合いにはそれぞれ以下の3種類があります.
- slight
- serious
- critical
建物の種類と倒壊度の組み合わせごとに,埋没するエージェントエージェントがどのダメージの度合いになるかの確率が設定されています.
ダメージの度合いごとに初期ダメージが設定されています.
救助隊にはダメージに対する乗数を設定できます.
基本的に救助隊は市民よりも受けるダメージが小さく設定されます.
```
# ダメージ進行に関する設定
misc.injury.collapse.k: 0.00025
misc.injury.collapse.l: 0.01
misc.injury.collapse.noise.mean: 0.1
misc.injury.collapse.noise.sd: 0.01
misc.injury.bury.k: 0.000035
misc.injury.bury.l: 0.01
misc.injury.bury.noise.mean: 0.1
misc.injury.bury.noise.sd: 0.01
```
ダメージの計算式は[こちら](https://maslab.aitech.ac.jp/codimd/35KXFQcnT0e3ySDoRmKTjA#-%E3%83%80%E3%83%A1%E3%83%BC%E3%82%B8%E3%81%AE%E7%A8%AE%E9%A1%9E%E3%81%A8%E3%83%80%E3%83%A1%E3%83%BC%E3%82%B8%E9%87%8F)を参照してください.
計算式におけるk, lの値がそれぞれ`misc.injury.*.k`, `misc.injury.*.l`に対応しています.
また,noiseを構成する平均値,標準偏差がそれぞれ`misc.injury.*.noise.mean`,`misc.injury.*.noise.sd`に対応しています.
#### perception.cfg
エージェントの知覚に関する設定が記述されています.
```
# 救助隊が障害物越しにも情報を知覚できる最大距離(最大値は1401166)
perception.standard.view-distance: 10000
# 救助隊が市民のHPを知覚する際に発生する誤差
perception.standard.hp-precision: 1000
# 救助隊が市民のダメージを知覚する際に発生する誤差
perception.standard.damage-precision: 100
# 救助隊が視線によって情報を知覚できる最大距離
perception.los.max-distance: 30000
# 視線の数
perception.los.ray-count: 72
# 救助隊が視線によって市民のHPを知覚する際に発生する誤差
perception.los.precision.hp: 1000
# 救助隊が視線によって市民のダメージを知覚する際に発生する誤差
perception.los.precision.damage: 50
```
エージェントは`perception.standard.view-distance`に指定された範囲の情報を知覚することができます.
十分大きく設定すれば救助隊がすべての情報を知覚できる環境を作成できます.
この他に視線による知覚があります.
エージェントから放射状に,`perception.los.max-distance`に指定された長さの線が`perception.los.ray-count`に指定された数だけ発生します.
救助隊はこの線に重なったエンティティの情報を取得することができます.
この線は建物の外壁に遮られます.
救助隊が市民のHPやダメージを知覚する際に,誤差を発生させることができます.
それぞれ誤差の倍数になるように丸められ,その結果が救助隊に知覚されます.
真値が倍数と倍数のちょうど中間ならば大きな方に丸められます.
すべて1に設定すれば誤差をなくすことができます.
### JapanOpen2022決勝の災害シナリオ作成におけるルール
ほとんどはRoboCup 2022のルールと同じです.
https://cdn.robocup.org/rsim/public/competitions/2022-RSL/info/agent/rsl22-rules.pdf
以下の2点のみを変更します.
- 消防隊,土木隊,救急隊,市民の数の最小個数 0から1
- シミュレーションの最大ステップ数 1,000から500
以下に示したパラメータのみ変更できるものとします.
#### scenario.xml
##### エージェントの数と避難所の情報
| エンティティ | 最小値 | 最大値 |
| ---------------- | ------ | ------ |
| 消防隊 | 1 | 100 |
| 土木隊 | 1 | 100 |
| 救急隊 | 1 | 100 |
| 消防司令部 | 0 | 1 |
| 土木司令部 | 0 | 1 |
| 救急司令部 | 0 | 1 |
| 市民 | 1 | 1,000 |
| 避難所 | 0 | 無制限 |
| 避難所のベット数 | 0 | 無制限 |
#### config
##### 全コンポーネント共通のパラメータ
| パラメータ | 値域 |
| ----------- | ---------- |
| random.seed | 任意の整数 |
##### カーネルのパラメータ
| パラメータ | 値域 |
| ------------------------ | --------- |
| kernel.timesteps | 100 - 500 |
| kernel.agents.think-time | 500 - 3000 |
##### 通信チャンネル全般の設定パラメータ
| パラメータ(` comms.channels.* `) | 値域 |
| -------------------------------- | ---- |
| count | 1 - 20 |
| max.platoon | 0 - 10 |
| max.centre | 0 - 20 |
##### 音声チャンネルのパラメータ
| パラメータ(`comms.channels.<x>.*`,`x`はチャンネル番号) | 値域 |
| ------------------------------------------------------- | ----------- |
| type | voice |
| range | 0 - 300,000 |
| message.size | 64 - 2,048 |
| message.max | 1 - 100 |
##### 無線チャンネルのパラメータ
| パラメータ(`comms.channels.<x>.*`,`x`はチャンネル番号) | 値域 |
| ------------------------------------------------------- | --------- |
| type | radio |
| bandwidth | 0 - 8,192 |
##### 音声/無線チャンネルのパラメータ
| パラメータ(`comms.channels.<x>.*`,`x`はチャンネル番号) | 値域 |
| ------------------------------------------------------- | ------------- |
| type | radio / voice |
| noise.[input / output].failure.use | yes / no |
| noise.[input / output].failure.p | 0 - 1 |
| noise.[input / output].dropout.use | yes / no |
| noise.[input / output].dropout.p | 0 - 1 |
##### 知覚のパラメータ
| パラメータ | 値域 |
| --------------------------- | ---------------- |
| perception.los.max-distance | 30,000 - 150,000 |
##### 倒壊のパラメータ
| パラメータ | 値域 |
| ------------------- | ---------------- |
| collapse.wood.* | 0 - 1 (合計 = 1) |
| collapse.steel.* | 0 - 1 (合計 = 1) |
| collapse.concrete.* | 0 - 1 (合計 = 1) |
##### 埋没度やダメージのパラメータ
| パラメータ(`misc.*<type>`,`<type> = wood / steel / concrete`) | 値域 |
| -------------------------------------------------------------- | ---------- |
| buriedness.<type>.severity.rate | 0 - 1 |
| buriedness.<type>.severity.value | 0 - 200 |
| injury.collapse.<type>.severity.sligh | 0 - 1 |
| injury.collapse.<type>.severity.serious | 0 - 1 |
| injury.collapse.<type>.severity.critical | 0 - 1 |
| injury.collapse.slight | 0 - 10,000 |
| injury.collapse.serious | 0 - 10,000 |
| injury.collapse.critica | 0 - 10,000 |
| injury.collapse.multiplier.<type> | 0 - 1 |
| injury.bury.<type>.severity.slight | 0 - 1 |
| injury.bury.<type>.severity.serious | 0 - 1 |
| injury.bury.<type>.severity.critical | 0 - 1 |
| injury.bury.slight | 0 - 10,000 |
| injury.bury.serious | 0 - 10,000 |
| injury.bury.critica | 0 - 10,000 |
| injury.bury.multiplier.<type> | 0 - 1 |
| injury.<type>.k | 0 - 1 |
| injury.<type>.noise.mean | 0 - 1 |
| injury.<type>.noise.sd | 0 - 1 |
##### 土木隊の啓開に関するパラメータ
| パラメータ | 値域 |
| ------------------------------------------------------- | ---------- |
| clear.repair.rate | 0 - 50,000 |