#include "ClassUsingPclViewer.h"
#if defined(VISP_HAVE_PCL) && (VISP_CXX_STANDARD >= VISP_CXX_STANDARD_11)
#include <pcl/io/pcd_io.h>
#include <visp3/core/vpTime.h>
#include <visp3/core/vpGaussRand.h>
#include <visp3/core/vpRobust.h>
#include <visp3/gui/vpColorBlindFriendlyPalette.h>
#include <visp3/io/vpKeyboard.h>
double zFunction(const double &x, const double &y, const unsigned int order)
{
const double offset(0.5);
double z(0.);
for (unsigned int n = 0; n <= order; n++) {
for (unsigned int k = 0; k <= order - n; k++) {
if (k + n > 0) {
z += std::pow(x, n) * std::pow(y, k);
}
else {
z += offset;
}
}
}
return z;
}
: m_t(0.1, 0.1, 0.1)
, m_R(M_PI_4, M_PI_4, M_PI_4)
, m_cMo(m_t, m_R)
, m_minX(xlimits.first)
, m_maxX(xlimits.second)
, m_n(nbPoints.first)
, m_minY(ylimits.first)
, m_maxY(ylimits.second)
, m_m(nbPoints.second)
, m_visualizer("Grid of points with / without robust")
{
m_dX = (m_maxX - m_minX) / (static_cast<double>(m_n) - 1.);
m_dY = (m_maxY - m_minY) / (static_cast<double>(m_m) - 1.);
}
{
}
std::pair<vpPclViewer::pclPointCloudPointXYZRGBPtr, vpPclViewer::pclPointCloudPointXYZRGBPtr> ClassUsingPclViewer::generateControlPoints(
const double &addedNoise,
const unsigned int &order,
vpColVector &confidenceWeights)
{
std::pair<vpPclViewer::pclPointCloudPointXYZRGBPtr, vpPclViewer::pclPointCloudPointXYZRGBPtr> result;
confidenceWeights.
resize(m_m * m_n);
vpGaussRand r;
vpColVector residuals(m_m * m_n);
for (unsigned int j = 0; j < m_m; j++) {
for (unsigned int i = 0; i < m_n; i++) {
double oX = m_minX + (double)i * m_dX;
double oY = m_minY + (double)j * m_dY;
double oZ = zFunction(oX, oY, order);
std::vector<double> point = { oX, oY, oZ,1. };
vpColVector oCoords = vpColVector(point);
(*unrotatedControlPoints)(i, j).x = oCoords[0];
(*unrotatedControlPoints)(i, j).y = oCoords[1];
(*unrotatedControlPoints)(i, j).z = oCoords[2];
vpColVector cCoords = m_cMo * oCoords;
(*rotatedControlPoints)(i, j).x = cCoords[0];
(*rotatedControlPoints)(i, j).y = cCoords[1];
double noise = r();
(*rotatedControlPoints)(i, j).z = cCoords[2] + noise;
confidenceWeights[j * m_n + i] = 1.;
residuals[j * m_n + i] = noise;
}
}
if (std::abs(addedNoise) > 0.) {
vpRobust robust;
}
result.first = unrotatedControlPoints;
result.second = rotatedControlPoints;
return result;
}
{
vpColVector confWeights;
std::pair<vpPclViewer::pclPointCloudPointXYZRGBPtr, vpPclViewer::pclPointCloudPointXYZRGBPtr> grids = generateControlPoints(addedNoise, order, confWeights);
unsigned int id_ctrlPts = m_visualizer.addSurface(grids.first, "Standard");
vpColorBlindFriendlyPalette color(vpColorBlindFriendlyPalette::Palette::Purple);
unsigned int id_robust = m_visualizer.addSurface(grids.second, confWeights, "RotatedWithRobust", color.to_RGB());
std::cout << "Press \"q\" while selecting the viewer window to stop the program." << std::endl;
m_visualizer.display();
(void)id_ctrlPts;
(void)id_robust;
}
{
vpColVector confWeights;
std::pair<vpPclViewer::pclPointCloudPointXYZRGBPtr, vpPclViewer::pclPointCloudPointXYZRGBPtr> grids = generateControlPoints(addedNoise, order, confWeights);
unsigned int id_ctrlPts = m_visualizer.addSurface(grids.first, "Standard");
vpColorBlindFriendlyPalette color(vpColorBlindFriendlyPalette::Palette::Purple);
unsigned int id_robust = m_visualizer.addSurface(grids.second, confWeights, "RotatedWithRobust", color.to_RGB());
m_visualizer.launchThread();
m_visualizer.updateSurface(grids.first, id_ctrlPts);
m_visualizer.updateSurface(grids.second, id_robust, confWeights);
vpKeyboard keyboard;
bool wantToStop = false;
double t;
std::cout << "Press any key in the console to stop the program." << std::endl;
while (!wantToStop) {
grids = generateControlPoints(addedNoise, order, confWeights);
m_visualizer.updateSurface(grids.first, id_ctrlPts);
m_visualizer.updateSurface(grids.second, id_robust, confWeights);
wantToStop = true;
}
}
}
#else
void dummy_class_using_pcl_visualizer()
{ }
#endif
void threadedMode(const double &addedNoise, const unsigned int &order)
Demonstration on how to use a vpPclViewer in threaded mode.
~ClassUsingPclViewer()
[Constructor]
ClassUsingPclViewer(std::pair< double, double > xlimits={ -2.5, 2.5 }, std::pair< double, double > ylimits={ -2.5, 2.5 }, std::pair< unsigned int, unsigned int > nbPoints={ 50, 50 })
Construct a new object.
void blockingMode(const double &addedNoise, const unsigned int &order)
Demonstration on how to use a vpPclViewer in blocking mode, i.e. we expect an input from the user aft...
Implementation of column vector and the associated operations.
void resize(unsigned int i, bool flagNullify=true)
void setSigmaMean(double sigma_val, double mean_val)
pcl::PointCloud< pclPointXYZRGB > pclPointCloudPointXYZRGB
pclPointCloudPointXYZRGB::Ptr pclPointCloudPointXYZRGBPtr
@ TUKEY
Tukey influence function.
void MEstimator(const vpRobustEstimatorType method, const vpColVector &residues, vpColVector &weights)
void setMinMedianAbsoluteDeviation(double mad_min)
VISP_EXPORT double measureTimeMs()
VISP_EXPORT int wait(double t0, double t)
VISP_EXPORT double measureTimeMicros()