Simbody
|
00001 #ifndef SimTK_SIMBODY_OBSERVED_POINT_FITTER_H_ 00002 #define SimTK_SIMBODY_OBSERVED_POINT_FITTER_H_ 00003 00004 /* -------------------------------------------------------------------------- * 00005 * SimTK Core: SimTK Simbody(tm) * 00006 * -------------------------------------------------------------------------- * 00007 * This is part of the SimTK Core biosimulation toolkit originating from * 00008 * Simbios, the NIH National Center for Physics-Based Simulation of * 00009 * Biological Structures at Stanford, funded under the NIH Roadmap for * 00010 * Medical Research, grant U54 GM072970. See https://simtk.org. * 00011 * * 00012 * Portions copyright (c) 2007 Stanford University and the Authors. * 00013 * Authors: Peter Eastman * 00014 * Contributors: * 00015 * * 00016 * Permission is hereby granted, free of charge, to any person obtaining a * 00017 * copy of this software and associated documentation files (the "Software"), * 00018 * to deal in the Software without restriction, including without limitation * 00019 * the rights to use, copy, modify, merge, publish, distribute, sublicense, * 00020 * and/or sell copies of the Software, and to permit persons to whom the * 00021 * Software is furnished to do so, subject to the following conditions: * 00022 * * 00023 * The above copyright notice and this permission notice shall be included in * 00024 * all copies or substantial portions of the Software. * 00025 * * 00026 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * 00027 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * 00028 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL * 00029 * THE AUTHORS, CONTRIBUTORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, * 00030 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR * 00031 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE * 00032 * USE OR OTHER DEALINGS IN THE SOFTWARE. * 00033 * -------------------------------------------------------------------------- */ 00034 00035 #include "SimTKcommon.h" 00036 #include "simbody/internal/common.h" 00037 #include "simbody/internal/MultibodySystem.h" 00038 00039 namespace SimTK { 00040 00053 class SimTK_SIMBODY_EXPORT ObservedPointFitter { 00054 public: 00060 static Real findBestFit 00061 (const MultibodySystem& system, 00062 State& state, 00063 const Array_<MobilizedBodyIndex>& bodyIxs, 00064 const Array_<Array_<Vec3> >& stations, 00065 const Array_<Array_<Vec3> >& targetLocations, 00066 Real tolerance=0.001); 00067 00069 static Real findBestFit 00070 (const MultibodySystem& system, 00071 State& state, 00072 const std::vector<MobilizedBodyIndex>& bodyIxs, 00073 const std::vector<std::vector<Vec3> >& stations, 00074 const std::vector<std::vector<Vec3> >& targetLocations, 00075 Real tolerance=0.001) 00076 { 00077 Array_<Array_<Vec3> > stationCopy(stations); 00078 Array_<Array_<Vec3> > targetCopy(targetLocations); 00079 return findBestFit(system,state, 00080 ArrayViewConst_<MobilizedBodyIndex>(bodyIxs), // no copying here 00081 stationCopy, targetCopy, tolerance); 00082 } 00083 00098 static Real findBestFit 00099 (const MultibodySystem& system, 00100 State& state, 00101 const Array_<MobilizedBodyIndex>& bodyIxs, 00102 const Array_<Array_<Vec3> >& stations, 00103 const Array_<Array_<Vec3> >& targetLocations, 00104 const Array_<Array_<Real> >& weights, 00105 Real tolerance=0.001); 00106 00108 static Real findBestFit 00109 (const MultibodySystem& system, 00110 State& state, 00111 const std::vector<MobilizedBodyIndex>& bodyIxs, 00112 const std::vector<std::vector<Vec3> >& stations, 00113 const std::vector<std::vector<Vec3> >& targetLocations, 00114 const std::vector<std::vector<Real> >& weights, 00115 Real tolerance=0.001) 00116 { 00117 Array_<Array_<Vec3> > stationCopy(stations); 00118 Array_<Array_<Vec3> > targetCopy(targetLocations); 00119 Array_<Array_<Real> > weightCopy(weights); 00120 return findBestFit(system,state, 00121 ArrayViewConst_<MobilizedBodyIndex>(bodyIxs), // no copying here 00122 stationCopy, targetCopy, weightCopy, 00123 tolerance); 00124 } 00125 00126 00127 private: 00128 static void createClonedSystem(const MultibodySystem& original, MultibodySystem& copy, const Array_<MobilizedBodyIndex>& originalBodyIxs, Array_<MobilizedBodyIndex>& copyBodyIxs, bool& hasArtificialBaseBody); 00129 static void findUpstreamBodies(MobilizedBodyIndex currentBodyIx, const Array_<int> numStations, const SimbodyMatterSubsystem& matter, Array_<MobilizedBodyIndex>& bodyIxs, int requiredStations); 00130 static void findDownstreamBodies(MobilizedBodyIndex currentBodyIx, const Array_<int> numStations, const Array_<Array_<MobilizedBodyIndex> > children, Array_<MobilizedBodyIndex>& bodyIxs, int& requiredStations); 00131 static int findBodiesForClonedSystem(MobilizedBodyIndex primaryBodyIx, const Array_<int> numStations, const SimbodyMatterSubsystem& matter, const Array_<Array_<MobilizedBodyIndex> > children, Array_<MobilizedBodyIndex>& bodyIxs); 00132 class OptimizerFunction; 00133 }; 00134 00135 } // namespace SimTK 00136 00137 #endif // SimTK_SIMBODY_OBSERVED_POINT_FITTER_H_