input.h
Go to the documentation of this file.
00001 //=================================================================================================
00002 // Copyright (c) 2011, Johannes Meyer, TU Darmstadt
00003 // All rights reserved.
00004 
00005 // Redistribution and use in source and binary forms, with or without
00006 // modification, are permitted provided that the following conditions are met:
00007 //     * Redistributions of source code must retain the above copyright
00008 //       notice, this list of conditions and the following disclaimer.
00009 //     * Redistributions in binary form must reproduce the above copyright
00010 //       notice, this list of conditions and the following disclaimer in the
00011 //       documentation and/or other materials provided with the distribution.
00012 //     * Neither the name of the Flight Systems and Automatic Control group,
00013 //       TU Darmstadt, nor the names of its contributors may be used to
00014 //       endorse or promote products derived from this software without
00015 //       specific prior written permission.
00016 
00017 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
00018 // ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
00019 // WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
00020 // DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
00021 // DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
00022 // (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
00023 // LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
00024 // ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
00025 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
00026 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00027 //=================================================================================================
00028 
00029 #ifndef HECTOR_POSE_ESTIMATION_INPUT_H
00030 #define HECTOR_POSE_ESTIMATION_INPUT_H
00031 
00032 #include <hector_pose_estimation/types.h>
00033 
00034 namespace hector_pose_estimation {
00035 
00036 class Input
00037 {
00038 public:
00039   Input() {}
00040   virtual ~Input() {}
00041 
00042   virtual int getDimension() const = 0;
00043 
00044   virtual const std::string& getName() const { return name_; }
00045   virtual void setName(const std::string& name) { name_ = name; }
00046 
00047   virtual Input& operator=(const Input& other) = 0;
00048 
00049 private:
00050   std::string name_;
00051 };
00052 
00053 template <int _Dimension>
00054 class Input_ : public Input {
00055 public:
00056   enum { Dimension = _Dimension };
00057   typedef Input_<Dimension> Type;
00058   typedef typename ColumnVector_<Dimension>::type Vector;
00059   typedef typename SymmetricMatrix_<Dimension>::type Variance;
00060 
00061   typedef boost::shared_ptr< Input_<_Dimension> > Ptr;
00062 
00063   Input_() { u_.setZero(); }
00064   template <typename Derived> Input_(const Eigen::MatrixBase<Derived>& u) : u_(u) {}
00065   template <typename Derived> Input_(const Eigen::MatrixBase<Derived>& u, const Variance& Q) : u_(u), variance_(new Variance(Q)) {}
00066   Input_(double u) { *this = u; }
00067   Input_(double u, const Variance& Q) : variance_(new Variance(Q)) { *this = u; }
00068   Input_(const Input& other) { *this = other; }
00069   virtual ~Input_() {}
00070 
00071   virtual int getDimension() const { return Dimension; }
00072 
00073   virtual Vector const &getVector() const { return u_; }
00074   virtual Vector& u() { return u_; }
00075 
00076   virtual Variance &setVariance(const Variance &other) {
00077     if (!variance_) variance_.reset(new Variance);
00078     *variance_ = other;
00079     return *variance_;
00080   }
00081 
00082   virtual bool hasVariance() const { return variance_; }
00083   virtual Variance const &getVariance() { if (!variance_) variance_.reset(new Variance); return *variance_; }
00084   virtual Variance const &getVariance() const { return *variance_; }
00085   virtual Variance& variance() { if (!variance_) variance_.reset(new Variance); return *variance_; }
00086 
00087   virtual Input_<Dimension>& operator=(const Input& other) {
00088     *this = static_cast<const Input_<Dimension>&>(other);
00089     return *this;
00090   }
00091 
00092   virtual Input_<Dimension>& operator=(const Input_<Dimension>& other) {
00093     u_ = other.getVector();
00094     if (other.variance_) setVariance(*other.variance_);
00095     return *this;
00096   }
00097 
00098   template <typename Derived> Vector &operator=(const Eigen::MatrixBase<Derived>& other) {
00099     u_ = other;
00100     return u_;
00101   }
00102 
00103   virtual Vector &operator=(double u) { u_.setConstant(u); return u_; }
00104 
00105 protected:
00106   Vector u_;
00107   boost::shared_ptr<Variance> variance_;
00108 };
00109 
00110 namespace traits {
00111   template <class Model> struct Input {
00112     enum { Dimension = 0 };
00113     typedef Input_<Dimension> Type;
00114     typedef ColumnVector_<0> Vector;
00115     typedef SymmetricMatrix_<0> Variance;
00116   };
00117 }
00118 
00119 } // namespace hector_pose_estimation
00120 
00121 #endif // HECTOR_POSE_ESTIMATION_INPUT_H


hector_pose_estimation_core
Author(s): Johannes Meyer
autogenerated on Mon Aug 22 2016 03:53:11