00001 #ifndef SimTK_SIMBODY_OBSERVED_POINT_FITTER_H_
00002 #define SimTK_SIMBODY_OBSERVED_POINT_FITTER_H_
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
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),
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),
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 }
00136
00137 #endif // SimTK_SIMBODY_OBSERVED_POINT_FITTER_H_