-
Notifications
You must be signed in to change notification settings - Fork 2
Example Model Motor
A "gold standard" for motor documentation is provided by manufacturers like Maxon (e.g., EC-i 40, 100W, Part No. 488607) or Faulhaber (e.g., 2264 BP4). These vendors are favorites in high-end robotics because they provide the "Simulation Essentials" without the need for additional measurement or hunting.
Below is an example of what a high-quality datasheet looks like, using the Maxon EC-i 40 (48V version) as our specimen.
This motor provides every variable needed for a high-fidelity power consumption and physics simulation.
| Specification | Value | Simulation Purpose |
|---|---|---|
| Nominal Voltage | The baseline supply voltage. | |
| Terminal Resistance ( |
Calculates |
|
| Terminal Inductance ( |
Used for PWM ripple and current lag at high speeds. | |
| Torque Constant ( |
Maps required torque to current draw ( |
|
| Speed Constant ( |
Inverse of Back-EMF ( |
|
| No-load Current ( |
Accounts for friction and internal iron losses. | |
| Rotor Inertia ( |
Needed for the MuJoCo armature calculation. |
|
| Number of Pole Pairs ( |
Sets the electrical frequency in the ESC/Inverter. |
-
Phase-to-Phase values: Maxon explicitly states that
$R$ and$L$ are "phase-to-phase." In a simulation (like a MuJoCo actuator or a Simscape model), the measurement basis (per-phase vs. terminal-to-terminal) must be known. -
No-Load Current at Voltage: Manufacturers provide this measured at the nominal voltage. This allows for estimation of the "tare" power consumption (
$P = V \times I_{nl}$ ) of the motor during operation. - Pole Pairs: Essential for BLDC simulations. Without this, the commutation frequency cannot be calculated, which is vital if the simulation includes motor controller (ESC) efficiency.
Important
Note on Unit Conversion:
Maxon and other manufacturers typically provide rotor inertia in armature attribute in standard SI units:
The conversion factor is
Example:
When placing this exact motor into MuJoCo with a 10:1 gearbox, the joint/actuator tags are configured as follows:
-
armature:$J_m \times Gear^2 \rightarrow 44\text{ g}\cdot\text{cm}^2 \times 10^2 = 4400\text{ g}\cdot\text{cm}^2$ .- (Conversion to MKS: $0.00044\text{ kg}\cdot\text{m}^2$).
-
kv(if using a velocity actuator): Derived from the Speed Constant ($105\text{ RPM/V}$ ). -
gear:$10$ (for the torque multiplication).
<mujoco model="maxon_ec_i_40_demo">
<actuator>
<motor joint="motor_joint" gear="10" name="maxon_ec40_drive"/>
</actuator>
<custom>
<!-- Use motor_ prefix + actuator name to link database spec -->
<text name="motor_maxon_ec40_drive" data="motor_spec:maxon_ec_i_40_488607"/>
</custom>
</mujoco>If Maxon is the "gold standard," Faulhaber is the "precision master." Their datasheets are arguably even more detailed, often including specific friction coefficients that allow you to move beyond simple estimates and into high-fidelity physics.
This motor uses "4-Pole Technology," which is a critical detail for the electrical frequency in a simulation.
| Specification | Value | Mapping to Model Dynamics |
|---|---|---|
| Nominal Voltage ( |
The reference supply voltage. | |
| Terminal Resistance ( |
Used for |
|
| Terminal Inductance ( |
Vital for PWM current ripple & high-speed lag. | |
| Torque Constant ( |
Converts current ( |
|
| Speed Constant ( |
Determines the voltage "limit" at high speeds. | |
| No-load Current ( |
"Tare" power; covers internal drag. | |
| Rotor Inertia ( |
The armature base value for MuJoCo. |
|
| Number of Pole Pairs ( |
Derived from "4-Pole" designation. |
Unlike many vendors, Faulhaber provides two extra values that are a "cheat code" for MuJoCo's damping and friction parameters:
-
Static Friction Torque (
$C_0$ ):$0.41\text{ mNm}$ .- In MuJoCo, you can plug this into the
frictionlossattribute of your joint. This is the "stiction" the motor must overcome just to start moving.
- In MuJoCo, you can plug this into the
-
Dynamic Friction Torque (
$C_v$ ):$1.15 \times 10^{-4}\text{ mNm/RPM}$ .- This maps directly to the
dampingattribute in MuJoCo. It simulates how drag increases as the motor spins faster.
- This maps directly to the
When a datasheet says "4-Pole Technology," it means the rotor has 4 magnetic poles (2 North and 2 South).
-
For the simulation: The number of pole pairs is
$2$ . - Significance: For every 1 mechanical revolution, the electrical controller (ESC) must complete 2 full electrical cycles. Incorrect values lead to erroneous switching loss calculations.
When modeling this motor with a 50:1 gear ratio:
-
armature:$J \cdot G^2 = 9.2\text{ g}\cdot\text{cm}^2 \cdot 50^2 = 23,000\text{ g}\cdot\text{cm}^2$ (convert to$0.0023\text{ kg}\cdot\text{m}^2$ ). -
frictionloss:$0.41\text{ mNm} \cdot 50 = 0.0205\text{ Nm}$ . -
damping: Derived from$C_v$ and the gear ratio.
Example XML snippet:
<mujoco model="faulhaber_2264_demo">
<actuator>
<motor joint="faulhaber_joint" gear="50" name="faulhaber_p4_drive"/>
</actuator>
<custom>
<text name="motor_faulhaber_p4_drive" data="motor_spec:faulhaber_2264w024bp4"/>
</custom>
</mujoco>Modeling the Dynamixel XL330-M288-T is unique because it is a "smart actuator." Unlike a raw motor, it includes a built-in controller, a multi-stage gear train, and a cored DC motor.
Based on the official Robotis e-Manual, here are the required specifications for a high-fidelity power simulation.
| Item | Value | Why it matters |
|---|---|---|
| Stall Torque | The absolute output limit ( |
|
| Stall Current | Max current draw at zero speed. | |
| No-load Speed |
|
Maximum output velocity. |
| No-load Current | Friction and "tare" electronics draw. | |
| Gear Ratio | Critical for inertia and torque mapping. | |
| Weight | Used for link mass distribution. |
To simulate power consumption, we derive the electrical constants (
-
Terminal Resistance (
$R$ ):$R = \frac{V_{nom}}{I_{stall}} = \frac{5.0\text{V}}{1.47\text{A}} \approx \mathbf{3.40\ \Omega}$ -
Torque Constant (
$K_t$ ): Maps current to torque at the output shaft (after gears).$$K_{t_output} = \frac{\tau_{stall}}{I_{stall}} = \frac{0.52\text{Nm}}{1.47\text{A}} \approx \mathbf{0.354\text{ Nm/A}}$$ -
Back-EMF Constant (
$K_e$ ): Determined by the voltage drop relative to no-load speed.$$K_{e_output} = \frac{V_{nom} - (I_{nl} \cdot R)}{\omega_{no-load}} \approx \mathbf{0.416\text{ V/(rad/s)}}$$
<mujoco model="xl330_demo">
<actuator>
<motor joint="xl330_joint" gear="1" name="xl330_actuator"/>
</actuator>
<custom>
<!-- Links to the Dynamixel JSON spec in the database -->
<text name="motor_xl330_actuator" data="motor_spec:dynamixel_xl330_m288_t"/>
</custom>
</mujoco>{
"motor_id": "maxon_ec_i_40_488607",
"manufacturer": "Maxon",
"model": "EC-i 40 (488607)",
"step_file": "https://github.com/robomotic/mujoco-motors/blob/main/motor_assets/maxon/488607.step",
"stl_file": "https://github.com/robomotic/mujoco-motors/blob/main/motor_assets/maxon/488607.stl",
"gear_ratio": 1.0,
"reflected_inertia": 4.4e-06,
"voltage_range": [0.0, 48.0],
"resistance": 0.994,
"inductance": 0.000995,
"motor_constant_kt": 0.091,
"motor_constant_ke": 0.091,
"stall_torque": 2.08,
"continuous_torque": 0.224,
"peak_torque": 2.08,
"no_load_speed": 523.6,
"no_load_current": 0.150,
"number_of_pole_pairs": 7,
"max_speed": 837.7,
"weight": 0.390,
"commutation": "Hall",
"thermal_resistance": 8.52,
"thermal_time_constant": 1400.0,
"max_winding_temperature": 155.0
}{
"motor_id": "faulhaber_2264w024bp4",
"manufacturer": "Faulhaber",
"model": "2264W024BP4",
"step_file": "https://github.com/robomotic/mujoco-motors/blob/main/motor_assets/faulhaber/2264W024BP4.step",
"stl_file": "https://github.com/robomotic/mujoco-motors/blob/main/motor_assets/faulhaber/2264W024BP4.stl",
"gear_ratio": 1.0,
"reflected_inertia": 9.2e-07,
"voltage_range": [0.0, 24.0],
"resistance": 0.22,
"inductance": 0.000024,
"motor_constant_kt": 0.0118,
"motor_constant_ke": 0.0118,
"stall_torque": 1.311,
"continuous_torque": 0.059,
"peak_torque": 1.311,
"no_load_speed": 2209.6,
"no_load_current": 0.261,
"number_of_pole_pairs": 2,
"max_speed": 1256.6,
"weight": 0.140,
"commutation": "Hall",
"friction_static": 0.00041,
"friction_dynamic": 1.09e-06,
"thermal_resistance": 5.0,
"thermal_time_constant": 950.0,
"max_winding_temperature": 125.0
}{
"motor_id": "dynamixel_xl330_m288_t",
"manufacturer": "Robotis",
"model": "XL330-M288-T",
"step_file": "https://github.com/robomotic/mujoco-motors/blob/main/motor_assets/robotis/xl330_m288.step",
"stl_file": "https://github.com/robomotic/mujoco-motors/blob/main/motor_assets/robotis/xl330_m288.stl",
"gear_ratio": 288.4,
"reflected_inertia": 0.00066,
"voltage_range": [0.0, 5.0],
"resistance": 3.40,
"inductance": 0.0002,
"motor_constant_kt": 0.354,
"motor_constant_ke": 0.416,
"stall_torque": 0.52,
"continuous_torque": 0.52,
"peak_torque": 0.52,
"no_load_speed": 10.78,
"no_load_current": 0.150,
"stall_current": 1.47,
"operating_current": 1.47,
"weight": 0.018,
"commutation": "Encoder",
"friction_static": 0.02,
"protocol": "UART",
"protocol_params": {
"baudrate": 1000000,
"version": 2.0
}
}If a vendor only provides a partial datasheet, mjlab parameters can be accurately estimated using these conversions:
| Goal Parameter | Formula / Method | Explanation |
|---|---|---|
| Back-EMF ( |
Converts |
|
| Stall Current ( |
The theoretical max current at zero speed. | |
| Stall Torque ( |
Max torque the motor can briefly generate. | |
| No-load Speed ( |
The theoretical max speed with no resistive load. | |
| Thermal Resistance | Sum of winding-to-housing and housing-to-ambient. |
Note
When
When
Cheaper "Hobby" motors (like those for drones) often only list KV and Max Current. They frequently leave out Inductance and Rotor Inertia. If a motor is missing these, estimations can often be made if a similar motor's datasheet is available, though the power simulation will have a higher margin of error.