# 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 $$ \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} $$ ## 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`](../entries/dynamics/motor.md) 0.2.0, rung `dynamic`