コンテンツにスキップ

トルクベクタリング(TV)

【未検証】

対象: torque_vectoring.c / .h、drive.c の AllocateTorque。確認した版: ファーム 2a2e9a8。 荷重比例の配分は実機未検証(ファーム CLAUDE.md)。旧方式の作り直しの経緯が、このページの主な読みどころです。

何をするか

旋回中は横加速度で荷重が外輪へ移ります。左右へ等トルクを配ると、荷重の抜けた内輪が先に空転して TC に絞られ、 荷重の乗った外輪のグリップは余ります。 そこで総駆動トルクを、左右の荷重の比で配ります。

\[ a_y = v \cdot \omega_z \quad(\text{左旋回が正}),\qquad r = \mathrm{clamp}\bigl(k_{tv}\,a_y,\; \pm r_{\max}\bigr),\qquad \Delta T = T_R - T_L = T_{\mathrm{total}}\cdot r \]

各輪のトルクは

\[ T_L = \frac{T_{\mathrm{total}} - \Delta T}{2},\qquad T_R = \frac{T_{\mathrm{total}} + \Delta T}{2} \]
記号 意味 パラメータ 現在値
\(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 の理論値は

\[ k_{tv} \approx \frac{2\,h_{cg}\,\rho_{\mathrm{roll}}}{t\,g} \]

(\(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 つ残っています。

  1. 偏差が最初からほぼ 0 だった。 規範に実機の同定結果(舵の効き)を入れていたので、偏差が不感帯の中にいた。
  2. ヨーモーメント→ヨーレートの効きが小さい。 0.1 N·m で 0.056 rad/s。ループゲインが 0.05 しかなく、 ゲインを 1 にすると偏差のノイズだけで上限に張り付く。
  3. 定常のヨーレートは舵の方が 30 倍動かせる。 舵は上位が直接指令する。TV が稼げるのは 「旋回しながらの加速で内輪を空転させない」ことで、それには偏差の制御は要らない。
  4. 回り過ぎの修正は、内輪へトルクを足す向きになる。 空転している内輪を TC が絞って打ち消した。

ここから学べること

アクチュエータの効きが小さい系に高ゲインの閉ループを掛けると、ノイズで飽和します。 「本当に欲しい効果は何か」(ここでは内輪の空転抑制)から逆算すると、閉ループではなくフィードフォワードで足りることがあります。

同定用のモード

tv_test_moment_nm が 0 以外の間は、配分を止めて指定のヨーモーメントだけを出します(ヨーモーメント→ヨーレートの応答を測るため)。 通常運転では 0 です。

TC との関係

TV が左右差を付けたあと、TC が各輪を絞ります。TV の左右差を載せた後のトルクが「絞る前に掛けたかったトルク」として torque_req(TELEMETRY のフィールド)に記録されるので、上位で TC の介入量を torque_req − torque_cmd として見られます。