zoukankan      html  css  js  c++  java
  • 根据相机旋转矩阵求解三个轴的旋转角/欧拉角/姿态角

    关键词:旋转矩阵 旋转角 欧拉角 姿态角

    用途:相机位姿估计、无人机位姿估计、各种位姿估计

    文章类型:概念、公式总结(本文不带推倒过程,若想了解公式是如何推出来的请自习搜索文献),C++函数展示

    @Author:VShawn(singlex@foxmail.com)

    @Date:2016-11-04

    @Lab: CvLab202@CSU

         

    前言

    相机标定后得出了旋转矩阵,而后应该怎么通过旋转矩阵表示相机姿态这一问题估计困扰过每一位研究这一问题的新同学,那么本文就给出我的一种做法,帮助大家少走歪路。当然有什么好的想法,或者更牛的办法也欢迎留言交流斧正。当然,公式的推倒就不要找我了,参考文献比我厉害多了

    公式

    有旋转矩阵

    [R ext{=}left( egin{matrix} {{r}_{11}} & {{r}_{12}} & {{r}_{13}} \ {{r}_{21}} & {{r}_{22}} & {{r}_{23}} \ {{r}_{31}} & {{r}_{32}} & {{r}_{33}} \end{matrix} ight)]

    那么可求出各轴旋转角:

    Z轴:

        [{{ heta }_{z}}=a an 2({{r}_{21}},{{r}_{11}})]

    Y轴

    [{{ heta }_{y}}=a an 2(-{{r}_{31}},sqrt{{{r}_{31}}^{2}+{{r}_{33}}^{2}})]

    X轴

    [{{ heta }_{x}}=a an 2({{r}_{32}},{{r}_{33}})]

    注:atan2C++中函数,atan2(y,x)的做法:当 x 的绝对值比 y 的绝对值大时使用 atan(y/x);反之使用 atan(x/y)。这样就保证了数值稳定性。

    上面公式的意思是,相机坐标系想要转到与世界坐标系完全平行(即xc平行于xw,yc平行于yw,zc平行于zw,且他们的方向都是相同的),需要旋转3次,设原始相机坐标系为C0

    1、C0绕其z轴旋转,得到新的坐标系C1

    2、C1绕其y轴旋转,得到新的坐标系C2(注意旋转轴为C1的y轴,而非C0的y轴);

    3、C2绕其x轴旋转,得到新的坐标系C3。此时C3与世界坐标系W完全平行。

    特别注意:旋转顺序为z y x,切记不能调换。

    C++程序

    代码就比较简单了

    r11-r33从旋转矩阵中提出,为double型变量。

        //计算出相机坐标系的三轴旋转欧拉角,旋转后可以转出世界坐标系。
        //旋转顺序为z、y、x
        const double PI = 3.141592653;
        double thetaz = atan2(r21, r11) / PI * 180;
        double thetay = atan2(-1 * r31, sqrt(r32*r32 + r33*r33)) / PI * 180;
        double thetax = atan2(r32, r33) / PI * 180;
    

    参考文献

    Computing Euler angles from a rotation matrix. Gregory G. Slabaugh

    http://www.staff.city.ac.uk/~sbbh653/publications/euler.pdf

  • 相关阅读:
    查看每个核的资源情况
    什么时候使用NO_UNNEST
    走FILTER效率高的2种情况
    PL/SQL 包头和包体
    产品研发要配合好
    ElasticSearch 文档并发处理以及文档路由
    ES(ElasticSearch) 索引创建
    BaikalDB技术实现内幕(三)--代价模型实现
    腾讯位置服务地图SDK自定义地图和路况
    mysql数据库优化
  • 原文地址:https://www.cnblogs.com/singlex/p/RotateMatrix2Euler.html
Copyright © 2011-2022 走看看