44         landmark_points.clear();
    52                 frame_poses[frame_ID]    = 
CPose3D(0,0,0,0,0,0);
    53                 landmark_points[feat_ID] = 
TPoint3D(0,0,1);
    71         landmark_points.clear();
    73         if (observations.empty()) 
return;
    89         frame_poses.assign(max_fr_id+1, 
CPose3D(0,0,0,0,0,0) );
    90         landmark_points.assign(max_pt_id+1, 
TPoint3D(0,0,1) );
    98 template <
bool POSES_INVERSE>
   103         const TFramePosesVec::value_type        & frame,
   104         const TLandmarkLocationsVec::value_type & point,
   106         const bool  use_robust_kernel,
   107         const double kernel_param,
   108         double * out_kernel_1st_deriv
   111         const TPixelCoordf  z_pred = mrpt::vision::pinhole::projectPoint_no_distortion<POSES_INVERSE>(camera_params, frame, point);
   114         out_residual[0] = z_meas.x-z_pred.
x;
   115         out_residual[1] = z_meas.y-z_pred.
y;
   117         const double sum_2= 
square(out_residual[0])+
square(out_residual[1]);
   119         if (use_robust_kernel)
   122                 kernel.param_sq = 
square(kernel_param);
   123                 double kernel_1st_deriv, kernel_2nd_deriv;
   125                 sum += kernel.eval(sum_2, kernel_1st_deriv,kernel_2nd_deriv);
   126                 if (out_kernel_1st_deriv) *out_kernel_1st_deriv = kernel_1st_deriv;
   146         const bool  frame_poses_are_inverse,
   147         const bool  use_robust_kernel,
   148         const double kernel_param,
   149         std::vector<double> * out_kernel_1st_deriv
   156         const size_t N = observations.size();
   157         out_residuals.resize(N);
   158         if (out_kernel_1st_deriv) out_kernel_1st_deriv->resize(N);
   160         for (
size_t i=0;i<N;i++)
   169                 ASSERTMSG_(itF!=frame_poses.end(), 
"Frame ID is not in list!")
   170                 ASSERTMSG_(itP!=landmark_points.end(), 
"Landmark ID is not in list!")
   172                 const TFramePosesMap::mapped_type        & frame = itF->second;
   173                 const TLandmarkLocationsMap::mapped_type & point = itP->second;
   175                 double *ptr_1st_deriv = out_kernel_1st_deriv ? &((*out_kernel_1st_deriv)[i]) : NULL;
   177                 if (frame_poses_are_inverse)
   178                         reprojectionResidualsElement<true>(camera_params, OBS, out_residuals[i], frame, point, 
sum, use_robust_kernel,kernel_param,ptr_1st_deriv);
   180                         reprojectionResidualsElement<false>(camera_params, OBS, out_residuals[i], frame, point, 
sum, use_robust_kernel,kernel_param,ptr_1st_deriv);
   194         const bool  frame_poses_are_inverse,
   195         const bool  use_robust_kernel,
   196         const double kernel_param,
   197         std::vector<double> * out_kernel_1st_deriv
   204         const size_t N = observations.size();
   205         out_residuals.resize(N);
   206         if (out_kernel_1st_deriv) out_kernel_1st_deriv->resize(N);
   208         for (
size_t i=0;i<N;i++)
   218                 const TFramePosesVec::value_type        & frame = frame_poses[i_f];
   219                 const TLandmarkLocationsVec::value_type & point = landmark_points[i_p];
   221                 double *ptr_1st_deriv = out_kernel_1st_deriv ? &((*out_kernel_1st_deriv)[i]) : NULL;
   223                 if (frame_poses_are_inverse)
   224                         reprojectionResidualsElement<true>(camera_params, OBS, out_residuals[i], frame, point, 
sum, use_robust_kernel,kernel_param,ptr_1st_deriv);
   226                         reprojectionResidualsElement<false>(camera_params, OBS, out_residuals[i], frame, point, 
sum, use_robust_kernel,kernel_param,ptr_1st_deriv);
   243         const size_t                                  num_fix_frames,
   244         const size_t                                  num_fix_points,
   245         const vector<double>   * kernel_1st_deriv
   250         const size_t N = observations.size();
   251         const bool use_robust_kernel = (kernel_1st_deriv!=NULL);
   253         for (
size_t i=0;i<N;i++)
   260                 const Eigen::Matrix<double,2,1> RESID( &residual_vec[i][0] );
   264                 if (i_f >= num_fix_frames)
   266                         const size_t frame_id = i_f - num_fix_frames;
   271                         JtJ.multiply_AtA(JACOB.
J_frame);
   274                         JACOB.
