ComplementaryDataTypes.hpp
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>   //this is for left multiplication by a scalar (uses right multiplier)
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         /* Differential equation of the estimator */
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         //ROS_INFO_STREAM("Residual bias: " << (rot*(matrixA*input.lin_acc + vectorB)).transpose());
00138     }
00139 };
00140 
00141 #endif /* COMPLEMENTARYDATATYPES_HPP_ */
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Friends


tk_state
Author(s): Dr. Antonio Franchi and Martin Riedel
autogenerated on Mon Nov 11 2013 11:13:03