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