J_frame.multiply_Atb(RESID, eps_delta); 
   275                         if (!use_robust_kernel)
   277                                 eps_frame[frame_id] += eps_delta;
   281                                 const double rho_1st_der = (*kernel_1st_deriv)[i];
   282                                 eps_frame[frame_id] += eps_delta * rho_1st_der;
   286                 if (i_p >= num_fix_points)
   288                         const size_t point_id = i_p - num_fix_points;
   293                         JtJ.multiply_AtA(JACOB.
J_point);
   296                         JACOB.
J_point.multiply_Atb(RESID, eps_delta); 
   297                         if (!use_robust_kernel)
   299                                 eps_point[point_id] += eps_delta;
   303                                 const double rho_1st_der = (*kernel_1st_deriv)[i];
   304                                 eps_point[point_id] += eps_delta  * rho_1st_der;
   317     const size_t         delta_first_idx,
   318     const size_t         delta_num_vals,
   320         const size_t         num_fix_frames  )
   324         new_frame_poses.resize(frame_poses.size());
   326         for (
size_t i=0;i<num_fix_frames;++i)
   327                 new_frame_poses[i] = frame_poses[i];
   329         size_t delta_used_vals = 0;
   330         const double *delta_val = &delta[delta_first_idx];
   332         for (
size_t i=num_fix_frames;i<frame_poses.size();i++)
   334                 const CPose3D &old_pose = frame_poses[i];
   335                 CPose3D       &new_pose = new_frame_poses[i];
   339                 const CPose3D         incrPose = CPose3D::exp(incr);
   350         ASSERT_(delta_used_vals==delta_num_vals)
   357     const size_t                delta_first_idx,
   358     const size_t                delta_num_vals,
   360         const size_t                num_fix_points )
   364         new_landmark_points.resize(landmark_points.size());
   366         for (
size_t i=0;i<num_fix_points;++i)
   367                 new_landmark_points[i] = landmark_points[i];
   369         size_t delta_used_vals = 0;
   370         const double *delta_val = &delta[delta_first_idx];
   372         for (
size_t i=num_fix_points;i<landmark_points.size();i++)
   374                 const TPoint3D &old_point = landmark_points[i];
   375                 TPoint3D       &new_point = new_landmark_points[i];
   377                 for (
size_t j=0;j<3;j++)
   378                         new_point[j] = old_point[j] + delta_val[j];
   385         ASSERT_(delta_used_vals==delta_num_vals)
 
A pair (x,y) of pixel coordinates (subpixel resolution). 
 
