コード例 #1
0
/**
 * Compute all constraints given x.
 */
void ActuatorForceTargetFast::
computeConstraintVector(SimTK::State& s, const Vector &x,Vector &c) const
{
	CMC_TaskSet&  taskSet = _controller->updTaskSet();
	const Set<Actuator>& fSet = _controller->getActuatorSet();

	int nf = fSet.getSize();

	// Now override the actuator forces with computed active force
	// (from static optimization) but also include the passive force
	// contribution of muscles when applying forces to the model
	for(int i=0;i<nf;i++) {
		ScalarActuator* act = dynamic_cast<ScalarActuator*>(&fSet[i]);
		act->overrideForce(s,true);
        act->setOverrideForce(s, x[i]);        
	}
	_controller->getModel().getMultibodySystem().realize(s, SimTK::Stage::Acceleration );

	taskSet.computeAccelerations(s);
	Array<double> &w = taskSet.getWeights();
	Array<double> &aDes = taskSet.getDesiredAccelerations();
	Array<double> &a = taskSet.getAccelerations();

	// CONSTRAINTS
	for(int i=0; i<getNumConstraints(); i++)
		c[i]=w[i]*(aDes[i]-a[i]);

	// reset the actuator control 
	for(int i=0;i<fSet.getSize();i++) {
		ScalarActuator* act = dynamic_cast<ScalarActuator*>(&fSet[i]);
        act->overrideForce(s,false);
	}

    _controller->getModel().getMultibodySystem().realizeModel(s);
}