Runtime disabling of actuators according to group.
Added `option-actuatorgroupdisable` attribute and associated `mjOption.disableactuator` integer bitfield, used to disable sets of actuators at runtime according to their group. - The first 6 actuator groups are toggleable in the `simulate` viewer. - Minor refactor and cleanup of actuator documentation. https://youtu.be/H9qG9Zf2W44 Fixes #1092. PiperOrigin-RevId: 578335600 Change-Id: I4cf663b90ea768e4380acfa2fe3b8c15c7cbb568
This commit is contained in:
committed by
Copybara-Service
parent
45878b7eef
commit
893c404230
+19
-17
@@ -271,7 +271,7 @@ the force outputs are stored in ``mjData.actuator_force``, and the activation st
|
||||
|
||||
These three components of an actuator - transmission, activation dynamics, and force generation - determine how the
|
||||
actuator works. The user can set them independently for maximum flexibility, or use :ref:`Actuator shortcuts
|
||||
<CActuator>` which instantiate common actuator types.
|
||||
<CActShortcuts>` which instantiate common actuator types.
|
||||
|
||||
.. _geTransmission:
|
||||
|
||||
@@ -316,8 +316,8 @@ is attached; the possible attachment object types are :at:`joint`, :at:`tendon`,
|
||||
|
||||
.. _geActivation:
|
||||
|
||||
Activation dynamics
|
||||
^^^^^^^^^^^^^^^^^^^
|
||||
Stateful actuators
|
||||
^^^^^^^^^^^^^^^^^^
|
||||
|
||||
Some actuators such as pneumatic and hydraulic cylinders as well as biological muscles have an internal state called
|
||||
"activation". This is a true dynamic state, beyond the joint positions :math:`q` and velocities :math:`v`. Including
|
||||
@@ -333,27 +333,33 @@ independent of the other actuators. The activation types currently implemented a
|
||||
.. math::
|
||||
\begin{aligned}
|
||||
\text{integrator}: & & \dot{w}_i &= u_i \\
|
||||
\text{filter}: & & \dot{w}_i &= (u_i - w_i) / t \\
|
||||
\text{filterexact}: & & \dot{w}_i &= (u_i - w_i) / t \\
|
||||
\text{filter}: & & \dot{w}_i &= (u_i - w_i) / \texttt{t} \\
|
||||
\text{filterexact}: & & \dot{w}_i &= (u_i - w_i) / \texttt{t} \\
|
||||
\text{muscle}: & & \dot{w}_i &= \textrm{muscle}(u_i, w_i, l_i, \dot{l}_i)
|
||||
\end{aligned}
|
||||
|
||||
where :math:`t` is an actuator-specific time constant stored in ``mjModel.actuator_dynprm``. In addition the type can
|
||||
be "user", in which case :math:`w_i` is computed by the user-defined callback :ref:`mjcb_act_dyn`. The type can also
|
||||
be "none" which corresponds to a regular actuator with no activation state. The dimensionality of :math:`w` equals
|
||||
where :math:`\texttt{t}` is an actuator-specific time-constant stored in ``mjModel.actuator_dynprm``. In addition, the
|
||||
type can be "user", in which case :math:`w_i` is computed by the user-defined callback :ref:`mjcb_act_dyn`. The type can
|
||||
also be "none" which corresponds to a regular actuator with no activation state. The dimensionality of :math:`w` equals
|
||||
the number of actuators whose activation type is different from "none".
|
||||
|
||||
For more information regarding muscle activation dynamics, see :ref:`CMuscle`.
|
||||
|
||||
For ``filterexact`` activation dynamics, Euler integration of :math:`\dot{w}` is replaced with the analytic integral:
|
||||
|
||||
.. math::
|
||||
\begin{aligned}
|
||||
\text{filter}: & & w_{i+1} &= w_i + h (u_i - w_i) / t \\
|
||||
\text{filterexact}: & & w_{i+1} &= w_i + (u_i - w_i) (1 - e^{-h / t}) \\
|
||||
\text{filter}: & & w_{i+1} &= w_i + h (u_i - w_i) / \texttt{t} \\
|
||||
\text{filterexact}: & & w_{i+1} &= w_i + (u_i - w_i) (1 - e^{-h / \texttt{t}}) \\
|
||||
\end{aligned}
|
||||
|
||||
The two expressions converge to the same value in the :math:`h \rightarrow 0` limit.
|
||||
The two expressions converge to the same value in the :math:`h \rightarrow 0` limit. Note that Euler-integrated filters
|
||||
diverge for :math:`\texttt{t} < h`, while exactly-integrated filters are stable for any positive :math:`\texttt{t}`.
|
||||
|
||||
Note that Euler-integrated filters diverge for :math:`t < h`, while exactly-integrated filters are stable for any
|
||||
:math:`t > 0`.
|
||||
:ref:`actearly<actuator-general-actearly>`:
|
||||
If the :ref:`actearly<actuator-general-actearly>` attribute is set to "true", ``mjData.actuator_force`` is computed
|
||||
based on :math:`w_{i+1}` (the next activation), reducing the delay between changes to :math:`u` and their effects on
|
||||
the acceleration by one time step (so the total dynamics are second-order rather than third order).
|
||||
|
||||
.. _geActuatorForce:
|
||||
|
||||
@@ -391,10 +397,6 @@ This quantity is stored in ``mjData.qfrc_actuator``. It is added to the applied
|
||||
with any user-defined forces in joint or Cartesian coordinates (which are stored in ``mjData.qfrc_applied`` and
|
||||
``mjData.xfrc_applied`` respectively).
|
||||
|
||||
Optionally, the :ref:`actearly<actuator-general-actearly>` attribute on an actuator computes ``mjData.qfrc_actuator``
|
||||
based on the value of :math:`w_{i+1}` after integration, reducing the delay between changes to :math:`u` and
|
||||
:math:`t`.
|
||||
|
||||
.. _gePassive:
|
||||
|
||||
Passive forces
|
||||
|
||||
Reference in New Issue
Block a user