---
# System prepended metadata

title: 3. 振る舞いモデル

---

# 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
```


