Compute the pose from different visual features.
#include <iostream>
#include <limits>
#include <vector>
#include <visp3/core/vpCameraParameters.h>
#include <visp3/core/vpConfig.h>
#include <visp3/core/vpHomogeneousMatrix.h>
#include <visp3/core/vpImage.h>
#include <visp3/core/vpPoint.h>
#include <visp3/vision/vpPose.h>
#include <visp3/vision/vpPoseFeatures.h>
#ifndef DOXYGEN_SHOULD_SKIP_THIS
#if (VISP_CXX_STANDARD >= VISP_CXX_STANDARD_11)
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));
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);
#if (VISP_CXX_STANDARD >= VISP_CXX_STANDARD_11)
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;
}
}