surface.h
Go to the documentation of this file.
00001 /*
00002  * surface.h
00003  *
00004  *  Created on: 09.08.2012
00005  *      Author: josh
00006  */
00007 
00008 #ifndef SURFACE_H_
00009 #define SURFACE_H_
00010 
00011 #include "form.h"
00012 #include "polygon_merger.h"
00013 #include <unsupported/Eigen/NonLinearOptimization>
00014 
00015 namespace Slam_Surface
00016 {
00017 
00018   class Surface
00019   {
00020   public:
00021 
00022     struct SWINDOW {
00023       float min_x, max_x, min_y, max_y;
00024     };
00025 
00026 
00027     virtual ~Surface() {}
00028 
00030     virtual void init(const boost::array<float, 6> &params, const float min_x, const float max_x, const float min_y, const float max_y, const float weight) = 0;
00031 
00033     virtual int getSurfaceType() const = 0;
00034     virtual const char *getName() const = 0;
00035 
00037     virtual Eigen::Vector2f nextPoint(const Eigen::Vector3f &v) const = 0;
00038 
00040     virtual Eigen::Vector3f project2world(const Eigen::Vector2f &pt) const = 0;
00041 
00043     virtual Eigen::Vector3f normalAt(const Eigen::Vector2f &v) const = 0;
00044 
00046     virtual float merge(const Surface &o, const float this_w, const float o_w, const SWINDOW &wind_t, const SWINDOW &wind_o) = 0;
00047 
00049     virtual void transform(const Eigen::Matrix3f &rot, const Eigen::Vector3f &tr) = 0;
00050 
00052     virtual bool fitsCurvature(const Surface &o, const float thr) const = 0;
00053 
00055     virtual float area() const = 0;
00056   };
00057 
00058   class PolynomialSurface : public Surface
00059   {
00060     //from segmentation....
00061     Eigen::Matrix3f param_;
00062     Eigen::Matrix<float,3,2> proj2plane_;
00063 
00064 
00065     struct MyFunctor
00066     {
00067       const float a,b,c, d,e;
00068       const float x0,y0,z0;
00069 
00070       int operator()(const Eigen::VectorXf &x, Eigen::VectorXf &fvec) const
00071       {
00072         // distance
00073         fvec(0) = std::pow((-z0+b*x(1)*x(1)+c*x(0)*x(1)+a*x(0)*x(0)+d*x(0)+e*x(1)),2)+std::pow(x(1)-y0,2)+std::pow(x(0)-x0,2);
00074         fvec(1) = 0;
00075 
00076 //        std::cout<<"x\n"<<x<<"\n";
00077 //        std::cout<<"dist "<<fvec(0)<<"\n";
00078 
00079         return 0;
00080       }
00081 
00082       int df(const Eigen::VectorXf &x, Eigen::MatrixXf &fjac) const
00083       {
00084         //Jacobian
00085         //TODO:
00086         fjac(0,0) = 2*(c*x(1)+2*a*x(0)+d)*(-z0+b*x(1)*x(1)+c*x(0)*x(1)+a*x(0)*x(0)+d*x(0)+e*x(1))+2*(x(0)-x0);
00087         fjac(0,1) = 2*(2*b*x(1)+c*x(0)+e)*(-z0+b*x(1)*x(1)+c*x(0)*x(1)+a*x(0)*x(0)+d*x(0)+e*x(1))+2*(x(1)-y0);
00088         fjac(1,0) = fjac(1,1) = 0;
00089 
00090 //        std::cout<<"x\n"<<x<<"\n";
00091 //        std::cout<<"fjac\n"<<fjac<<"\n";
00092 
00093         return 0;
00094       }
00095 
00096       int inputs() const { return 2; }
00097       int values() const { return 2; } // number of constraints
00098     };
00099 
00100     Eigen::Vector2f _nextPoint(const Eigen::Vector3f &v, Eigen::Vector3f p, const int depth=0) const;
00101 
00102   public:
00103 
00105     virtual void init(const boost::array<float, 6> &params, const float min_x, const float max_x, const float min_y, const float max_y, const float weight);
00106 
00108     virtual int getSurfaceType() const {return 1;}
00109     virtual const char *getName() const {return "polynomial surface";}
00110 
00112     virtual Eigen::Vector2f nextPoint(const Eigen::Vector3f &v) const ;
00113 
00115     virtual Eigen::Vector3f project2world(const Eigen::Vector2f &pt) const ;
00116 
00118     virtual Eigen::Vector3f normalAt(const Eigen::Vector2f &v) const ;
00119 
00121     virtual Eigen::Vector3f normalAt2(const Eigen::Vector2f &v) const ;
00122 
00124     virtual float merge(const Surface &o, const float this_w, const float o_w, const SWINDOW &wind_t, const SWINDOW &wind_o) {return 0.f;}
00125 
00127     virtual void transform(const Eigen::Matrix3f &rot, const Eigen::Vector3f &tr);
00128 
00130     virtual bool fitsCurvature(const Surface &o, const float thr) const;
00131 
00133     virtual float area() const {return 1.f;}
00134   };
00135 
00136 #include "impl/surface.hpp"
00137 
00138 }
00139 
00140 #include "surface_nurbs.h"
00141 #include "surface_tri_spline.h"
00142 
00143 
00144 #endif /* SURFACE_H_ */


cob_3d_mapping_slam
Author(s): Joshua Hampp
autogenerated on Wed Aug 26 2015 11:04:51