Compute the pose from different visual features.
#include <iostream>
#include <vector>
#include <limits>
#include <visp3/core/vpConfig.h>
#include <visp3/core/vpHomogeneousMatrix.h>
#include <visp3/core/vpPoint.h>
#include <visp3/core/vpImage.h>
#include <visp3/core/vpCameraParameters.h>
#include <visp3/vision/vpPoseFeatures.h>
#include <visp3/vision/vpPose.h>
#ifndef DOXYGEN_SHOULD_SKIP_THIS
#ifdef VISP_HAVE_CPP11_COMPATIBILITY
class vp_createPointClass{
public:
int value;
vp_createPointClass() : value(0){}
value += 1;
return value;
}
};
}
}
#endif
#endif
int test_pose(bool use_robust)
{
if (use_robust)
std::cout << "** Test robust pose estimation from features\n" << std::endl;
else
std::cout << "** Test pose estimation from features\n" << std::endl;
std::cout << "Reference pose used to create the visual features : " << std::endl;
std::cout << pose_ref.
t() << std::endl;
std::vector<vpPoint> pts;
double val = 0.25;
double val2 = 0.0;
pts.push_back(
vpPoint(0.0,-val,val2) );
pts.push_back(
vpPoint(0.0,val,val2) );
pts.push_back(
vpPoint(-val,val,val2) );
pts.push_back(
vpPoint(-val,-val/2.0,val2) );
pts.push_back(
vpPoint(val,val/2.0,val2) );
pts.push_back(
vpPoint(0.0,0.0,-1.5) );
0.0,0.0,1.0,0.0);
1.0,0.0,0.0,-0.25);
-1.0,0.0,0.0,-0.25);
pts[0].project(cMo_ref);
pts[1].project(cMo_ref);
pts[2].project(cMo_ref);
pts[3].project(cMo_ref);
pts[4].project(cMo_ref);
pts[5].project(cMo_ref);
#ifdef VISP_HAVE_CPP11_COMPATIBILITY
vp_createPointClass cpClass;
int (vp_createPointClass::*ptrClass)(
vpFeaturePoint&,
const vpPoint&) = &vp_createPointClass::vp_createPoint;
#endif
std::cout << "\nPose used as initialisation of the pose computation : " << std::endl;
std::cout << pose_est.
t() << std::endl;
if (! use_robust)
else
if (! use_robust)
std::cout << "\nEstimated pose from visual features : " << std::endl;
else
std::cout << "\nRobust estimated pose from visual features : " << std::endl;
std::cout << pose_est.
t() << std::endl;
std::cout << "\nResulting covariance (Diag): " << std::endl;
std::cout << covariance[0][0] << " " << covariance[1][1] << " "
<< covariance[2][2] << " " << covariance[3][3] << " "
<< covariance[4][4] << " " << covariance[5][5] << " " << std::endl;
int test_fail = 0;
for(unsigned int i=0; i<6; i++) {
if (std::fabs(pose_ref[i]-pose_est[i]) > 0.001)
test_fail = 1;
}
std::cout << "\nPose is " << (test_fail ? "badly" : "well") << " estimated\n" << std::endl;
return test_fail;
}
int main()
{
try {
if (test_pose(false))
return -1;
if (test_pose(true))
return -1;
return 0;
}
return -1;
}
}