ETロボコン2022 モデル審査
ETロボコン実⾏委員会
1

モデル審査• モデル審査はETロボコンの最⼤の特徴• 参加チームは⼤会の前に⾃分たちのソフトウェアをどう設計したかを⽰す設計資料（モデル）を提出• モデルにはUMLなどの記法を活⽤する• 実⾏委員が審査員としてモデルを評価する• この評価が総合成績に⼤きく影響する
DENS

1. 要 求 モ デ ル
高いリザルトタイムを確実に獲得する高いリザルトタイムを確実に獲得できるようにする

達成すべきことや、検討すべきことを示す

信頼性を考慮する

求める機能の達成度は目標性能（リザルトタイム）に到達するかどうかで判断する

要求図での要件抽出時の観点（検討すること）を示す
主張や説明の前提となること(事実・事象・考え・制約など）

機能適合性を考慮する

速く走行するために検討すべき事を抽出する

req_01
効率よく走れるようにするための要件を検討
する

保

信

移

※紙面の都合上、ユースケースの記載は「コースを攻略する」のみとした

text = "（req_01を考慮）"«deriveReqt»«deriveReqt»«deriveReqt»«deriveReqt»

信«satisfy»«block»bl_A2. ローパスフィルタ

text = "req_01を考慮"«deriveReqt»

保«requirement»
色の濃淡で制御量を決める«requirement»
走行パラメータの調整をしやすくする

text = "（req_01,req_06を考慮）"«requirement»
現在の座標・角度と目標座標を用いて旋回量を制御する«deriveReqt»«deriveReqt»

機«requirement»
ショートカット走行終了時に確実にラインに戻れるようにする

機

text = "調整要素の明確化と分離（req_12を考慮）"«satisfy»«satisfy»«satisfy»«block»bl_A3. カラーセンサによる輝度判定«block»bl_A4. 調整が容易にできる構造«block»bl_A5. PID制御«satisfy»«block»bl_A6. ライン復帰«requirement»
ブロックエリアのマスを移動する«deriveReqt»

機«deriveReqt»«requirement»
ラインに沿って走る«deriveReqt» «deriveReqt»«requirement»
ビンゴエリア(白)とライン(黒)と交点サークル(赤・黄・青・緑)の色を判別する«deriveReqt»«requirement»
色を正しく識別する«requirement»
コース形状に合わせて滑らかに走行する«deriveReqt»

text = "req_01を考慮"

機«satisfy»«block»bl_A10. カラーセンサによる色判定«satisfy» «satisfy»«block»bl_B1. 走行ライン
エッジの切り替え«block»bl_A5. PID制御«block»bl_B2. その場旋回«requirement»
ラインからズレた分旋回量
を補正する

信

«block»bl_A8. 走行距離による補正«satisfy»«block»bl_A3. カラーセンサによる輝度判定«deriveReqt»«deriveReqt»«requirement»
走行体の現在位置を推測する«satisfy»«requirement»
走行パラメータの調整をしやすくする機«requirement»
ライン外走行後に確実にラインに戻れるようにする
text = "ライン外の走行からライントレースに復帰する（req_01、req_02を考慮）"«block»bl_A2. 調整が容易にできる構造機«requirement»
各動作のつなぎを滑らかにする«satisfy»«satisfy»

交点サークルに置かれているブロックの色・位置を特定する

text = "黒ブロックは必ず端点サークルに置かれる"

カラーブロック8個の運搬

1..*«satisfy»

ノード

ビンゴボーナス
-

350mm

解決策

ブロックビンゴ
2021エリア

事前に算出した最適なパターンを走行中に選択できるようにする«satisfy»
text = "（req_02、req_03、req_04、
text = "（req_02、req_03を考慮）"

走行中の運搬パターン選択方法として、生成器を用いる方法と探索器を用いる方法が考えられる。
生成器・・・順序の生成ルールをもとに、運搬パターンを算出する機能を持つ（≒貪欲法）«satisfy»«satisfy»«satisfy»«satisfy»
探索器・・・全パターンの中から、最適判定によって最適なパターンを算出する機能を持つ（≒全探索）«block»«block»«block»«block»bl_B8. 運搬パターン選択の処理負荷低減
bl_B6. スロー設置
bl_B7. スイング設置
bl_B10. ボーナスタイム算出
生成器は計算量が少ないが最適なパターンを決定するのが困難である。
一方、探索器は最適なパターンを決定することができるが計算量が膨大になってしまう。

探索器によって算出した最適解を生成器から算出できる仕組みを考案

text = "（req_02、
req_04、req_05を考慮）"

text = "（req_02、

req_04、req_05を考慮）"
運搬パターン«satisfy»

指針②

指針③

最適なパターンの学習

最適な運搬パターンの生成少ない計算量で最適なパターンを算出可能！

経路・運搬順序を定義する効果
取得経路

設置経路
運搬経路

端点サークル

センターマーク

交点サークル黒ブロック

カラーブロック

オブジェクト生成(座標)
オブジェクト生成(座標, 色)
opt

オブジェクト生成(色)オブジェクト生成(座標, 色)

ノードの組み合わせをある単位で意味付けて分割することで、それぞれの問題に適したアルゴリズムや設計の検討が容易となる。

学習モデル

etrobo環境

ブロックビンゴ
2021エリア

エリア情報を設定する(ブロックの位置情報)

1

ことでメインの振る舞いは共通化
タスク設計

動作定義毎のコストを所持

*

走行体動作

-

動作定義毎のコスト[動作定義数]: float+

動作コストを取得する(動作定義): 動作定義毎のコスト-

運搬順序探索器

経路探索器

走行体デバイス

1

-

-設置経路

1

-全運搬パターン1

図3-1 1ソフトウェア構造全体像（パッケージ図）
1 -黒ブロック設置経路
-取得経路

:ロボコン
1
1
2021攻略黒ブロック経路

情報更新タスク:色検知

2: 推定する()

:動作変換

ref

走行動作中

低

合計ボーナスタイムを取得する(): 合計ボーナスタイム
走行中の運搬パターン選択を実現する設計
パターンを算出する方法は共通

エリア情報の設定

学習モデルから最適な運搬順序を生成する(パラメータ): 最適な運搬順序

動作指示を実行する(): void
速度指令値を算出する(): 速度指令値-

図3-4 各タスクの動作タイミング

算出処理

ブロックビンゴ攻略開始まで算出処理推定する(): 走行体速度-アームモータ+
駆動依頼-左車輪モータ
駆動依頼

角度: int
回転速度: int
Pゲイン: int
Iゲイン: int
Dゲイン: int

setPWM(PWM値): void
ローパスフィルタ値を算出する(): ローパスフィルタ値
ローパスフィルタ係数設定(フィルタ係数): void-

終了条件を判定する(): 判定結果-

終了条件を判定する(): 判定結果-

終了条件を判定する(): 判定結果

タッチセンサンを決定する()
タスクを停止する()
走行体の向きを取得する(): 走行体の向き動作を実行する(): 動作終了状況
推定動作時間を取得する(): 推定動作時間
動作の終了状況を取得する(): 終了状況+++

動作を実行する(): 動作終了状況
推定動作時間を取得する(): 推定動作時間
動作の終了状況を取得する(): 終了状況+++

動作を実行する(): 動作終了状況
推定動作時間を取得する(): 推定動作時間
動作の終了状況を取得する(): 終了状況-

角度: int
回転速度: int+

setAngle(角度): void

-

攻略する

黒ブロック運搬:ロボコン2021
攻略

+
+
+

動作を実行する(): 動作終了状況
推定動作時間を取得する(): 推定動作時間
動作の終了状況を取得する(): 終了状況+++

動作を実行する(): 動作終了状況
推定動作時間を取得する(): 推定動作時間
動作の終了状況を取得する(): 終了状況+++

動作を実行する(): 動作終了状況
推定動作時間を取得する(): 推定動作時間
動作の終了状況を取得する(): 終了状況+++

動作を実行する(): 動作終了状況
推定動作時間を取得する(): 推定動作時間
動作の終了状況を取得する(): 終了状況+++

:スタート待ち戦略

交点サークルブロック取得

-クロック

-

有効移動成立数: int+

ボーナスタイムを算出する(): float

攻略する-ボーナスタイム獲得条件

ボーナス条件-

合計ボーナスタイム: float+

ボーナスタイムを算出する(): float

動作を実行する(): 動作終了状況
推定動作時間を取得する(): 推定動作時間
動作の終了状況を取得する(): 終了状況+++

動作を実行する(): 動作終了状況
推定動作時間を取得する(): 推定動作時間
動作の終了状況を取得する(): 終了状況

ブロック設置後復帰

+
+
+

待機

:ブロックビンゴ
戦略

動作を実行する(): 動作終了状況
推定動作時間を取得する(): 推定動作時間
動作の終了状況を取得する(): 終了状況

動作を実 走行する
行する

ビンゴ成立数: int
ボーナスタイムを算出する(): float
ビンゴ成立を判定する(列, ブロック): boolean++

ブロックサークルを取得する(): list<ノード>8
センターマークを取得する(): list<ノード>

-

8

-

有効移動成立数: int

4-ビンゴ候補列

ボーナスタイムを算出する(): float

1-全てのセン
ターマーク

2..3

パワースポットビンゴ成立数: int
ボーナスタイムを算出する(): float
パワースポットビンゴ成立を判定する(列, ブロックサークル): void

3

-全ての
ブロック
サークル

-

位置: 端点サークル位置

動作実行 動作変換1
+
タスク
+
+

色: 色の種類
有効移動成立: boolean

運搬パターン
計画

動作生成

1

1

«enumeration»
ノード種別

:色

現在の色を
取得する

ライントレース走行:
目標値: float = 0 動作-

終了状況: boolean = falseref
最適解かどうか判定する(): 判定結果

目標値: float = 30

制御量を算出する

黒ブロック運搬: 動作
制御量を算出する

ブロックサークル-

1..*-ボーナスタイム獲得条件-

色: 色の種類
パワースポット成立: boolean
位置: ブロックサークル位置

1

1..*-ボーナスタイム獲得条件++

隣接ノードを取得する(): list<ノード>
1..2
ノード上にあるブロックを取得する(): list<ブロック>1..3

色: 色の種類
位置: 交点サークル位置

隣接ノードを取得する(): list<ノード>
ノード上にあるブロックを取得する(): list<ブロック>24-隣接する中点ノード

運搬順序から運搬パターンを算出する()
最適（コストが最小となる）運搬経路を
運搬パターンへ追加する

PWM値: int = 0
回転角度: int = 0

現在の色を
取得する

左モータ: モータ:色ロボコン
2021攻略

ブロックビン
ゴ戦略

-現在位置
0..1

0..1

ref

-探索対象

図3-15 最適な運搬経路を決定する
経路探索器

図3-15を参照

最適な運搬経路を決定する

経路を追加する(設置経路)

:色検知

-運搬先

最適な経路を決定する(スタートノード, ゴールノード): 経路*-

最適な経路を復元する(): 経路

1

0..1

運搬順序を構成するノードから動作に変換する
0..* {ordered}
-構成要素

loop

1

フリー走行
制御

-

運搬経路のコスト: float
ノードを追加する(): void

ライントレース制御

色検知

図3-18を参照[現在の制御 == 旋回制御]

動作コストを取得する(現在のノード, 隣接するノード): int
動作に変換(現在のノード, 隣接するノード, 走行体の向き): 動作定義

実行する()

ref

旋回制御

内部で持つ条件種別に対応した情報を取得し、終了判定に用いる-取得経路
1 -設置経路

終了条件を判定する():
判定結果
1

ライントレース
制御

動作生成クラスによって登録される「交点サークル跨ぎ動作」の振る舞いを図3-17に示す。

ライントレース制御

検知結果を取得する(): 色の種類
走行距離を取得する(): 走行距離

図3-19を参照

setPWM(PWM値)
ref

速度制御

経路のコストが最小となる
隣接ノードを見つける[!全隣接ノードをチェック完了]
ノード間の進行可否を判断する(現在のノード, 隣接するノード): 進行可否

モータ制御

制御方式によって異なる情報を参照する

動作コストを取得する(現在のノード, 隣接するノード): 動作定義毎のコスト
走行体の向きを取得する(): 走行体の向き

左右のモータのPWM値を設定する動作に変換する(現在のノード, 隣接するノード, 走行体の向き): 動作定義
動作コストを取得する(動作定義): 動作定義毎のコスト

setPWM(PWM値)
ref

モータ

速度制御

経路探索コストを更新する(合計コスト)

図3-19を参照

slp()
スリープ

ローパスフィルタ値を算出する():
ローパスフィルタ値

スリープを挿入することで処理負荷低減を可能にする
詳細は工夫点4-4.で解説

bl_C1.試走会
情報の活用

bl_C3.処理負荷を減らす工夫をする

最適な経路を登録する()

ローパスフィルタを用いて急激なPWM指令値の変化を抑制する。

ローパスフィルタで算出した値を左右のモータのPWM値として設定する

次のノードへ移動するための動作を判定し、コスト（時間）を取得する

経路探索コストを取得する(): 現在のノードまでの合計コスト

右車輪速度を取得する()

alt
次の制御を取得する()

モータ制御

RGB値を取得する()
左車輪速度を取得する()

左右のモータのPWM値を設定する

図3-19 速度制御

setPWM(PWM値)

動作を実行する(): 動作の終了状況[終了状況 == true]

走行速度

合計コストを計算する()

getPWM(): PWM値

終了条件を判定する(): 判定結果

次の動作を取得する(): 動作

色検知

ローパスフィルタ係数を設定する(フィルタ係数)

速度指令値を算出する()

図3-20を参照
ref

動作パラメータ

ノード上にあるブロックを取得する(): List<ノード上にあるブロック>

検知結果を取得する():
色の種類
黒ブロック経路のコスト: float

1

実行する()

戦略を実行する()

隣接ノードのブロック有無から通過可否を判断し、次に移動するノードを決定する

loop取得する()

黒ブロック経路--設置経路
1-探索中の経路

交点サークル跨ぎ動作

動作パラメータ モータ制御

ローパスフィルタ係数を設定する(フィルタ係数)

alt 0..*
走行体動作変換器
動作実行時間: float

+
-

フリー走行
制御

図3-20 ライントレース制御取得する()*[現在の制御==ライントレース制御]

ref

自己位置

複数の制御の連続によって、
1
1
1つの動作を実現する

-

0..1

運搬順序

4

運搬経路

次のノードを決定する(): 移動先ノード+

1[!全制御実行完了]-現在の向き動作を登録する(動作)

走行体動作

隣接ノードを取得する(): list<隣接するノード>

運搬経路

向き: int
現在位置を取得する(): 現在のノード
所持ブロックを取得する(): 所持ブロック
現在位置を設定する(ノード): void

経路*

隣接ノードを取得する(): 隣接するノード

終了条件-最適な経路

+
+
+

-構成要素
0..* {ordered}

走行体

経路探索コストを初期化する()

図3-18 旋回制御

1

動作

1
仮想走行体

0..1

-現在位置

走行動作
変換器

loop

1

図3-17 交点サークル跨ぎ動作

-現在位置

1

経路探索コスト: float
ノード種別: ノード種別
隣接ノードを取得する(): list<ノード>
ノード上にあるブロックを取得する(): list<ブロック>ノード[!ゴールノードに到達]

+

1

動作
*

ノード

-

+
+

図3-13を参照

運搬順序から運搬パターンを算出する

図3-15を参照

経路探索器

1

*

2..4

ブロックビンゴ攻略状態に遷移したら、その時点の最適な運搬順序を取得し動作を生成する-ref

図3-8 動作の具体例（オブジェクト図）

1..*

図3-9 経路計画の構造（クラス図）

最適な運搬経路を決定する

経路を追加する(取得経路)
最適な運搬経路を決定する(スタートノード, 運搬先ノード): 設置経路

:色検知

ノード間の進行可否を判断する(現在のノード, 隣接するノード): boolean
ブロックビンゴ攻略の振る舞いをシーケンス図で示す。
次のノードを決定する(): ノード

動作を生成する(動作名)+
ノード上にあるブロックを取得する(): list<ブロック>-隣接する中点ノード

:自己位置

現在の色を
取得する

:色

PWM値: int = 25
回転角度: int = 60

動作の種類 = 交点サークル跨ぎ

中点ノード
+

現在の走行距離を取得する

右輪速度: int = 12
左輪速度: int = 0
走行体速度: int = 8

エンコーダ値を算出する
右モータ: モータ-

動作の種類 = 黒ブロック運搬

最適な運搬パターンを取得する(): 運搬パターン

4

-

:距離 -

全運搬パターンの合計コストを計算する

最適な運搬経路を決定する(スタートノード, 取得先ノード): 取得経路

:自己位置

:走行速度
現在の速度を取得する

図3-15を参照

合計コストを計算する(): 合計コスト
最適な運搬順序を登録する()

図3-11 攻略の具体例（オブジェクト図）

動作を変換する()++-隣接する交点
サークルボーナスタイムを算出する(): float[!全カラーブロックの運搬完了]

現在の走行距離:カラーセンサを取得する
RGB値: char = [255,204,255]
:距離

RGB値を
取得する

:自己位置

終了条件を
走行距離: int = 5
判定する

フィルタ係数: float = 0.9
PWM指令値: int = 25

1

センターマーク

交点サークル

16

有効移動成立数: int

+

終了条件を
:色検知
判定する
色の種類: enum = 黒

-

終了条件を
駆動させる
判定する

右モータ制御: モータ制御-

運搬対象に選択したブロックに対して、設置すると有効移動となるノードの中から機械的に運搬先を決定する

最適な運搬経路を決定する

合計獲得ボーナスタイムを取得する(): 合計獲得ボーナスタイム

ref現在の位置を取得する:距離-

軌道追従走行:動作
終了状況: boolean= false

動作の種類 = 軌道追従走行

図3-15を参照

最適な運搬経路を決定する

最適な運搬経路を決定する(スタートノード, 運搬先ノード): 設置経路

運搬順序から、全カラーブロックの運搬経路を決定し、運搬パターンへ追加する

loop:ライントレース制御

中点ノード-初期位置 0..1
[戦略状態 == ブロックビンゴ攻略状態]
交点サークル-全ての交点 4
サークル2

位置: 侵入サークル位置-

攻略する()

ETロボコン2022 開催発表会資料／ETロボコン実行委員会

運搬パターン

運搬順序

運搬順序から運搬パターンを算出する(): 運搬パターン:入力操作

動作の種類 = ライントレース走行-

ブロック位置を取得する(): list<ノード>ブロック位置を設定する(ノード): void
-初期位置
運搬先を取得する(): list<ノード>

alt

侵入サークル-

経路探索器

運搬順序を取得する(): 運搬順序

ボタン押下状態を取得する:タッチセンサ

右輪速度指令値: int = 0

0..1

1

8
ブロックサークル-ボーナスタイム獲得条件

終了条件を
判定する

制御量を算出する
左輪速度指令値: int = 0
左モータ制御: モータ制御終了条件を動作を実Pゲイン: float = 1.50
駆動させる
フィルタ係数: float = 0.9
Iゲイン: float = 0.00交点サークル跨ぎ: 動作 判定する
行する
制御量を算出する
PWM指令値: int = 0
Dゲイン: float = 0.55

現在の戦略状態を取得する(): 戦略状態
座標: int1-全ての侵入
サークル

-ビンゴと
なる組

1

運搬順序探索器

ref

運搬先を決定する(): 運搬先ノード
運搬先を取得する(): List<運搬先のノード>

これを未運搬のブロックがなくなるまで繰り返すことで、すべてのブロックを運搬する運搬経路とその合計コストが決定する

図3-13 運搬順序から運搬パターンを算出する

終了

要素技術

走行エッジ: enum = 右

端点サークル-

1

デフォルト設定値: 初期情報
エリア情報を設定する(ブロックの位置情報[9]): void
更新する(ブロックの位置情報[9]): void1-

最適な運搬経路を決定する(スタートノード, 取得先ノード): 取得経路

1つのブロックに対する最適(コストが最小となる)運搬経路が決定する（1回のループの処理）

設計方針

bl_xx. ・・・:フリー走行制御1
図3-16
ブロックビンゴ攻略状態の振る舞い
カラーブロック

1

+
+

動作実行中

方針①
次の動作なし1

タッチセンサ:動作パラメータ-

右輪速度指令値: int = 30
左輪速度指令値: int = 0

ブロック
-運搬対象
有効移動成立: boolean
9
ブロック位置を取得する(): list<ノード>0..1
ブロック位置を設定する(ノード): void
運搬先を取得する(): list<ノード>
0..1-運搬中ブロック
0..1

-

0..1

1

+
+

パワースポットビンゴ条件

1

-初期位置

1

ブロックビンゴ2021エリア
1-タッチセンサ

目標走行体速度: int = 30
待機: --動作
走行方向: float = 0

第二終了条件を判定する-

3-5-4. ブロックビンゴ攻略の振る舞い

隣接ノードを取得する(): list<ノード>
ノード上にあるブロックを取得する(): list<ブロック> -隣接するセンターマーク

4

列

+

有効移動成立: boolean

ブロック位置を取得する(): list<ノード>+-全ブロックブロック位置を設定する(ノード): void+
運搬先を取得する(): list<ノード>
9 +

位置: センターマーク位置++-関与するセン
ターマーク

1-ビンゴ候補列1

カラーセンサ

第一終了条件を 判定する--動作を実 行する

運搬順序を網羅的に探索するため、全ブロックを取得して未運搬ブロックの中から機械的に運搬対象を決定する。

運搬対象を決定する(): 運搬対象ブロック
運搬対象を取得する(): List<運搬対象のブロック>

do / 動作を実行する
・ゲーム攻略に不要な要素、自明な要素、getter及びsetter
動作終了条件の成立は省略した
・マーカは以下対応を表す

動作の種類 = 待機

動作を実
走行する
行する

-

+
+
+

センターマーク+--カラーセンサ

クロック-

交点サークル跨ぎ:スピードラン戦略

+
+
+

攻略する

スロー設置

1

1

1

最適な運搬順序を探索する(): 運搬順序[!全運搬パターンのコスト計算完了]

図3-13を参照

bl_B14.

コース情報取得ID: enum

ETRoboc_getCourceInfo(コース情報取得ID): ブロックの位置情報

運搬パターンloop

bl_B8. 運搬パターン選択の処理負荷低減運搬順序から運搬パターンを算出する

用拡張API+

動作を実想定動作時間: int = 3
行する

動作を実行する(): 動作終了状況
推定動作時間を取得する(): 推定動作時間
動作の終了状況を取得する(): 終了状況

スイング設置黒ブロック

0

動作の取得完了

次の動作取得中

経路探索器

エリア情報を設定する(ブロックの位置情報)

学習モデルを用いて運搬順序を生成する
詳細は工夫点4-1.で解説

学習モデルから最適な運搬順序を生成する(パラメータ):
運搬順序
ref

1

ブロックビンゴ2021
エリア

ETRoboc_getCourceInfo(コース情報取得ID): ブロックの位置情報

運搬順序から運搬パターンを算出する(): 運搬パターン

1-獲得ボーナスタイム

1
ボーナス条件

コース情報

最適な運搬パターンを決定する(): 運搬パターン

事前に学習したパラメータを読み込む

エリア情報を設定する(ブロックの位置情報)

0..8{ordered}-黒ブロック
黒ブロック経路 設置経路

-設置経路

図3-10
システム全体の状態遷移（状態遷移図）
現在時刻:
int
センサ値: int
センサ値: boolean

出力文字列: char

図3-7 動作の構造（クラス図）«enumeration»
端点サークル位置

ビンゴ条件

ブロックビンゴ攻略中

1

コンソール

PWM値: int
回転角度: int
setPWM(PWM値): void

-ノード通行可否条件«enumeration»
交点サークル位置«enumeration»
ブロックサークル位置

パワースポット有効移動条件

動作処理

-出力先

アームモータ-

軌道追従走行区
1間の終了
11 -設置経路1
1

運搬順序探索器

ETRoboc_getCourceInfo(コース情報取得ID): ブロックの位置情報
軌道追従走行中

do / 軌道追従走行する

運搬経路

-取得経路

経路

0..1 -ブロックの
運搬経路

搬経路

-探索中の

1

*

方針②

ブロックビンゴ2021
エリア

ETロボコン2021 シミュレータ
do / 次の動作を取得する
コース情報

-初期情報
取得先
1

+

交点サークル間移動

動作を実行する(): 動作終了状況
推定動作時間を取得する(): 推定動作時間
動作の終了状況を取得する(): 終了状況

経路計画パッケージの詳細を示す。

センターブロック有効移動条件-変換対象

動作変換完了シュミレータ拡張用API

経路計画

動作に変換する(現在のノード, 隣接するノード,
走行体の向き): 動作定義

ブロックビンゴ 動作処理
攻略開始

+
+
+

+
+
+

ボタン押下状態: boolean
更新する(): void

ライントレース走行中

do / ライントレース走行する
0..1経路1-経路コスト取得先0..1

交点サークル跨ぎ

推定動作時間: int
動作の種類: 動作名
動作を実行する(): 動作終了状況
推定動作時間を取得する(): 推定動作時間
動作の終了状況を取得する(): 終了状況

ライン復帰

図3-6 終了条件の構造（クラス図）

動作変換中

+

経路探索器

ライントレース走行
0..1
区間の終了
1
-最適な運

走行体動作変換器

1

ブロック

コース情報

パラメータを読み込む()

動作「交点サークル跨ぎ」のオブジェクト図を具体例とし
ETロボコン2021攻略の具体例をオブジェクト図で示す。図3-11のように各動作の終了条件を設計することで図3-10の状態遷移を実現する。
図3-5の動作クラスの詳細を示す。
動作の具体例て示す。本図では、フリー走行中の場面を切り取って記
紙面の都合上、各「戦略状態」の遷移に関係しない部分については省略する。
述する。振舞(シーケンス)に関しては、図3-18で示す。

+++

軌跡追従走行

色

ユーザ入力

1
開始

仮想走行体

1
0..1
ブロックビンゴ攻略状態

1

ライントレース走行

時間

終了条件を判定する(): 判定結果

do / 運搬パターンを算出する-運搬中ブロック

学習モデル

運搬順序生成器

最適な運搬パターンを決定する(): 運搬パターン

2021エリア[ゴールまでの走行制御]

0..1

1

運搬計画タスク1

運搬パターン算出中
読み込み完了 ブロックビンゴ

図3-14 運搬順序探索器の振る舞い
運搬計画タスク

3-5-2.ロボコン2021攻略クラスの具体例
図3-5 ソフトウェア全体の構造（クラス図）

動作の詳細

終了条件を判定する(): 判定結果

-運搬エリア情報

構造設計【3-4】の運搬計画パッケージで示したクラス構造により、運搬計画タスクの振る舞いは容易に切り替え可能である

図3-12 運搬順序生成器の振る舞い

1

運搬パターン算出の振る舞いは3-5-3. を参照

1

1

運搬順序

-構成要素

1-動作変換2
要素-次の状態

処理負荷が低い運搬パターン選択手法である「運搬順序生成器」とベースの運搬パターン選択手法である「運搬順序探索器」の振る舞いをシーケンス図で示す。

3-5-3.運搬パターン算出の振る舞い

0..1

0..1
-現在の状態

1do
運搬パターンを動作に変換する+ / 取得する():
ボタン押下状態

モータ

2

1

1

do / パラメータを読み込む

走行体デバイス
-車輪
モータ

動作管理

-

開始

開始時刻: int
経過時間: int

更新する(): void
経過時間を算出する(): 経過時間
1

bl_A2.
ローパスフィルタ

モータ制御
PWM指示値: int
係数: float++1-条件判定要素-パラメータ: double
パラメータを更新する(パラメータ): void

スピードラン攻略状態

1

学習パラメータの読
み込み中-全運搬順序-最適な運搬順序 1

入力操作

+
-

setAngle(角度): void-

色: 色の種類
RGB値: int+

合計獲得ボーナスタイム: float

最適解かどうか判定する(): 判定結果

-最適な運搬順序

位置
bl_A3.
カラーセンサによる輝度判定スピードラン区間の終了
bl_A10.
カラーセンサに/運搬計画タスクを停止する
よる色判定

色検知
-

1

0..*
時刻

1

進行方向
終了条件を判定する(): 判定結果

経路計画の詳細

-表示
情報

-条件判
-表示
情報 1 定要素

-

1

1

+
更新する(): void
ブロックビンゴ攻略の振る舞いは+検知結果を取得する(): 色の種類
3-5-4.を参照

1

アームモータ制御

1

終了条件を判定する(): 判定結果-

動作コストを取得する(動作定義): 動作定義毎のコスト

動作処理

右輪速度: int
左輪速度: int
走行体速度: int

+

距離

-

ブロックサークル有効移動条件

動作処理

走行速度
-

1

1

1

1

1
-条件判定要素-情報取得先

画面表示
1
入力する(文字列): void1
表示する(): 文字列

+
+

1

フリー走行

:入力操作

攻略開始時点で見つかった
最適な運搬パターンを選択し、運搬計画タスクを停止

算出処理

1

-表示
情報

1
-情報
取得先

図3-5の終了条件クラスの詳細を示す。

:自己位置

運搬計画タスク(ワンショットタスク)
算出開始

1

動作

:走行速度

合計コストを計算する(): 合計コスト
経路探索コストを更新する(合計コスト)
図3-3
ワンショットタスク起動・停止の流れ（シーケンス図）
走行動作処理を周期タスクで実行し、運搬パターンの算出処理をワンショットタスクで実行する。
運搬順序から運搬パターンを算出する(): 運搬パターン
走行動作処理をしてない間の時間で算出処理を実行できる。
動作処理の実行
動作処理の実行周期
動作処理の実行周期
動作処理の実行周期
loop
最適な経路を決定する(スタートノード, ゴールノード): 最適な経路ref
動作定義毎のコストを取得する
最適な経路の決定
最適な経路を復元する(): 最適な経路
周期(4ms)
(4ms)
(4ms)
(4ms)
[カラーブロックの取得・設置の回数]

情報更新タスク(周期タスク：優先度中)

1-右車輪モータ 1
駆動依頼

目標値: float
終了状況: boolean

最適な経路の決定

動作実行タスク(周期タスク：優先度高)走行方向: int
走行距離: int
自己位置: 座標推定する(): 自己位置-情報取得先1

終了条件-

1: 更新する()

1

・運搬パターンの算出を行う
・運搬計画
最適な経路を決定する(スタートノード,
運搬先ノード): 設置経路
・動作実行の合間に行う→ワンショット・低優先度に ・経路計画
ref2. ブロックビンゴ攻略開始時、
最適解かどうか判定する(): 判定結果
最適な経路の決定
運搬計画タスクを停止する
経路探索器と組み合わせて運搬最適な経路を決定する(スタートノード, ゴールノード): 最適な経路
ref

実行する(): void
速度指令値を算出する(): 速度指令値

+
+

-表示
情報

+

1

bl_A7
軌道追従走行

+
+

走行体制御

1

1

経路

2: 動作変換する()

ら最適解か判定する

運搬計画 ワンタスク
ショット

運搬順序から運搬パターンを算出する(): 運搬パターン

動作指示を実行する(): void
速度指令値を算出する(): 速度指令値

終了条件の詳細*方針④ ポイント・メリット-デフォルト運搬パターン

1: 攻略する()*

動作実行タスク

自己位置1

1-情報取得先

-条件判定
要素

1

合計獲得ボーナスタイム: float
合計コスト: float

1

+

開始

0..* {ordered}
0..*
-現在

-条件判定
要素

-情報取得先1*-デフォルト運搬順序[学習モデルによる運搬パターン算出]

待機状態- Pathfinder -

-参照

学習モデル

デフォルト運搬パターン: 運搬パターン
最適な運搬パターン: 運搬パターン

経路計画

ノード
タッチセンサ押下を検出/運搬計画タスクを起動する

スロー設置
ブロック設置後復帰待機

外部情報管理bl_A9.
オドメトリを用いた
自己位置の推定

走行体
0..*
0..*

0..*

フリー走行制御

運搬パターン-ブロックの運搬経路
0..8 {ordered}

運搬経路

ライントレース走行
軌跡追従走行フリー走行
ライン復帰
黒ブロック運搬交点サークル間移動
交点サークル跨ぎ交点サークルブロック取得

スタート待ち状態
スイング設置開始-

1

最適な運搬パターンを学習する(パラメータ): 運搬パターン
運搬順序から運搬パターンを算出する(): 運搬パターン
学習モデルから最適な運搬順序を生成する(パラメータ): 運搬順序+
パラメータを読み込む(): void
分析モデルの動作定義、構造設計【3-2】【3-4】、タスク設計【3-3】の結果を運搬パターン計画-全運搬パ
基に詳細な振舞を設計した。
ビンゴゲーム目標攻略時間: float
ターン
運搬パターン

11 1-運搬パターン

ゲームを攻略するためのシステム全体の振る舞いを状態遷移図で示す。
合計コスト: float*+
最適な運搬パターンを決定する(): 運搬パターン
1+
運搬経路を追加する(運搬経路): void
紙面の都合上、学習モデルを用いた運搬パターン選択手法における図のみを示す。
+
運搬順序から運搬パターンを算出する(): 運搬パターン
1

3-5-1.システム全体の状態遷移
0..*

1

1
1

戦略の完了状況を取得する(): 戦略状態
戦略を実行する(): void
動作を登録する(動作名): void
次の動作を取得する(): 次の動作

0..* -生成物

ライントレース制御

最適な運搬順序を探索する(): 運搬順序
運搬対象を決定する(): 運搬対象のブロック

1 1 1«enumeration»
動作名

+
+
-

最適な運搬パターンを決定する(): 運搬パターン
最適な運搬順序を探索する(): 運搬順序
運搬順序から運搬パターンを算出する(): 運搬パターン
運搬順序を登録する(): void
運搬対象を決定する(): 運搬対象のブロック
運搬先を決定する(): 運搬先のノード
合計コストを計算する(): 合計コスト
最適な運搬順序を登録する(): void1

do / その場で待機する

bl_A5.
bl_A1.
ライントレース走行 PID制御

Pゲイン: float
Iゲイン: float
Dゲイン: float

軌道追従制御+++-3-5.振舞設計（詳細)0..*

