00001
00002
00011 #ifndef SLAM_PLUCKER_TOOLS_HPP
00012 #define SLAM_PLUCKER_TOOLS_HPP
00013
00014 #include "kernel/jafarException.hpp"
00015 #include "jmath/jblas.hpp"
00016 #include "boost/tuple/tuple.hpp"
00017 #include "slam/eulerTools.hpp"
00018
00019 namespace jafar {
00020 namespace slam {
00025 namespace lineTools {
00026
00033 template<class Mat>
00034 void pluckerIntrinsicMatrix(double u0, double v0, double au, double av,
00035 Mat& K);
00036
00040 template<class Vec, class Mat>
00041 void pluckerIntrinsicMatrix(Vec const& k,
00042 Mat& K);
00043
00044
00045
00052 void pluckerInverseIntrinsicMatrix(double u0, double v0, double au, double av,
00053 jblas::mat& iK);
00054
00055
00059 void pluckerInverseIntrinsicMatrix(jblas::vec4 const& k,
00060 jblas::mat& iK);
00061
00062
00063
00067 jblas::vec2 homogeneousToRhoTheta(jblas::vec3 const& l);
00068
00069
00074 void homogeneousToRhoTheta(jblas::vec3 const& l,
00075 jblas::vec2& rt,
00076 jblas::mat& RT_l) ;
00077
00078
00079
00083 jblas::vec3 rhoThetaToHomogeneous(jblas::vec2 const& rt);
00084
00085
00090 void rhoThetaToHomogeneous(jblas::vec2 const& rt,
00091 jblas::vec3& l,
00092 jblas::mat& L_rt);
00093
00094
00095
00100 jblas::vec3 projectPlucker(jblas::mat33 const& K,
00101 jblas::vec6 const& L);
00102
00103
00109 void projectPlucker(jblas::mat33 const& K,
00110 jblas::vec6 const& L,
00111 jblas::vec3& l,
00112 jblas::mat& L_l);
00113
00114
00115
00120 jblas::vec3 retroProjectPluckerPlaneNormal(jblas::mat33 const& iK,
00121 jblas::vec3 const& l);
00122
00123
00129 void retroProjectPluckerPlaneNormal(jblas::mat33 const& iK,
00130 jblas::vec3 const& l,
00131 jblas::vec3& n,
00132 jblas::mat33& N_l);
00133
00134
00140 jblas::vec6 retroProjectPlucker(jblas::mat33 const& iK,
00141 jblas::vec3 const& l,
00142 jblas::vec3 const& v);
00143
00144
00152 void retroProjectPlucker(jblas::mat33 const& iK,
00153 jblas::vec3 const& l,
00154 jblas::vec3 const& v,
00155 jblas::vec6& L,
00156 jblas::mat& L_l,
00157 jblas::mat& L_v);
00158
00159
00160
00161
00167 jblas::vec6 retroProjectPluckerFromBase(jblas::mat33 const& iK,
00168 jblas::vec3 const& l,
00169 jblas::vec2 const& beta);
00170
00171
00179 void retroProjectPluckerFromBase(jblas::mat33 const& iK,
00180 jblas::vec3 const& l,
00181 jblas::vec2 const& beta,
00182 jblas::vec6& L,
00183 jblas::mat& L_l,
00184 jblas::mat& L_beta);
00185
00186
00187
00188
00192 jblas::mat planeVecToBaseMatrix(jblas::vec3 const& n);
00193
00194
00195
00196
00201 jblas::vec3 planeBaseToDirVector(jblas::vec3 const& n,
00202 jblas::vec2 const& beta);
00203
00210 void planeBaseToDirVector(jblas::vec3 const& n,
00211 jblas::vec2 const& beta,
00212 jblas::vec3& v,
00213 jblas::mat33& V_n,
00214 jblas::mat& V_beta);
00215
00222 void planeBaseToDirVector(jblas::vec_range const& n,
00223 jblas::vec2 const& beta,
00224 jblas::vec_range& v,
00225 jblas::mat33& V_n,
00226 jblas::mat& V_beta);
00227
00228
00229
00233 jblas::vec3 normVec3(jblas::vec3 const& v);
00234
00239 void normVec3(jblas::vec3 const& v,
00240 jblas::vec3& vn,
00241 jblas::mat33& VN_v);
00242
00243
00248 void normVec3(jblas::vec3 const& v,
00249 jblas::vec_range& vn,
00250 jblas::mat33& VN_v);
00251
00252
00257 jblas::vec3 adjustVec3(jblas::vec3 const& v,
00258 jblas::vec3 const& n);
00259
00265 void adjustVec3(jblas::vec3 const& v,
00266 jblas::vec3 const& n,
00267 jblas::vec3& w,
00268 jblas::mat33& W_v);
00269
00270
00271
00277 jblas::vec3 pluckerOrigin(jblas::vec6 const& L);
00278
00279
00289 void pluckerOrigin(jblas::vec6 const& L,
00290 jblas::vec3& p0,
00291 jblas::mat& P0_l);
00292
00293
00297 jblas::mat33 skewSymmMat33(jblas::vec3 const& v);
00298
00299
00304 jblas::vec3 pluckerEndpoint(jblas::vec6 const& L,
00305 double const s);
00306
00313 void pluckerEndpoint(jblas::vec6 const& L,
00314 double const s,
00315 jblas::vec3& e,
00316 jblas::mat& E_l,
00317 jblas::mat& E_s);
00318
00319
00324 jblas::vec6 pluckerRay(jblas::mat33 const& K,
00325 jblas::vec2 const& p);
00326
00327
00333 void pluckerRay(jblas::mat33 const& K,
00334 jblas::vec2 const& p,
00335 jblas::vec6 r,
00336 jblas::mat R_p);
00337
00338
00339
00347 boost::tuple<double,double,double> pluckerSoftIntersectionAbscissa(jblas::vec6 const& line1,
00348 jblas::vec6 const& line2);
00349
00350
00354 jblas::vec6 pluckerToEuclideanPlucker(jblas::vec6 const& L);
00355
00360 void pluckerToEuclideanPlucker(jblas::vec6 const& L,
00361 jblas::vec6& eL,
00362 jblas::mat66& EL_l);
00363
00364
00365
00367 jblas::vec3 extToHomogeneous(jblas::vec2 const& p, jblas::vec2 const& q);
00368
00369
00371 void extToHomogeneous(jblas::vec2 const& p,
00372 jblas::vec2 const& q,
00373 jblas::vec3& hm,
00374 jblas::mat& HM_p,
00375 jblas::mat& HM_q);
00376
00377
00379 void points3plane(jblas::vec3 const& a, jblas::vec3 const& b, jblas::vec3 const& c, jblas::vec6& plane);
00380
00381
00383 jblas::vec6 hmPointsToPlucker(jblas::vec4& A, jblas::vec4& B);
00384
00386 void hmPointsToPlucker(jblas::vec4& A, jblas::vec4& B, jblas::vec6& L,jblas::mat& L_a,jblas::mat& L_b);
00387
00389 jblas::vec4 uvdToHmPoint(jblas::vec3 const& uvd, jblas::vec4& k, double const alpha);
00390
00392 void uvdToHmPoint(jblas::vec3 const& uvd, jblas::vec4& k, double const alpha, jblas::vec4& hmP, jblas::mat& HmPu);
00393
00394
00395
00401
00402
00403
00404
00405
00406
00407
00408
00409
00410
00411
00412
00413
00414
00415
00416
00417
00418
00419
00420
00421
00422
00423
00424
00425
00426
00427
00428
00429
00430
00431
00432 jblas::vec6 projectPluckerToStereo(jblas::vec4 const& k,
00433 double alpha,
00434 jblas::vec6 const& L);
00435
00436
00437
00438
00445
00446
00447
00448
00449
00450
00451 void projectPluckerToStereo(jblas::vec4 const& k,
00452 double alpha,
00453 jblas::vec6 const& L,
00454 jblas::vec6& stLine,
00455 jblas::mat66& StLine_l);
00456
00457
00462 jblas::vec2 extToRhoTheta(const jblas::vec2& ext1, const jblas::vec2& ext2);
00463
00469 void extToRhoTheta(const jblas::vec2& ext1, const jblas::vec2& ext2, jblas::vec2& rt, jblas::mat& RT_ee);
00470
00471
00472
00476 jblas::vec4 uvdsToStereoRhoTheta(jblas::vec6 const& uvduvd);
00477
00482 void uvdsToStereoRhoTheta(jblas::vec6 const& uvduvd, jblas::vec4& rtrt, jblas::mat& RR_uu);
00483
00487 void uvdsToStereoRhoTheta(jblas::vec6 const& uvduvd, jblas::mat& RR_uu);
00488
00493 void homogenousToExtDistances( const jblas::vec3& _hm, const jblas::vec2& ext1, const jblas::vec2& ext2, jblas::vec2& dd, jblas::mat& DD_hm, jblas::mat& DD_ext1, jblas::mat& DD_ext2 );
00494
00495 void homogenousToPointDistance( const jblas::vec3& _hm, const jblas::vec2& _ext, double& d, jblas::mat_range& D_hm, jblas::mat_range& D_ext );
00496
00497 void homogenousToExtDistances( const jblas::vec3& _hm, const jblas::vec2& ext1, const jblas::vec2& ext2, jblas::vec2& dd, jblas::mat& DD_hm);
00498
00499 void homogenousToPointDistance( const jblas::vec3& _hm, const jblas::vec2& _ext, double& d, jblas::mat_range& D_hm );
00500
00502 jblas::vec6 points3DToPointVecLine(const jblas::vec3& p, const jblas::vec3& q);
00503
00505 void points3DToPointVecLine(const jblas::vec3& p, const jblas::vec3& q, jblas::vec6& m, jblas::mat66& M_l);
00506
00508 jblas::vec2 intersectPointVecLines(const jblas::vec6& l1, const jblas::vec6& l2);
00509
00511 double cosVecsAngle(const jblas::vec3& v1, const jblas::vec3& v2);
00512
00513 }
00514 }
00515
00516 }
00517
00518 #endif
00519