Eigen库中四元数运算q * q.adjoint()的含义与作用是什么?
q * q.adjoint()的具体含义
这段代码里的q是Eigen::Quaternion类型,运算时会被隐式转换为存储四元数系数的4维实列向量:
- 实向量的
adjoint()方法等价于转置操作,返回1行4列的行向量 - 4维列向量乘以1维行向量的运算本质是向量外积(并矢运算),最终得到的
A是4×4的实对称自伴矩阵,该矩阵秩为1,唯一非零特征值等于四元数q的模长平方$||q||^2$,对应特征向量就是q本身的系数向量。
如果你的场景中q是单位四元数(绝大多数四元数处理旋转的场景都是单位四元数),那这个非零特征值就是1。
执行该运算的目的
这段逻辑是多四元数平均经典算法的核心实现片段,你看到的应该是单样本下的简化演示:
- 多四元数平均的需求背景是:同一个旋转可以用
q和-q两个互为相反数的四元数表示,不能直接对四元数系数做算术平均得到正确结果。 - 对应算法的完整流程是:
- 首先对所有待平均的四元数做符号统一:如果四元数实部小于0就取反,避免符号抵消
- 对每个四元数计算外积矩阵并累加得到总矩阵
A - 对自伴矩阵
A做特征分解,Eigen的SelfAdjointEigenSolver会默认把特征值按升序排列,索引为3的列就是最大特征值对应的特征向量,也就是最小化所有样本四元数平方距离的平均四元数。
如果只有单个四元数参与计算,得到的q_avg就是符号统一后的原四元数。
内容的提问来源于stack exchange,提问作者chan
相关产品推荐
相关产品推荐

