私は aira(Autonomous Intelligence Racing Arena) という、仮想ロボットで自律走行アルゴリズムを競うレース競技を運営しています。今回は自分のシミュレータで、いちばん単純な制御方式である**テーブルモード(指令列をCSVに書いて再生するだけのオープンループ制御)**が、どこまで速く走れるのかを検証しました。
「理想のラインに沿うようにCSVを最適化すれば、そこそこ速いタイムが出るだろう」——そう思って始めたのですが、これが劇的に難しかった。そして、その難しさ自体が答えでした。本記事は、オープンループ制御を限界まで攻めて、「なぜフィードバック制御(クローズドループ)が必要なのか」をデータと体感で理解するに至った開発ログです。
本記事は運営者(開発者)としての検証です。掲載しているタイムは挙動を調べるための参考値で、競技リーダーボードへの参加記録ではありません。
1. 前提:aira とテーブルモード
aira の車は、224×224 のカメラ画像と**バッテリ残量(SOC)**だけを入力に、**スロットル(drive_torque)と操舵(steer_angle)**を出力して、50ms 周期で 2 周の最短タイムを競います。速度計も GPS も他車レーダーもありません。「視界」と「残量」だけで走る、という意図的な制約です。
まずは、テーブルモードで2周を走り切ったときの映像を見てください。ロボットが自分で走っているのが分かると思います——これが自動走行です。
今回の主役 テーブルモードは、指令列を書いたCSVを 20fps で上から送るだけ。ここに、後の議論を全部支配する制約が 3 つあります。
- 純粋なオープンループ:CSVの行を順に送るだけで、センサを一切読まない。
-
走行中は自車位置が取れない:リアルタイムで得られるのは SOC とステップ数のみ。
pos_x, pos_z, yawは走行終了後にログへ書き出されるだけ。 - 非決定的:localhost のジッタ(1〜5ms)と機械的遅延により、同じCSVでも毎回少しずつズレる。
2. 仮説:CSVを「理想ライン」へ最適化できるはず
最初のアイデアはこうでした。数周マニュアルで走ってデータを取り、それを基に理想ラインへCSVを書き換え、走らせ、結果を見てまた直す——強化学習に近い反復改善です。aira には繰り返し実行の足場(headless ループと最適化スクリプト)が既にあるので、機械的には回せます。
発想は正しい。では、攻めた最速ラインをそのまま再生したらどうなるか。やってみた結果が、これです。
図A:黒が攻めた最速お手本(101659, 21.6s)。青・橙がその再生だが、理想ラインに乗れず壁や落下で失敗している(102330→Fallen@326、102400→Wall@303→Fallen@397)。「理想ラインをなぞればいい」は、こんなに甘くありませんでした。
3. 端的に言うと、あらゆる手が失敗した(限界と課題)
先に「モデルが下手なせい」を否定しておくと、システム同定では操舵モデルがよく当たりました(yaw_rate=(v/L)·tan(δ)、R²=0.81、軸距 L=0.274m)。つまり、この後の失敗はモデル誤差ではなく構造的なものです。なのに——
- 記録の単純再生:1周目は参照ラインから平均 8.7cm のズレで忠実に再現できる。しかし1周を過ぎるとドリフトが蓄積してコースアウト=落下。完走は確率的で、7本中 完走1・落下6。
-
モデルベースFF(flatsteer):理想ラインを平滑化し
δ=arctan(L·κ)で操舵を生成。0/3 完走。しかも毎回同じコーナーで決定論的に脱輪する。モデル操舵には、記録走行が持っていたフィードバック補正分が欠けているため。 - ILC(反復学習制御):試行間の誤差を操舵に焼き戻す。さらに悪化。失敗が壁衝突を含むと、衝突は試行ごとに非再現なので、ILCの「挙動が再現する」前提が崩れる。
- 攻めたラインの継ぎ足し修復:コーナーはすでに最大舵角(±0.524 rad ≒ 30°)で飽和していた。舵を足す=飽和で不可能、減らす=過敏、減速する=操舵タイミング総崩れ。全方向にマージンが無い。
正直に言うと、思いつくレバーは全部悪化しました。これは調整不足ではなく、オープンループの構造的な限界です。
4. 転換:限界を"実感"して、作戦を変える
ここまで何十本も走らせて、テーブルモードの限界を頭ではなく体で実感しました。オープンループはシンプルで魅力的ですが、現実には——壁に当たる。スタートの角度がほんの少しズレただけでコースアウトする。そして後半になるほど誤差が蓄積していく。走行中に自分を直す手段が無い以上、これは避けられません。
決定的だったのはこの数字です。操舵が飽和したコーナーでは、旋回量はスロットルのタップで決まります。タップ量を足せば平均の旋回角は狙える(目標178°に対し、+0.12でほぼ届く)。ところが、同じ +0.12 のCSV × 3走行で旋回角を測ると——
150° / 174° / 179°(±15°)
同じ指令なのに、これだけばらつく。平均は合わせられても、分散は消せない。 この分散を打ち消すには、走行中に測って即補正する=フィードバックしかない、と走らせながら腹落ちしました。
…正直、早くルールベース制御に時間を割きたい。でも、その前にテーブルモードで一度はちゃんと完走しておきたい(笑)。というわけで作戦変更。速さを諦め、マージンを取って、まず「完走」だけを狙います。
5. 結果:本物の2周完走(ただし約25%)
2つの工夫を合わせました。
- マージンのある保守的なお手本(低速・中央寄り、27.6s)を起点にする。攻めたライン(21.6s)ではなく。
-
CSV末尾に前進スロットルを継ぎ足す:再生はゴールわずか0.12m手前で指令切れ→停止していた。末尾に
(torque=1.0, steer=0)を25行足して、最後の数cmを走り切らせる。
結果、延長CSV計8本中 2本が本物の2周完走(28.1s / 28.3s、落下なし)。完走率およそ 25%。冒頭の映像が、この完走の1本です。
図B:黒が保守的なお手本(115116, 27.6s)。青・橙が本物の完走(123933, 124126)。図Aより明らかにラインへ乗って2周を走り切っている。6秒遅い「安心ライン」にして、ようやくオープンループでも完走が出た。ただし安定はしない。
図Aと図Bを並べると、この記事の主張が2枚で言い切れます。A=速いが完走ゼロ、B=遅いが完走できる。 走行中に補正できないオープンループでは、速さと確実性は同時に買えない。フィードバックが無い代償を、どちらかで必ず払うことになります。
6. 結論:フィードバックは「あれば良い」ではなく「必須」
完走率をまとめると、オープンループの限界は明確です。
| 手法 | 完走率 |
|---|---|
| 手動お手本の再生 | 0/3 |
| ルールベース記録の再生 | 1/10 |
| flatsteer(モデルFF) | 0/3 |
| ILC | 0/3 |
| 保守お手本+末尾継ぎ足し | 2/8 |
オープンループは「条件を整えればたまに完走できる」が、安定して速く走ることはできない。安定化=分散の吸収には、走行中に観測して補正するクローズドループ(フィードバック)が必須です。
そして、攻めた理想ラインのデータは無駄になりません。それは次フェーズのクローズドループ制御(ルールベースの前方注視 pure-pursuit や AI)の目標ライン・教師データとして活きる。当初の「理想ライン × 報酬はクローズドループに置くべき」という仮説が、実験的に裏づけられました。
——失敗も、数式も、すべて理由を説明できる形で残す。これが aira が掲げる 「説明できる知性(Explainable Intelligence)」 が指すものです。次回はいよいよ、ルールベース制御で 46 秒の壁に挑みます。
おまけ:aira について
aira は、仮想ロボットで自律走行アルゴリズムを競う、誰でも参加できる物理AIレース競技です(Race Your Algorithm)。PC1台・参加無料。現在 Race_260601(タイムアタック) と Race_260615 を開催中です。

