スラローム自動生成で楽をしたかった話
この記事はMicroMouse Advent Calendar2020の14日目の記事です。
前回はぱわぷろさんの「ジャイロセンサ「ICM20948」で苦しんだ話」でした。
新しい素子を使うのは大変ですよね。自分はソフトが苦手でついつい新機体を
設計しがちですが、毎回悩まされるのはIMUと通信できないことです。
いつかは人ともICとも会話できないコミュ障から脱却したいものです……
◆はじめに
マウサーの皆さんは各種調整作業は好きですか?私は大嫌いです。
タイヤ径、トレッド幅、壁センサの閾値、ジャイロの感度係数などなど、
マウスを完走させる上で調整すべきパラメータは無数にあるでしょう。
私はこれらのパラメータが重要なことは重々承知していますが、
それでも目的の動作になるまで何度も何度も繰り返し同じ作業をすることが
飽き性の私には苦痛でならないのです。
これが嫌いでソフトを嫌厭してしまっていると言っても過言ではありません。
その中でもスラロームの調整作業は苦行以外の何物でもありません。
スラロームは角度や速度によって軌道が異なるため、ターン前後の直線距離を
角度と速度毎に調整パラメータとしている人が多いのではないでしょうか。
そもそもターンの軌道を計算するだけでも色んなパラメータがあり、
それらも加えると数えたくもない程のパラメータが存在していると思います。
私はこの調整作業をサボるためにスラロームの自動生成機能を実装しました。
この記事はそんなものぐさが書いたものなので期待しないで読んで下さい。
◆スラロームのパラメータ
- 角度
- 速度
- 最小旋回半径
- 前距離
- 後距離

◆自動生成のパラメータ
まず自動生成に必要なパラメータを紹介します。
- 角度θ
- 目標位置[X,Y]
- 限界横重力加速度G
- コーナリングパワーC
またパラメータが増えるのかと思った方はもう少し読んで下さい。
角度は前述した通りです。作りたい角度毎に設定して下さい。
目標位置はスラローム開始時を原点としたスラローム終了後の位置です。
限界横重力加速度は最大遠心力と同義です。スラロームの速度と最小旋回半径を
求めるのに必要なパラメータです。マウサーが「何Gでターンしている」などと
会話しているのを聞いたことがあるかもしれません。
これらはスラロームを作る上で設定するだけで調整項目ではありません。
唯一調整が必要なのはコーナリングパワーです。
大抵の人には聞き覚えのない言葉だと思うので簡単に説明します。
タイヤに発生する力 ※理系的な戯れより転載
クルマが曲がるときにタイヤから発生する力のことをコーナリングフォース
と言います。遠心力と釣り合っている力とも言いますね。
この力は横滑り角βと比例関係にあるというのが最も単純なタイヤモデルで、
その比例定数をコーナリングパワーと呼んでいます。
図を見るとタイヤの方向とタイヤが進んでいる方向には角度がついていますが、
この角度を横滑り角と言い、タイヤが変形することで車両角度と車両進行方向が
ズレることを表しています。このズレがスラローム速度によって軌道が変わる
原因だと仮定して今回の自動生成アルゴリズムを構築しています。
コーナリングパワーはタイヤ固有のパラメータなので、スラローム毎に調整する
必要はありません。なので、このパラメータを1つ調整するだけですべての
スラロームを生成することができます。
少しだけ考え方が違いますが、こじまうす方式でも比例定数kを調整するだけで
同じことができます。
◆自動生成アルゴリズム
■初期角度の設定
最初の速度は自分のマウスが出せないと思う限界の速度を設定して下さい。
この速度以上のスラロームは生成できません。また速すぎても計算時間が
かかるだけなので、自分のハーフマウスでは2m/sを設定しています。
■最小旋回半径の算出
最小旋回半径Rは、最大遠心力時の旋回半径と同義なので、上で設定した
速度Vと限界横重力加速度Gから算出します。(M:質量、g:重力加速度)
■ターン軌道の算出
次は最小旋回半径Rから前後距離を除くターンの軌道を算出します。
まず、私はターンの軌道を計算する上で下図のような形状となる角速度と
時間の関係式を使ってます。一般的な台形関数でも考え方は同じです。
最小旋回半径Rと速度Vから最大角速度ωmaxを算出します。
この値が角速度関数の最大値となり、角速度関数の面積(角速度の積分)が
ターン角度θとなるので、ターン時間Tが算出できます。(A:上図の関数の面積)
これで角速度の関数が求まりました。
速度V一定で角速度ωの分布があれば滑りのないターンの軌道が算出できます。
続いてコーナリングパワーを用いて横滑りを考慮したターンの軌道を求めます。
まず横滑り角は上図タイヤに発生する力より下記のように表せます。
今回の計算では、単純化するために横滑り角が十分に小さいと仮定とすると、
左右輪の横滑り角は下記になります。(W:車両中間からタイヤ力点までの距離)

横滑りが発生しているため、少しだけ大回りすることがわかります。
この位置と角度のズレがスラロームの調整を面倒にしていると考えています。
■前後距離の算出
最後は前後距離の算出です。
ターン終了後の位置と角度がわかっているので、設定した目標位置との差分を
幾何計算するだけで求まります。
ターン終了位置を(XEnd, YEnd)、ターン終了角度をθEnd、
目標位置を(XGoal, YGoal)とすれば、前後距離は以下のようになる。
初期位置や角度が違う場合にはそれぞれの値を移動、回転して使って下さい。
■算出した軌道の確認
これでスラロームの軌道を求めることができました。
あとはフローチャートに従って前後距離が負の値になっていないかや、
柱と干渉していないかなどを確認して下さい。
もしいずれかの条件に満たなければ速度を落として計算し直します。
私の場合は計算速度も考慮して10mm/s刻みで繰り返し計算しています。
※180度ターンだけは刻みを細かくしないとうまくできません。
◆計算結果
これで単一パラメータの調整のみで任意のターンが自動生成できるようになりました。
◆おわりに
ここまで読んで頂きありがとうございます。
スラロームの自動生成は、地獄のような調整から開放されるだけでなく、
リアルタイムに計算できれば位置や角度の補正に使えたり、
こじまターンなどのアウトインアウトで曲がるターンを生成できたりと、
安定化や高速化にも役立つはずだと妄想しています。
まだまだ検証が足りていないですが誰かの調整作業を楽にできれば幸いです。