Node DynamicMotorNode#

Defined in mime.nodes.actuation._dynamic.DynamicMotorNode.

Algorithm MIME-NODE-110.

A dynamic motor: a rotor carried by its absolute spin about its axis, driven by a torque against its inertia, viscous bearing damping on its speed relative to its stator and the loads on it about its axis, and the wrench its stator passes to the frame it is mounted on, its gyroscopic torque among it.

Governing equations#

\[\begin{split} \mathbf{e} = R(\mathbf{P}_{s}) \mathbf{a}, \quad \tau_{l} = \mathbf{e} \cdot \mathbf{T}_{r}, \quad \mathbf{Q}_{n} = R_{n} \mathbf{Q} R_{n}^{\top}, \ R_{n} = R(\mathbf{P}_{s}) \, \mathrm{Rot}(\mathbf{a}, \phi_{n}), \quad \tau_{q} = (\boldsymbol{\omega} \times \mathbf{e}) \cdot \mathbf{Q}_{n} \boldsymbol{\omega}, \quad \Omega_{n+1} = \frac{J \Omega_{n} + \mathrm{d}t \, (\tau + \tau_{l} + \tau_{q} + b \, \mathbf{e} \cdot \boldsymbol{\omega})}{J + \mathrm{d}t \, b}, \quad \phi_{n+1} = \phi_{n} + \mathrm{d}t \, (\Omega_{n+1} - \mathbf{e} \cdot \boldsymbol{\omega}); \quad \mathbf{R} = \begin{bmatrix} \mathbf{F}_{s} + \mathbf{F}_{r} \\ \mathbf{T}_{s} + \mathbf{T}_{r} - (\mathbf{e} \cdot \mathbf{T}_{r}) \mathbf{e} - (\tau - b \, (\Omega_{n+1} - \mathbf{e} \cdot \boldsymbol{\omega}) + \tau_{q}) \mathbf{e} + (\mathbf{x}_{s} - \mathbf{x}_{m}) \times (\mathbf{F}_{s} + \mathbf{F}_{r}) \end{bmatrix}, \quad \mathbf{H} = J \Omega_{n+1} \mathbf{e}, \quad \mathbf{C} = (\mathbf{Q}_{n+1}, \mathbf{Q}_{n+1}^{+}), \ \mathbf{Q}_{n+1}^{+} \text{ at } \phi_{n+1} + \mathrm{d}t \, (\Omega_{n+1} - \mathbf{e} \cdot \boldsymbol{\omega}); \quad \mathbf{P}_{s} = \mathbf{M}_{j} \circ \mathbf{O}, \quad \mathbf{P}_{r} = \mathbf{P}_{s} \circ \mathrm{Rot}(\mathbf{a}, \phi_{n+1}); \quad \boldsymbol{\Omega}_{s} = \boldsymbol{\omega}, \quad \boldsymbol{\Omega}_{r} = \boldsymbol{\omega} + (\Omega_{n+1} - \mathbf{e} \cdot \boldsymbol{\omega}) \mathbf{e} \end{split}\]

Discretisation#

Semi-implicit Euler, first order in time: the rotor’s spin with its damping taken at the end of the step, then its angle from the new spin; the mount’s pose and angular velocity are this step’s, read after the segment it is mounted on has stepped. What it passes that segment (its reaction, momentum and inertia) that segment reads on its next step.

Assumptions#

  • An ideal torque source: no cogging, imbalance, armature or thermal terms (MIME-ANO-102)

  • Rigid bearings, and a rotor with its centre of mass on its axis and its inertia not turned off it: its mass and mean inertia across the axis ride on the link it is mounted on, grafted there at build, its inertia about the axis is carried by its absolute spin, and its inequality across the axis turns with it (MIME-ANO-122)

  • What crosses between the rotor and the frame it is mounted on: the mount’s pose and angular velocity in, this step’s; the reaction, the rotor’s spin momentum and its inequality across the axis out, which that frame’s segment reads on its next step

Limitations#

none declared

Declared regimes (not evidenced here)#

none declared

References#

[@Sola2017], [@Featherstone2008]

Symbols#

Symbol

Kind

Name

Units

Implemented by

\(\phi\)

state

angle

1 (units declared, not checked)

mime.nodes.actuation._dynamic.DynamicMotorNode.advance

\(\Omega\)

state

spin

rad/s (units declared, not checked)

mime.nodes.actuation._dynamic.DynamicMotorNode.advance

\(\tau\)

input

torque

N m

mime.nodes.actuation._dynamic.DynamicMotorNode.advance

\(J\)

parameter

inertia

kg m^2

mime.nodes.actuation._dynamic.DynamicMotorNode.advance

\(b\)

parameter

damping

N m s

mime.nodes.actuation._dynamic.DynamicMotorNode.advance

\(\mathbf{T}_{r}\)

input

link_wrench

N; N m

mime.nodes.actuation._dynamic.DynamicMotorNode.advance

\(\mathbf{F}_{s}\)

input

link_wrench

N; N m

mime.nodes.actuation._dynamic.DynamicMotorNode.passed

\(\mathbf{R}\)

state

reaction

N; N m (units declared, not checked)

mime.nodes.actuation._dynamic.DynamicMotorNode.passed

\(\mathbf{H}\)

state

momentum

N m s (units declared, not checked)

mime.nodes.actuation._dynamic.DynamicMotorNode.handed

\(\mathbf{C}\)

state

inertia

kg m^2 (units declared, not checked)

mime.nodes.actuation._dynamic.DynamicMotorNode.handed

\(\mathbf{Q}\)

parameter

asymmetry

kg m^2

mime.nodes.actuation._dynamic.DynamicMotorNode.unequal

\(\mathbf{P}\)

state

frame_poses

m; 1

mime.nodes.actuation._dynamic.DynamicMotorNode.advance

\(\boldsymbol{\Omega}\)

state

frame_angular_velocities

rad/s

mime.nodes.actuation._dynamic.DynamicMotorNode.advance

\(\boldsymbol{\omega}\)

input

mount_rates

rad/s

mime.nodes.actuation._chain.MountedNode.base_rate

\(\mathbf{M}\)

input

mount_poses

m; 1

mime.nodes.actuation._chain.MountedNode.base

\(\mathbf{O}\)

parameter

placement

m; 1

mime.nodes.actuation._chain.MountedNode.base

\(\mathbf{a}\)

parameter

axis

1

mime.nodes.actuation._dynamic.DynamicMotorNode.poses

A row marked units declared, not checked has the units its author wrote: the code declares none there, so the node walk cannot compare them with anything.

Built by#

  • motor 0.2.0, rung dynamic