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.