はじめに
自動運転AIチャレンジ2025に参加している中で、どうすれば上位にいけるかを検討する場面がありました。
chatgptに相談したところMPCを使うと早くなるかもよ、とアドバイスをもらいました。
pythonのOSSはあったもののC++のOSSを見つけられなかったので自分でchatgptを使って作ってうごかすことにしました。
(本記事は人力かつやっつけで書いているのでかなり読みづらいです、ご勘弁を)
筆者スペック
・40前半
・車載開発経験はあるものの制御は素人
です。
MPCとは
経路追従(trajectory tracking)で使うアルゴリズムです。
- Q(状態コスト行列)
予測ホライズン中での 状態誤差(目標値との差)をどれだけ重要視するかを表す重み。
例:位置のズレ、速度誤差、ヨーレート誤差など。
値を大きくすると「目標にぴったり合わせたい」という制御になる。
逆に小さくすると「誤差に少し寛容で、入力の滑らかさを優先」するようになる。
👉 直感的にいうと、Qは「どれだけ目標軌跡を大事にするか」のパラメータ。 - R(入力コスト行列)
制御入力(アクセル・ブレーキ・舵角など)の大きさを抑えるための重み。
値を大きくすると「激しい操作を嫌う」=スムーズな運転を優先する。
値を小さくすると「多少荒っぽくても目標を追従」しやすい。
👉 Rは「運転の滑らかさ・エネルギー効率をどれだけ重視するか」のパラメータ。 - N(予測ホライズン)
将来をどこまで見据えて最適化するかを表す 時間の長さ(ステップ数)。
大きいと → 先を見据えた計画的な制御(計算コストは増える)。
小さいと → 応答は速いが、先を見越した制御はできない。
👉 Nは「どれくらい未来を考慮するか」のパラメータ。
らしいです、chatgptの説明そのまま書きました
僕は制御屋じゃないので説明できないです、ごめんなさい。
やったこと
pythonのOSSであるMulti-Purpose-MPCを参考にchatgptに作ってもらいました。
C++になぜしたのかというとAutowareの処理周期が10msなのでpythonだと処理が破綻するかなと思ったからです。
移植するにあたり以下をやってもらいました。
1.Multi-Purpose-MPCの描画処理(凝ったアニメーションなど)を簡潔にする
2.1.で作ったpythonでもMPCがちゃんと動いていること
3.2.から描画処理を削除する
4.3.で作ったものを基にC++のMPCファイルを
5.C++で実装したファイルでもMPCが動いていること確認する。
6.Autowareで動作するように処理を変更する
7.実際に動かして走行することを確認する。
です
Autowareで動かすまでに苦労したこと
chatgptが動くプログラムを作らない
まず何もベースなしでchatgptがC++のプログラムをMPCを上手いこと作りますよーとは言ってきましたが、まず出してきたプログラムがビルドが通りません。
やっとビルドが通ったのでAutowareに乗っける前にシミュレーションしました。
Trajectoryを渡してそのとおりに走るか試験したもののカーブを検出しません。
chatgptが修正案を出してきても改善せず。
でどうしたの?
chatgptに対する指示方法を変えました。
Multi-Purpose-MPCをベースにC++のプログラムを作ってもらうことにしました。
構成は一切変えるな、chatgptの色も極力出すなと指示を出しました。
それで上記の移植方針で1〜7までやり、なんとかAutowareで動く形まで持っていけました。
Autowareに乗っけてみて初試走させてみて
はい、まっすぐ走りません。蛇行します。もうぐにゃぐにゃ。
chagptにQ,R,Nの値を直すと動くよと言われてそのとおりにしたものの全く改善せず。
嫁にはヘボ車とは言われました。
でどうしたの?
基本直線、急カーブ検出したときだけ曲がるようなパラメータに上記のQ,R,Nのパラメータを変更しました。
Trajectoryもついでにchatgptに作ってもらうことにしました。
経路追従もへったくれもない状態だったのですが、とりあえず1周回してくれました。
実際にAutowareで動かせるようにしたファイル
物量が多すぎるのでここでの掲載は割愛します。
私のブランチにのっけておきます。
興味のある方は見てみてください。
提出結果
ローカルで実行して動いてたので、提出してみました。6周回してくれました。1周40秒くらい。
こちらが結果となります。
youtubeはこちら
https://youtu.be/ihuQ6XO70B4
提出後
結局思うように動かなかったので諦めてpure pursuitの改造に路線を変更しました。
MPCの適用また来年以降機会があったら使ってみようと思います。
終わりに
最初からpure pursuit使っときゃよかった。。。