終了条件を判定する(): 判定結果

1

動作を変換する(): 動作
次の動作を推定する(現在状態, 次の状態): 次の動作

0..*

目標値: float
終了状況: boolean

+
+

1

1

+
-

* -推定動作時間取得先

-

-

0..*

-登録
する

現在の戦略状態: 戦略状態

+
+
+
-

0..* {ordered}

運搬順序生成器

運搬順序探索器

1

1..* {ordered}-

1..* {ordered}

1
1

初期情報を
取得する

-経路算出先-最適な運搬経路

ポイント

0..*
-制御器

左輪速度指令値: int
右輪速度指令値: int
実行する(): void
速度指令値を算出する(): 速度指令値

1 外部情報管理
運搬先を決定する(): 運搬先のノード
シュミレータ拡張用API

最適な経路を決定する(スタートノード, ゴールノード): 最適な経路駆動する センサ値を取得する
センサ値を取得するノード間の進行可否を判断する(現在のノード, 隣接するノード): 進行可否
最適な経路を復元する(): 最適な経路動作に変換する(現在のノード,
隣接するノード, 走行体の向き): 動作定義
シミュレータ用
ブロックビンゴ2021のブロック配置など初期
拡張API
情報を取得する
1

初期情報をもとにエリアを形成
Lコース,Rコースの差分を吸収する

