トルクベクタリング(TV)¶
【未検証】
対象: torque_vectoring.c / .h、drive.c の AllocateTorque。確認した版: ファーム 2a2e9a8。
荷重比例の配分は実機未検証(ファーム CLAUDE.md)。旧方式の作り直しの経緯が、このページの主な読みどころです。
何をするか¶
旋回中は横加速度で荷重が外輪へ移ります。左右へ等トルクを配ると、荷重の抜けた内輪が先に空転して TC に絞られ、 荷重の乗った外輪のグリップは余ります。 そこで総駆動トルクを、左右の荷重の比で配ります。
各輪のトルクは
| 記号 | 意味 | パラメータ | 現在値 |
|---|---|---|---|
| \(k_{tv}\) | 横加速度→配分比 | tv_load_gain_s2_per_m |
0.045 s²/m |
| \(r_{\max}\) | 比率の上限(1 で内輪のトルクが 0) | tv_max_ratio |
0.5 |
たとえば横加速度 5 m/s² なら \(r = 0.045 \times 5 = 0.225\)、総トルクの 22.5 % が左右差になります。
- 駆動(総トルク > 0): 外輪が多くなり、旋回方向のヨーモーメントも付く。
- 車速 PI の減速(総トルク < 0): 外輪が多く制動し、旋回を戻す向き(安定側)になる。
- 総トルクが 0(定速の惰行に近い旋回): 何もしない。
- 後退: 車速・ヨーレート・総トルクの符号が揃って反転するので、同じ式で外輪が多くなる。
左右差 \(\Delta T\) をヨーモーメントに換算するときは \(M_z = \Delta T \cdot \dfrac{t}{2 r_w}\)(\(t\): トレッド、\(r_w\): 車輪半径)です。
ゲインの理論値¶
tv_load_gain の理論値は
(\(h_{cg}\): 重心高、\(\rho_{\mathrm{roll}}\): 後軸のロール分担、\(t\): トレッド)で、後輪 1 つの静止荷重 \(F_z\) と
「横加速度あたりに外輪へ移る荷重」\(k\) [N/(m/s²)] からは \(k / F_z\) です(ヘッダのコメント)。
現在の 0.045 は机上の見積もりです。[control.plant] の lateral_transfer(机上 0.13)× 質量 2.0 kg ÷ 後輪 1 つの静止荷重
fz_static_n(机上 5.75 N)≒ 0.045。実機では未調整で、vehicle.toml のコメントは「旋回しながらの加速で、内輪と外輪の滑り率がそろう値を探す」としています。
実装の性質¶
- フィードフォワードのみ。状態(積分)を持たない。 TC が後段で片輪を絞っても、巻き戻すものがありません。
- 横加速度を、舵角ではなく実測ヨーレートから作る。 車体が滑り出したら自然に頭打ちになるため。 舵角から作ると、曲がれていないのに外輪を押し続けてしまいます。
- IMU の実測ヨーレートが得られない間は介入しない。 舵角から幾何計算で出した代用値は、車体が滑って曲がれていなくても
横加速度が出ていることにしてしまうためです(
drive.c:yaw_rate_measured)。 - 「ヨーが増える → 外輪が増える → ヨーモーメントが増える」の正帰還になりますが、全開でもループゲインは 0.05 未満で発散しません。
- 制動モードでは効きません。 MD の制動モードは左右に同じトルクしか出せません。
- 各輪は ±0.15 N·m(
DRIVE_MAX_TORQUE_NM)に収めます。全開で外輪が上限に当たっても、内輪は荷重の比どおりのままにします (外輪が出せない分を内輪に載せない。内輪は荷重が抜けているので、載せれば空転する)。そのぶん総駆動トルクは減ります。
ヨーレート PI をやめた理由¶
最初は「規範モデルとのヨーレート偏差を、左右トルク差で埋める PI」にしていました。作り直した理由が、ヘッダのコメントに 4 つ残っています。
- 偏差が最初からほぼ 0 だった。 規範に実機の同定結果(舵の効き)を入れていたので、偏差が不感帯の中にいた。
- ヨーモーメント→ヨーレートの効きが小さい。 0.1 N·m で 0.056 rad/s。ループゲインが 0.05 しかなく、 ゲインを 1 にすると偏差のノイズだけで上限に張り付く。
- 定常のヨーレートは舵の方が 30 倍動かせる。 舵は上位が直接指令する。TV が稼げるのは 「旋回しながらの加速で内輪を空転させない」ことで、それには偏差の制御は要らない。
- 回り過ぎの修正は、内輪へトルクを足す向きになる。 空転している内輪を TC が絞って打ち消した。
ここから学べること
アクチュエータの効きが小さい系に高ゲインの閉ループを掛けると、ノイズで飽和します。 「本当に欲しい効果は何か」(ここでは内輪の空転抑制)から逆算すると、閉ループではなくフィードフォワードで足りることがあります。
同定用のモード¶
tv_test_moment_nm が 0 以外の間は、配分を止めて指定のヨーモーメントだけを出します(ヨーモーメント→ヨーレートの応答を測るため)。
通常運転では 0 です。
TC との関係¶
TV が左右差を付けたあと、TC が各輪を絞ります。TV の左右差を載せた後のトルクが「絞る前に掛けたかったトルク」として
torque_req(TELEMETRY のフィールド)に記録されるので、上位で TC の介入量を torque_req − torque_cmd として見られます。