シミュレーション・制御・実機
BAMとは:小型サーボの摩擦と電圧をシミュレーションで再現する仕組み
- BAM
- ロボット
- シミュレーション
- Isaac Lab
- BamActuatorCfg
- Newton
- MuJoCo
- MJWarp
- Dynamixel
- Microduck
- CMA-ES
- サーボ
- 摩擦
- 逆起電力
- デューティ比
- 強化学習
- ドメインランダム化
- バックラッシ
- 同定
- 電源電圧
- Coulomb-Viscous
- Stribeck
- アクチュエータネット
- ANYmal
- ファームウェア
- 振り子
目次
小型のサーボを関節に並べた歩行ロボットに、強化学習で歩き方を覚えさせる技術者を考える。小型のサーボは、モータ、減速の歯車、位置を測るセンサ、目標の角度へ向けてモータを回すファームウェアを一つの箱に収めた部品である。技術者はシミュレーションの中で関節を、目標との角度の差に比例して押し戻すばねと、速さに比例して動きを抑えるダンパとして置き、ばねとダンパの強さを決めて学習を回す。
シミュレーションの中では歩けた方策が、実機では倒れることがある。実機のサーボは、重い脚を支えきれずに沈み、止まった歯車は小さな修正の指令では動き出さず、電池の電圧が下がると力が落ちる。上限を持たないばねとダンパの関節は、この三つの挙動を表せない。技術者は差の原因を特定できないまま、質量や摩擦をランダムに変える幅を広げて学習をやり直す。
BAM(Better Actuator Models)は、サーボの中の制御則・電圧・摩擦をモデルとしてシミュレーションに置き、その係数を実機の計測に合わせて決める方法である。ロボット学習の枠組み Isaac Lab が BAM を取り込んだ。本稿が BAM を取り上げるのは、作り手が設計の中身と、それを使うべき場面を公開の文書と論文で説明しているためである。サーボと実機の差を埋める方法には、ばねとダンパの強さを調整してランダム化の幅を広げる方法や、実機の記録からトルクを予測するニューラルネットを学習する方法もある。
BAM は、小型サーボを関節のばね・ダンパとはどう違う形でシミュレーションに置き、使うには何が要るのか。
BAM は、小型サーボのトルクを位置制御則・電源電圧・DC モータの式から計算し、止まった歯車の摩擦を負荷とともに増える上限として加えるモデルである。BAM のサーボは、ばね・ダンパの関節と違い、電圧が下がるとトルクが落ち、重い負荷を支えるほど小さな修正の指令では動き出さない。
BAM の係数は、振り子の試験台で記録した実機の軌道から決める。論文は4種のサーボを同定し、2関節のアームでも最良のモデルの軌道の誤差が従来の摩擦のモデルの半分未満だったと報告するが、方策を実機へ移す効果は測っていない。Isaac Lab で使うには、サーボごとの係数と、実行系 Newton とソルバ MuJoCo Warp(MJWarp)が要る。
おもりを持ち上げるサーボを、ばね・ダンパと BAM で比べる
※ この節の例は、説明のために作った架空のものです。
ばね・ダンパの関節は、目標からずれた分だけ押し戻すだけで、サーボの中の電源やモータを持たない。BAM はサーボの中で起きることを順に計算するので、電池が減ると力が落ち、重い物を支えていると歯車が動き出しにくい、という実機の癖がシミュレーションにも出る。
一つの小型サーボが、軸に付けた棒の先のおもりを持ち上げ、目標の角度に保つ場面を考える。BAM は、サーボの中を次の順に計算する。
- ファームウェア1. 目標との角度の差から、モータにかける電圧の割合を決める
- ファームウェアモータ2. 電源電圧にその割合を掛けた電圧をかける
- モータ3. 電圧に応じたトルクを出す。速く回るほど自分で発電し、トルクが減る
- モータ歯車4. トルクを伝える
- 歯車5. 止まっているときは、支えている負荷が大きいほど強く張り付く
この順に計算すると、ばね・ダンパでは起きないことが二つ起きる。
一つ目は、電池が減ったときである。電圧の割合は最大でも 100% なので、出せる力の上限は電源電圧で決まる。満充電の電池で持ち上がったおもりが、電圧が下がると持ち上がらなくなる。たとえば、上限が満充電では 0.98 N·m、電圧が下がると 0.86 N·m になるサーボでは、0.9 N·m のおもりは満充電でしか持ち上がらない。ばね・ダンパには上限が無いので、電圧によらず持ち上げ続ける。
二つ目は、重いおもりを支えているときである。止まった歯車は、負荷が大きいほど強く張り付く。目標をわずかに上げる小さな修正の指令は、軽いおもりなら歯車を動かせるが、重いおもりでは張り付きに負けて動かない。ばね・ダンパに付ける一定の摩擦は負荷で変わらないので、どちらのおもりでも同じように動く。
この例から言えること
- BAM は、サーボの中のファームウェア・電源・モータ・歯車の働きを、順に計算してトルクを決める。
- そのため、電池が減ると出せる力が落ち、重い負荷では小さな修正が効かない、という実機のサーボの癖がシミュレーションに出る。ばね・ダンパの関節では出ない。
- その代わり、モータの定数や摩擦の係数を、サーボの種類ごとに実機の計測から決める必要がある。
ばね・ダンパと一定の摩擦では、電圧で変わるトルクの上限と負荷で増える摩擦が抜ける
関節を PD(Proportional-Derivative、比例・微分)のばね・ダンパと一定の Coulomb-Viscous の摩擦で表すシミュレーションは、低いゲインで動かす小型サーボについて、電源電圧によるトルクの上限の変化と、負荷に応じた静止摩擦の増加を再現できない。ここでのゲインは、角度の差に対してサーボが押し戻す強さの係数である。
Isaac Lab は、ロボットの方策を GPU(Graphics Processing Unit)上の多数の並列シミュレーションで学習するための、NVIDIA のオープンソースの枠組みである1。GitHub のリポジトリの作成は 2022年11月で、スターは 8,520(2026年10月30日の時点)である2。Isaac Lab の既定のアクチュエータ(関節を動かす部品のモデル)は ImplicitActuator で、位置と速度のゲインを物理エンジンに渡し、物理エンジンがソルバの中でばね・ダンパの PD 制御を計算する3。PD の制御では、関節のトルクは目標との角度の差に比例する項と、目標との速度の差に比例する項の和で決まる。文書がこれを式 で書くのは、明示的な PD のモデル IdealPDActuator の行で、 はフィードフォワードのトルクである3。トルクの上限を別に設けないかぎり、この式は角度の差が大きいほど強く押し戻し、電源電圧の項を持たない。
ばね・ダンパに付ける摩擦の形を問題にしたのが、Duclusaud らの論文である4。Coulomb-Viscous のモデルは、摩擦を速さに比例する粘性の項 と、動き出すために越える一定の項 で表す。論文は2024年の時点で、MuJoCo や Isaac Gym のような広く使われる物理シミュレータがこのモデルを使い続けていると書く4。著者らは、そのためにこれらのシミュレータでは、サーボを低いゲインで制御したときに実機の挙動を再現できないおそれがあると書き、低いゲインは強化学習(RL、Reinforcement Learning)で一般的だと指摘する4。
論文は、Coulomb-Viscous の式 が、速さが 0 のときの摩擦を 0 とし、現実を反映しないと書く4。著者らは Dynamixel MX-106 と eRob80:100 を振り子の試験台に付け、止まった状態から手で振り子を動かして、静止したまま保てる範囲の端を測った。その結果は、摩擦がかかっているトルクとともに増える、つまり負荷に依存することを示した4。
Isaac Lab の文書も、BamActuatorCfg を使う場面を同じ挙動で書く。文書によれば、サーボ自身の動特性が実機への移行に影響するとき、すなわちサーボが負荷で目標を保てず、歯車が張り付き、電源電圧が下がるときに BamActuatorCfg を使う3。
BAM は、トルクを電圧とモータの式で計算し、摩擦を止めるトルクの予算として置く
BAM(Better Actuator Models)は、サーボのトルクを位置の制御則と DC(Direct Current、直流)モータの式から計算し、摩擦を動きを止めるために使えるトルクの予算として負荷に応じて置くモデルと、その係数を同定する手順である45。BAM は、ボルドー大学の Rhoban のチームが GitHub で公開し、論文は ICRA(International Conference on Robotics and Automation)2025 に載った。リポジトリは 2024年3月に作られ、2026年10月30日の時点でスターは 584、ライセンスは Apache-2.0 である5。リポジトリは、Dynamixel MX-64・MX-106・XL-320・XL330-M288-T、eRob80:50・eRob80:100、Feetech STS3215 の7種について同定済みのモデルを公開する5。BAM は、これらを MuJoCo と MuJoCo Warp で使う API(Application Programming Interface)も持つ5。
論文は、サーボを、関節の角度と速さと目標の位置を受け取ってモータのトルクを返す関数として置き、制御則とモータの式に分ける4。電圧で制御するサーボでは、PID(Proportional-Integral-Derivative、比例・積分・微分)の制御がモータにかける電圧 を決め、 を の範囲に収める。モータのトルクは で決まる4。第2項は逆起電力によるトルクで、速さに比例してトルクを減らす。論文の は、モータのトルク定数に減速比を掛けた値である4。
論文は摩擦を、動きを止めるために使えるトルクの予算 と定義する4。シミュレータが時間刻み ごとに進むとき、次の刻みで速さを 0 にするのに要るトルクを とする。働く摩擦は、 を の範囲に切り詰めた値である4。予算が の大きさ以上なら関節はその刻みで止まり、予算が足りなければ予算いっぱいの摩擦が動きに逆らう。この定義では、速さが 0 の関節にも予算の分だけ摩擦が働く。
論文は予算の形を6通り置く4。
| モデル | 予算に | 係数の |
|---|---|---|
| M1 Coulomb-Viscous | 粘性 と | 2 |
| M2 Stribeck | M1 に、 | 5 |
| M3 負荷依存 | M1 に、 | 3 |
| M4 Stribeck 負荷依存 | M3 に、 | 7 |
| M5 方 | 負荷の | 9 |
| M6 二次 | M5 に、 | 11 |
M3 の負荷の項は、歯車の歯が互いに滑るのが、かかるトルクが大きいほど難しくなることを表す4。M5 では、自分では逆回りしないウォームねじのような機構を、外の負荷側の係数を1より大きくして表せる4。M6 の2乗の項は、波動歯車(ハーモニックドライブ)で負荷に対して2乗で効く摩擦を表す4。
BAM の係数は、振り子の試験台で記録した軌道に合わせて探す
BAM は、振り子の試験台で記録した実機の軌道と、同じ台のシミュレーションの軌道との差が小さくなるように、摩擦の係数、 と 、モータの見かけの慣性を探索して決める4。試験台は、サーボの軸に剛体の腕を付け、先端に質量を載せた振り子である4。
著者らは4種類の軌道を記録した4。一つ目は振幅一定で周波数を上げていく振動、二つ目は大きく遅い振動に小さく速い振動を重ねた動き、三つ目は質量をゆっくり上げ下げし、負荷に押し戻されるまで静止が続く動きである。四つ目は質量を持ち上げてから放す動きで、電圧で制御するサーボでは、モータの電圧の向きを切り替える回路(H ブリッジ)を開放する。この操作でモータの逆起電力をなくし、逆起電力と粘性の摩擦を区別する4。回路が開いていれば電流が流れないので、逆起電力によるトルク が消え、動きを遅くするのは粘性の摩擦だけになる。
探索には CMA-ES(Covariance Matrix Adaptation Evolution Strategy、共分散行列適応進化戦略)を Python のライブラリ optuna で使い、シミュレーションと実測の軌道の MAE(Mean Absolute Error、平均絶対誤差)を下げる4。記録は1種のサーボあたり6秒のものが約100本で、75% を同定に、25% を検証に使う。Dynamixel では、質量 0.5・1・1.5 kg、腕の長さ 0.1・0.15・0.2 m、比例ゲイン 4・8・16・32 を組み合わせた4。同定は各モデルで3回繰り返し、どの回も5分未満、約4,000回の反復で同じ値に収束した4。
論文が同定したのは Dynamixel MX-64・MX-106 と eRob80:50・eRob80:100 の4種である4。検証用の記録での MAE は、各サーボの最良のモデルで、Coulomb-Viscous の M1 の (MX-64)、(MX-106)、(eRob80:100)、(eRob80:50)になった4。Dynamixel では M1 から M5 まで MAE が下がり続け、M6 では下がらなかった。eRob80:50 では M3 より先に明確な改善が無かった4。
著者らは、同定した係数を MuJoCo に入れ、2関節のアーム2台で、円・四角・矩形波・三角波の経路を高いゲインと低いゲインで動かして比べた4。Dynamixel のアームでは M4 が最も良く、すべての経路とゲインで MAE が Coulomb-Viscous の半分未満だった。M5 は同定では M4 より良かったが、アームでは結果を改善せず、著者らは過学習の可能性を挙げる4。eRob80 のアームでは M6 が最も良く、MAE はやはり Coulomb-Viscous の半分未満だった4。
論文のモデルは、サーボの温度、軸にかかる半径方向の力、歯面が止まっていた時間による摩擦の変化を含まない4。
Isaac Lab は BAM を BamActuatorCfg として取り込み、Microduck の14個のサーボに使う
Isaac Lab の BamActuatorCfg は、電圧で制御する小型のサーボを対象に BAM を移植した設定で、物理の1ステップごとに次の順で計算する3。
- 位置の指令は、ランダムに選び直す遅れの分だけ遅れて届く。
- 電源電圧は、同じ環境で同じドライブ(BAM の計算を受け持つ関節の一まとまり)に属する関節が出すトルクの和に比例して下がり、 になる。 は電圧降下の係数、 はドライブの関節 のトルク、 は電圧の下限である。
- ファームウェアの比例則 がデューティ比を決め( はファームウェアのゲイン、 は誤差に掛ける倍率)、 を電流の制限と PWM(Pulse Width Modulation、パルス幅変調)の範囲で切り詰める。
- DC モータの式 がトルクを出し、ダンピングは逆起電力から生じる。
- 歯車の摩擦の予算を、論文の M1・M2・M5・M6 に当たるモデル(設定の名前は
m1・m2・m5・m6)のどれかで計算し、MuJoCo Warp のソルバ(MJWarp)が、関節の動きを予算の範囲で止める条件(摩擦の拘束)として解く。
文書によれば、BamActuatorCfg はばねとダンパの強さを受け取らない。位置のループはサーボのファームウェアのものであり、ダンピングはモータの逆起電力だからである3。ドライブは物理の1ステップごとに摩擦の予算を MuJoCo の dof_frictionloss に書き込み、ソルバが静止摩擦をほかの拘束と同時に解く。予算の計算に使う外の負荷は、一つ前のステップで解いた力である3。BAM の論文も、外のトルクと摩擦は同時に解かれるので、一つ前の値を使う近似を書いている4。actuator_effort_limit を指定しなければ、モータのトルクは電圧の範囲の最大値での停止トルク で頭打ちになる3。
BamActuatorCfg を使えるのは、Isaac Lab の物理の実行系のうち Newton で、MJWarp のソルバを選び use_newton_actuators=True にしたときだけである。ほかの実行系とソルバでは、Isaac Lab がエラーを出す3。文書は既知の制約を二つ挙げる。一つ目に、電源の電圧降下と指令の遅れはロボット単位ではなくドライブ単位で、同じロボットでもドライブが分かれると電圧と遅れが別々に動く。二つ目に、ソルバの関節の制限がドライブの出力をさらに切り詰めても、負荷に応じた摩擦はその切り詰めを見ない3。ドメインランダム化(シミュレーションの係数を環境ごとに変えて学習する方法)のために、ドライブは電源電圧、電圧降下の係数、乾燥摩擦の予算の倍率、ファームウェアのゲインの倍率、モータの式に入る速度の倍率を書き換えられるようにしている3。
Microduck は、Pollen Robotics と Hugging Face が公開したオープンソースの二足歩行ロボットである1。Isaac Lab の Microduck の設定は、14個の Dynamixel XL330 を、BAM のリポジトリの特定の版にある XL330 の m6(M6)の係数で置く6。設定の値は、 が約 0.366 N·m/A、 が約 2.81 Ω、電流の上限が 1.75 A、ファームウェアのゲインが 200、公称電圧が 7.4 V で、電圧は環境ごとに 6.5〜8.2 V、電圧降下の係数は 0〜0.2 V/(N·m)、電圧の下限は 6.0 V、指令の遅れは 3〜6 ステップである6。バックラッシ(向きを変えたときに歯車がかみ合うまで関節が少し動く遊び)を入れた版は、各サーボに直列に ±1° の範囲で動く受動の関節を14個足す61。Hugging Face のブログで NVIDIA の著者らは、質量と重心、地面の摩擦、関節の慣性、エンコーダのずれ、電池の電圧と電圧降下、指令の遅れ、関節ごとのバックラッシをランダム化して学習し、方策を実機の Microduck に載せる手順を示す1。
ただし、Microduck が使う XL330 の m6 の係数は BAM のリポジトリが公開した同定であり、論文が検証した4種には XL330 が入っていない46。論文の Dynamixel の2種では、同定で M6 が M5 より改善せず、アームでは M4 が最も良かった4。XL330 の m6 の係数を多関節のロボットで確かめた結果は、論文には無い。論文は強化学習の方策を実機へ移す効果を測っておらず、今後の課題に挙げている4。Hugging Face のブログは、実機の Microduck が学習した方策で歩き、倒されても起き上がって歩き続ける様子を図で示すが、歩行の成功率は載せていない1。
BAM の代償はサーボの種類ごとの同定で、アクチュエータネットはトルクの計測を要する
BAM を使う側は、サーボの種類ごとに振り子の試験台で係数を同定する手間と、Isaac Lab では Newton と MJWarp に限られる制約を負う。学習型のアクチュエータネットは、トルクの計測を要する代わりに、解析的なモデルを組む手間を省く。
アクチュエータネットは、Hwangbo らがチューリッヒ工科大学の四脚ロボット ANYmal で使った方法である7。著者らは、アクチュエータの動特性、何層ものハードウェアとソフトウェアが生む指令の遅れ、低レベルの制御器の動特性、関節のコンプライアンスと減衰を正確にモデルにするのはほぼ不可能だとして、指令からトルクへの写像を深いニューラルネットで学習した7。著者らによれば、ANYmal のアクチュエータの解析的なモデルを組むには、よく似たモデルが文献にあっても3週間以上かかり、係数の多くは計測やデータシートから正確には得られない7。一方でアクチュエータネットは、記録・回帰・トルクの計測のためのソフトウェアとハードウェアが揃っていれば容易で、揃っていなければ開発の時間のかなりの部分を占める7。著者らは ANYmal で、理想的なアクチュエータのモデルと、制御器のコードと同定した係数を使い、遅れ・減衰・摩擦を手で調整した解析的なモデルの両方を試し、どちらの方策も倒れずに1歩も踏み出せなかったと報告する7。実機で方策を比べたこの結果に当たる測定は、BAM の論文には無い。この結果は ANYmal の関節で得たもので、小型サーボで同じ比較をした報告ではない。Isaac Lab も、関節の誤差と速度の履歴からトルクを予測する ActuatorNetMLP と ActuatorNetLSTM を持ち、MLP(Multi-Layer Perceptron、多層パーセプトロン)と LSTM(Long Short-Term Memory)の学習済みの重みを読み込む3。
BAM の論文の同定は、試験台の軌道の誤差を下げる手順で、関節のトルクの計測を手順に含まない4。同定した係数は ・・摩擦の係数のように物理の意味を持つ。論文は学習型のモデルについて、関節の履歴からトルクを予測するネットワークは理想的なサーボのモデルを上回ったが、同定したモデルと比べていないので性能を評価しにくいと書き、シミュレーションの位置を補正するトランスフォーマーは補正に物理の解釈を与えないと書く4。論文が挙げるこのネットワークは、上の Hwangbo らのアクチュエータネットである4。Hwangbo らはトルクの予測を理想的なモデルとだけ比べたが、方策の水準では、同定した係数に加えて遅れ・減衰・摩擦を手で調整した解析的なモデルとも比べている7。
学習型の側にも、トルクの計測を要らなくする研究がある。Dou らの NeuralActuator は、安価なサーボで線形の の近似が摩擦・ヒステリシス・バックラッシ・熱で崩れることを問題にし、トルクの代わりの量を、関節のトルクの実測なしに姿勢の軌道だけから微分可能なシミュレーションで学習する8。著者らは、この方法を OpenManipulator-X と LeRobot の SO-101 を含む3種のアームで検証した8。この方向が進めば、トルクの計測を要しないという BAM の利点は、物理の意味を持つ係数という点に絞られる。
サーボの種類ごとの同定は、新しい種類のサーボを使うたびに試験台での記録と探索が要る代償である。BAM のリポジトリが7種の係数を公開しているので、その7種を使う側は同定の手順を自分で回さずに始められる5。公開された係数が自分の個体と負荷で通用するかは、論文が検証した4種についても、著者らの個体と試験台の範囲の外では確かめられていない。Newton と MJWarp への限定は、ほかの実行系とソルバでエラーを出すという現在の実装の制約である3。文書は、ほかの実行系に広げる予定を書いていない。
出典8件
-
Doherty ほか「Train in Simulation, Deploy on a Real Robot: Microduck with Isaac Lab 3.0」Hugging Face Blog, 2026. https://huggingface.co/blog/nvidia/microduck-isaac-lab-sim-to-real — BAM とバックラッシでサーボを置き電圧や遅れをランダム化する手順。実機で歩く図があるが、成功率は無い。 ↩ ↩2 ↩3 ↩4 ↩5
-
isaac-sim/IsaacLab, GitHub(2026-10-30 取得). https://github.com/isaac-sim/IsaacLab — GPU で加速するオープンソースの枠組み。スター 8,520、リポジトリ作成は 2022年11月。 ↩
-
Isaac Lab「Actuators」develop ブランチ(2026-10-30 取得). https://github.com/isaac-sim/IsaacLab/blob/develop/docs/source/concepts/actuators.rst — BamActuatorCfg の計算の順序、ばねとダンパを受け取らない理由、Newton と MJWarp への限定、ドライブ単位の電源と遅延の制約。 ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11 ↩12
-
Duclusaud ほか「Extended Friction Models for the Physics Simulation of Servo Actuators」ICRA, 2025. https://arxiv.org/abs/2410.08650 — 摩擦を止めるトルクの予算とする M1〜M6、振り子の試験台での同定、4種のサーボと2関節のアームでの検証。 ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11 ↩12 ↩13 ↩14 ↩15 ↩16 ↩17 ↩18 ↩19 ↩20 ↩21 ↩22 ↩23 ↩24 ↩25 ↩26 ↩27 ↩28 ↩29 ↩30 ↩31 ↩32 ↩33 ↩34 ↩35 ↩36
-
Rhoban「BAM: Better Actuator Models」GitHub(2026-10-30 取得). https://github.com/Rhoban/bam — Apache-2.0、7種のサーボの同定済みモデル、MuJoCo と MuJoCo Warp の API。スター 584、作成は 2024年3月。 ↩ ↩2 ↩3 ↩4 ↩5
-
Isaac Lab「microduck.py」develop ブランチ(2026-10-30 取得). https://github.com/isaac-sim/IsaacLab/blob/develop/source/isaaclab_assets/isaaclab_assets/robots/microduck.py — 14個の XL330 を BAM の m6 の係数で置く設定、電圧の範囲、3〜6ステップの指令の遅れ、±1° のバックラッシ。 ↩ ↩2 ↩3 ↩4
-
Hwangbo ほか「Learning agile and dynamic motor skills for legged robots」Science Robotics, 2019. https://arxiv.org/abs/1901.08652 — 指令からトルクへの写像を学ぶアクチュエータネット。ANYmal の解析的なモデルは3週間以上かかり、学習にはトルク計測の設備が要ると書く。 ↩ ↩2 ↩3 ↩4 ↩5 ↩6
-
Dou ほか「NeuralActuator: Neural Actuation Modeling for Robot Dynamics and External Force Perception」RSS, 2026. https://arxiv.org/abs/2607.11734 — 安価なサーボのトルクを、トルクの実測なしに姿勢の軌道から学習する Transformer。 ↩ ↩2
この記事はAIを使用して執筆されました。内容には誤りが含まれる可能性があります。事実や数字の出典は脚注から確かめられます。