走行体

+
-

*

動作コストを取得する(現在のノード, 隣接するノード): 動作定義毎のコスト

1
1経路を生成する・各クラス（特にセンサやアクチュエータ）の初期化が完了してから、各処理の実
１-1.
3-1.
１. 最適な運搬パターンを探索
3: 推定する()
1: 初期情報を設定する()行を開始することで安全に動作を開始できるようにした。
:ブロックビンゴ
運搬計画タスク経路の探索（=最適な経路の決定）
運搬順序探索器
経路探索器
ブロックビンゴ攻
etrobo環境
ブロックビンゴ
アドバンストクラス
2021エリア・走行体制御に関わるものほど高優先度・短周期で実行することで、制御が妨げ
略2021エリア
ボーナスタイム
4: 更新する()
2: 最適な運搬パターンを決定する()
経路探索器
ノード
走行体動作変換器
走行体
走行体動作
られて走行不能となるリスクを下げた。
:運搬計画
loop
・運搬パターンの算出をワンショットタスクから実行することで、
方針①
最適な運搬パターンを決定する(): 最適な運搬パターン[!全初期値パターンで実施完了]
ブロックや走行体の位置など
走行動作中に運搬パターンを選択できるようにした。
loop
現在のノードを決定する()エリアの更新処理は省略
図3-2 詳細タスク設計（コミュニケーション図）
初期情報を取得する(コース情報取得ID): ブロックの位置情報[!ゴールノードに到達]
隣接ノードを取得する(): List<隣接するノード>
タスク 全初期値パターン(5040個)
周期 優先度役割と設計意図
実行パッケージ

情報更新
タスク

初期情報を取得する(コース情報取得ID): ブロックの位置情報学習したパラメータをもとに、走行中に最適解を即時算出[カラーブロックの取得・設置の回数]-動作コスト取得先

1

1.

-全運搬順序1-最適な運搬順序 -

1

環境情報を
取得する

ブロックビンゴ攻略戦略
0..1 --デフォルト動作

動作を実行する(): 動作終了状況
推定動作時間を取得する(): 推定動作時間
動作の終了状況を取得する(): 終了状況

経路探索器

最適な運搬パターンを決定する(): 最適な運搬パターン
パラメータを読み込む()

loop

1

各種モータ・センサ
走行体動作変換器

1

3-1.

1

+
+

経路計画

・動作を実行する
loop
運搬対象を決定する(): 運搬対象のブロック
動作実行
4ms
高
・動作が停止するとコース攻略が[!全運搬パターンのコスト計算完了]
タスク
運搬対象を取得(): List<運搬対象のブロック>
不可能になる→高優先度に3. 最適な運搬パターンを生成
運搬順序生成器+
走行体の向きを取得する(): 走行体の向き
走行体外部の情報（通信や色など）を1-向き取得先管理する

外部情報管理走行体デバイス

走行体

-構成要素

推定動作時間: int
動作の種類: 動作名

+
+
+

終了条件

目標走行体速度: int
走行方向: float
目標座標: 座標
走行エッジ: 走行エッジ
目標アーム角度: int-パラメータ
取得先

走行制御

エリア情報を設定する(ブロックの位置情報)
初期化 の最適解を全て算出する・各種初期化を行う
ブロックが置いてあるノードには、
―
―
・（全体）
動作実行
運搬計画
loop
ref
エリア情報の設定
最適な運搬順序を探索する(): 最適な運搬順序
タスク
・最初に実行、下記周期タスクを起動
ゴールノード以外では進行禁止[!全隣接ノードをチェック完了]
タスク
タスク
・動作管理
ノード間の進行可否を判断する(現在のノード, 隣接するノード): 進行可否・走行体制御ノード上にあるブロックを取得する(): List<ノード上にあるブロック>・走行体
タスクを起動する()
1. 走行開始時に、・動作生成合計コストを計算する()
最適な経路を決定する(スタートノード, 取得先ノード): 取得経路
運搬計画タスクを起動する
目標時間とボーナス
経路探索コストを取得する(): 現在のノードまでの合計コスト
ref
・走行体の情報更新・推定を行う
・外部情報管理
運搬先を決定する(): 運搬先のノード
最適な経路の決定
最適な運搬パター
4ms
中
タイム、合計コストか・制御性能に影響する→中優先度に・走行体運搬先を取得(): List<運搬先のノード>
動作コストを取得する(現在のノード, 隣接するノード): 動作定義毎のコスト[ブロック位置情報と一致][ブロックサークル位置と一致]

合計ボーナスタイム: float

合計ボーナスタイムを取得する(): 合計ボーナスタイム*

合計コスト: float

戦略の完了状況を取得する(): 戦略状態
戦略を実行する(): void
次の動作を取得する(): 次の動作-

1..* {ordered}

動作パラメータ
-

方針②

運搬計画

方針③

駆動を指示 走行体情報を取得する
する 運搬順序１-1.

向き: int

3-3.振舞設計（タスク）

エリア情報の設定
ブロックサークル

オブジェクト生成(向き)オブジェクト生成()[交点サークル位置と一致]-+[センターマーク位置と一致] オブジェクト生成(座標)ブロックビンゴ攻略-+

bl_B10.ボーナスタイム算出
etrobo環境

-

0..1
0..1
運搬パターンから動作を生成し、戦略に登
走行体
録する

1

+
+
-

-動作終了条件-動作パラメータ

1

運搬パターン計画

を取得する

最適な運搬パターンを決定する(): 最適な運搬パターン
運搬順序から運搬パターンを算出する(): void
最適解かどうか判定する(): 判定結果

残り時間を
1
取得する
運搬順序生成器
環境情報を

3.

1-最適な運搬順序
1

戦略の完了状況を取得する(): 戦略状態
戦略を実行する(): void
次の動作を取得する(): 次の動作

動作を生成する(動作名): 動作
1

動作変換

1

デフォルト運搬パターン: 運搬パターン
運搬パターンビンゴゲーム目標攻略時間: float

+
+

取得する
最適な運搬順序を学習する(パラメータ):
void
学習モデルから最適な運搬順序を生成する(パラメータ): 運搬順序+-

-運搬中のブロック
走行体の状態推定や駆動を行う

1
動作生成

アドバンストクラス ボーナスタイム

ボーナスタイム: float
パワースポットビンゴ成立数: int

ノードを継承したクラス[端点サークル位置と一致] オブジェクト生成(座標)

2.

走行体制御

*

0..1

走行体

-ボーナスタイム取得先-全走行体動作

中点ノード

alt

[中点ノード位置と一致]

色: char-参照

動作を実行する戦略（動作リスト）を保持し、次の動作
0..9
を決める
ブロック

パワースポットビンゴボーナス-

ボーナスタイム: float
有効移動成立数: int

req_04、req_05を考慮）"

黒ブロック経路

指針①
最適なパターンの探索

[座標]

運搬順序

ブロックの取得・配置の順序でノードを組み«satisfy»
合わせたもの。（図の緑四角）«block»
運搬順序をもとに運搬パターンを算出す
bl_B13. 経路探索アルゴリズム
る。

工夫点4-1参照
本番走行

開発段階

text = "（req_02、req_03、
req_05を考慮）"

運搬順序の順に運搬経路を組み合わせ«satisfy»«satisfy»
たものに、黒ブロック経路を追加したもの。
«block»
走行体はこのパターンをもとに走行する。
bl_B12. 走行体動作を考慮した運搬パターン選択«block»bl_B11. 攻略目標時間
の設定

loop

1

1

ブロックサークル有効移動
ボーナス
-

1

カラーブロック

ボーナスタイム: float
有効移動成立数: int

ボーナスタイム: float
有効移動成立数: int

4.指針を実現する振る舞い

題を解いたとしても、動作コストの計算が可能。

«deriveReqt»

req_08を考慮）"«satisfy»

ボーナスタイム: float
ビンゴ成立数: int

1
1

パワースポット有効移動
ボーナス

1

-初期位置

1

センターブロック有効移動ボーナス-

位置: 端点サークル位置

動作管理

パラメータ: double

パラメータを更新する(パラメータ): void
パラメータを読み込む(): void

有効移動成立: boolean
走行体制御 黒ブロック 動作に基づいて、適切な出力を決定する
色: int--ボーナスタイム
獲得条件

-

0..1

1

1

学習モデル 動作を登録 動作生成
する
-

+
+

0..1

走行体

8
4

-

色: char
位置: 交点サークル位置

中点ノード

+
+
-

-動作生成
依頼先

動作生成
+

スピードラン戦略

動作

推定動作時間を取得する

初期情報を取得する(コース情報取得ID): ブロックの位置情報

動作管理

動作定義を基に最適な経路を探索する

現在の戦略状態: 戦略状態

1

etrobo環境

ブロックの位置情報[9]: char+

ブロックビンゴ2021を攻略する最適な運1
搬パターンを算出する-現在位置
1

戦略の完了状況を取得する(): 戦略状態
戦略を実行する(): void
次の動作を取得する(): 次の動作-

現在の戦略状態: 戦略状態

走行体制御互参照が行われない構成にした。
→パッケージ間の疎結合によって、変更や単体テストが容易となる。
1 -初期情報取得先--経路構成要素0..* {ordered}

経路探索コスト: float

隣接ノードを取得する(): List<隣接するノード>-現在位置
ノード上にあるブロックを取得する(): List<ノード上にあるブロック>

端点サークル-初期位置

1: 移動可能なノード(交点サークル)-

0..* {ordered}

ノード

+

1

経路計画

1
-ビンゴとなる組
4
-全ての列

列

«block»1

運搬計画+

交点サークル

1..2

位置: ブロックサークル位置

2..3-ビンゴとなる組

8-ボーナスタイム
獲得条件«deriveReqt»«block»bl_B5. 衝突を回避する経路の選択

3-ボーナスタイム
獲得条件

8-ボーナスタイム
獲得条件

走行体のエリア上での位置(座標)のこと。走行体はノード間の移動を繰り返す。
ノードを定義することでブロックの現在位置や走行体の位置などを表現することができる。

«deriveReqt»
1. ⇒ 交点サークル跨ぎ(前方)0.5秒組み合わせを算出«requirement»«requirement»
機機
2. ⇒ (ブロック無し)交点サークル間移動 1.0秒
«deriveReqt»
制限時間内で獲得できるボーナスタイムが最大になる運搬
最短時間で運搬できるパターンを探索する
3. ⇒ 交点サークル跨ぎ(前方)0.5秒
パターンを選択する機課題«requirement»
text = "（req_02を考慮）"
走行中の膨大な計算処理の制約 «deriveReqt»
4. ⇒ スイング設置
2.5秒
高速にブロックを設置する
text = "（req_02を考慮）"
機«requirement»
動作コスト計算の例→ 動作コスト合計：5.0秒
計算リソースが越えてはいけない
計算時間が越えてはいけない
text = "（req_02を考慮）"
走行中の計算にはリソースと処理時間の2点課題がある。
ブロックビンゴ攻略開始までに運搬«satisfy»
パターン選択を完了する
動作定義の組み合わせは膨大なため、計算量が非常に多ビンゴ攻略動作
走行体が処理経路
text = "（req_02、req_03、
く、単純に全て計算すると処理が終わらない可能性が高い。
«block»が始まるライン
落ちするライン «deriveReqt»
req_04、req_05を考慮）"«deriveReqt»
bl_B9. 走行中に運搬パ«deriveReqt»«deriveReqt»«deriveReqt»
一方、処理を終わらせるため計算にリソース（メモリやCPU使
ノードを移動する順に組み合わせたもの。以下の４種類が存在する。
«deriveReqt»
ターンを探索できる設計用率）を当てすぎると、走行体の処理が追い付かない可能
信①取得経路 ・・・ ブロックを取得するまでの経路（図の赤矢印）
機«requirement»«requirement»性がある。以上より、限られた計算リソースと時間の中で、②設置経路
ブロックを設置するまでの経路（図の青矢印）
機 信 «requirement»
機 ・・・
機 信 «requirement»
機 信 «requirement» 機 信 «requirement» 機 信 «requirement»
信 «requirement»
ブロックに衝突しないよう走行する
設置動作を短縮する
最適パターンを選択する工夫が必要となる。
時間
時間 運搬パターンごとに獲得できる③運搬経路 ・・・
取得経路と設置経路を一組にしたもの
ライントレースが処理落ちしないように
攻略制限時間内で運搬
走行体が走行可能な経路
最短時間で運搬できるパターンか全ての運搬パターンを探索する
text = "（req_02、req_03を考慮）"
text = "アームや遠心力を利用してブロックを設
運搬パターン選択の処理を軽くする
ボーナスタイムを算出するできるか判定するを選択する
判定する④黒ブロック経路 ・・・黒ブロックを取得・設置するまでの経路（図の黒矢印）
置する（req_02を考慮）"
text = "（req_02、req_03、«satisfy»«block»bl_B4. フリー走行

