cayley变换/参数
参考链接:
- http://blog.leanote.com/post/610167078@qq.com/cayley%E5%8F%98%E6%8D%A2
- https://blog.youkuaiyun.com/J10527/article/details/70140264
旋转向量与旋转矩阵之间的相互转换是通过罗德里格斯公式建立起来的:
其中r为旋转向量,R为旋转矩阵。其反过程可有下式确定:
除此之外,还有凯莱公式(Cayley formula)可以将旋转向量转化为旋转矩阵,该公式也有说是欧拉发现的:
其中A为旋转向量对应的反对称阵。值得一提的是,同一个旋转向量用凯莱公式和罗德里格斯公式转化得到的旋转矩阵通常并不相等,但都是旋转矩阵。
凯莱公式的逆变换为:
使用凯莱公式计算旋转矩阵,计算量会比罗德里格斯公式小很多。
MultiCol-Slam 接受的外参传入数据 为对旋转矩阵R进行了CAYLAY变换后的结果,其代码为:
template<typename T>
cv::Matx<T, 3, 1> rot2cayley(const cv::Matx<T, 3, 3>& R)
{
cv::Matx<T, 3, 3> eyeM = cv::Matx<T, 3, 3>::eye();
cv::Matx<T, 3, 3> C1 = R - eyeM;
cv::Matx<T, 3, 3> C2 = R + eyeM;
cv::Matx<T, 3, 3> C = C1 * C2.inv();
cv::Matx<T, 3, 1> cayley(-C(1, 2), C(0, 2), -C(0, 1));
return cayley;
}
因为旋转矩阵一定是正交矩阵,因此, 对于旋转矩阵R, 进行(R-I)* inv((R+I)) 后生成的矩阵C为反对称矩阵,这里取 -C(1, 2), C(0, 2), -C(0, 1),作为参数传入。反对称矩阵可由一个向量对应,这里的代码实际上是由旋转矩阵经过cayley变换得到旋转向量对应的反对称矩阵,然后提取出来旋转向量。使用cayley变换计算旋转矩阵,计算量会比罗德里格斯公式小很多。