---
# System prepended metadata

title: 1. 機能モデル

---

# 1. 機能モデル

選択課題: ダブルループ

## 1-1. 走行戦略

シナリオ走行と、 PID 制御によるカーブ走行 (以下 カーブ走行) によって確実にダブルループを突破する

> ここに図を示す

| 区間                     | 主な方法                         |
| ------------------------ | -------------------------------- |
| 1. 大円 1 周 ～ 大円青線 | シナリオ走行                     |
| 2. 大円 → 小円に移行     | カーブ走行               |
| 3. ～小円青線            | シナリオ走行                     |
| 4. 小円 → 脱出ルート     | シナリオ走行・カーブ走行 |

> ここに カーブ走行 = 仮想ライントレース の概要説明を挿入する
> https://thinkit.co.jp/sites/default/files/articles/404307.png

## 1-2. 機能要求とリスク分析

走行戦略の実現に必要な機能を抽出し、起こり得るリスクとその緩和策を検討した。

```plantuml
@startuml
left to right direction

actor 競技者 as a0
actor "[原因 1]\n黒線と青線における輝度の違い" as a1
actor "[原因 2]\n黒線を跨ぐ際の走行距離・角度の誤差" as a2
actor "[原因 3]\n走行距離・機体方向の計測誤差" as a3

rectangle {
    usecase #beige (安全に走行する) as use0

    usecase #beige ([UC1]\nライントレース走行) as use1
    usecase #violet ([ミスUC1]\n青線付近で\n急速に向きを変えラインを見失う) as mis1
    usecase #lightgreen ([緩和UC1]\n青線検出時に青線走行用の\nPIDパラメータに切り替える) as miti1

    usecase #beige ([UC2]\nシナリオ走行) as use2
    usecase #violet ([ミスUC2]\n左右ライン沿いを切り替えた後に\nラインを見失いコースアウトする) as mis2
    usecase #lightgreen ([緩和UC2]\nアーチ走行) as miti2

    usecase #violet ([ミスUC3]\n大円・小円間の移行後に\nラインを見失いコースアウトする) as mis3
    usecase #lightgreen ([緩和UC3]\nモータの実回転数を元にした\n走行距離推定) as miti3
}

a0 --> use0
use0 --> use1    : <<includes>>
use0 --> use2    : <<includes>>

mis1 ---> a1
mis1 --> use1    : <<threatens>>
miti1 --> mis1   : <<mitigates>>
use1 --> miti1   : <<includes>>

mis2 ---> a2
mis2 --> use2    : <<threatens>>
miti2 --> mis2   : <<mitigates>>
use2 --> miti2   : <<includes>>

mis3 --> a3
mis3 --> miti2   : <<threatens>>
miti2 --> miti3  : <<includes>>
miti3 --> mis3   : <<mitigates>>

@enduml
```

## 1-3. 機能要求

ユースケース図における機能要求の詳細は以下となる:

| Column 1   | Column 2                                                 |
| ---------- | -------------------------------------------------------- |
| 概要       | 走行体が 4 つのチェックポイントを通過する                |
| アクター   | 競技者                                                   |
| 事前条件   | 走行体が位置 ① を走っており、黒線右側をトレースしている  |
| 事後条件   | 走行体がダブルループを脱出し、ゲート・ラップ間のコースに復帰する |
| 基本フロー | [1] ダブルループの中に入る [2] 大円を一周する [3] 大円中の青線を検出する [4] 小円へ移動する [5] 小円中の青線を検出する [6] ゲート・ラップ間のラインをトレースする |

## 1-4. リスクと緩和策

ユースケース図におけるリスクと緩和策の詳細は以下となる:

| 場面                       | リスク                                         | 原因                                                   | 緩和策                                                                     |
| -------------------------- | ---------------------------------------------- | ------------------------------------------------------ | -------------------------------------------------------------------------- |
| 青線付近                   | 走行体が急速に向きを変えコースアウトする               | 黒線と青線の輝度の違い                                             | シナリオ走行により、青線検出直後に PID パラメータを切り替える                    |
| 大円から小円へ移動するとき | 走行体が急速に向きを変えコースアウトする               | ライントレースできる場所が無い                         | 青線検出後、シナリオ走行によって大円から小円に移動する                     |
| 大円から小円へ移動するとき | 移動後、小円のライントレースに失敗して回転する | 走行距離の誤差により、ライントレースの開始位置がズレる | モータの回転数を元に走行距離を推定することで、より正確にシナリオを再現する |

## 1-5. シナリオ詳細

2\. 構造モデルで示す通り、走行コマンドの配列をダブルループ攻略のシナリオとして用いる。そのためシナリオの詳細を示すことによって、要求機能実現の詳細を示す。

> ここにコース図と具体的なコマンドの定義
