|
OpenSim Moco
0.4.0
|
Minimize the sum of the absolute value of the controls raised to a given exponent, integrated over the phase.
The default weight for each control is 1.0; this can be changed by calling setWeight() or editing the control_weights property in XML. The exponent must be an integer greater than or equal to 2, and is 2 by default. If conducting a predictive simulation, you likely want to set divide_by_displacement to true; otherwise, this cost is minimized by not moving. Dividing by displacement leads to a quantity similar to cost of transport.
This goal is computed as follows:
\[ \frac{1}{d} \int_{t_i}^{t_f} \sum_{c \in C} w_c |x_c(t)|^p ~dt \]
We use the following notation:
divide_by_displacement is true; 1 otherwise.exponent.If p > 2, we first the absolute value of the control; this is to properly handle odd exponents.
#include <Moco/Moco/MocoGoal/MocoControlGoal.h>
Public Member Functions | |
| MocoControlGoal (std::string name) | |
| MocoControlGoal (std::string name, double weight) | |
| void | setWeightForControl (const std::string &controlName, const double &weight) |
Set the weight to use for the term in the cost associated with controlName (the name or path of the corresponding actuator). More... | |
| void | setWeightForControlPattern (const std::string &pattern, const double &weight) |
| Set weights for all controls whose entire path matches the provided regular expression pattern. More... | |
| void | setExponent (int exponent) |
| Set the exponent on the control signals. | |
| double | getExponent () const |
| void | setDivideByDisplacement (bool tf) |
| Set if the goal should be divided by the displacement of the system's center of mass over the phase. More... | |
| bool | getDivideByDisplacement () const |
Public Member Functions inherited from OpenSim::MocoGoal | |
| MocoGoal (std::string name) | |
| MocoGoal (std::string name, double weight) | |
| void | setEnabled (bool enabled) |
| Set whether this goal is used in the problem. | |
| bool | getEnabled () const |
| void | setWeight (double weight) |
| In cost mode, the goal is multiplied by this weight. More... | |
| double | getWeight () const |
| void | setMode (std::string mode) |
| Set the mode property to either 'cost' or 'endpoint_constraint'. More... | |
| std::string | getModeAsString () const |
| This returns the default mode of the goal, unless the user overrode the default using setMode(). More... | |
| Mode | getMode () const |
| bool | getModeIsCost () const |
| bool | getModeIsEndpointConstraint () const |
| Mode | getDefaultMode () const |
| Types of goals have a class-level default for whether they are enforced as a cost or endpoint constraint. More... | |
| bool | getSupportsEndpointConstraint () const |
| Can this constraint be used in endpoint constraint mode? | |
| const MocoConstraintInfo & | getConstraintInfo () const |
| Get bounds for the constraints when using this goal in endpoint constraint mode. More... | |
| MocoConstraintInfo & | updConstraintInfo () |
| int | getNumOutputs () const |
| Get the length of the return value of calcGoal(). | |
| int | getNumIntegrals () const |
| Get the number of integrals required by this cost. More... | |
| SimTK::Real | calcIntegrand (const SimTK::State &state) const |
| Calculate the integrand that should be integrated and passed to calcCost(). More... | |
| void | calcGoal (const GoalInput &input, SimTK::Vector &goal) const |
| In cost mode, the returned cost includes the weight, and the elements of the returned vector should be summed by the caller to obtain the total cost. More... | |
| void | initializeOnModel (const Model &model) const |
| For use by solvers. This also performs error checks on the Problem. | |
| void | printDescription (std::ostream &stream=std::cout) const |
| Print the name type and mode of this goal. More... | |
Protected Member Functions | |
| void | initializeOnModelImpl (const Model &) const override |
| Perform any caching before the problem is solved. More... | |
| void | calcIntegrandImpl (const SimTK::State &state, double &integrand) const override |
| void | calcGoalImpl (const GoalInput &input, SimTK::Vector &cost) const override |
| The Lagrange multipliers for kinematic constraints are not available. | |
| void | printDescriptionImpl (std::ostream &stream=std::cout) const override |
| Print a more detailed description unique to each goal. | |
Protected Member Functions inherited from OpenSim::MocoGoal | |
| void | setNumIntegralsAndOutputs (int numIntegrals, int numOutputs) const |
| Set the number of integral terms required by this goal and the length of the vector passed into calcGoalImpl(). More... | |
| virtual Mode | getDefaultModeImpl () const |
| virtual bool | getSupportsEndpointConstraintImpl () const |
| const Model & | getModel () const |
| For use within virtual function implementations. | |
| double | calcSystemDisplacement (const SimTK::State &initial, const SimTK::State &final) const |
Additional Inherited Members | |
Public Types inherited from OpenSim::MocoGoal | |
| enum | Mode { Cost, EndpointConstraint } |
|
overrideprotectedvirtual |
Reimplemented from OpenSim::MocoGoal.
|
overrideprotectedvirtual |
Perform any caching before the problem is solved.
You must override this function and invoke setNumIntegralsAndOutputs().
Implements OpenSim::MocoGoal.
|
inline |
Set if the goal should be divided by the displacement of the system's center of mass over the phase.
| void OpenSim::MocoControlGoal::setWeightForControl | ( | const std::string & | controlName, |
| const double & | weight | ||
| ) |
Set the weight to use for the term in the cost associated with controlName (the name or path of the corresponding actuator).
To remove a control from the cost function, set its weight to 0. If a weight is already set for the requested state, then the provided weight replaces the previous weight. Only controls with non-zero weights that are associated with actuators for which appliesForce is True are included in the cost function. Weights set here take precedence over weights specified with a regular expression.
| void OpenSim::MocoControlGoal::setWeightForControlPattern | ( | const std::string & | pattern, |
| const double & | weight | ||
| ) |
Set weights for all controls whose entire path matches the provided regular expression pattern.
Multiple pairs of patterns and weights can be provided by calling this function multiple times. If a control matches multiple patterns, the weight associated with the last pattern is used.