notes
Robotics

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 A100%
C620 (M3508)±16384±20 A61% (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: 3

FW で 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)

関連#

最終更新:

On this page