三维坐标变换——旋转矩阵与旋转向量
2018-02-24 23:25
585 查看
用 opencv 进行过双目相机标定的同学都知道,单目标定 calibrateCamera() 函数能够对每一张标定图像计算出一对 rvec 和 tvec,即旋转平移向量,代表世界坐标系到相机坐标系的转换关系。而 stereoCalibrate() 函数则可以计算出旋转矩阵 R 和平移向量 T,代表左右相机坐标系之间的转换关系。同样是坐标变换,平移倒总是向量,但旋转怎么有时是向量,有时又是矩阵呢?
⎡⎣⎢x′y′z′⎤⎦⎥=R∗⎡⎣⎢xyz⎤⎦⎥[x′y′z′]=R∗[xyz]其中 RR 就是三阶的旋转矩阵。仅仅考虑绕 XX、YY 或 ZZ 单个轴旋转 θθ (右手螺旋),RR 分别为:
RX=⎡⎣⎢1000cosθsinθ0−sinθcosθ⎤⎦⎥RY=⎡⎣⎢cosθ0−sinθ010sinθ0cosθ⎤⎦⎥RZ=⎡⎣⎢cosθsinθ0−sinθcosθ0001⎤⎦⎥RX=[1000cosθ−sinθ0sinθcosθ]RY=[cosθ0sinθ010−sinθ0cosθ]RZ=[cosθ−sinθ0sinθcosθ0001]绕任意轴旋转则可以分解成绕三个坐标轴旋转的叠加,最终得到的旋转矩阵 RR 便是上述三个矩阵的乘积。
矩阵运算显然是计算机三维坐标变换最简单方便的计算方法,因此在 opencv、opengl、工业机器人等开发中,提到位姿旋转变换,多半用的是旋转矩阵。然而,用矩阵来表示一个旋转关系有两个缺点:
首先,通过旋转矩阵不能直观地看出旋转的方向和角度,假设给定一个旋转矩阵,要求旋转方向不变,旋转角度变成一半,那么新的旋转矩阵计算起来就比较麻烦了。
另一方面,旋转变换本身只有3个自由度,但旋转矩阵有9个元素,因此旋转矩阵中的元素不是相互独立的,这在非线性优化中会带来问题。
设旋转向量的单位向量为 rr,模为 θθ。三维点(或者说三维向量)pp 在旋转向量 rr 的作用下变换至 p′p′,则:
p′=cosθ⋅p+(1−cosθ)(p⋅r)r+sinθ⋅r×pp′=cosθ⋅p+(1−cosθ)(p⋅r)r+sinθ⋅r×p显然,旋转向量代表的变换关系十分直观,但运算上要比矩阵形式更加复杂。
opencv 中有函数 Rodrigues() 用于旋转矩阵和旋转向量的转换。参照opencv文档,设旋转向量的单位向量 r=[rx ry rz]Tr=[rx ry rz]T,旋转角度为 θθ,对应的旋转矩阵为 RR,则 rr 到 RR 的转换是:
R=cosθI+(1−cosθ)rrT+sinθ⎡⎣⎢0rz−ry−rz0rxry−rx0⎤⎦⎥R=cosθI+(1−cosθ)rrT+sinθ[0−rzryrz0−rx−ryrx0]其中 II 是三阶单位矩阵。反过来 RR 到 rr 的转换则可以利用等式:
R−RT2=sinθ⎡⎣⎢0rz−ry−rz0rxry−rx0⎤⎦⎥R−RT2=sinθ[0−rzryrz0−rx−ryrx0]
opencv 官方文档中的原话是:
A rotation vector is a convenient and most compact representation of a rotation matrix (since any rotation matrix has just 3 degrees of freedom). The representation is used in the global 3D geometry optimization procedures like calibrateCamera, stereoCalibrate, or solvePnP .
称旋转向量是旋转矩阵方便而且最紧凑的表示方法,被用于一些需要全局三维几何优化的函数中。
旋转矩阵
参考csxiaoshui的博客,三维旋转变换可以看成是矩阵乘法运算,即:⎡⎣⎢x′y′z′⎤⎦⎥=R∗⎡⎣⎢xyz⎤⎦⎥[x′y′z′]=R∗[xyz]其中 RR 就是三阶的旋转矩阵。仅仅考虑绕 XX、YY 或 ZZ 单个轴旋转 θθ (右手螺旋),RR 分别为:
RX=⎡⎣⎢1000cosθsinθ0−sinθcosθ⎤⎦⎥RY=⎡⎣⎢cosθ0−sinθ010sinθ0cosθ⎤⎦⎥RZ=⎡⎣⎢cosθsinθ0−sinθcosθ0001⎤⎦⎥RX=[1000cosθ−sinθ0sinθcosθ]RY=[cosθ0sinθ010−sinθ0cosθ]RZ=[cosθ−sinθ0sinθcosθ0001]绕任意轴旋转则可以分解成绕三个坐标轴旋转的叠加,最终得到的旋转矩阵 RR 便是上述三个矩阵的乘积。
矩阵运算显然是计算机三维坐标变换最简单方便的计算方法,因此在 opencv、opengl、工业机器人等开发中,提到位姿旋转变换,多半用的是旋转矩阵。然而,用矩阵来表示一个旋转关系有两个缺点:
首先,通过旋转矩阵不能直观地看出旋转的方向和角度,假设给定一个旋转矩阵,要求旋转方向不变,旋转角度变成一半,那么新的旋转矩阵计算起来就比较麻烦了。
另一方面,旋转变换本身只有3个自由度,但旋转矩阵有9个元素,因此旋转矩阵中的元素不是相互独立的,这在非线性优化中会带来问题。
旋转向量
向量旋转公式最早由 Rodrigues 提出,用一个三维向量来表示三维旋转变换,该向量的方向是旋转轴,其模则是旋转角度。百度百科中有其详细的介绍与推导,我在这边只列一下最重要的公式。设旋转向量的单位向量为 rr,模为 θθ。三维点(或者说三维向量)pp 在旋转向量 rr 的作用下变换至 p′p′,则:
p′=cosθ⋅p+(1−cosθ)(p⋅r)r+sinθ⋅r×pp′=cosθ⋅p+(1−cosθ)(p⋅r)r+sinθ⋅r×p显然,旋转向量代表的变换关系十分直观,但运算上要比矩阵形式更加复杂。
相互转换
用矩阵形式和向量形式表示旋转变换各有优劣势,因此经常需要来回转换,这里跟数学中的李群与李代数有所关联,本人目前还一知半解,可以参考半闲居士的博客。opencv 中有函数 Rodrigues() 用于旋转矩阵和旋转向量的转换。参照opencv文档,设旋转向量的单位向量 r=[rx ry rz]Tr=[rx ry rz]T,旋转角度为 θθ,对应的旋转矩阵为 RR,则 rr 到 RR 的转换是:
R=cosθI+(1−cosθ)rrT+sinθ⎡⎣⎢0rz−ry−rz0rxry−rx0⎤⎦⎥R=cosθI+(1−cosθ)rrT+sinθ[0−rzryrz0−rx−ryrx0]其中 II 是三阶单位矩阵。反过来 RR 到 rr 的转换则可以利用等式:
R−RT2=sinθ⎡⎣⎢0rz−ry−rz0rxry−rx0⎤⎦⎥R−RT2=sinθ[0−rzryrz0−rx−ryrx0]
opencv 官方文档中的原话是:
A rotation vector is a convenient and most compact representation of a rotation matrix (since any rotation matrix has just 3 degrees of freedom). The representation is used in the global 3D geometry optimization procedures like calibrateCamera, stereoCalibrate, or solvePnP .
称旋转向量是旋转矩阵方便而且最紧凑的表示方法,被用于一些需要全局三维几何优化的函数中。
相关文章推荐
- 三维世界里的坐标和变换,逆方向旋转移动三维世界的方式来实现3D漫游
- 二维坐标变换三维坐标未解答
- openGL三维网格坐标,旋转,缩放,灯光设置,纹理读取,模型读取(MFC单文档)
- OpenCV 旋转向量与旋转矩阵转化(罗德里格斯 )
- 刚体在三维空间的旋转(关于旋转矩阵、DCM、旋转向量、四元数、欧拉角)
- 刚体在三维空间的旋转(关于旋转矩阵、DCM、旋转向量、四元数、欧拉角)
- 根据旋转前后的向量值求旋转矩阵
- 根据旋转前后的向量值求旋转矩阵
- 三维坐标点绕任意轴旋转的新坐标计算
- POJ 1835 宇航员 (模拟&三维向量旋转)
- OpenGL ES2.0中shader,当顶点坐标做旋转和平移的过程中,顶点法向量不需要要做相应的旋转
- OpengGL - 旋转彩色立方体(glDrawElements & 鼠标键盘操作 & 三维图形变换)
- 根据旋转前后的向量值求旋转矩阵
- ArcBall坐标旋转三维物体原理
- HDU 4449 Building Design 第37届ACM/ICPC 金华赛区H题 (计算几何,三维凸包+空间坐标旋转+二维凸包)
- OpenCV 根据对应的三维点估计刚体变换的旋转平移矩阵(RT矩阵)
- 二维和三维向量的旋转
- 详解游戏中的旋转坐标变换
- Nyoj 298 点的变换[利用矩阵求解坐标点的转换,平移,绕原点旋转,沿x,y轴翻转]
- 三维坐标变换