@@ -139,42 +139,43 @@ Eigen::Vector3d CalibrationCalc::CalibrateRotation() const {
139139
140140 // Kabsch algorithm
141141
142- Eigen::MatrixXd refPoints (deltas.size (), 3 ), targetPoints (deltas.size (), 3 );
143- Eigen::Vector3d refCentroid (0 , 0 , 0 ), targetCentroid (0 , 0 , 0 );
142+ // Initialize 2D points and centroids
143+ Eigen::MatrixXd refPoints (deltas.size (), 2 ), targetPoints (deltas.size (), 2 );
144+ Eigen::Vector2d refCentroid (0 , 0 ), targetCentroid (0 , 0 );
144145
145- for ( size_t i = 0 ; i < deltas. size (); i++)
146- {
147- refPoints.row (i) = deltas[i].ref ;
148- refCentroid += deltas[i]. ref ;
146+ // Fill matrices and calculate centroids
147+ for ( size_t i = 0 ; i < deltas. size (); i++) {
148+ refPoints.row (i) << deltas[i].ref [ 0 ], deltas[i]. ref [ 2 ]; // Take only the x and z components
149+ refCentroid += refPoints. row (i) ;
149150
150- targetPoints.row (i) = deltas[i].target ;
151- targetCentroid += deltas[i]. target ;
152- }
151+ targetPoints.row (i) << deltas[i].target [ 0 ], deltas[i]. target [ 2 ]; // Take only the x and z components
152+ targetCentroid += targetPoints. row (i) ;
153+ }
153154
154- refCentroid /= (double )deltas.size ();
155- targetCentroid /= (double )deltas.size ();
155+ refCentroid /= (double )deltas.size ();
156+ targetCentroid /= (double )deltas.size ();
156157
157- for ( size_t i = 0 ; i < deltas. size (); i++)
158- {
159- refPoints.row (i) -= refCentroid;
160- targetPoints.row (i) -= targetCentroid;
161- }
158+ // Center the points
159+ for ( size_t i = 0 ; i < deltas. size (); i++) {
160+ refPoints.row (i) -= refCentroid;
161+ targetPoints.row (i) -= targetCentroid;
162+ }
162163
163- auto crossCV = refPoints.transpose () * targetPoints;
164+ // Calculate cross-covariance matrix
165+ auto crossCV = refPoints.transpose () * targetPoints;
164166
165- Eigen:: BDCSVD <Eigen::MatrixXd> bdcsvd;
166- auto svd = bdcsvd. compute (crossCV, Eigen::ComputeThinU | Eigen::ComputeThinV);
167+ // Singular Value Decomposition (SVD)
168+ Eigen::JacobiSVD<Eigen::MatrixXd> svd (crossCV, Eigen::ComputeThinU | Eigen::ComputeThinV);
167169
168- Eigen::Matrix3d i = Eigen::Matrix3d::Identity ();
169- if ((svd.matrixU () * svd.matrixV ().transpose ()).determinant () < 0 )
170- {
171- i (2 , 2 ) = -1 ;
172- }
170+ // Calculate 2D rotation matrix
171+ Eigen::Matrix2d i = Eigen::Matrix2d::Identity ();
172+ Eigen::Matrix2d rot = svd.matrixV () * i * svd.matrixU ().transpose ();
173173
174- Eigen::Matrix3d rot = svd. matrixV () * i * svd. matrixU (). transpose ();
175- rot. transposeInPlace ( );
174+ // Calculate yaw angle in radians
175+ double yaw = std::atan2 ( rot ( 1 , 0 ), rot ( 0 , 0 ) );
176176
177- Eigen::Vector3d euler = rot.eulerAngles (2 , 1 , 0 ) * 180.0 / EIGEN_PI ;
177+ // Convert to degrees
178+ Eigen::Vector3d euler (0.0 , yaw * 180.0 / EIGEN_PI , 0.0 );
178179
179180 // snprintf(buf, sizeof buf, "Calibrated rotation: yaw=%.2f pitch=%.2f roll=%.2f\n", euler[1], euler[2], euler[0]);
180181 // CalCtx.Log(buf);
@@ -546,8 +547,8 @@ bool CalibrationCalc::ComputeIncremental(bool &lerp, double threshold) {
546547 ValidateCalibration (byRelPose, &relPoseError, &relPosOffset);
547548 Metrics::posOffset_byRelPose.Push (relPosOffset * 1000 );
548549 Metrics::error_byRelPose.Push (relPoseError * 1000 );
549-
550- if (relPoseError < 0.015 || m_relativePosCalibrated && relPoseError < 0.035 ) {
550+
551+ if (relPoseError < 0.010 || m_relativePosCalibrated && relPoseError < 0.025 ) {
551552 newCalibrationValid = true ;
552553 usingRelPose = true ;
553554 newError = relPoseError;
0 commit comments