当前位置: 首页>>代码示例>>C++>>正文


C++ Actuator::setForce方法代码示例

本文整理汇总了C++中Actuator::setForce方法的典型用法代码示例。如果您正苦于以下问题:C++ Actuator::setForce方法的具体用法?C++ Actuator::setForce怎么用?C++ Actuator::setForce使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在Actuator的用法示例。


在下文中一共展示了Actuator::setForce方法的1个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。

示例1: lu

/**
 * This method is called at the beginning of an analysis so that any
 * necessary initializations may be performed.
 *
 * This method should be overriden in the child class.  It is
 * included here so that the child class will not have to implement it if it
 * is not necessary.
 *
 * @param s state of system
 *
 * @return -1 on error, 0 otherwise.
 */
int InverseDynamics::
begin(SimTK::State& s )
{
	if(!proceed()) return(0);

	SimTK::Matrix massMatrix;
    _model->getMatterSubsystem().calcM(s, massMatrix);

	//massMatrix.dump("mass matrix is:");
	// Check that m is full rank
	try {
 	    SimTK::FactorLU lu(massMatrix);
    } catch (const SimTK::Exception::Base&) {
        throw Exception("InverseDynamics: ERROR- mass matrix is singular  ",__FILE__,__LINE__);
    }
    // enable the line below when simmath is fixed
	//bool singularMassMatrix = lu.isSingular();

	//cout << "Mass matrix is " << (singularMassMatrix?"singular":"Non-singular");

	// Make a working copy of the model
	delete _modelWorkingCopy;
	_modelWorkingCopy = _model->clone();
	_modelWorkingCopy->updAnalysisSet().setSize(0);
	//_modelWorkingCopy = _model->clone();
	//_modelWorkingCopy = new Model(*_model);

	// Replace model force set with only generalized forces
	if(_model) {
		SimTK::State& sWorkingCopyTemp = _modelWorkingCopy->initSystem();
		// Update the _forceSet we'll be computing inverse dynamics for
		if(_ownsForceSet) delete _forceSet;
		if(_useModelForceSet) {
			// Set pointer to model's internal force set
			_forceSet = &_modelWorkingCopy->updForceSet();
		    _numCoordinateActuators = _modelWorkingCopy->getActuators().getSize();
		} else {
			ForceSet& as = _modelWorkingCopy->updForceSet();
			// Keep a copy of forces that are not muscles to restore them back.
			ForceSet* saveForces = as.clone();
			// Generate an force set consisting of a coordinate actuator for every unconstrained degree of freedom
			_forceSet = CoordinateActuator::CreateForceSetOfCoordinateActuatorsForModel(sWorkingCopyTemp,*_modelWorkingCopy,1,false);
		    _numCoordinateActuators = _forceSet->getSize();
			// Copy whatever forces that are not muscles back into the model
			
			for(int i=0; i<saveForces->getSize(); i++){
				const Force& f=saveForces->get(i);
				if ((dynamic_cast<const Muscle*>(&saveForces->get(i)))==NULL)
					as.append(saveForces->get(i).clone());
			}
		}
	    _modelWorkingCopy->setAllControllersEnabled(false);
		_ownsForceSet = false;

		SimTK::State& sWorkingCopy = _modelWorkingCopy->initSystem();

		// Gather indices into speed set corresponding to the unconstrained degrees of freedom (for which we will set acceleration constraints)
		_accelerationIndices.setSize(0);
		const CoordinateSet& coordSet = _model->getCoordinateSet();
		for(int i=0; i<coordSet.getSize(); i++) {
			const Coordinate& coord = coordSet.get(i);
			if(!coord.isConstrained(sWorkingCopy)) {
				_accelerationIndices.append(i);
			}
		}

		_dydt.setSize(_modelWorkingCopy->getNumCoordinates() + _modelWorkingCopy->getNumSpeeds());

		int nf = _numCoordinateActuators;
		int nacc = _accelerationIndices.getSize();

		if(nf < nacc) 
			throw(Exception("InverseDynamics: ERROR- overconstrained system -- need at least as many forces as there are degrees of freedom.\n"));

		// Realize to velocity in case there are any velocity dependent forces
		_modelWorkingCopy->getMultibodySystem().realize(sWorkingCopy, SimTK::Stage::Velocity);

		_constraintMatrix.resize(nacc,nf);
		_constraintVector.resize(nacc);

		_performanceMatrix.resize(nf,nf);
		_performanceMatrix = 0;
		for(int i=0,j=0; i<nf; i++) {
            Actuator* act = dynamic_cast<Actuator*>(&_forceSet->get(i));
            if( act ) {
                act->setForce(sWorkingCopy,1);
			    _performanceMatrix(j,j) = act->getStress(sWorkingCopy);
                j++;
//.........这里部分代码省略.........
开发者ID:chrisdembia,项目名称:opensim-pythonwrap,代码行数:101,代码来源:InverseDynamics.cpp


注:本文中的Actuator::setForce方法示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。