surface_nurbs.h
Go to the documentation of this file.
00001 /*
00002  * surface_nurbs.h
00003  *
00004  *  Created on: 10.08.2012
00005  *      Author: josh
00006  */
00007 
00008 #ifndef SURFACE_NURBS_H_
00009 #define SURFACE_NURBS_H_
00010 
00011 #include <nurbsS_sp.h>
00012 #include <pcl/common/pca.h>
00013 
00014 namespace Slam_Surface
00015 {
00016   class SurfaceNurbs : public Surface
00017   {
00018     typedef PlNurbsSurfaceSPf SURFACE;
00019     SURFACE nurbs_;
00020     MatrixRTf weights_;
00021 
00022     //    Eigen::Vector3f plane_x_, plane_y_;
00023     float c_x_m_, c_x_o_, c_y_m_, c_y_o_;       
00024 
00025     virtual Eigen::Vector2f correct(const Eigen::Vector2f &v) const ;
00026     virtual Eigen::Vector3f _normalAt(const Eigen::Vector2f &v) const ;
00027 
00028 
00029     // for LM
00030     struct Functor {
00031       PLib::Point3Df _pt_;
00032       const SURFACE &nurbs_;
00033 
00034       Functor(const SURFACE &nurbs):nurbs_(nurbs)
00035       {}
00036 
00037       int operator()(const Eigen::VectorXf &x, Eigen::VectorXf &fvec) const
00038       {
00039         // distance
00040         fvec(0) = norm2(_pt_ - nurbs_.pointAt(x(0),x(1)));
00041         fvec(1) = 0;
00042 
00043         std::cout<<"x\n"<<x<<"\n";
00044         std::cout<<"dist "<<fvec(0)<<"\n";
00045 
00046         //        std::cout<<"fvec\n"<<fvec<<std::endl;
00047         return 0;
00048       }
00049 
00050       int df(const Eigen::VectorXf &x, Eigen::MatrixXf &fjac) const
00051       {
00052         //Jacobian
00053         Matrix_Point3Df ders;
00054         nurbs_.deriveAt(x(0),x(1), 1, ders);
00055         PLib::Point3Df p = nurbs_.pointAt(x(0),x(1));
00056         fjac(0,0) = dot(ders(1,0),(_pt_-p));
00057         fjac(0,1) = dot(ders(0,1),(_pt_-p));
00058         fjac(1,0) = fjac(1,1) = 0;
00059 
00060         std::cout<<"ders\n"<<ders<<"\n";
00061         std::cout<<"fjac\n"<<fjac<<"\n";
00062         return 0;
00063       }
00064 
00065       int inputs() const { return 2; }
00066       int values() const { return 2; } // number of constraints
00067     };
00068 
00069     int myprojectOn(const SURFACE &s, const Eigen::Vector3f &p, float &u, float &v, const int maxIt) const;
00070 
00072     Eigen::Vector2f _nextPoint(const Eigen::Vector3f &v) const ;
00073 
00074 
00075     struct PT_GRID {
00076       int w,h;
00077       std::vector<Eigen::Vector3f> grid;
00078 
00079       PT_GRID(const SURFACE &s, const int sampling) {
00080         w = s.ctrlPnts().rows()*sampling;
00081         h = s.ctrlPnts().cols()*sampling;
00082         grid.resize(w*h);
00083       }
00084 
00085       Eigen::Vector3f &operator()(int i, int j) {return grid[i*h+j];}
00086     };
00087     virtual float _merge2(SurfaceNurbs o, const float this_w, const float o_w, const SWINDOW &wind_t, const SWINDOW &wind_o);
00088 
00089   public:
00090 
00092     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);
00093 
00095     virtual int getSurfaceType() const {return 2;}
00096     virtual const char *getName() const {return "NURBS";}
00097 
00099     virtual Eigen::Vector2f nextPoint(const Eigen::Vector3f &v) const ;
00100 
00102     virtual Eigen::Vector3f project2world(const Eigen::Vector2f &pt) const ;
00103     virtual Eigen::Vector3f _project2world(const Eigen::Vector2f &pt) const ;
00104 
00106     virtual Eigen::Vector3f normalAt(const Eigen::Vector2f &v) const ;
00107 
00109     virtual float merge(const Surface &o, const float this_w, const float o_w, const SWINDOW &wind_t, const SWINDOW &wind_o);
00110     virtual float _merge(SurfaceNurbs o, const float this_w, const float o_w, const SWINDOW &wind_t, const SWINDOW &wind_o);
00111 
00113     virtual void transform(const Eigen::Matrix3f &rot, const Eigen::Vector3f &tr);
00114 
00116     virtual bool fitsCurvature(const Surface &o, const float thr) const;
00117 
00118     const SURFACE &getNurbs() const {return nurbs_;}
00119 
00121     virtual float area() const {return nurbs_.area(0.0001f,20);}
00122   };
00123 
00124 #include "impl/surface_nurbs.hpp"
00125 }
00126 
00127 #endif /* SURFACE_NURBS_H_ */


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