本文整理汇总了C++中FunctionSet::get方法的典型用法代码示例。如果您正苦于以下问题:C++ FunctionSet::get方法的具体用法?C++ FunctionSet::get怎么用?C++ FunctionSet::get使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类FunctionSet
的用法示例。
在下文中一共展示了FunctionSet::get方法的4个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: Exception
/**
* Set the velocity functions for the tasks. Functions are set based on the
* correspondence of the function and the task. For example,
* a task with the name "x" will search for a function or functions
* with the name "x". For tasks that require 3 functions, such
* as CMC_Point tasks, the assumption is that there will be three
* consecutive functions named "x" in the function set. If the correct
* number of functions is not found, the task is disabled.
*
* @param aFuncSet Function set.
* @return Pointer to the previous function set.
*/
void CMC_TaskSet::
setFunctionsForVelocity(FunctionSet &aFuncSet)
{
// LOOP THROUGH TRACK OBJECTS
int i,j,iFunc=0;
int nTrk;
string name;
Function *f[3];
const CoordinateSet& coords = getModel()->getCoordinateSet();
for(i=0;i<getSize();i++) {
// OBJECT
TrackingTask& ttask = get(i);
// If CMC_Task process same way as pre 2.0.2
if (dynamic_cast<CMC_Task*>(&ttask)==NULL)
continue;
CMC_Task& task = dynamic_cast<CMC_Task&>(ttask);
// NAME
name = task.getName();
if(name.empty()) continue;
const Coordinate& coord = coords.get(name);
// FIND FUNCTION(S)
f[0] = f[1] = f[2] = NULL;
nTrk = task.getNumTaskFunctions();
iFunc = aFuncSet.getIndex(coord.getSpeedName(),iFunc);
if (iFunc < 0){
name = coord.getJoint().getName() + "/" + coord.getSpeedName();
iFunc = aFuncSet.getIndex(name, iFunc);
if (iFunc < 0){
string msg = "CMC_TaskSet::setFunctionsForVelocity: function for task '";
msg += name + " not found.";
throw Exception(msg);
}
}
for(j=0;j<nTrk;j++) {
try {
f[j] = &aFuncSet.get(iFunc);
} catch(const Exception& x) {
x.print(cout);
}
if(f[j]==NULL) break;
}
task.setTaskFunctionsForVelocity(f[0],f[1],f[2]);
}
}
示例2: processModel
/**
* This method creates a SimmMotionTrial instance with the markerFile and
* timeRange parameters. It also creates a Storage instance with the
* coordinateFile parameter. Then it updates the coordinates and markers in
* the model, if specified. Then it does IK to fit the model to the static
* pose. Then it uses the current model pose to relocate all non-fixed markers
* according to their locations in the SimmMotionTrial. Then it writes the
* output files selected by the user.
*
* @param aModel the model to use for the marker placing process.
* @return Whether the marker placing process was successful or not.
*/
bool MarkerPlacer::processModel(Model* aModel, const string& aPathToSubject)
{
if(!getApply()) return false;
cout << endl << "Step 3: Placing markers on model" << endl;
/* Load the static pose marker file, and average all the
* frames in the user-specified time range.
*/
MarkerData staticPose(aPathToSubject + _markerFileName);
if (_timeRange.getSize()<2)
throw Exception("MarkerPlacer::processModel, time_range is unspecified.");
staticPose.averageFrames(_maxMarkerMovement, _timeRange[0], _timeRange[1]);
staticPose.convertToUnits(aModel->getLengthUnits());
/* Delete any markers from the model that are not in the static
* pose marker file.
*/
aModel->deleteUnusedMarkers(staticPose.getMarkerNames());
// Construct the system and get the working state when done changing the model
SimTK::State& s = aModel->initSystem();
// Create references and WeightSets needed to initialize InverseKinemaicsSolver
Set<MarkerWeight> markerWeightSet;
_ikTaskSet.createMarkerWeightSet(markerWeightSet); // order in tasks file
MarkersReference markersReference(staticPose, &markerWeightSet);
SimTK::Array_<CoordinateReference> coordinateReferences;
// Load the coordinate data
// create CoordinateReferences for Coordinate Tasks
FunctionSet *coordFunctions = NULL;
bool haveCoordinateFile = false;
if(_coordinateFileName != "" && _coordinateFileName != "Unassigned"){
Storage coordinateValues(aPathToSubject + _coordinateFileName);
aModel->getSimbodyEngine().convertDegreesToRadians(coordinateValues);
haveCoordinateFile = true;
coordFunctions = new GCVSplineSet(5,&coordinateValues);
}
int index = 0;
for(int i=0; i< _ikTaskSet.getSize(); i++){
IKCoordinateTask *coordTask = dynamic_cast<IKCoordinateTask *>(&_ikTaskSet[i]);
if (coordTask && coordTask->getApply()){
CoordinateReference *coordRef = NULL;
if(coordTask->getValueType() == IKCoordinateTask::FromFile){
index = coordFunctions->getIndex(coordTask->getName(), index);
if(index >= 0){
coordRef = new CoordinateReference(coordTask->getName(),coordFunctions->get(index));
}
}
else if((coordTask->getValueType() == IKCoordinateTask::ManualValue)){
Constant reference(Constant(coordTask->getValue()));
coordRef = new CoordinateReference(coordTask->getName(), reference);
}
else{ // assume it should be held at its current/default value
double value = aModel->getCoordinateSet().get(coordTask->getName()).getValue(s);
Constant reference = Constant(value);
coordRef = new CoordinateReference(coordTask->getName(), reference);
}
if(coordRef == NULL)
throw Exception("MarkerPlacer: value for coordinate "+coordTask->getName()+" not found.");
// We have a valid coordinate reference so now set its weight according to the task
coordRef->setWeight(coordTask->getWeight());
coordinateReferences.push_back(*coordRef);
}
}
double constraintWeight = std::numeric_limits<SimTK::Real>::infinity();
InverseKinematicsSolver ikSol(*aModel, markersReference,
coordinateReferences, constraintWeight);
ikSol.assemble(s);
// Call realize Position so that the transforms are updated and markers can be moved correctly
aModel->getMultibodySystem().realize(s, SimTK::Stage::Position);
// Report marker errors to assess the quality
int nm = markerWeightSet.getSize();
SimTK::Array_<double> squaredMarkerErrors(nm, 0.0);
SimTK::Array_<Vec3> markerLocations(nm, Vec3(0));
double totalSquaredMarkerError = 0.0;
double maxSquaredMarkerError = 0.0;
int worst = -1;
// Report in the same order as the marker tasks/weights
ikSol.computeCurrentSquaredMarkerErrors(squaredMarkerErrors);
for(int j=0; j<nm; ++j){
//.........这里部分代码省略.........
示例3: run
/**
* Run the inverse Dynamics tool.
*/
bool InverseDynamicsTool::run()
{
bool success = false;
bool modelFromFile=true;
try{
//Load and create the indicated model
if (!_model)
_model = new Model(_modelFileName);
else
modelFromFile = false;
_model->printBasicInfo(cout);
cout<<"Running tool " << getName() <<".\n"<<endl;
// Do the maneuver to change then restore working directory
// so that the parsing code behaves properly if called from a different directory.
string saveWorkingDirectory = IO::getCwd();
string directoryOfSetupFile = IO::getParentDirectory(getDocumentFileName());
IO::chDir(directoryOfSetupFile);
const CoordinateSet &coords = _model->getCoordinateSet();
int nq = _model->getNumCoordinates();
FunctionSet *coordFunctions = NULL;
//Storage *coordinateValues = NULL;
if(hasCoordinateValues()){
if(_lowpassCutoffFrequency>=0) {
cout<<"\n\nLow-pass filtering coordinates data with a cutoff frequency of "<<_lowpassCutoffFrequency<<"..."<<endl<<endl;
_coordinateValues->pad(_coordinateValues->getSize()/2);
_coordinateValues->lowpassIIR(_lowpassCutoffFrequency);
if (getVerboseLevel()==Debug) _coordinateValues->print("coordinateDataFiltered.sto");
}
// Convert degrees to radian if indicated
if(_coordinateValues->isInDegrees()){
_model->getSimbodyEngine().convertDegreesToRadians(*_coordinateValues);
}
// Create differentiable splines of the coordinate data
coordFunctions = new GCVSplineSet(5, _coordinateValues);
//Functions must correspond to model coordinates and their order for the solver
for(int i=0; i<nq; i++){
if(coordFunctions->contains(coords[i].getName())){
coordFunctions->insert(i,coordFunctions->get(coords[i].getName()));
}
else{
coordFunctions->insert(i,new Constant(coords[i].getDefaultValue()));
std::cout << "InverseDynamicsTool: coordinate file does not contain coordinate " << coords[i].getName() << " assuming default value" << std::endl;
}
}
if(coordFunctions->getSize() > nq){
coordFunctions->setSize(nq);
}
}
else{
IO::chDir(saveWorkingDirectory);
throw Exception("InverseDynamicsTool: no coordinate file found.");
}
bool externalLoads = createExternalLoads(_externalLoadsFileName, *_model, _coordinateValues);
// Initialize the the model's underlying computational system and get its default state.
SimTK::State& s = _model->initSystem();
// Exclude user-specified forces from the dynamics for this analysis
disableModelForces(*_model, s, _excludedForces);
double first_time = _coordinateValues->getFirstTime();
double last_time = _coordinateValues->getLastTime();
// Determine the starting and final time for the Tool by comparing to what data is available
double start_time = ( first_time > _timeRange[0]) ? first_time : _timeRange[0];
double final_time = ( last_time < _timeRange[1]) ? last_time : _timeRange[1];
int start_index = _coordinateValues->findIndex(start_time);
int final_index = _coordinateValues->findIndex(final_time);
// create the solver given the input data
InverseDynamicsSolver ivdSolver(*_model);
const clock_t start = clock();
int nt = final_index-start_index+1;
Array_<double> times(nt, 0.0);
for(int i=0; i<nt; i++){
times[i]=_coordinateValues->getStateVector(start_index+i)->getTime();
}
// Preallocate results
Array_<Vector> genForceTraj(nt, Vector(nq, 0.0));
// solve for the trajectory of generlized forces that correspond to the coordinate
// trajectories provided
ivdSolver.solve(s, *coordFunctions, times, genForceTraj);
success = true;
//.........这里部分代码省略.........
示例4: processModel
/**
* This method creates a SimmMotionTrial instance with the markerFile and
* timeRange parameters. It also creates a Storage instance with the
* coordinateFile parameter. Then it updates the coordinates and markers in
* the model, if specified. Then it does IK to fit the model to the static
* pose. Then it uses the current model pose to relocate all non-fixed markers
* according to their locations in the SimmMotionTrial. Then it writes the
* output files selected by the user.
*
* @param aModel the model to use for the marker placing process.
* @return Whether the marker placing process was successful or not.
*/
bool MarkerPlacer::processModel(Model* aModel,
const string& aPathToSubject) const {
if(!getApply()) return false;
cout << endl << "Step 3: Placing markers on model" << endl;
if (_timeRange.getSize()<2)
throw Exception("MarkerPlacer::processModel, time_range is unspecified.");
/* Load the static pose marker file, and average all the
* frames in the user-specified time range.
*/
TimeSeriesTableVec3 staticPoseTable{aPathToSubject + _markerFileName};
const auto& timeCol = staticPoseTable.getIndependentColumn();
// Users often set a time range that purposely exceeds the range of
// their data with the mindset that all their data will be used.
// To allow for that, we have to narrow the provided range to data
// range, since the TimeSeriesTable will correctly throw that the
// desired time exceeds the data range.
if (_timeRange[0] < timeCol.front())
_timeRange[0] = timeCol.front();
if (_timeRange[1] > timeCol.back())
_timeRange[1] = timeCol.back();
const auto avgRow = staticPoseTable.averageRow(_timeRange[0],
_timeRange[1]);
for(size_t r = staticPoseTable.getNumRows(); r-- > 0; )
staticPoseTable.removeRowAtIndex(r);
staticPoseTable.appendRow(_timeRange[0], avgRow);
OPENSIM_THROW_IF(!staticPoseTable.hasTableMetaDataKey("Units"),
Exception,
"MarkerPlacer::processModel -- Marker file does not have "
"'Units'.");
Units
staticPoseUnits{staticPoseTable.getTableMetaData<std::string>("Units")};
double scaleFactor = staticPoseUnits.convertTo(aModel->getLengthUnits());
OPENSIM_THROW_IF(SimTK::isNaN(scaleFactor),
Exception,
"Model has unspecified units.");
if(std::fabs(scaleFactor - 1) >= SimTK::Eps) {
for(unsigned r = 0; r < staticPoseTable.getNumRows(); ++r)
staticPoseTable.updRowAtIndex(r) *= scaleFactor;
staticPoseUnits = aModel->getLengthUnits();
staticPoseTable.removeTableMetaDataKey("Units");
staticPoseTable.addTableMetaData("Units",
staticPoseUnits.getAbbreviation());
}
MarkerData* staticPose = new MarkerData(aPathToSubject + _markerFileName);
staticPose->averageFrames(_maxMarkerMovement, _timeRange[0], _timeRange[1]);
staticPose->convertToUnits(aModel->getLengthUnits());
/* Delete any markers from the model that are not in the static
* pose marker file.
*/
aModel->deleteUnusedMarkers(staticPose->getMarkerNames());
// Construct the system and get the working state when done changing the model
SimTK::State& s = aModel->initSystem();
s.updTime() = _timeRange[0];
// Create references and WeightSets needed to initialize InverseKinemaicsSolver
Set<MarkerWeight> markerWeightSet;
_ikTaskSet.createMarkerWeightSet(markerWeightSet); // order in tasks file
// MarkersReference takes ownership of marker data (staticPose)
MarkersReference markersReference(staticPoseTable, &markerWeightSet);
SimTK::Array_<CoordinateReference> coordinateReferences;
// Load the coordinate data
// create CoordinateReferences for Coordinate Tasks
FunctionSet *coordFunctions = NULL;
// bool haveCoordinateFile = false;
if(_coordinateFileName != "" && _coordinateFileName != "Unassigned"){
Storage coordinateValues(aPathToSubject + _coordinateFileName);
aModel->getSimbodyEngine().convertDegreesToRadians(coordinateValues);
// haveCoordinateFile = true;
coordFunctions = new GCVSplineSet(5,&coordinateValues);
}
int index = 0;
for(int i=0; i< _ikTaskSet.getSize(); i++){
IKCoordinateTask *coordTask = dynamic_cast<IKCoordinateTask *>(&_ikTaskSet[i]);
if (coordTask && coordTask->getApply()){
std::unique_ptr<CoordinateReference> coordRef{};
//.........这里部分代码省略.........