RoboMaster 電流指令の正規化 (CanMotorMbed 実装)
FW は duty ∈ [-1, 1] を ±10000 に線形変換して ESC へ送る。C610 では ±10A で spec 一致、C620/GM6020 では range を使い切れない
要点: CanMotorMbed は duty ∈ [-1, +1] を int16_t ∈ [±10000] にスケーリングして RoboMaster ESC に送る (RoboMaster.hpp:174)。C610 では ±10A で spec 完全一致だが、C620 は 61%、GM6020 は 33% しか使えない。物理的には電流制御 (ESC 内部で current loop) が回るが、呼称の「duty」は誤解を招く (PWM ではない)。
数字とコマンド
送信 (RoboMaster.hpp:174):
auto data = static_cast<int16_t>(at(group * 4 + motor).duty * 10000);受信 (RoboMaster.hpp:269-271):
float read() override { return _manager.at(_port).torque / 10000.0f; }
float read_current() override { return _manager.at(_port).torque / 1000.f; }motor 別 range 比較
| Motor (ESC) | native ±max | 電流/torque 最大 | duty=1.0 で使える割合 |
|---|---|---|---|
| C610 (M2006) | ±10000 | ±10 A | 100% |
| C620 (M3508) | ±16384 | ±20 A | 61% (10000/16384) |
| GM6020 | ±30000 | ±3 A (定格 torque) | 33% (10000/30000) |
電流制御として正しいか
物理層: YES
- 送信値は ESC で電流指令として解釈される
- ESC 内蔵 FOC + current PID + current sensor が指令を追従
- 実巻線電流が指令に近づく → current control
用語: NO (誤解を招く)
- 「duty」は PWM デューティ比を意味する言葉
- 実際は正規化された電流指令
- 正確には
current_command_normalized/current_setpoint_normalizedと呼ぶべき
範囲活用: 不完全
- C610 だけ完全、他は headroom を捨ててる
実運用の影響
使える最大電流
- C610: 10 A (motor spec 一致)
- C620: 10 A (実は motor は 20 A まで許容、5.5 kW 出せる spec の半分)
- GM6020: 1 A (定格 3 A の 1/3)
分解能
duty の float 分解能 (概ね 1e-6 級) は int16 ±10000 の 5 倍以上 → 実質 int16 分解能 (0.6mA @ C610)。float→int16 の quantize がボトルネック。
FF スタックとの相互作用
- friction.coulomb [duty] = A/10 単位相当 (C610 で 0.001 = 10mA)
- friction.viscous [duty·s/rad] = A·s/(rad·10)
- accel_ff_gain [duty·s²/rad] =
J / (Kt · 10 A)相当
FF スタック内部は一貫した「duty」単位で閉じてるので実害なし。物理量 (J·a/Kt) と比較する時は ×10 の scale factor 忘れずに。
改善案
A) motor 型別 scale factor param
motor0:
current_full_scale_a: 10.0 # C610: 10, C620: 20, GM6020: 3FW で native = duty * scale_a * (max_native/max_a) に変換。全機種で duty=1.0 = 100% 使える。
B) 単位を A に統一
host は current_command_a で指令、FW が motor 型を知って native 単位に変換。機種依存を FW に閉じ込める。
C) 現状維持 + doc
motor 別実効上限を doc 化。C620 の 20A を使いたいコードは書けない (要改修)。
推奨: A (breaking change だが host コードは既存 duty のまま scale_a param を追加すれば済む)。
参考
- RoboMaster C610 マニュアル: -10000 to +10000 = -10A to +10A
- RoboMaster C620 マニュアル: -16384 to +16384 = -20A to +20A
- GM6020 マニュアル: -30000 to +30000 = 電圧指令 (定格 3A)
関連
- FF スタック — friction/accel_ff の単位系
- MIT mode — 比較 (MIT は τ_ff を N·m で直接指定)
- BLDC motor specs