色: char
位置: ブロックサークル位置

1..*-ボーナスタイム
獲得条件

1.ゲーム攻略に必要な要素

黒ブロック運搬

パッケージ名役割
座標: int

1
16-ボーナスタイム
獲得条件

センターマーク

現在の戦略状態: 戦略状態

+
+
-

1
1..*
戦略

1

デフォルト運搬パターンを所持しておくことで、運搬パターンが算出でパッケージを必要最低限の機能区分で作成し、加えてパッケージで相きなかった時のリスクを軽減

解法

設置物

競技システムブロックビンゴ2021の分析結果及び、ソフトウェアの設計方針を基にソフトウェア全体の構造設計を行った。
-順序構成要素-初期情報設定先

エリア情報を設定する(ブロックの位置情報[9]): void1

1

ブロックサークル«block»bl_D7. 自動シミュレーション実行環境«block»bl_D6. シミュレーションの配信・アーカイブ

3.カラーブロック運搬«satisfy»«block»bl_A9. オドメトリを用いた自己位置推定

1

配置

ブロックビンゴ2021エリア
+
1

8

エッジ切替

競技ルール

競技フィールド-攻略する(): void-0..*0..* {ordered}

メリット

ポイント

クラスの色分け分類：

パッケージ設計
1

左エッジ

右エッジ

«requirement»

ビンゴゲームのルールを分析し、新たに「列」「ノード」「経路」「運搬パターン」「運搬順序」を追加した。
«requirement»

運搬戦略を決める

走行中の動作定義の«satisfy»«block»bl_A7. 軌道追従制御«requirement»
継続的に検査をして品質を高める

果を共有・分析する«deriveReqt»

text = "加速制御により各動作切替
時のカクツキを低減（req_01を考慮）"«block»bl_A2. ローパスフィルタ«block»bl_A6. ライン復帰«satisfy»

2-4.解法«block»bl_D5. 結果自動集計

text = "ブロック配置に応じて、どのブロックをどこに運搬するのかを決める"

88.3秒

０

動作生成

スタート待ち現在の攻略状態: 攻略状態

-攻略方法

ゲーム攻略に必要だがエリアには該当しないクラスは「解法」など、クラスを分類することでクラス間の責務を明確にできる。

3-2. 構造設計（全体）«enumeration»
端点サークル位置«deriveReqt»

その場旋回 シミュレーション結«requirement»
旋回する«deriveReqt»«satisfy»

text = "調整要素の明確化と分離（req_12を考慮）"

104.8 秒

最初に黒ブロック運搬する動作⇒ 観測の結果、16.5秒を目標値として設定«requirement»
複数拠点での開発資産の統合と変更管理をする：移動可能なノード(中点ノード)
bl_B14. ETロボコン2021シミュレータ用拡張API
bl_B12.走行体動作を考慮した運搬パターン選択
凡：ブロック取得/設置のみ移動可能な例
黒ブロックの初期配置場所は固定だが、カラーブロックの色は競技のターン毎に決定される。そのため、カラーブロック運搬をどのノード(ブロックサークル)
列列
ような動作定義の組み合わせで実現するかは走行中に算出する必要がある。そこで、動作定義毎にコスト(時間)を定義する：移動可能なパス
ことで目標時間に収まるか評価できるようにする。目標時間内に収まる組み合わせの中で、ボーナスタイムが高いかつ動作定義
コストの合計が最小のもの（最適な運搬パターン）を算出する。
ノードから動作コストの算出 隣接する２点のノードの組み合わせで動作定義は定め«requirement»
運搬パターンを選択する
運搬パターン
初期配置
られるため、ノードという扱いやすい単位で組み合わせ問«deriveReqt»«requirement»
各動作を切り替える«satisfy»

保«block»bl_D4. Gitを用いて構成管理を行う

text = "ブロックの運搬順序とその運搬経路を選択する"«deriveReqt»«deriveReqt»«deriveReqt»«deriveReqt»«satisfy»«block»bl_D3. クラウド上で進捗・成果物を共有する«block»bl_A10. カラーセンサによる色判定«requirement»
ブロックを設置する«deriveReqt»«deriveReqt»«deriveReqt»«requirement»
複数拠点でプロジェクト
管理をする«satisfy»«satisfy»

16.5秒

・複数人で分担して・実装できるようにしたい«enumeration»
交点サークル位置«enumeration»
ブロックサークル位置

交点サークル間移動
交点サークル跨ぎ(前方)交点サークル跨ぎ(左右)スロー設置+スロー設置復帰
スイング設置
ブロック取得(前方)ブロック取得(左右)動作効率化のため、交点サークル跨ぎ及び、設置後
交点サークルの中心へ少しだけ後退する。
text = "（req_09を考慮）"
復帰実行中にライントレースの走行エッジを切り替え
その後、次の移動先の交点サークルの方向(右前/左前/る。
右後/左後)にその場旋回し、黒ラインを検出して停止。
例えば、交点サークル跨ぎ(右)では跨いだ後に左エッ«deriveReqt»«deriveReqt»
ジでライン復帰した方が良く、(左)では右エッジでライン«deriveReqt»«deriveReqt»«deriveReqt»
復帰した方が動作の効率が良い。
«deriveReqt»«deriveReqt»«satisfy»«block»bl_D2. 機能を容易に追加・変更できる構造«requirement»

工夫点4-2参照
ブロックを運搬する«enumeration»
動作定義< 3-2. 運搬順序の生成>・・・運搬順序探索器が担当

択手法」を容易に切り替えできるようにしている。

運搬計画

+

動作パラメータ部と制御部を分離した。
→制御ロジックやPID値を変更することなく、動作の追加や変更が可能である。

DENS

設計モデル(1)3.
設 計 モ デ ル (2)機能間の結合を疎（パッケージで相互参照が行われない）に設計 / 機能ごとに独立して動作する構造としている。

ロボコン2021攻略-

方針③

事前に学習したモデル（
2. ）から最適な運搬順序を生成す
方針③
・調整箇所と実行処理部を分けるる。最適な運搬順序を生成後、経路探索器を利用して最終的な最適運搬パターンを算出する。
・機能間の結合を疎にする
bl_D1. 機能毎に容易に
方針④
・機能ごとに独立して動作する構造にする
テストできる構造
エリアにある固定オブジェクトのクラスは「競技フィールド」、浮動するオブジェクトのクラスは「設置物」、※解法に直接関係しない要素や、・不具合発生時に原因箇所の特定を容易にしたい
単純なset/getの操作は紙面の都合上省略した。

3. 指針を実現する構成

7.走行ラインエッジ切替«deriveReqt»«requirement»
機能毎に追加・変更しやすくする

運搬戦略をもとにゲームを分割して攻略目標時間を設定

text = "運搬経路に沿って走行し、ブロックを運搬する"«satisfy»«block»bl_A9. オドメトリを用いた自己位置推定«deriveReqt»«deriveReqt»«requirement»
動作に合わせてPID値や速度、距離を切り替える«deriveReqt»«requirement»
色の濃淡で制御量を決める

text = "（req_06を考慮）"«satisfy»«block»bl_A1. ライントレース走行«satisfy»«satisfy»«block»bl_A7. 軌道追従制御«requirement»
ライン外を走行する«deriveReqt»«requirement»
現在の座標・角度と目標座標を用いて旋回量を制御する«satisfy»«requirement»
ムダな動作を省く

text = "（req_01、req_02を考慮）"

text = "白と黒とそれ以外の色の3パターンを識別する（req_06を考慮）"«deriveReqt»«deriveReqt»«requirement»
色を正しく識別する

text = "白と黒とそれ以外の色の3パターンを識別する（req_06を考慮）"«requirement»
ブロックを取得する«deriveReqt»«requirement»
走行時間を短縮する

text = "（req_01、req_02を考慮）"«deriveReqt»

信«satisfy»«block»bl_D1. 機能毎に容易にテストできる構造«requirement»
リモート開発をしやすくする

方針④
動作管理

・走行中に運搬パターンを選択できるようにする
走行中に最適な運搬パターンを生成する。 １. と同様に、運搬パターンを経路と運搬順序に分割して解法を検討した。
・「ベースの運搬パターン選択手法」と、「学習モデルを用いた

3-1. 経路の探索>・・・経路探索器が担当<
方針②
運搬パターン選択手法」を容易に切り替えできるようにする・パラメータ調整にかかる時間を減らしたい。
運搬順序の探索
bl_A4. 調整がノード間の経路コストは・パラメータ調整時に発生し得るリスク（人為的なミスな＝経路探索器が算出したノード間コストが経路探索器から算出容易にできる構造最小となるノードの組み合わせを探索ど）を減らしたい。

«deriveReqt»«deriveReqt»

機能の追加・変更のテストをしやすくする

ブロックビンゴを攻略する
最初に黒ブロックをセンターマークに運搬する動作は、動作定義の軌跡追従を利用する
ことで左図のように定義できる。ゲームを「黒ブロック運搬」「カラーブロック8個の運搬」とtext = "最大ボーナスタイムを獲得できるよう攻略する"
分割し、以下のような目標時間を設定した。
bl_B11.攻略目標時間の設定※1-1. 攻略方針から算出«requirement»«requirement»«deriveReqt»«deriveReqt»«requirement»
走行位置を補正する«satisfy»«deriveReqt»«deriveReqt»«deriveReqt»«requirement»
走行体の現在位置を推測する

text = "目標座標を設定し、それに対する
必要旋回角度を計算することで座標を追尾する（req_01を考慮）"

text = "ライン外の走行から
ライントレースに復帰する（req_01を考慮）"«requirement»

text = "本番の照明環境での「旋回時の制限」に抵触しないように少し手前で旋回する«deriveReqt»

構造の詳細から運搬順序を抜き出して学習

設計方針

最適な運搬パターンを生成3.
方針①

bl_D2. 機能を容易に追加・変更できる構造

バックアッププランを用意した上で、より高いリザルトタイムが獲得できる方法を開発したい

3-2にて説明したパッケージの役割と関係を詳細に説明する為に、図3-5を記載した。なお、終了条件（走行体制御パッケージ）・動作（動作管理パッケージ）の詳細はそれぞれ図3-6, 3-7に別途記載し、動作の具体例として「交点サークル跨ぎ」を図3-8に記載した。また、本図では経路計画パッケージ内は概略のみを示し、詳細は図3-9にて示す。
方針② 「ベースの運搬パターン選択手法」と、「学習モデルを用いた運搬パターン選

3-4.構造設計（詳細）学習モデル

後、経路探索器を利用して最終的な最適運搬パターンを算出する。
時間内に最大ボーナスを獲得したい
bl_B9. 走行中に運搬パターンを選択できる設計

カラーブロック8個の運搬

text = "（req_11を考慮）"«deriveReqt»«deriveReqt»
要求に対する課題 信ブロック配置や運搬パターン選択が間に合わないリスク有り«deriveReqt»«deriveReqt»«deriveReqt»«requirement»

開発段階と本番の差異を抑える
ボーナスタイムが高い配置パターンを分析し、ブロック配置の優先度を決める
移 照明環境に合わせて調整する«requirement»

text = "開発用PC性能が本番用PC性能を超えている

2.ゲームの分割«deriveReqt»«deriveReqt»«requirement»
コース形状に合わせて滑らか
に走行する

移

要求達成に向けた課題を解決するために、ボーナスタイム別に観測さ（req_07、req_08を考慮）"
センサ値を調整する（req_06、req_08を考慮）"れるブロック配置のパターンを全て列挙して分析した。（右図）分析によ«satisfy»
り、センターマークにブロックを配置した場合に、取得できるボーナスタイム«satisfy»«satisfy»«satisfy»«satisfy»«satisfy»の期待値が高いという結果が得られた。そのため、カラーサークルよりも«block»«block»«block»«block»センターマークにブロックを配置することを最優先とする。更に、満点のbl_C2. 大会推奨性能以下のPC
bl_C3. 処理負荷
bl_A2. 調整が
bl_C4. センサ値
でもゲームクリアできることを確認する
を減らす工夫をする
容易にできる構造 のキャリブレーション
30.0秒を狙うためには黒ブロックをセンターマークに配置する必要がある
ため、最初に黒ブロックをセンターマークに配置する戦略とする。

«block»bl_C1. 試走会情報の活用«deriveReqt»

6.スロー設置後復帰
保«requirement»
平行開発をしやすくする

運搬順序生成器

ストを算出する。また、経路探索とは異なり、全ての組み合わせを探索しなければ最適解が保証で狙い
設計要件
きないことから、ダイクストラアルゴリズムをベースとした探索を採用する。最適な運搬順序を探索

黒ブロック運搬攻略«requirement»
複数の遠隔拠点でも効率よく開発できるようにする
text = "全体についての移植性の要求をまとめたものを検討（req_09、req_10、req_11、req_12を考慮）"

保«requirement»保«requirement»
変更作業をしやすくする«requirement»
制限時間内で獲得できるボーナスタイムが照明環境変化対策をする
text = "（req_10、req_12を考慮）"
最大になる運搬パターンを選択する«requirement»
PC性能変化の対策をする

1.運搬戦略«satisfy»«requirement»
ゴール後に存在する青線を検出する«deriveReqt»«deriveReqt»«requirement»
ラインからズレた分旋回量を補正する

text = "PID制御量で旋回量を補正する（req_01を考慮）"«requirement»
走行体の走行安定性を向上させる

text = "ローパスフィルタによる加速制御を行う（req_01を考慮）"

信

2-3.指針解決策

text = "（req_08を考慮）"«deriveReqt»«deriveReqt»«requirement»
ゴール付近に到達したか判断する«requirement»
ショートカット走行«deriveReqt»«requirement»
本番PC性能に合わせて調整する«requirement»
ゴールを通過したか判断する«deriveReqt»«requirement»
走行時間を短縮する«deriveReqt»

機«requirement»
交点サークルを正しく検出する

260mm

移

1-1.攻略方針の達成度«requirement»
目標タイムまでにゴールする«deriveReqt»

機

指針③
ゴール

交点サークル間移動中に左右に旋回し、遠心力でブロックを飛ばして設置する。
設置後の移動先が前方にある場合は運搬パターン

初期配置

設計方針

3. 最適な運搬パターンを生成

5.スイング設置

4.スロー設置

メンバーはみな拠点が異なる

機能要求以外で開発方針から導出された開発要件について検討

100mm«requirement»
ETロボコン2021シミュレータ上で走行する

計算リソース

コースを攻略する
競技者
走行システムの初期設定が終わっていること
走行システムが正常終了する①競技者は走行システムをスタートさせる②走行システムはゴールまで走行する[E1]③走行システムはブロックビンゴを攻略する[E1]④走行システムは競技終了通知
で終了する
競技時間が終了したら強制的に
ユースケースを終了する

160mm

150mm

text = "全体についての移植性の一部と信頼性の一部の要求をまとめたものを検討（req_06、req_08を考慮）"

成功率90%以上を目標とする«verify»«requirement»
コース上を走行する«block»
要素技術«requirement»
ラインに沿って走る

req_12
開発中や適合時の調整をしやすくするための要件を検討する

3.ブロック取得

アームを振り上げ、ブロックを投げて交点サークルを跨げば取得可能。
通過時にブロックを取りこぼさないよう ブロックサークルに設置する。

- Pathfinder -学習モデルの選定や、学習方法、入出力データの検討は工夫点
4-1を参照。

