# 3. 振る舞いモデル
## 3.1 シナリオ制御
シナリオ制御は、以下の振る舞いによって走行コマンドを順番に実行する:
```plantuml
@startuml
start
while (未完の走行コマンドがある)
:ロボット情報取得;
while (現在の走行コマンドは完了?)
:走行コマンドのオプション実行;
endwhile
:走行コマンド実行;
:PWM セット;
endwhile
:走行終了;
note right
この図は astah で書きなおすなどして少し綺麗に……
end note
stop
@enduml
```
## 3.2 全体シーケンス
```plantuml
@startuml
participant "シナリオ制御" as E1 #F5F5F5
database "計測・デバイス制御" as E2 #DAE8FC
database "走行コマンド" as E3 #D5E8D4
database "PID 制御" as E4 #F8CECC
E1 -> E2 : 更新
E2 -> E1 : ロボット情報返却
E1 -> E3 : 更新
E3 -> E4 : 更新
E4 -> E3 : 左右モータの回転数の差
E3 -> E1 : PWM 設定値返却
E1 -> E2 : PWM 設定値セット
@enduml
```
## 3.3 計測・デバイス制御
```plantuml
@startuml
participant "シナリオ制御" as E1 #F5F5F5
database "計測・デバイス制御" as E2 #DAE8FC
entity "ロボット" as E3 #DAE8FC
entity "距離計" as E4 #DAE8FC
entity "角度計" as E5 #DAE8FC
database "EV3RT API" as E6
E1 -> E2 : 更新
E2 -> E3 : 各種センサ値更新: void
E3 -> E6 : 各種センサ値取得\n(EV3RT API はクラス図に記載なし)
E3 <- E6: 各種センサ値返却
E2 -> E3 : モータ角取得()
E3 -> E6 : モータ角取得\n(EV3RT API はクラス図に記載なし)
E3 <- E6 : モータ角返却
E2 <- E3 : モータ角返却
E2 -> E4 : 更新()
E2 <- E4 : 推定走行距離返却
E2 -> E5 : 更新()
E2 <- E5 : 推定車体角度返却
E2 -> E1 : ロボット情報返却
@enduml
```
## 3.4. 走行コマンド
```plantuml
@startuml
participant "シナリオ制御" as E1 #F5F5F5
database "走行コマンド" as E2 #D5E8D4
entity "終了判定" as E4 #D5E8D4
entity "走行方法" as E3 #D5E8D4
database "PID 制御" as P1 #F8CECC
E1 -> E4 : 終了?
E1 <- E4 : 終了判定
E1 -> E2 : 更新
E2 -> E3 : 更新
E3 -> P1 : 更新
E3 <- P1 : 左右モータ回転数の差
E2 <- E3 : PWM 値
E1 <- E2 : PWM 値
@enduml
```
## 3.5. PID 制御
```plantuml
@startuml
participant "走行コマンド" as E1 #D5E8D4
database "PID 制御" as E2 #F8CECC
entity "PID 状態" as E3 #F8CECC
E1 -> E2 : 更新
E2 -> E3 : 更新
E2 <- E3 : 左右モータ回転数の差
E1 <- E2 : 左右モータ回転数の差
@enduml
```
# 没
## 3-1. タスク構成
> 闇が深そうなのでなるべく触れずにおこうかと
走行の開始・終了をキックするメインタスクと、実際の走行を担うロボット制御タスクに分割した。メインタスクは 100ms 周期で走行終了を監視し、ロボット制御タスクは 10ms 周期で走行体を制御する。
```mermaid
gantt
title 図 1. タスク周期 (1 周期辺り 100 ミリ秒)
dateFormat HH:mm
axisFormat %H:%M
section メインタスク
Main (1) :m1, 00:00, 00:10
Sleep :done, :s1, 00:10, 10:00
Main (2) :after s1 m2, 10:00, 10:10
section ロボット制御タスク
Robo (1) :00:10, 00:20
Robo (2) :01:10, 01:20
Robo (3) :02:10, 02:20
Robo (4) :03:10, 03:20
Robo (5) :04:10, 04:20
Robo (6) :05:10, 05:20
Robo (7) :06:10, 06:20
Robo (8) :07:10, 07:20
Robo (9) :08:10, 08:20
Robo (10) :09:10, 09:20
Robo (11) :10:10, 10:20
```
# X
## 3.2 全体シーケンス
```plantuml
@startuml
'skinparam lifelineStrategy solid
skinparam style strictuml
participant "コマンド実行" as E1 #F5F5F5
participant "デバイス" as E2 #D5E8D4
participant "走行コマンド" as E3 #DAE8FC
participant "PID 制御" as E4 #F8CECC
participant "EV3RT API" as E5
activate E1
activate E5
E1 -> E5 : 現時間取得 (EV3RT API はクラス図に記載無し)
E1 <- E5 : 現時間返却
deactivate E5
E1 -> E2 : 更新()
activate E2
E2 --> E1 : ロボット情報返却
deactivate E2
E1 -> E3 : 更新()
activate E3
E3 -> E4 : 更新()
activate E4
E4 --> E3 : PWM設定値返却
deactivate E4
E3 --> E1 : PWM 設定値返却
deactivate E3
E1 -> E2 : PWM セット(): void
@enduml
```
ref over E3
図 3-3. 参照
end ref
## 3.3 計測・デバイス制御
```plantuml
@startuml
skinparam style strictuml
participant "コマンド実行" as E1 #F5F5F5
participant "デバイス" as E2 #D5E8D4
participant "ロボット" as E3 #D5E8D4
participant "距離計" as E4 #D5E8D4
participant "角度計" as E5 #D5E8D4
participant "EV3RT API" as E6
E1 -> E2 : 更新()
activate E1
activate E2
E2 -> E3 : 各種センサ値\n更新()
activate E3
E3 -> E6 : 各種センサ値取得\n(EV3RT API はクラス図に記載無し)
activate E6
E3 <-- E6: 各種センサ値返却
deactivate E6
E2 <-- E3 : void
deactivate E3
E2 -> E3 : モータ角取得()
activate E3
E3 -> E6 : モータ角取得\n(EV3RT API はクラス図に記載無し)
activate E6
E3 <-- E6: モータ角返却
deactivate E6
E2 <-- E3 : void
deactivate E3
E2 -> E4 : 更新()
activate E4
E2 <-- E4 : 推定走行距離返却
deactivate E4
E2 -> E5 : 更新()
activate E5
E2 <-- E5 : 推定車体角度返却
deactivate E5
E2 --> E1 : ロボット情報返却
deactivate E2
deactivate E1
@enduml
```
## 3.4. 走行コマンド
```plantuml
@startuml
skinparam style strictuml
participant "コマンド実行" as E1 #F5F5F5
participant "走行コマンド" as E2 #DAE8FC
participant "輝度に対するPID制御" as E3 #DAE8FC
participant "PID 制御" as P1 #F8CECC
'activate E1
'E1 -> E2 : 終了判定の実施()
'activate E2
'E1 <-- E2 : 終了判定値
'deactivate E2
E1 -> E2 : 更新()
activate E1
activate E2
E2 -> E3 : 更新()
activate E3
E3 -> P1 : 更新()
activate P1
E3 <-- P1 : PWM 設定値
deactivate P1
E2 <-- E3 : PWM 設定値
deactivate E3
E1 <-- E2 : PWM 設定値
deactivate E2
deactivate E1
@enduml
```
## 3.5. PID 制御
```plantuml
@startuml
skinparam style
participant "走行コマンド" as E1 #DAE8FC
participant "PID 制御" as E2 #F8CECC
participant "PID 状態" as E3 #F8CECC
activate E1
E1 -> E2 : 更新()
activate E2
E2 -> E3 : 更新()
activate E3
E2 <-- E3 : 左右モータ回転数の差
deactivate E3
E1 <-- E2 : PWM 設定値
deactivate E2
deactivate E1
@enduml
```