double VISION_IMPEXP reprojectionResiduals(const mrpt::vision::TSequenceFeatureObservations &observations, const mrpt::utils::TCamera &camera_params, const mrpt::vision::TFramePosesVec &frame_poses, const mrpt::vision::TLandmarkLocationsVec &landmark_points, std::vector< mrpt::utils::CArray< double, 2 > > &out_residuals, const bool frame_poses_are_inverse, const bool use_robust_kernel=true, const double kernel_param=3.0, std::vector< double > *out_kernel_1st_deriv=NULL)
Compute reprojection error vector (used from within Bundle Adjustment methods, but can be used in gen...
 
TLandmarkID id_feature
A unique ID of this feature. 
 
Classes for serialization, sockets, ini-file manipulation, streams, list of properties-values, timewatch, extensions to STL. 
 
#define ASSERT_BELOW_(__A, __B)
 
Column vector, like Eigen::MatrixX*, but automatically initialized to zeros since construction...
 
One feature observation entry, used within sequences with TSequenceFeatureObservations. 
 
const Scalar * const_iterator
 
void VISION_IMPEXP add_se3_deltas_to_frames(const mrpt::vision::TFramePosesVec &frame_poses, const mrpt::math::CVectorDouble &delta, const size_t delta_first_idx, const size_t delta_num_vals, mrpt::vision::TFramePosesVec &new_frame_poses, const size_t num_fix_frames)
For each pose in the vector frame_poses, adds a "delta" increment to the manifold, with the "delta" given in the se(3) Lie algebra: 
 
mrpt::utils::TPixelCoordf px
The pixel coordinates of the observed feature. 
 
Helper types for STL containers with Eigen memory allocators. 
 
A complete sequence of observations of features from different camera frames (poses). 
 
T square(const T x)
Inline function for the square of a number. 
 
mrpt::aligned_containers< mrpt::poses::CPose3D >::vector_t TFramePosesVec
A list of camera frames (6D poses), which assumes indexes are unique, consecutive IDs...
 
A numeric matrix of compile-time fixed size. 
 
This base provides a set of functions for maths stuff. 
 
#define MRPT_UNUSED_PARAM(a)
Can be used to avoid "not used parameters" warnings from the compiler. 
 
void composeFrom(const CPose3D &A, const CPose3D &B)
Makes "this = A (+) B"; this method is slightly more efficient than "this= A + B;" since it avoids th...
 
void VISION_IMPEXP add_3d_deltas_to_points(const mrpt::vision::TLandmarkLocationsVec &landmark_points, const mrpt::math::CVectorDouble &delta, const size_t delta_first_idx, const size_t delta_num_vals, mrpt::vision::TLandmarkLocationsVec &new_landmark_points, const size_t num_fix_points)
For each pose in the vector frame_poses, adds a "delta" increment to the manifold, with the "delta" given in the se(3) Lie algebra: 
 
A STL container (as wrapper) for arrays of constant size defined at compile time. ...
 
CONTAINER::Scalar sum(const CONTAINER &v)
Computes the sum of all the elements. 
 
Classes for computer vision, detectors, features, etc. 
 
uint64_t TFeatureID
Definition of a feature ID. 
 
void ba_build_gradient_Hessians(const TSequenceFeatureObservations &observations, const std::vector< mrpt::utils::CArray< double, 2 > > &residual_vec, const mrpt::aligned_containers< JacData< 6, 3, 2 > >::vector_t &jac_data_vec, mrpt::aligned_containers< mrpt::math::CMatrixFixedNumeric< double, 6, 6 > >::vector_t &U, mrpt::aligned_containers< CArrayDouble< 6 > >::vector_t &eps_frame, mrpt::aligned_containers< mrpt::math::CMatrixFixedNumeric< double, 3, 3 > >::vector_t &V, mrpt::aligned_containers< CArrayDouble< 3 > >::vector_t &eps_point, const size_t num_fix_frames, const size_t num_fix_points, const vector< double > *kernel_1st_deriv)
Construct the BA linear system. 
 
void keep_max(T &var, const K test_val)
If the second argument is above the first one, set the first argument to this higher value...
 
Classes for 2D/3D geometry representation, both of single values and probability density distribution...
 
uint64_t TCameraPoseID
Unique IDs for camera frames (poses) 
 
This is the global namespace for all Mobile Robot Programming Toolkit (MRPT) libraries. 
 
#define ASSERTDEB_(f)
Defines an assertion mechanism - only when compiled in debug. 
 
A class used to store a 3D pose (a 3D translation + a rotation in 3D). 
 
mrpt::math::CMatrixFixedNumeric< double, ObsDim, FrameDof > J_frame
 
mrpt::math::CMatrixFixedNumeric< double, ObsDim, PointDof > J_point
 
std::vector< mrpt::math::TPoint3D > TLandmarkLocationsVec
A list of landmarks (3D points), which assumes indexes are unique, consecutive IDs. 
 
A partial specialization of CArrayNumeric for double numbers. 
 
std::map< TLandmarkID, mrpt::math::TPoint3D > TLandmarkLocationsMap
A list of landmarks (3D points) indexed by unique IDs. 
 
TCameraPoseID id_frame
A unique ID of a "frame" (camera position) from where the feature was observed. 
 
void reprojectionResidualsElement(const TCamera &camera_params, const TFeatureObservation &OBS, CArray< double, 2 > &out_residual, const TFramePosesVec::value_type &frame, const TLandmarkLocationsVec::value_type &point, double &sum, const bool use_robust_kernel, const double kernel_param, double *out_kernel_1st_deriv)
 
void VISION_IMPEXP ba_initial_estimate(const mrpt::vision::TSequenceFeatureObservations &observations, const mrpt::utils::TCamera &camera_params, mrpt::vision::TFramePosesVec &frame_poses, mrpt::vision::TLandmarkLocationsVec &landmark_points)
Fills the frames & landmark points maps with an initial gross estimate from the sequence observations...
 
mrpt::aligned_containers< TCameraPoseID, mrpt::poses::CPose3D >::map_t TFramePosesMap
A list of camera frames (6D poses) indexed by unique IDs. 
 
#define ASSERTMSG_(f, __ERROR_MSG)
 
Structure to hold the parameters of a pinhole camera model.