3-1.設計意図・方針< １-2. 運搬順序の探索>・・・運搬順序探索器が担当「高いリザルトタイムを確実に獲得する」ために、運搬順序の特性として、ノード順列がブロック位置・ブロックサークル位置の有限な繰り返しで構成さソフトウェア設計方針の検討 要求分析にて抽出したソフトウェア設計に関する要件から設計の方針を決定した。
初期値に対応する最適な運搬パターン
れる点がある。ノード間のコスト=最適経路のコストとできるため、経路探索器を用いてノード間のコ
全初期値パターンを入力※下図はあくまで例«testCase»
15.2秒以内にゴールできるか

text = "目標タイムの15.2秒以内にゴールまで走行する"«block»
解法の方針«block»bl_A1. ライントレース走行

機

試走会の走行結果を活用して開発PCとの走行状況の差に対して検討すべきことを抽出する

軌跡追従走行を利用することで黒ラインに依らない移動を実現する。(実現の詳細は工夫点4.2参照)

DENS

設計モデル(1)3.
設 計 モ デ ル (1)経路の特性として、ノード順列が隣接するノードで構成される点がある。そのため、経路は動作定義毎のコストを直接反映することができる。また、探索量削減手法(ヒューリスティックコスト設計)が適用可能な探索問題であることから、A*アルゴリズムをベースとした探索を採用する。

指針②

競技スタート実
施しない

運搬パターン全体をモデル化した学習は、推定する範囲が大きく最適化が困難と考えられる。そこで、運搬順序という単位の学習モデ
ルを設計して最適化した。 ・・・運搬順序生成器が担当

経路の探索＝動作定義毎のコストが最小となる
隣接ノードの組み合わせを探索< １-1. 経路の探索>・・・経路探索器が担当

旋回時の制限req_11

側面

前面«deriveReqt»«block»
設計方針（分析モデル・設計モデル）«satisfy»

etrobo環境

2.軌跡追従制御による走行

開発PC間の性能差に対して検討すべきことを抽出する

交点サークル間移動 交点サークル跨ぎ

コロナ禍のためFace
to Face
運んで設置するより高速に設置可能。
ただし、ライントレースに比べて誤差が大きく、調整が
通常より少し速度を下げて通過する。
req_07
req_08
req_09では開発できない
スロー設置よりも高速に設置可能。
開発PC間の性能差の影響に対応
開発PCと本番PCの性能差の影響にツールを活用してリモート開発をするための難しいため、特定のシーンに限定して利用する。
するための要件を検討する
対応するための要件を検討する
要件を検討する

req_06
照明の差の影響に対応するための要件を検討する

要求への対応（※要求を何で対応するかを示す）

機能ごとに
要件抽出

図1-3.1. UC図

業務時間外での開発で通行不可

開発を効率化するために検討すべきことを抽出する(C)交点サークルとブロックサークルの間のスペース(D)ブロックサークルの無い対角の交点サークル間
複数拠点で分散して開発する際にのスペース検討すべきことを抽出する

試走会の走行結果と開発PC間で走行結果が異なるシミュレーションを行うPCの性能差
によって走行体の挙動にバラツキがある

3.走行体

性能の異なる開発PC間で走行結果が異なる«requirement»
ゴールまで走行する«deriveReqt»

するために必要なAPIを提供する

通行可

機能ごとの並行開発をするため
フリー走行で直進 or
交点サークル間の中点付近で(A)ライン上作業時間が制限される 交点サークルを検出するまでの要件を検討する
旋回後、ラインに復帰する。 90度以上旋回すると設置済
ライントレースで走行する。
(B)交点サークル上みブロックに接触するリスク有。

D
C

計算リソース機«requirement»
機能条件«requirement»機能(ユースケース)

etrobo環境はブロックビンゴを攻略

・GPU
・メモリ
・OS

照明の環境の違い

350mm

req_05ブロックの配置によって、ゲーム攻略に必要な時間が異なることに対応するための要件を検討する※頭文字を引用«testCase»
テストケース

ブロックビンゴを攻略する

開発時と本番での環境差の影響がある

環境差で想定される外乱ごとに検討すべきことを抽出する

スタート成立後に決まるもので検討すべきことを抽出する

req_04
経路探索が全て終わらないことを考慮して戦略を検討し、必要な要件を検討する«requirement»
その他の開発要求«include»

競技ルール上、スタート成立後に決まるものがある

ゴールまでの時間内に経路探索を終わらせないといけない

走行体のみで経路探索するために検討すべきことを抽出する

req_03
経路探索の計算の範囲とタイミングを検討し、必要な要件を検討する

検討

ゴールまで走行する

例外フロー E1

＜PC性能＞A

A

2. 最適な運搬パターンを学習・評価
開発段階に １. で算出した最適な運搬パターンを学習しておく。

最適な運搬パターンを学習するためのデータとして、開発段階に初期配置毎の最適な運搬パターンを算出しておく。要素定義より、運搬パターンは経路と運搬順序という異なる特性を持つノード
順列（ノードの組み合わせ）で表現できる。そこで、各特性を分析して適切な解法を検討した。

指針①

2. 最適な運搬パターンを学習・評価(C)は通過不可とした。また、ブロックサークルの無い対角の交点サークル間のスペース(D)は移動後のラインへの復帰が難しいため、通行不可とした。
・CPU

シミュレーションを行うPCの性能差による走行結果の違いにB
対して検討すべきことを抽出する

工夫点4-1参照

bl_B13.経路探索のアルゴリズム

１. 最適な運搬パターンを探索

1. 最適な運搬パターンを探索

開発時

req_10135mm

ゴールまでの走行時間は
15.5秒

走行の制限時間は120.0秒

2. ゲーム攻略の流れ

bl_B7.
スイング設置

bl_B6.
スロー設置

1.ブロックビンゴエリア内の通行可否 と 移動方法考慮した品質特性

要求・要件の種類«requirement»
品質特性を考慮して抽出した要件

走行システム

事後条件
基本フローボーナスタイム30.0秒を獲得
しなければならない

全ボーナスタイムを獲得するために検討すべきことを抽出する

req_02
制限時間内で最高ボーナスタイムを獲得するための要件を検討する

bl_B2.
その場旋回

保守性を考慮する
移植性を考慮する
基本的には個々に活動することになるの要件を検討する
2-1-1より、交点サークルとブロックサークル内の点線の円との距離は185mmで、ここ(C)を通過すると走行体(横幅150mm)とブロックが接触するリスクがあるため、走行体のアームの姿勢が変動しないように固定する想定される変動要素を抽出する＜スタート成立後すぐに決まるもの＞
・全カラーブロックの色と位置要求に対してシステムが満たさなくてはならないこと・やらなくてはならないことを抽出し、要件への対応を検討する※機能やその他の開発要求（1-2. 開発方針から出てきた要求をまとめたもの）をトップの要求として、そこからシステムへの要件を導出※1-2. 開発方針で出した観点を考慮し、抽出した要求に該当する観点のID（req_xx）を記載して検討漏れがないことを確認

②要求図

①UC分析

ユースケース名アクター
事前条件

限られたリソースの中でゲーム攻略するために検討すべきことを抽出する使用できるリソースは
走行体のみ

30.0秒は、全ボーナスを達成した際のボーナスタイムの合計

bl_B1.走行
ラインエッジの切替

ブロックビンゴエリア内を安定して移動するために、基本的には、交点サークル間をライントレースで移動する。
メンバーは皆部署が異なり開発中の追加・変更に対応しやすくするため

競技時に毎回変化する要素がある（競技ルール）

本番で意図通りに走行するには変動要素への対応が必要

60mm

ゴールまでを15.5秒以下で走行できないといけない

ライントレース中の走行体は左右に揺れる

ライントレース走行とショートカット走行を組み合わせた走行をする

1-3.要件定義の②要求図の<testCase>と対応«include»2-2.走行体の動作定義

2.ブロック1.コースサイズ
開発開始してからプログラム提出まで
シミュレータの環境設定が更新されないとはかぎらない

60mm②ブロックビンゴ<攻略方針>• 地区大会で既に上位チームは最大のボーナスタイムを獲得している。
ここで差をつけられない様に ボーナスタイム満点(30.0秒)獲得を狙う。

コースを攻略する

2-1.各種寸法

目標到達の確実性向上と、何かあっても目標到達に近づけるために必要なことを抽出する

シミュレータ環境に対応するためのシステム構成に対する考慮が必要

本番PC以外のPCを使って分散処理ができない

目標性能を達成するための目標性能を分割し、それぞれの目標について検討すべきことを抽出する

リザルトタイムは、走行タイムとボーナスタイムの合計①ゴールまでの走行①ゴールまでの走行②ブロックビンゴ<攻略方針>• CS大会で勝利するためには地区大会の最速記録(15.7秒)を上回る必要がある。ただし、地区大会で既にショートカットを利用しており、大幅な短縮は望めないため、0.5秒短縮となる 15.2秒 を目標に設定した。
• 成功率の目標を設けることで達成度を評価する。

1-3.要件定義- Pathfinder -目標達成のために網羅的に検討すべきことを抽出するため、考慮すべき品質特性を抽出する

主張の導出の仕方や導出理由を説明する

目標リザルトタイム：-14.8秒(内訳)
走行タイム ：15.2秒
ボーナスタイム：30.0秒① システムに搭載する機能をユースケース図で定義② 機能ごとに機能実現に必要な要件を抽出※要件に対して1-2. の品質特性から導出した検討
すべきことを検討③ 抽出した要件に対する対応方針を検討

DENS

目標達成に向けて非機能要求を網羅的に抽出するため、あらかじめ品質特性の観点（ISO25010から機能適合性・信頼性・移植性・保守性を使用）を踏まえて要件定義で検討すべきことを洗い出してから、要件の抽出・定義を行う。ここでは要件を抽出する時の検討すべきこと（観点）を検討・整理する。

凡例

1-１.攻略方針
高いリザルトタイム(= ゴールまで安定して走行できる最短時間 - ブロックビンゴの最大ボーナス
タイム)を確実に獲得することを目指す。
図1-1.1. 各ゲームの区間定義

競技者- Pathfinder -2. 分 析 モ デ ル

1-2.開発方針

90mm

目標

bl_A2.
ローパスフィルタ

loop[!スタートノードに到達]

ノードを追加する()
コストを設定する()

2

ETロボコンにおける総合成績• ETロボコンの総合評価は競技成績とモデル評価から決定される• つまり、競技だけを⼀⽣懸命やっても総合成績は上がらず
上位に⾏くにはモデルをしっかり作る必要がある⇨ 設計技術を学ぶ
モチベーションとなる• 設計技術として、ETロボコン
ではモデリングを重視
Result Time / Model Point

1.0

0.9

競技成績

0.8

0.7

0.6

0.5

0.4

右上に近いほど
順位が高い

0.3

0.2

0.1

0.0
0.0

0.1

0.2

0.3

0.4

0.5

0.6

0.7

0.8

0.9

1.0

系列1

ETロボコン2022 開催発表会資料／ETロボコン実行委員会

モデルの評価3

モデリングとは︖•

モデリングとはそのままでは取り扱いが複雑な対象から不必要な情報を排除し（抽象化）、⽬的に合ったシンプルな形にすること

徒歩で⽬的地に⾏くには地図が⾒やすい
https://www.fujifilm.com/fb/company/profile/location/map002.html

写真には多くの情報が⼊っているがそのために分かりづらいことも多い
画像 ©2018 Google、地図データ©2018 Google、ZENRIN

電⾞で⾏くには路線図が分かりやすい
ETロボコン2022 開催発表会資料／ETロボコン実行委員会

http://www.m-kana.com/yokohama.html

4ソフトウェアにおけるモデリングとは︖• 近年のソフトウェアは⼤規模化・複雑化している• コードだけをみていては全体像をつかみきれない• モデリングを活⽤することで全体を掴みやすくし関係者の理解やコミュニケーションを促す
コードだけだと⾒通しが、、モデルで⾒通しがよくなりレビューがしやすくなった︕
モデル化

ETロボコン2022 開催発表会資料／ETロボコン実行委員会

5よく使うモデルの観点• ソフトウェアのモデリングで⼀般的に使われる3つの観点「機能」「構造」「振る舞い」

モデルの具体例(UML)– 機能
それって何をするの︖

ユースケース図など
xxシステム

同じものを
別の観点で
⾒ている

クラス図など– 構造
それってどんな作りなの︖

シーケンス図など

xxシステム– 振る舞いそれってどう動くの︖
ETロボコン2022 開催発表会資料／ETロボコン実行委員会

6よく使うモデルの観点• ソフトウェアのモデリングで⼀般的に使われる3つの観点「機能」「構造」「振る舞い」

モデルの具体例(UML)– 機能
それって何をするの︖

ユースケース図など
xxシステム

同じものを
別の観点で
⾒ている

ETロボコンではこの３つの観点をクラス図などベースに、実際の開発に使える– 構造技術を学べますそれってどんな作りなの︖

シーケンス図など

xxシステム– 振る舞いそれってどう動くの︖
ETロボコン2022 開催発表会資料／ETロボコン実行委員会

7

スキルに応じた３クラス•••

獲得したいスキルに応じた３つのクラスを提供しています
連続して参加することでさらなるスキルアップが図れます
上位のクラスに参加することで、より深く広いスキルを学べます
クラス名

狙い

想定対象者

モデリングに要する期間（参考)※

エントリー

・モデルを読んで理解し、改良することでモモデリング未経験者
デルの使い⽅を体験する
ソフトウェア開発初⼼・プログラムを作り動かす体験をする者
・設計と実装の繋がりを把握する

1〜4週間

プライマリー

・競技課題に合わせてモデルを構築する
事で、モデリングの基礎を⾝につける・品質向上に向けた取り組み

モデリング初級者

4週間〜

アドバンスト・モデルを使って課題解決ができる・要求に基づき設計⽅針を⽴て、それにモデリング中級者
基づいた設計を実践
・制御技術の向上
・画像処理・AIなど重点技術への取組み

６週間〜※エントリーはA評価、プライマリー/アドバンストはB+評価以上を取ったチームのアンケートから算出しています
現状のスキル・利⽤できる時間・環境・過去参加状況などによって増減します
ETロボコン2022 開催発表会資料／ETロボコン実行委員会

8

各クラスのモデル審査対象範囲• クラスによってモデル審査対象は異なり、アドバンストクラスが最も範囲が広くなります• モデル審査では実装は審査対象外ですが、技術教育ではモデルと実装のつながりを教育します
アドバンストクラス
課題の分析
要求分析
要件定義
(機能)

アーキテクチャ設計
設計(構造・振舞い)

実装

評価
（テスト)

エントリークラス
プライマリークラス

⼯夫点
重点技術（AI/画像処理)

ETロボコン2022 開催発表会資料／ETロボコン実行委員会※この図は対象範囲をイメージ化したもので、開発プロセスそのものではありません9

また、それぞれの関係をパッケージ図を用いて、図2.1に示す。

2021作成モデル例（設計︓構造）動作の切替えを判断する「戦略」と、モータに与える走行量を計算する「動作」については、それぞれのパッケージと同じ名前のスーパークラスを定義し、それを継承することで構成した。

緑色で示した戦略パッケージは3つの攻略課題に対応している。
(図2.2参照) そのため、 1-①～ 1-③に関するクラスをクラスの継承を用いて作成することで、構造を明確にした。
1-①「ゴールまで走行する」について、動作パッケージの「ライントレース」
クラスとの混同を避けるため、「ゴールまで走行する」に対応するクラスを「ラインコース」とした。

図2.1 パッケージ図

プライマリークラス
2.2.クラス構造

青色で示した動作パッケージについては、タッチセンサが押されてからゴー
ルまで走行するために必要な動作を分類し、戦略パッケージ同様にクラスの継承を用いて作成した。(図2.3参照)

本システムの構造をクラス図を用いて図2.4.に示す。

赤枠の部分がゴールまで完走するに相当するため、赤枠部分を記述している

設計のクラス図作成を通じて、全体を俯瞰しながらアーキテクチャ・詳細設計を⾏うスキルを⾝につける

1-①ゴールまで走行する

1-②スラロームを攻略する

1-③ガレージを攻略する

図2.2 戦略パッケージにおける継承関係

