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 ColumnVector_<Dimension> Vector;
00059   typedef SymmetricMatrix_<Dimension> Variance;
00060 
00061   Input_() { u_.setZero(); }
00062   template <typename Derived> Input_(const Eigen::MatrixBase<Derived>& u) : u_(u) {}
00063   template <typename Derived> Input_(const Eigen::MatrixBase<Derived>& u, const Variance& Q) : u_(u), variance_(new Variance(Q)) {}
00064   Input_(double u) { *this = u; }
00065   Input_(double u, const Variance& Q) : variance_(new Variance(Q)) { *this = u; }
00066   Input_(const Input& other) { *this = other; }
00067   virtual ~Input_() {}
00068 
00069   virtual int getDimension() const { return Dimension; }
00070 
00071   virtual Vector const &getVector() const { return u_; }
00072   virtual Vector& u() { return u_; }
00073 
00074   virtual Variance &setVariance(const Variance &other) {
00075     if (!variance_) variance_.reset(new Variance);
00076     *variance_ = other;
00077     return *variance_;
00078   }
00079 
00080   virtual bool hasVariance() const { return variance_; }
00081   virtual Variance const &getVariance() { if (!variance_) variance_.reset(new Variance); return *variance_; }
00082   virtual Variance const &getVariance() const { return *variance_; }
00083   virtual Variance& variance() { if (!variance_) variance_.reset(new Variance); return *variance_; }
00084 
00085   virtual Input_<Dimension>& operator=(const Input& other) {
00086     *this = static_cast<const Input_<Dimension>&>(other);
00087     return *this;
00088   }
00089 
00090   virtual Input_<Dimension>& operator=(const Input_<Dimension>& other) {
00091     u_ = other.getVector();
00092     if (other.variance_) setVariance(*other.variance_);
00093     return *this;
00094   }
00095 
00096   template <typename Derived> Vector &operator=(const Eigen::MatrixBase<Derived>& other) {
00097     u_ = other;
00098     return u_;
00099   }
00100 
00101   virtual Vector &operator=(double u) { u_ = u; return u_; }
00102 
00103 protected:
00104   Vector u_;
00105   boost::shared_ptr<Variance> variance_;
00106 };
00107 
00108 namespace traits {
00109   template <class Model> struct Input {
00110     enum { Dimension = 0 };
00111     typedef Input_<Dimension> Type;
00112     typedef ColumnVector_<0> Vector;
00113     typedef SymmetricMatrix_<0> Variance;
00114   };
00115 }
00116 
00117 } // namespace hector_pose_estimation
00118 
00119 #endif // HECTOR_POSE_ESTIMATION_INPUT_H


hector_pose_estimation_core
Author(s): Johannes Meyer
autogenerated on Mon Oct 6 2014 00:24:16