|
添加 PartialRotation 分支实现:
case TransformationType::PartialRotation:
{
// 检查输入合法
if (allowedRotationAxes.size() != 3)
throw std::invalid_argument("allowedRotationAxes must have 3 elements");
std::vector<int> constrainedAxes;
for (int i = 0; i < 3; ++i)
{
if (!allowedRotationAxes)
constrainedAxes.push_back(i); // 约束这个轴为 0
}
const int numConstraints = static_cast<int>(constrainedAxes.size()) + 1; // +1 for quaternion norm
result.m = numConstraints;
result.gradientFunction = [constrainedAxes](DenseOptimization::ConstVectorRef x,
DenseOptimization::VectorRef outValues,
DenseOptimization::MatrixRef outJacobian) -> void
{
// 平移部分放前 3 个,旋转部分从第 3 开始,四元数 qx,qy,qz,qw
// 假设 quaternion 从 x[3] 到 x[6]
outValues.setZero();
outValues[0] = x.tail<4>().squaredNorm() - 1.0;
outJacobian.setZero();
outJacobian.bottomRows<4>().col(0) = 2.0 * x.tail<4>(); // ∂(q^2 - 1)/∂q
// 添加轴约束
for (size_t i = 0; i < constrainedAxes.size(); ++i)
{
const int idx = constrainedAxes; // 0:x, 1:y, 2:z
outValues[1 + i] = x[3 + idx]; // qx/qy/qz == 0
outJacobian(3 + idx, 1 + i) = 1.0;
}
};
result.hessianFunction = [constrainedAxes](DenseOptimization::ConstVectorRef /*x*/,
DenseOptimization::ConstVectorRef multiplier,
DenseOptimization::MatrixRef outHessian) -> void
{
outHessian.setZero();
outHessian.diagonal().tail<4>().setConstant(2.0 * multiplier[0]);
// 其他部分为常数约束,Hessian为0
};
break;
}
✅ 示例调用:
auto constraints = OptimizableTransformDefinitions<3>::transformationConstraint(
TransformationType::PartialRotation,
{false, false, true} // 只允许 Z 轴旋转
);
🧠 说明:
默认使用四元数旋转(四维)。
该约束函数添加了:
单位四元数约束(归一化)
指定轴为 0 的额外约束(如 qx = 0,代表无 X 轴旋转) |
|