エントリークラス
提供モデル

ライントレーサー and ブロックキャリーへ変更

2-①タッチセンサーが押されるまで待機する

ライントレースへ変更

2-②黒線に沿って走行する
エンコーダ走行へ変更

ャリー

2-③自分たちで引いた仮想ラインに沿って走行する

設計モデル(1)3.
設 計 モ デ ル (1)アドバンストクラス
シンプルタイマー
図2.3 動作パッケージにおける継承関係
ライブラリ関数を削除

DENS

図2.4 クラス図- Pathfinder -変更※追加したクラスは青色で示す

変更後のモデル

3-1.設計意図・方針

設計方針
ソフトウェア設計方針の検討

狙い

構造の詳細

カラーサーチを追加

設計要件

3-2にて説明したパッケージの役割と関係を詳細に説明する為に、図3-5を記載した。なお、終了条件（走行体制御パッケージ）・動作（動作管理パッケージ）の詳細はそれぞれ図3-6, 3-7に別途記載し、動作の具体例として「交点サークル跨ぎ」を図3-8に記載した。また、本図では経路計画パッケージ内は概略のみを示し、詳細は図3-9にて示す。
方針② 「ベースの運搬パターン選択手法」と、「学習モデルを用いた運搬パターン選

3-4.構造設計（詳細）「高いリザルトタイムを確実に獲得する」ために、要求分析にて抽出したソフトウェア設計に関する要件から設計の方針を決定した。

方針④

設計方針

運搬計画
ロボコン2021攻略

時間内に最大ボーナスを獲得したい

bl_B9. 走行中に運搬パターンを選択できる設計

バックアッププランを用意した上で、より高いリザルトタイムが獲得できる方法を開発したい・パラメータ調整にかかる時間を減らしたい。
・パラメータ調整時に発生し得るリスク（人為的なミスなど）を減らしたい。
・複数人で分担して・実装できるようにしたい・不具合発生時に原因箇所の特定を容易にしたい

bl_D2. 機能を容易に追加・変更できる構造

配置

運搬計画
経路計画

走行体

・走行中に運搬パターンを選択できるようにする

bl_D1. 機能毎に容易にテストできる構造

RGB-HSV変換を追加
・調整箇所と実行処理部を分ける

ブロックビンゴ2021を攻略する最適な運搬パターンを算出する

現在の攻略状態: 攻略状態-

現在の戦略状態: 戦略状態+攻略する(): void++-戦略の完了状況を取得する(): 戦略状態
戦略を実行する(): void
次の動作を取得する(): 次の動作

-攻略方法

1..*

方針④

・機能間の結合を疎にする
・機能ごとに独立して動作する構造にする

1-

現在の戦略状態: 戦略状態-

現在の戦略状態: 戦略状態

戦略の完了状況を取得する(): 戦略状態
戦略を実行する(): void
次の動作を取得する(): 次の動作++-

戦略の完了状況を取得する(): 戦略状態
戦略を実行する(): void
次の動作を取得する(): 次の動作

-構成要素

ブロックビンゴ攻略戦略+++

パッケージを必要最低限の機能区分で作成し、加えてパッケージで相互参照が行われない構成にした。
→パッケージ間の疎結合によって、変更や単体テストが容易となる。
推定動作時間を取得する
動作管理

動作を登録 動作生成
する

運搬計画

戦略（動作リスト）を保持し、次の動作
を決める

走行体制御

動作に基づいて、適切な出力を決定する

走行体

走行体の状態推定や駆動を行う

動作生成

運搬パターンから動作を生成し、戦略に登録する動作を実行する

残り時間を
取得する

走行体制御

環境情報を
取得する

経路を生成する

0..*-制御器

1..* {ordered}

終了条件

0..*
0..*

-

終了条件を判定する(): 判定結果

1..* {ordered}

左輪速度指令値: int
右輪速度指令値: int++

実行する(): void
速度指令値を算出する(): 速度指令値

+
+

1

0..*

-条件判定
要素

0..*

0..*

bl_A5.
bl_A1.
ライントレース走行 PID制御

1

1

動作指示を実行する(): void
速度指令値を算出する(): 速度指令値

軌道追従制御++自己位置1-情報取得先1-情報取得先

外部情報管理シュミレータ拡張用API

ETロボコン2022 開催発表会資料／ETロボコン実行委員会
走行体外部の情報（通信や色など）を
センサ値を取得するセンサ値を取得する推定する(): 自己位置

動作指示を実行する(): void
速度指令値を算出する(): 速度指令値

1

11 1

1 1 1

外部情報管理

1

1

-表示
情報

-

右輪速度: int
左輪速度: int
走行体速度: int

1+

推定する(): 走行体速度1-アームモータ+
駆動依頼

1

bl_A2.
ローパスフィルタ

PWM指示値: int
係数: float++

setPWM(PWM値): void
ローパスフィルタ値を算出する(): ローパスフィルタ値
ローパスフィルタ係数設定(フィルタ係数): void

色: 色の種類
RGB値: int++

更新する(): void
検知結果を取得する(): 色の種類

0..*

開始時刻: int
経過時間: int+-

更新する(): void
経過時間を算出する(): 経過時間

ビンゴゲーム目標攻略時間: float
デフォルト運搬パターン: 運搬パターン
最適な運搬パターン: 運搬パターン+++

最適な運搬パターンを決定する(): 運搬パターン
運搬順序から運搬パターンを算出する(): 運搬パターン
最適解かどうか判定する(): 判定結果*

-最適な運搬順序

2

1

運搬パターン
-

合計獲得ボーナスタイム: float
合計コスト: float+

運搬経路を追加する(運搬経路): void
1

*
1

1

1

1

-運搬エリア情報

運搬順序

1-全運搬順序1

ブロックビンゴ
2021エリア

1-現在
位置

1-動作変換
2
要素

0..1
経路探索器

-構成要素
0..1

走行体動作変換器
1

0..1-経路コスト
取得先

仮想走行体

-探索中の
0..1経路
1

1
*

-次の状態

1
-運搬中ブロック

1

0..1

-変換対象

0..1

1

+
+

更新する(): void取得する(): ボタン押下状態

シュミレータ拡張用API
-初期情報
取得先

1

1

-出力先

アームモータ-

PWM値: int
回転角度: int-

角度: int
回転速度: int+

setPWM(PWM値): void+

setAngle(角度): void

図3-5 ソフトウェア全体の構造（クラス図）

1 -設置経路

1

1

1

1

1

-クロック

コンソール
-

出力文字列: char-

コース情報取得ID: enum+

ETRoboc_getCourceInfo(コース情報取得ID): ブロックの位置情報

1-カラーセンサ

クロック-

現在時刻: int1

-タッチセンサ

カラーセンサ-

センサ値: int1
ボーナス条件

bl_B14.
ETロボコン2021 シミュレータ
コース情報
用拡張API

1

0..8{ordered}-黒ブロック
黒ブロック経路 設置経路

-設置経路

ブロック

ボタン押下状態: boolean

運搬経路

-取得経路

経路

0..1
-現在の状態

1

1
0..1 -ブロックの
運搬経路

-最適な運
搬経路

1

入力操作

モータ

パラメータを更新する(パラメータ): void
パラメータを読み込む(): void

-最適な運搬順序 1

走行体デバイス-車輪モータ

パラメータ: double

+
+

1

ノード

-

1

-

-全運搬パ
ターン

-

-デフォルト運搬順序-条件判定要素-

setAngle(角度): void

-

1

-参照
学習モデル

経路計画

bl_A3.
カラーセンサによる輝度判定bl_A10.
カラーセンサに
よる色判定

-

時刻

角度: int
回転速度: int
Pゲイン: int
Iゲイン: int
Dゲイン: int

1
モータ制御

-条件判
-表示
情報 1 定要素

1-条件判定要素色検知

1

アームモータ制御
-

1

1

-表示
情報

画面表示
1
入力する(文字列): void1
表示する(): 文字列++1-情報取得先最適な運搬パターンを学習する(パラメータ): 運搬パターン
運搬順序から運搬パターンを算出する(): 運搬パターン
学習モデルから最適な運搬順序を生成する(パラメータ): 運搬順序

運搬パターン計画-運搬パターン1

ライントレース走行
軌跡追従走行フリー走行
ライン復帰
黒ブロック運搬交点サークル間移動
交点サークル跨ぎ交点サークルブロック取得
スイング設置
スロー設置
ブロック設置後復帰
待機

0..*

1

-左車輪モータ
駆動依頼

1

1

走行速度

1
-情報
取得先

-右車輪モータ 1
駆動依頼

フリー走行制御++

走行方向: int
走行距離: int
自己位置: 座標

bl_A7
軌道追従走行

実行する(): void
速度指令値を算出する(): 速度指令値

-表示
情報

+

-情報取得先

-条件判定
要素

1

環境情報を
取得する

動作を変換する(): 動作
次の動作を推定する(現在状態, 次の状態): 次の動作

«enumeration»
動作名

bl_A9.
オドメトリを用いた
自己位置の推定-1

Pゲイン: float
Iゲイン: float
Dゲイン: float

1
1

初期情報を
取得する

戦略の完了状況を取得する(): 戦略状態
戦略を実行する(): void
動作を登録する(動作名): void
次の動作を取得する(): 次の動作

走行体

ライントレース制御-

経路計画

駆動を指示 走行体情報を
取得する
する

駆動する

1

+
-

+
+
-

最適な運搬パターンを決定する(): 運搬パターン
最適な運搬順序を探索する(): 運搬順序
運搬順序から運搬パターンを算出する(): 運搬パターン
運搬順序を登録する(): void
運搬対象を決定する(): 運搬対象のブロック
運搬先を決定する(): 運搬先のノード
合計コストを計算する(): 合計コスト
最適な運搬順序を登録する(): void0..* {ordered}0..*-動作終了条件

-

走行制御

方針③

走行体

-パラメータ取得先

方針②

運搬パターン
を取得する

目標走行体速度: int
走行方向: float
目標座標: 座標
走行エッジ: 走行エッジ
目標アーム角度: int

1* -推定動作時間取得先

目標値: float
終了状況: boolean

1..* {ordered}

動作パラメータ-

10..*0..* -生成物

1-動作パラメータ

1

+
+
+
-

-動作生成
依頼先

-登録
する

現在の戦略状態: 戦略状態

+
+
+
-

0..* {ordered}

動作を実行する(): 動作終了状況
推定動作時間を取得する(): 推定動作時間
動作の終了状況を取得する(): 終了状況

走行体制御0..1 --デフォルト動作

推定動作時間: int
動作の種類: 動作名

1

メリット

ポイント

-

動作を生成する(動作名): 動作

スピードラン戦略++-

運搬順序生成器

運搬順序探索器
動作生成

+

動作変換

戦略

0..*
0..* {ordered}

動作定義を基に最適な経路を探索する

管理する

-

1

動作パラメータ部と制御部を分離した。
→制御ロジックやPID値を変更することなく、動作の追加や変更が可能である。

・「ベースの運搬パターン選択手法」と、「学習モデルを用いた運搬パターン選択手法」を容易に切り替えできるようにする

役割

動作管理

外部情報管理方針③

動作生成

スタート待ち動作

ブロックビンゴ2021の分析結果及び、ソフトウェアの設計方針を基にソフトウェア全体の構造設計を行った。

パッケージ名方針②

PD演算を追加
bl_A4. 調整が
方針③
容易にできる構造

3-2. 構造設計（全体）パッケージ設計方針①

択手法」を容易に切り替えできるようにしている。

機能間の結合を疎（パッケージで相互参照が行われない）に設計 / 機能ごとに独立して動作する構造としている。

動作管理

1-獲得ボーナスタイム
1

・ゲーム攻略に不要な要素、自明な要素、getter及びsetter
は省略した・マーカは以下対応を表す
方針①

設計方針

bl_xx. ・・・

要素技術

タッチセンサ-

センサ値: boolean

10

動作「交点サークル跨ぎ」のオブジェクト図を具体例として記載する。
BLK206

5.斜め直進ラインなしで単純前進する。

走行体とブロックの衝突を避けるため、ブロック
はブロックサークル内に設置する（ブロックサー
クルライン上はNG） 。

ブロックの配置に依存せず、決まった動作で運搬できるよう、
黒ブロック設置を攻略の最初に実行する。決め打ち動作の為、黒ブロック設置は経路探索の対象外とする 。
REQ206

2021作成モデル例（要求・分析モデル）

BLK205制約

補足

場で方向転換する。

ブロックの取得もできる。

ミニノード: ノードに方向成分を加えた概念。
ノード上で走行体が取り得る方向分だけ、ミニノードが存在する。
エッジ: グラフ理論のエッジの概念。
ミニノード間の繋がりを、
BLK202方向を持って(有向)定義する。

②
③

①
ノード
指針2. 各ブロックの設置先を全網羅して経路を決定する
ルール上、カラーブロックの初期位置は競技開始まで
7.5cm
図2.3. ミニノード・エッジと動作の関係
BLK204
解らないがどの初期位置でも必ずPFBを獲得する必要がある。
6.黒ブロック設置
指針3.2.動作のリスクと所要時間を考慮した経路を選択する
初期位置の違いによる攻略時間への影響（時間増加による
45度単位で回転する為、ラインが走行エリアからビンゴエリアに進入し、黒ブロックをセンターマーク
PFBを達成するには1つ1つの動作を順次実行して、失敗なく
タイムオーバー）を抑えられる様に、各ブロックの設置先あるとは限らない。自己位置(モーに設置する。その後、Lコースではノード(2,4) 、Rコースではノード（設置先パターン）を全網羅して決定する (表2.2.,図2.2.) 。 予定した全動作を完了する必要がある。一方で、攻略時間の8.0cm タ回転量)で動作の終了判定を行う。 (4,2)に移動する。
7.ゲーム要素制約もある為、動作のリスクと所要時間の両方を考慮した経m
なお、設置先パターンは計16パターンある。
路選択をおこなう。2点間経路はミニノードとエッジによる
詳細は、5-1章の ノード:ブロックサークルと交点サークルの総称。 設置先パターン数 ＝同色の設置先数[2] ^ 色数[4]BLK207
BLK206動作の切り替え可能な地点で、座標定義をもつ。
ダイクストラ法の最良優先探索で決定し、
工夫参照。
表2.2.
設置先パターンの全網羅のイメージ
ライントレースで走行する。
パス:走行体が移動可能なノード間の繋がり。
エッジの重み(コスト)を以下のように定義する。
設置元 色 設置先パターン1 パターン2 … パターン16
0 1 2 3 4 5 6 x「コスト＝リスク ×所要時間」)
L/Rの両コースでX/Y軸
赤色
(2,0)
(5,1)
(3,5)
…
(5,1)
またリスクは「リスク＝1/各動作の成功確率」で導出する。
1
所要時間を減らすためには、は共通とする。
(6,4) 赤色
(3,5)
(5,1)
…
(3,5)
2
なお、各動作の成功確率は、複数の動作を連続して実施する
停止動作を減らすことが重(6,6) (x,y):ノード座標
3(6,0) 青色
(1,3)
(1,3)
…
(5,5)
結合テストの結果から導出する。
要。2パス動作も採用する。
)
4
…
…
…
…
…
…
:ノード
:パス
BLK203
指針4. 事前経路計算による動作順序を組み込む
5
緑色
(0,6)
(1,5)
(1,5)
…
(3,1)
図2.1. ノードのイメージ
パスも2パスもブロックの取得もできる。
指針2に従い網羅的な経路計算を行うと計算量が増大する。
y6
表2.1. 動作定義一覧
設置先パターン1 設置先パターン2
そのためターン開始後に計算すると、ビンゴゲーム開始まで
回転
直進
ブロック設置 バック
斜め直進 黒ブロック設置に計算を完了できない。ターン開始前に予め全初期位置
ブロックサークルとブ
るパ 保持
有
無
保持
有
無
パターンの経路を算出し、動作に則した情報(動作順序)に
保
ロックの色が一致する
タ
角度 45 90 135 45 90 135 パス
有
無変換し組み込んでおく。そして、拡張APIから取得する
持
1パス2パス 1パス 2パス
ように設置先を網羅す
方向
種別
初期位置情報から、適切な動作順序を取得する(図2.4.)。
右/左<<requirement>><<requirement>><<constraint>><<constraint>>
る。
凡例:
間(※) 1-2
1.3
1.3- 2.0 1.8
20.0
機能要求
非機能要求
シミュレータ制約
競技規約制約- 0.5 1.1
2.2 0.4 0.6 0.7 1.8 2.7 1.7
2.3
初期位置情報
動作順序
動作順序
要求分析
デ バ イ ス 制御情報
(一部ブロックは省略)
事前経
動作順<<block>><<block>>
品質特性<<rational>>__ev3rtfs
開発者
走行体
※)
- 1.0 1.1 1.4 1.0 1.1 1.3 1.3 1.4 1.2
1.3
1.0
1.0
- 1.4 1.3設計方針
1.0
路計算
序実行
リスク事象
実現手段
チーム目標を達成するための開発とエリアごとの要求図を図1.2.,図1.3.,図1.4.に示す。
走行体ファイルシステム
件
自己位置
色/自己位置
自己位置 色/自己位置 色/自己位置 色/自己位置 別ページ参照
これらはゲームの分析の結果を踏まえている。図1.2.の「納期までに開発完了する」はチームの開発目標であり、図1.3.と図1.4.の最上位の要求は図1.5.のユースケースに対応
図2.4. 事前計算のデータフロー
REQ211
図2.2. 設置先パターンのイメージ(※)所要時間とリスクについては指針3.2.に記載する。ブロック保持の有無によって所要時間が異なる。

