Go to the documentation of this file.00001 #ifndef COMPLEMENTARYDATATYPES_HPP_
00002 #define COMPLEMENTARYDATATYPES_HPP_
00003
00004 #include <Eigen/Geometry>
00005
00006 class State {
00007 public:
00008 Eigen::Vector3d position;
00009 Eigen::Vector3d lin_velocity;
00010 Eigen::Quaterniond orientation;
00011 Eigen::Vector3d bias;
00012
00013 State operator+(const State& addend) const {
00014 State temp;
00015 temp.position = position + addend.position;
00016 temp.lin_velocity = lin_velocity + addend.lin_velocity;
00017 temp.orientation.w() = orientation.w() + addend.orientation.w();
00018 temp.orientation.vec() = orientation.vec() + addend.orientation.vec();
00019 temp.bias = bias + addend.bias;
00020 return (temp);
00021 }
00022
00023 State& operator+=(const State& addend) {
00024 position += addend.position;
00025 lin_velocity += addend.lin_velocity;
00026 orientation.w() += addend.orientation.w();
00027 orientation.vec() += addend.orientation.vec();
00028 bias += addend.bias;
00029 return *this;
00030 }
00031
00032 template <typename _scalarT>
00033 State operator*(const _scalarT factor) const {
00034 State temp;
00035 temp.position = factor*position;
00036 temp.lin_velocity = factor*lin_velocity;
00037 temp.orientation.w() = factor*orientation.w();
00038 temp.orientation.vec() = factor*orientation.vec();
00039 temp.bias = factor*bias;
00040 return (temp);
00041 }
00042
00043 template <typename _scalarT>
00044 State& operator*=(const _scalarT factor) {
00045 State temp;
00046 position *= factor;
00047 lin_velocity *= factor;
00048 orientation.w() *= factor;
00049 orientation.vec() *= factor;
00050 bias *= factor;
00051 return *this;
00052 }
00053
00054 };
00055
00056 template <typename _scalarT>
00057 State operator*(const _scalarT factor, const State& state) { return state*factor; };
00058
00059
00060 class Measure {
00061 public:
00062 Eigen::Vector3d position;
00063 Eigen::Quaterniond orientation;
00064 };
00065
00066 class Input {
00067 public:
00068 Eigen::Vector3d lin_acc;
00069 Eigen::Vector3d ang_vel;
00070 };
00071
00072 class DynamicSystem {
00073 protected:
00074 Eigen::Matrix3d positionGain;
00075 Eigen::Matrix3d velocityGain;
00076 Eigen::Matrix3d orientationGain;
00077 Eigen::Matrix3d biasGain;
00078 Eigen::Vector3d gravity;
00079
00080 Eigen::Matrix3d matrixA;
00081 Eigen::Vector3d vectorB;
00082 double normalizationGain;
00083
00084 Input input;
00085 Measure measure;
00086 public:
00087
00088 DynamicSystem(){}
00089
00090 DynamicSystem(const Eigen::Matrix3d& inPositionGain, const Eigen::Matrix3d& inVelocityGain, const Eigen::Matrix3d& inOrientationGain, const Eigen::Matrix3d& inBiasGain,
00091 const Eigen::Vector3d& inGravity, double inNormalizationGain, const Eigen::Matrix3d& inMatrixA, const Eigen::Vector3d& inVectorB):
00092 positionGain(inPositionGain),
00093 velocityGain(inVelocityGain),
00094 orientationGain(inOrientationGain),
00095 biasGain(inBiasGain),
00096 gravity(inGravity),
00097 matrixA(inMatrixA),
00098 vectorB(inVectorB),
00099 normalizationGain(inNormalizationGain) {
00100 }
00101
00102 void setInput(const Input& inInput){
00103 input = inInput;
00104 }
00105
00106 const Input& getInput(){
00107 return input;
00108 }
00109
00110 void setMeasure(const Measure& inMeasure){
00111 measure = inMeasure;
00112 }
00113
00114 const Measure& getMeasure(){
00115 return measure;
00116 }
00117
00118
00119 void operator()(State& inState, State& dState , double t )
00120 {
00121 Eigen::Vector3d positionResidual = measure.position - inState.position;
00122 Eigen::Quaterniond orientationResidual = inState.orientation.conjugate()*measure.orientation;
00123
00124 Eigen::Matrix3d rot = inState.orientation.normalized().toRotationMatrix();
00125 dState.position = inState.lin_velocity + positionGain*positionResidual;
00126 dState.lin_velocity = rot*(matrixA*input.lin_acc + vectorB + inState.bias) + gravity
00127 + velocityGain*positionResidual;
00128
00129 Eigen::Quaterniond omegaQuaternion;
00130 omegaQuaternion.w() = normalizationGain*(1-inState.orientation.squaredNorm());
00131 omegaQuaternion.vec() = .5*input.ang_vel + orientationGain*orientationResidual.w()*orientationResidual.vec();
00132
00133 dState.orientation = inState.orientation*omegaQuaternion;
00134
00135 dState.bias = biasGain*rot.transpose()*positionResidual;
00136
00137
00138 }
00139 };
00140
00141 #endif