40 #ifndef PCL_REGISTRATION_TRANSFORMATION_ESTIMATION_DQ_HPP_
41 #define PCL_REGISTRATION_TRANSFORMATION_ESTIMATION_DQ_HPP_
43 #include <pcl/common/eigen.h>
46 "TransformationEstimationDQ has been renamed to "
47 "TransformationEstimationDualQuaternion.");
51 namespace registration {
53 template <
typename Po
intSource,
typename Po
intTarget,
typename Scalar>
58 Matrix4& transformation_matrix)
const
60 const auto nr_points = cloud_src.
size();
61 if (cloud_tgt.
size() != nr_points) {
62 PCL_ERROR(
"[pcl::TransformationEstimationDQ::estimateRigidTransformation] Number "
63 "or points in source (%zu) differs than target (%zu)!\n",
64 static_cast<std::size_t
>(nr_points),
65 static_cast<std::size_t
>(cloud_tgt.
size()));
71 estimateRigidTransformation(source_it, target_it, transformation_matrix);
74 template <
typename Po
intSource,
typename Po
intTarget,
typename Scalar>
80 Matrix4& transformation_matrix)
const
82 if (indices_src.size() != cloud_tgt.
size()) {
83 PCL_ERROR(
"[pcl::TransformationDQ::estimateRigidTransformation] Number or points "
84 "in source (%zu) differs than target (%zu)!\n",
86 static_cast<std::size_t
>(cloud_tgt.
size()));
92 estimateRigidTransformation(source_it, target_it, transformation_matrix);
95 template <
typename Po
intSource,
typename Po
intTarget,
typename Scalar>
102 Matrix4& transformation_matrix)
const
104 if (indices_src.size() != indices_tgt.size()) {
105 PCL_ERROR(
"[pcl::TransformationEstimationDQ::estimateRigidTransformation] Number "
106 "or points in source (%zu) differs than target (%zu)!\n",
114 estimateRigidTransformation(source_it, target_it, transformation_matrix);
117 template <
typename Po
intSource,
typename Po
intTarget,
typename Scalar>
123 Matrix4& transformation_matrix)
const
127 estimateRigidTransformation(source_it, target_it, transformation_matrix);
130 template <
typename Po
intSource,
typename Po
intTarget,
typename Scalar>
135 Matrix4& transformation_matrix)
const
137 const int npts =
static_cast<int>(source_it.
size());
139 transformation_matrix.setIdentity();
142 Eigen::Matrix<Scalar, 4, 4> C1 = Eigen::Matrix<Scalar, 4, 4>::Zero();
143 Eigen::Matrix<Scalar, 4, 4> C2 = Eigen::Matrix<Scalar, 4, 4>::Zero();
144 Scalar* c1 = C1.data();
145 Scalar* c2 = C2.data();
147 for (
int i = 0; i < npts; i++) {
148 const PointSource& a = *source_it;
149 const PointTarget& b = *target_it;
150 const Scalar axbx = a.x * b.x;
151 const Scalar ayby = a.y * b.y;
152 const Scalar azbz = a.z * b.z;
153 const Scalar axby = a.x * b.y;
154 const Scalar aybx = a.y * b.x;
155 const Scalar axbz = a.x * b.z;
156 const Scalar azbx = a.z * b.x;
157 const Scalar aybz = a.y * b.z;
158 const Scalar azby = a.z * b.y;
159 c1[0] += axbx - azbz - ayby;
160 c1[5] += ayby - azbz - axbx;
161 c1[10] += azbz - axbx - ayby;
162 c1[15] += axbx + ayby + azbz;
163 c1[1] += axby + aybx;
164 c1[2] += axbz + azbx;
165 c1[3] += aybz - azby;
166 c1[6] += azby + aybz;
167 c1[7] += azbx - axbz;
168 c1[11] += axby - aybx;
196 const Eigen::Matrix<Scalar, 4, 4> A =
197 (0.25f / float(npts)) * C2.transpose() * C2 - C1;
199 const Eigen::EigenSolver<Eigen::Matrix<Scalar, 4, 4>> es(A);
202 es.eigenvalues().real().maxCoeff(&i);
203 const Eigen::Matrix<Scalar, 4, 1> qmat = es.eigenvectors().col(i).real();
204 const Eigen::Matrix<Scalar, 4, 1> smat = -(0.5f / float(npts)) * C2 * qmat;
206 const Eigen::Quaternion<Scalar> q(qmat(3), qmat(0), qmat(1), qmat(2));
207 const Eigen::Quaternion<Scalar> s(smat(3), smat(0), smat(1), smat(2));
209 const Eigen::Quaternion<Scalar> t = s * q.conjugate();
211 const Eigen::Matrix<Scalar, 3, 3> R(q.toRotationMatrix());
213 for (
int i = 0; i < 3; ++i)
214 for (
int j = 0; j < 3; ++j)
215 transformation_matrix(i, j) = R(i, j);
217 transformation_matrix(0, 3) = -t.x();
218 transformation_matrix(1, 3) = -t.y();
219 transformation_matrix(2, 3) = -t.z();
Iterator class for point clouds with or without given indices.
std::size_t size() const
Size of the range the iterator is going through.
std::vector< pcl::Correspondence, Eigen::aligned_allocator< pcl::Correspondence > > Correspondences
IndicesAllocator<> Indices
Type used for indices in PCL.
#define PCL_DEPRECATED_HEADER(Major, Minor, Message)
macro for compatibility across compilers and help remove old deprecated headers for the Major....