1cm

回転時のブロックとの衝突を避ける為、交点サークル上でのみ行う。

• アドバンストクラスでは要求モデル・分析モデルを評価します• 実際の業務でも重要となる分析について学ぶことができます
要求モデル<<requirement>>
走行エリアを攻略する

分析モデル

Id = REQ101
text = 走行エリアを15.7秒以内で走行完了する。

<<requirement>><<requirement>>
している。
目標時間内にゴールゲートを通過する
全てのゲートを順番に通過する<<rational>>
品質特性についてISO/IEC 25010に照らし合わせ、要求に抜け漏れがないことを点検し
Id = REQ102
ゲートに接触する可能
Id = REQ103
text = 15.7 秒以内にゴールゲートを通過性がある
text = 中間ゲート1、中間ゲート
る。 た。品質特性をもとに導出した要求にはラベルを付けている。検討の結果、互換性、使する
2、ゴールゲートの順で通過する
経路計算の流れ<<deriveReqt>>
構造体と、 用性、セキュリティ、移植性の品質特性の要求は本大会は挙げないこととする。
<<deriveReqt>><<deriveReqt>>
る。 Blockについてはアイコンが指す別ページで詳細を説明する。ただし自明なものについ全16通りの設置先パターンに対し経路計算を行い、最小コストの経路
Enum<<requirement>>
黒ラインの形状に合わせて 度を最適にする
機能適合性<<requirement>>
黒ラ ては紙面の都合上割愛する。
<<requirement>>
ゲ ー ム の要素を選択する。現在地からの移動コストで次に取得するブロックを決定し、黒ラインの形状に合わせて走行する

解法

3

Id = REQ104
text = 15.7秒以内で走行完了するためには平均
度 35.4cm/sec.で走行する必要があるが、カーブを曲がり切れない。
黒ラインの形状に合わせて、カーブでは曲がり切ることができる最高 度で走行する

カーブをショートカットして走行する<<requirement>><<constraint>>
沿ってゲームを攻略するために、
設置先パターンによりブロックの設置先を決定する（図2.5.,図2.6.）。
納期までに開発完了する
開発期間中にシミュレータがアップデートされる
Id = REQ001
Id = CNST001
要素の定義と、実際の攻略方法・<<deriveReqt>><<deriveReqt>>
記載する。
<<requirement>><<requirement>>
全設置先パ タ ー ン を 生成す る
全初期位置パ タ ー ン の 動作順序を 生成す る)

Id = REQ106
text = カーブで黒ラインの内側を走行してショートカットし、走行距離を短くする

cm)

シミュレータのアップデートに対応する開発を効率化する

Id = REQ003

Id = REQ002

ーム攻略に必要な要素<<deriveReqt>>
保守性<<requirement>><<requirement>><<requirement>>
必要となる要素を定義する。
チーム開発で生産性を上げる
図2.6.参照
パラメータ調節を高 化する
効率的にテストを行う
Id = REQ004

設計1<<satisfy>>

設計3

text = カーブで黒ラインの内側を走行することで、走行距離を短くする

経路を 取得す る

設計5

信頼性

設計7

<<enum>>ミ ニ ノ ー ド 識別子- ノ ー ド _0_0
- ノ ー ド _0_2
- (省略)- ノ ー ド _6_4
- ノ ー ド _6_6

- ミ ニ ノ ー ド _0_0_0- ミ ニ ノ ー ド _0_0_45- ミ ニ ノ ー ド _0_0_90- (省略)- ミ ニ ノ ー ド _6_6_315

1

1 - を 一意に特定する

1

Id = BLK103
text = モーターの回転角度から走行体の座標と方向を推定する<<requirement>>
全てのブロックを配置完了する

1..*+ コ ス ト を 取得する () : double

性能効率性<<deriveReqt>><<deriveReqt>>

出現確率<<deriveReqt>>

2..8- 隣接するーの実現方法
算の流れとその構造(図2.8.)を記載
なお、指針1に従い、黒ブロックに記載は省略する。

<<requirement>>
すべての初期配置に対して104.3秒以内で走行可能な経路が求まる

Id = REQ205
text = 走行に影響を与えずに経路を計算
し、ブロック運搬に備える

Id = REQ206
text = すべての初期配置に対して、104.3秒以内で全てのブロックを設置可能な走行経路が求まる

攻略時間(s)<<rational>>
回転動作を行ったときなどにブロックがアームの間から外れたり倒れることがある

Id = REQ207
text = 現在位置、運搬対象のブ
ロック、ブロックの配置場所の間を走行する経路を計算する

0.00<<deriveReqt>>

84 88 92 96<<deriveReqt>>
100 104 108 112 116 120 124<<deriveReqt>><<deriveReqt>><<block>>
ブロックの初期位置情報を取得する

Id = BLK201
text = ブロックの初期位置情報をAPIから取得する<<requirement>>
正確性を考慮した運搬経路を計算する<<requirement>>
ブロック保持時は動作を低 にする

Id = REQ210
text = 運搬に必要な時間だけではなく、正確性も考慮した運搬経路を生成する

Id = REQ211
text = ブロック保持時はブロックをこ
ぼさないように 度を変更する<<requirement>>
その場回転する<<requirement>>
時間効率の良い経路を計算する<<rational>>
ブロック保持時に180度回転するとブロックをこぼす<<rational>>
黒ラインに沿わずにビンゴエ
リア内を走行する場合、ブロックとの衝突が生じる可能性がある

Id = REQ209
text = 計算した経路から外れずに
正確に走行する<<deriveReqt>><<satisfy>><<rational>>
走行体を急加 /急減
すると車輪の空転が生じる<<requirement>>
黒ラインに沿って走行する

Id = REQ213
text = 黒ラインに沿わずに走行する

Id = REQ105
text = 黒ラインをライントレース
する<<rational>>
コースアウトすることがある<<requirement>>
自己位置を推定する<<deriveReqt>><<satisfy>>

信頼性<<requirement>>
動作のコストを計算する<<requirement>>
黒ラインを含んだ運搬経路を計算する

Id = REQ217
text = 経路の走行に必要となる動作について、要する時間とリスクから、動作のコストを求める

Id = REQ218
text = 黒ラインを用いた運搬経路を計算する

分析<<satisfy>><<satisfy>>

分析<<satisfy>>

分析<<block>>
各動作に要する時間を見積もる

設計

Id = BLK202
text = 動作に要する時間の実測値を求める<<block>>
回転角度を制限する<<satisfy>>

Id = BLK205
text = 180度回転を行わないように動作定義する<<block>>
ブロックを保持しているかを把握する

Id = BLK206
text = 走行経路からブロックを保持していることを判断する

分析<<block>>
各動作の正確性を見積もる<<block>>
黒ラインに沿った走行を動作定義する

Id = BLK203
text = 全ての初期位置パターンに対する経路をあらかじめ組み込んでおく

Id = BLK204
text = 動作の成功率を求める

Id = BLK207
text = 黒ライントレースの走行を動作定義する

分析<<requirement>>
走行の精度を上げる<<satisfy>><<rational>>
環境光の影響によって色を誤識別することがある<<satisfy>><<block>>
モーターの回転角度から位置を計算する<<satisfy>><<block>>
色識別する<<satisfy>>

Id = BLK210
text = RGB の値から4色を識別する<<block>>
PID 制御する<<block>>
環境光の影響を吸収する

Id = BLK208
text = ラインのエッジあるいは疑似的なラインを目標値としてPID 制御する

Id = BLK211
text = 環境光の影響を吸収するようにRGBの値域を設定する<<block>>
PWMの値を指定する- 初期位置と する
0..1

1

セ ン タ ー ブ ロ ッ ク 置き 場

0..1

0..1

パ ワ ー ス ポ ッ ト ビ ン ゴ 成立
{パワ ー ス ポ ッ ト が3つ 並ぶ }1
ブ ロ ッ ク サーク ル

10..1- パワ ー ス ポ ッ ト と する

- ブ ロ ッ ク サ ー ク ル置き 場

0..9 - 設置物と する

セ ン タ ー ブ ロ ッ ク 有効移動成立- 移動先と する
1
1
セン タ ーマ ーク

ブ ロ ッ ク サ ー ク ル有効移動成立{同色}- 算入さ れる<<abstract>>
ボ ー ナ ス 成立
- ボー ナ ス タ イ ム : double- 種別 : ボー ナ ス 種別

カ ラ ーブロ ッ ク

黒ブ ロ ッ ク
セ ン タ ー ブ ロ ッ ク 有効移動成立

0..8- 設置物と する

0..1- 設置物と する

0..1- 設置物と する
ブ ロ ッ ク サ ー ク ル 有効移動成立- 成立さ せる
1..9

パ ワ ー ス ポ ッ ト 有効移動成立- 初期位置と する
パ ワ ー ス ポ ッ ト ビ ン ゴ 成立

0..1

図2.8. 解法を示したクラス図<<requirement>>
コースの色を識別する<<satisfy>><<requirement>>
滑らかに走行する

Id = BLK102
text = モーターのPWMの値を指定する

0...1 - 隣接す る- 移動先と する

1

1
0..*

- 色 : 色種別
- 初期位置 : ノ ー ド 識別子- 移動先位置 : ノ ー ド 識別子- 隣接する2..4- 総獲得ボー ナ ス タ イ ム : double

1..*

ブロッ ク

<<deriveReqt>>

Id = REQ216
text = コース上の色を識別して現在位置を把握する

Id = REQ219
text = コースアウトしないように補正して滑らかに走行する

Id = BLK103
text = モーターの回転角度から走行体の自己位置を推定する

分析<<block>>
あらかじめ全ての初期位置パターン (用語4)に対する走行経路を組み込む

工夫

1
1 - 隣接す る- 右に 位置する

8

ブ ロ ッ ク ビ ン ゴ ボーナス タ イ ム
ビ ン ゴ 成立

1 - 運搬さ れる

Id = REQ214
text = 経路に沿って走行するときの精度を上げる<<deriveReqt>><<satisfy>><<block>>
加減 制御する

Id = BLK104
text = モータのPWMの値を指定し滑らかに加 する<<satisfy>><<deriveReqt>>

信頼性

工夫

進入サ ー ク ル

端点ラ イ ン交点サ ー ク ル
1

- 8方に 隣接する<<enum>>ボ ー ナ ス 種別
- ブ ロ ッ ク サ ー ク ル有効移動ボ ー ナ ス- セ ン タ ー ブ ロ ッ ク 有効移動ボ ー ナ ス- ビ ン ゴ ボー ナ ス- パワ ー ス ポ ッ ト 有効移動ボー ナ ス- パワ ー ス ポ ッ ト ビ ン ゴ ボー ナ ス- 情報を 管理する

0..* - 運搬する

0..1
- 設置物と する
ブ ロ ッ ク サ ー ク ル 置き 場

- パワ ー ス ポ ッ ト か否か : boolean- 設置済みブ ロ ッ ク 数 : int- ブ ロ ッ ク サー ク ル ノ ー ド- 交点ノ ー ド

+ 走行する ( 動作 : 動作) : void

- 隣接する1..*

ノ ード

0..1 横ラ イ ン
0..1

0..1

- 上に 位置す る

端点サ ー ク ル<<rational>>
車輪の回転角だけでは距離の計算が正確でない場合がある<<deriveReqt>>

Id = REQ106
text = 走行体の座標と方向を推定する

端点ラ イ ン

0..1

横進入ラ イ ン
1

1 - 隣接す る

設計11

要求図や表などを⽤いて、達成したい⽬標をシステムへの要求・設計へと繋げます<<deriveReqt>><<satisfy>>

縦進入ラ イ ン
横進入ラ イ ン<<deriveReqt>><<requirement>>
自由走行する<<satisfy>><<deriveReqt>><<deriveReqt>>

Id = REQ215
text = 時間効率よくブロックを運搬可能な経路を計算する

Id = REQ208
text = 全てのブロックを運搬して配置する

図2.6. １つの初期位置パターン
での、経路計算の流れ

Id = REQ212
text = その場で回転する<<satisfy>>

ユースケー
スの検討

<<requirement>>
経路に沿って走行する<<deriveReqt>>

信頼性
信頼性
図2.7. 全初期位置パターンでの攻略時間分布<<satisfy>><<requirement>>
ブロックを運搬する

1- 色 : 色種別
- 有効ブ ロ ッ ク 置き場か 否か : boolean- 情報を 管理する

- 識別子 : ノ ー ド 識別子- ノ ー ド 種別 : ノ ー ド 種別
- 色 : 色種別

- 左に 位置す る<<enum>>ノ ー ド 種別1

- 現在位置 : ノ ー ド- 方向 : int- 走行さ れるビ ン ゴ 成立

- 隣接す る縦ラ イ ン- 下に 位置する

縦進入ラ イ ン

経路を 比較し 、<<deriveReqt>>
最小コ ス ト の 経路を選択す る<<deriveReqt>><<requirement>>
運搬経路を計算する

横ラ イ ン

Id = REQ204
text = 計算した経路通りにビンゴ
エリア内を走行し、全てのブロックを配置する<<deriveReqt>>

攻略可能性100%
機能適合性<<deriveReqt>>

0.10<<requirement>>
走行への影響を抑えて経路計算する

1..* - を 子と する
1- 親と する

パス

パス

ライン

<<requirement>>
経路通りに走行する

Id = REQ202
text = 全てのブロックを運搬してパーフェクトフルビンゴとなるよ
うに配置する

1 - 経路取得する

1

2..8

ブ ロ ッ ク 置き 場

- 識別子 : ミ ニ ノ ー ド 識別子- 親識別子 : ノ ー ド 識別子- 方向 : int- 色 : 色種別

- 情報を 管理する

縦ラ イ ン+ 動作順序を 登録す る ( 初期位置情報パタ ー ン 識別 : int, 動作順序 : 動作[]) : void
+ 動作順序を 取得す る ( 初期位置情報パタ ー ン 識別 : int, 動作順序 : 動作[]) : void

+ 経路を 取得する (初期位置パタ ー ン 識別子 : int) : エ ッ ジ []- 全設置先パタ ー ン を 生成する (全設置先パタ ー ン : ブ ロ ッ ク [][]) : void
- 次の 設置先パタ ー ン を 取得する () : void
- 経路を 比較し 、 最小コ ス ト の経路を 選択す る () : void

{有効ブ ロ ッ ク 置き 場が 3つ 並ぶ }ミ ニ ノ ード
エッ ジ<<deriveReqt>><<requirement>>
経路を生成する

