Skip to content

Commit e371b1d

Browse files
committed
Use only yaw rotation for calibration
Pitch and roll offsets usually should be 0 because "up" vector in all VR tracking systems is the same.
1 parent cc4ffa7 commit e371b1d

2 files changed

Lines changed: 31 additions & 30 deletions

File tree

OpenVR-SpaceCalibrator/CalibrationCalc.cpp

Lines changed: 30 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -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;

Version.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
#pragma once
22

3-
#define SPACECAL_VERSION_STRING "1.4-bd_-af-r3"
3+
#define SPACECAL_VERSION_STRING "1.4-bd_-af-r5"

0 commit comments

Comments
 (0)