1- 経路を 生成する

- 走行する- 情報を 管理する
1..*

- 隣接する1..*- に 保持さ れる- 動作 : 動作情報
- 始点 : ミ ニ ノ ー ド- 終点 : ミ ニ ノ ー ド<<block>>
モーターの回転角度から自己位置を計算する

Id = REQ201
text = 攻略時間を104.3秒以内としてパーフェクトフルビンゴを達成し、ボーナスタイム30点を獲得
する

1

0..1

Id = BLK104
text = モーターのPWMの値を指定し滑らかに加 する<<requirement>>
ビンゴゲームを攻略する

Id = REQ203
text = 104.3 秒以内に全てのブ
ロックをブロックサークルに配置するための経路を生成する

1
ブ ロ ッ ク ビ ン ゴ 2021エ リ ア

エッ ジ

Id = BLK102
text = モータ制御のPWMの値を形状に合わせて設定する- 動作順序リ ス ト : 動作[][]

1

経路選択

<<satisfy>><<block>>
加減 制御する

1
0..1- 動作順序を 登録する

走行体<<satisfy><<satisfy>>
最小コ ス トで 取得で き る ブ ロ ッ ク の 位置を 取得する

設計8

動作順序管理+ 経路を 生成する (初期位置パタ ー ン 識別子 : int, 設置先パタ ー ン : ブ ロ ッ ク [], エ ッ ジリ ス ト : エ ッ ジ *) : void
- グ ラ フ を 初期化する (ブ ロ ッ ク の有無 : boolean) : void
- 最小コ ス ト で 取得で き る ブ ロ ッ ク の 位置を 取得する (現在位置 : ミ ニ ノ ー ド , ブ ロ ッ ク 位置 : ノ ー ド *) : void
- 設置先を 決定す る () : ノ ー ド- 2点間経路を 取得する ( 現在位置 : ミ ニ ノ ー ド , 目標位置 : ミ ニ ノ ー ド *, 経路 : エ ッ ジ *) : void1

+ 初期化す る (動作識別子 : int) : void<<satify>>生成し た 動作順序を 登録す る
設計4
全カラーブロック設置までに通過
取得経路を 生成す る<<requirement>><<block>>
並行開発しやすくする<<satisfy>>
設計9
2点間経路
コンパイル作業をRPA化する<<satisfy>>
エッジをリストにしたもの。
Id = REQ007
タ ーン の<<satisfy>> [全初期位置パ
Id = BLK001
を取得[全初期位置パ タ ー ン
設置先を 決定す る
経路計算は 完了し て い な い ]路:現在地からブロック取得まで<<satisfy>>
で 経路計算完了し た ]設計
設計
設計
設置先パターンより(指針3)<<block>><<block>><<block>>
過するエッジをリストにしたもの。
機能ごとにテストできるようにする
モジュール化する
高凝集・疎結合な構 にする
一意に決定する。
設置経路を 生成す る
図2.5. 事前計算の処理の流れ
Id = BLK004
Id = BLK002
Id = BLK003
図1.3. 走行エリアを攻略するための要求図
路:ブロック取得後からブロック分割
設計10
図1.2. 開発の要求図[全ブ ロ ッ ク の 運搬はト
全初期位置パターンで攻略時間を計算し、競技時間は120秒である。
までに通過するエッジをリストに[全ブ ロ ッ ク の完了し て い な い ]目標の走行タイムは15.7秒であるため、運搬完了し た ]PFBを必ず達成できる事を確認した(図2.7.)。
ビンゴゲームの目標時間を104.3秒とする。
もの。
0.20[全設置先パ タ ー ン で[全設置先パ タ ー ン で の路:取得経路＋設置経路。
120s
求の分析
経路計算完了し た ]経路計算は 完了し て い な い ]<<rational>>
計算に時間がかかる
経路が決定しないと走行できない

動作順序生成+ 全初期位置パ タ ー ン の 動作順序を 生成する () : void
- 次の 初期位置パタ ー ン を生成する () : void
- 生成し た 動作順序を 登録する (初期位置パタ ー ン 識別子 : int, 経路 : エ ッ ジ []) : void
- 経路を 動作順序に 変換する ( 経路 : エ ッ ジ [], 動作順序 : 動作[]) : void
- 動作順序に 固定動作の 情報を 付加する (付加先の 動作順序 : 動作[]) : 動作[]
経路計算<<rational>>
走行体を急加 /急減+ コ ス ト を 取得する () : double
すると車輪の空転+ 動作時間を 取得する () : doubleが生じる<<block>>
PWMの値を調節する<<deriveReqt>><<enum>>ノ ー ド 識別子

- 赤色
- 青色
- 黄色
- 緑色
- 黒色

- 動作識別子 : int- 所用時間 : double- リ ス ク : double<<deriveReqt>><<requirement>>
走行距離を把握する<<enum>>
色種別
色識別子

動作情報

Id = REQ108
Id = REQ107
次の 設置先パ タ ー ン を 取得する
text = 走行体の位置を推測するた
text = 指定した 度で走行する
めに走行距離を把握する

Id = REQ006

Id = REQ005<<requirement>>
目標 度で走る<<block>>

Id = REQ105
ゲ ー ム の解法
text = 黒ラインの形状に合わせて走行する<<deriveReqt>><<deriveReqt>>

設計6

る
次の 初期位置パ タ ー ン を 取得す
設計2
カーブをショートカットして走行する<<deriveReqt>>
保守性
Id = BLK101<<deriveReqt>><<deriveReqt>><<deriveReqt>>

動作- 動作識別子 : int- 終了ノ ー ド : ノ ー ド 識別子- 色 : 色種別
- 角度 : double

課題のモデリングを通じて、対象を正しく理解しシンプルで品質の⾼いアーキテクチャ・設計に繋げます<<block>>
反射光を計測する
Id = BLK209
text = コース上の反射光を計測する

図1.4. ビンゴエリアでビンゴゲームを攻略するための要求図

ETロボコン2022 開催発表会資料／ETロボコン実行委員会

112021作成モデル例（⼯夫点）• プライマリークラスでは性能向上などの取り組みである「⼯夫点」も評価（⼯夫点はオプション項⽬となります）• 設計という観点よりも、問題に対して論理的にアプローチしているかを評価するため、説明⼒を向上させることができます
4-1課題設定

4-2対策

私たち 戦略で ライントレースとエンコーダ走行を交互に繰り返す。
エンコーダ走行における課題 、走行体が旋回や停止、走行を開始する際に発生するタイヤ スリップによる走行精度 低下であると考えた。
そこで私たち 上記 課題を解決する方法として、台形加速度制御によるタイヤ スリップ低減を考案した。
しかし、私たち 戦略においてこ 方法を実装すると、タイヤ スリップを低減させることに成功したが、2分という攻略時間を越えてしまい最後まで攻略することが出来なかった。
（表4‐1, 図4‐1参照）
そ ことから私たち 課題を解決するために 上記 方法で 不可能と判断し、別 方法を考案した。
それ 、タイヤ スリップが発生することを加味したうえでエンコーダ走行 走行距離を設定するというも である。（ここでいう「走行距離」と 左右モータ 角位置 値を基準値と比較することで判断でき、基準値を変えることで設定距離を変更できるも である）
表4‐1 台形加速度制御 実装時と未実装時 比較

私たち エンコーダ走行中 走行体 角度を正確に計測することが出来れ 、タイヤ スリップを加味したうえ
で 走行距離 設定が可能だと考え、スラローム上 ラインを利用して走行体 角度を算出する方法を考案した。
そ 方法と 、エンコーダ走行中に走行体がライン横断を開始したらカウントを開始し、走行体がライン横断を終了したらカウントを終了し、そ カウント値によって走行体 角度を算出するという方法である。（図4‐2参照）「カウント値」と 10msec 処理を何回繰り返したかによって経過秒数をカウントするも である。
【例】カウント値が100⇒10msec 処理が100回行われたため、経過秒数 1秒「走行体がライン横断を開始」 「カラーセンサーで取得した反射光 値が23以下になった」ことを開始条件とし、「走行体がライン横断を終了」 「カラーセンサーで取得した反射光 値が24以上になった」ことを終了条件とする。
こ 値 スラローム板 ライン以外 反射光 値が24であること、ライン上 反射光 値が2であることから設定した。（図4-3参照）
カウント値と角度 関係 検証 、ラインに対して30度～70度 間で10度ずつ傾け、横断した際 カウント値を5回測定し、そこから各角度 平均カウント値を算出した。また、それを活用してカウント値と角度 判断基準を設けた。（図4‐4, 表4-2,4-3参照）
測定角度を30度～70度にした理由として 、実際に走行した際 角度
らつきが、目測で あるが30度～70度以内に収まっていたためである。また、私たち 戦略においてエンコーダ走行 PWM値10で走らせるため、検証
もPWM値を10に設定して行った。
検証 際、角度を任意 も に設定する方法 、スラローム板で一度ライントレースをすることでラインに対して走行体を平行にし、そこから左モータ 角位置がα度になるまでそ 場で旋回するというも である。
α度 機能モデル1‐3 「障害物通過 流れ」にある【θ 求め方】を利用して求めており、旋回したい角度によって値が変わる。また、検証 際に 台形加速度制御を用いることで旋回 精度を向上させた。

1回目
実装

未実装

未転倒障害物数

2回目

3回目

4回目

5回目

６本

６本

６本

６本

６本

到達区間

区間３

区間３

区間４

区間４

区間３

未転倒障害物数

５本

６本

４本

５本

５本

到達区間

通過

落下

通過

通過

落下

表4-1 補足・未転倒障害物数↳リザルトタイム確定時に板 上に転倒せず残っている障害物 数
・到達区間↳リザルトタイム確定時に走行体が停止している区間(区間分け 図4-1で示す)
・通過↳スラローム通過が成立
・落下↳通過ラインを通過する前に走行体 一部がコースに触れた

色色

color
color

工夫点

区間１

反射光

値が２４

③カウント値によって走行体 角度を算出

区間３②走行体がライン横断を終了したらカウント終了

区間２

図4‐1 スラローム

区間分け

図4‐2 角度算出方法

イメージ図

30度
70度
図4‐4 カウント値と角度

関係

検証

イメージ図
平均

1回目

2回目

3回目

4回目

5回目

30度

195

195

197

196

197

196

40度

143

144

145

145

146

144.6

50度

112

112

111

113

111

111.8

60度

94

94

95

70度

87

88

86

表4‐2 カウント値と角度

93

94

87

90

87.6

関係

94

検証結果

判断角度

①走行体がライン横断を開始したらカウント開始→ ライントレース→ エンコーダ走行
区間４

黄弧上を10度ずつ傾け検証を行う

反射光

値が２

図4‐3 スラローム板で

反射光

値

超

以下

-

91

70度

91

103

60度

103

128

50度

128

170

40度

170

-

30度

表4-3 補足
最終的な判断角度を10度ごとにした理由 、台形加速度制御を用いて正確な角度でエンコーダ
走行を検証した際に、10度ごと
走行距離 設定 変更で、十分に精度 高い走行が行えることが確認できたためである。

表4‐3 カウント値による判断角度

4-3検証

10
１
２
３
４
５
６
７
８
９
私たち 上記 対策について、スラローム内 2か所に実装し、検証を行った。（図4‐5参照）
回
回
回
回
回
回
回
回
回
回
目
目
目
目
目
目
目
目
目
→ ライントレース目
また、角度とエンコーダ走行 走行距離 設定と 関係を決定した。（表4‐4参照）→ エンコーダ走行
これ 台形加速度制御を用いてエンコーダ走行 検証を行った際に妥当だと判断した走行
未転倒障害物数
4本
5本
5本
6本
4本
6本
4本
4本
5本
6本
→ 対策実装ポイント
区間４
未実装
距離である。なお、走行距離 設定について 4-1でも記述した通り、左右モータ 角位置
ボーナスタイム
8秒
10秒 10秒
0秒
8秒
13秒
8秒
8秒
0秒
13秒
ポイント1
値と比較するため 基準値を変更することで設定できるも とする。
区間１
区間３
未転倒障害物数
5本
5本
4本
6本
6本
6本
5本
4本
5本
6本
具体的な検証方法として、
ポイント2
ポイント1のみ①対策を実装しない状態で走行を10回実施する
ボーナスタイム
10秒 10秒
8秒
13秒 13秒
0秒
10秒
8秒
10秒 13秒
区間２②ポイント1 みに対策を実装して走行を10回実施する
未転倒障害物数
6本
6本
5本
6本
6本
5本
5本
6本
6本
6本
③ポイント1, 2 両方に対策を実装して走行を10回実施する
両方ボーナスタイム
13秒 13秒 10秒 13秒 13秒 10秒 10秒 13秒 13秒 13秒
図4‐5 対策実装ポイント イメージ図④それぞれ 走行で 未転倒障害物数とスラロームで ボーナスタイムを比較(「スラロームで ボーナスタイム」と 、
表4‐5実装時、未実装時における 未転倒障害物数とボーナスタイム 比較
スラローム通過又 障害物回避によって得られるボーナスタイムを指す)
両方という形をとった。
ポイント1のみ
上記 検証 結果を表と図にて示す。（表4‐5, 図4‐6参照）
ボーナスタイムが「0秒」となっているところ 、スラローム通過が成立しなかったところである。
今回 検証において、対策未実装 場合 スラローム通過未成立 2回、平均ボーナスタイム 7.8秒だった
未実装
平均4.3秒UP!
70度
60度
50度
40度
30度
に対し、対策を実装した場合 スラローム通過未成立 0回、平均ボーナスタイム 12.1秒になっており、
0
2
4
6
8
10
12
14
4.3秒 ボーナスタイムUPを達成することが出来た。
基準値
30
35
40
50
65
以上 事から、今回 対策 課題を解決するために有効な手段であったと判断できる。
図4‐6 検証結果 比較
表4-4 角度と基準値 関係

4-4結論

課題・対策とその検証結果が論理的であるか、効果の有効性などを評価
ETロボコン2022 開催発表会資料／ETロボコン実行委員会

12

技術教育

技術教育

2022年度の技術教育は全てリモートで⾏います（動画配信またはZoomを使った講義)①全国共通(動画配信)
a.⾛⾏体の基本制御とモデルによる可視化
b.モデル作成とそれをコードに変換する基礎演習
全国共通教育は動画配信で⾏います
内容は2020年作成したものがベースとなりますが、2022年も追加コンテンツを提供予定です②地区独⾃(Zoomを利⽤)地区ごとに独⾃の教育・フォロー会・モデル相談会を開催します（地区の状況によりできない場合もあります）
上記には、初学者のためのセットアップサポートや演習も含まれます。

提供資料

参加者サポート①環境構築ガイド・シミュレータ利⽤ガイド②2021年度の提出モデルおよび評価付きコメント③2021年CS⼤会ワークショップ資料④⾛⾏体制御に関する参考資料①メーリングリストによる連絡事項展開・質問応答（チームから２名まで）②Slackのワークスペースによる質問応答、情報共有（全参加者が登録可能）※登録を強く推奨

ETロボコン2022 開催発表会資料／ETロボコン実行委員会

13

モデル教育・審査・フォローの⼤まかなスケジュール
l ４⽉に段階で審査規約・技術教育動画を展開
l モデルの学習や作成には数ヶ⽉の期間が必要
効果を上げるには計画的な取り組みが必要となります
4
参加者

5

6

7

8

9

地区⼤会モデル作成（参考)1011

アドバンストのみ

CS⽤モデ
ル修正

共通技術教育動画配信(追加は随時)

技術教育

CS⼤会
審査規約正式版公開

審査・
フォロー

地区⼤会モデル
締切

地区技術教育・相談会（地区により回数・時期は変化)

地区⼤会
審査

CS⼤会モデル
締切(10/下旬)
CS⼤会
審査

地区⼤会 /
CSチーム発表

Slack/MLによるフォロー

ETロボコン2022 開催発表会資料／ETロボコン実行委員会

14

ETロボコン2022 モデル審査
ETロボコン実⾏委員会
15