python 和c++实现旋转矩阵到欧拉角的变换方式


Posted in Python onDecember 04, 2019

在摄影测量学科中,国际摄影测量遵循OPK系统,即是xyz转角系统,而工业中往往使用zyx转角系统。

旋转矩阵的意义:描述相对地面的旋转情况,yaw-pitch-roll对应zyx对应k,p,w

#include <iostream>
#include<stdlib.h>
#include<eigen3/Eigen/Core>
#include<eigen3/Eigen/Dense>
#include<stdlib.h>
using namespace std;
Eigen::Matrix3d rotationVectorToMatrix(Eigen::Vector3d theta)
{
  Eigen::Matrix3d R_x=Eigen::AngleAxisd(theta(0),Eigen::Vector3d(1,0,0)).toRotationMatrix();
  Eigen::Matrix3d R_y=Eigen::AngleAxisd(theta(1),Eigen::Vector3d(0,1,0)).toRotationMatrix();
  Eigen::Matrix3d R_z=Eigen::AngleAxisd(theta(2),Eigen::Vector3d(0,0,1)).toRotationMatrix();
  return R_z*R_y*R_x;

}
bool isRotationMatirx(Eigen::Matrix3d R)
{
  int err=1e-6;//判断R是否奇异
  Eigen::Matrix3d shouldIdenity;
  shouldIdenity=R*R.transpose();
  Eigen::Matrix3d I=Eigen::Matrix3d::Identity();
  return (shouldIdenity-I).norm()<err?true:false;
}

int main(int argc, char *argv[])
{
  Eigen::Matrix3d R;
  Eigen::Vector3d theta(rand() % 360 - 180.0, rand() % 360 - 180.0, rand() % 360 - 180.0);
  theta=theta*M_PI/180;
  cout<<"旋转向量是:\n"<<theta.transpose()<<endl;
  R=rotationVectorToMatrix(theta);
  cout<<"旋转矩阵是:\n"<<R<<endl;
  if(! isRotationMatirx(R)){
   cout<<"旋转矩阵--->欧拉角\n"<<R.eulerAngles(2,1,0).transpose()<<endl;//z-y-x顺序,与theta顺序是x,y,z
  }
  else{
    assert(isRotationMatirx(R));
  }

  return 0;
}

python 和c++实现旋转矩阵到欧拉角的变换方式

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import cv2
import numpy as np
import math
import random

def isRotationMatrix(R) :
  Rt = np.transpose(R)
  shouldBeIdentity = np.dot(Rt, R)
  I = np.identity(3, dtype = R.dtype)
  n = np.linalg.norm(I - shouldBeIdentity)
  return n < 1e-6

def rotationMatrixToEulerAngles(R) :

  assert(isRotationMatrix(R))
  
  sy = math.sqrt(R[0,0] * R[0,0] + R[1,0] * R[1,0])
  
  singular = sy < 1e-6

  if not singular :
    x = math.atan2(R[2,1] , R[2,2])
    y = math.atan2(-R[2,0], sy)
    z = math.atan2(R[1,0], R[0,0])
  else :
    x = math.atan2(-R[1,2], R[1,1])
    y = math.atan2(-R[2,0], sy)
    z = 0

  return np.array([x, y, z])

def eulerAnglesToRotationMatrix(theta) :
  
  R_x = np.array([[1,     0,         0          ],
          [0,     math.cos(theta[0]), -math.sin(theta[0]) ],
          [0,     math.sin(theta[0]), math.cos(theta[0]) ]
          ])
    
    
          
  R_y = np.array([[math.cos(theta[1]),  0,   math.sin(theta[1]) ],
          [0,           1,   0          ],
          [-math.sin(theta[1]),  0,   math.cos(theta[1]) ]
          ])
        
  R_z = np.array([[math.cos(theta[2]),  -math.sin(theta[2]),  0],
          [math.sin(theta[2]),  math.cos(theta[2]),   0],
          [0,           0,           1]
          ])
          
          
  R = np.dot(R_z, np.dot( R_y, R_x ))

  return R


if __name__ == '__main__' :

  e = np.random.rand(3) * math.pi * 2 - math.pi
  
  R = eulerAnglesToRotationMatrix(e)
  e1 = rotationMatrixToEulerAngles(R)

  R1 = eulerAnglesToRotationMatrix(e1)
  print ("\nInput Euler angles :\n{0}".format(e))
  print ("\nR :\n{0}".format(R))
  print ("\nOutput Euler angles :\n{0}".format(e1))
  print ("\nR1 :\n{0}".format(R1))

以上这篇python 和c++实现旋转矩阵到欧拉角的变换方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python中将字典转换成其json字符串
Jul 16 Python
Python中zip()函数用法实例教程
Jul 31 Python
Python统计日志中每个IP出现次数的方法
Jul 06 Python
在类Unix系统上开始Python3编程入门
Aug 20 Python
Python判断值是否在list或set中的性能对比分析
Apr 16 Python
深入理解python函数递归和生成器
Jun 06 Python
python urllib urlopen()对象方法/代理的补充说明
Jun 29 Python
Python OpenCV处理图像之图像像素点操作
Jul 10 Python
Python中矩阵创建和矩阵运算方法
Aug 04 Python
python八皇后问题的解决方法
Sep 27 Python
如何基于Python制作有道翻译小工具
Dec 16 Python
python如何利用cv2模块读取显示保存图片
Jun 04 Python
python实现一个点绕另一个点旋转后的坐标
Dec 04 #Python
Django配置文件代码说明
Dec 04 #Python
python实现回旋矩阵方式(旋转矩阵)
Dec 04 #Python
在Django下创建项目以及设置settings.py教程
Dec 03 #Python
Django自带的加密算法及加密模块详解
Dec 03 #Python
python Opencv计算图像相似度过程解析
Dec 03 #Python
django 中使用DateTime常用的时间查询方式
Dec 03 #Python
You might like
发布一个迷你php+AJAX聊天程序[聊天室]提供下载
2007/07/21 PHP
PHP根据两点间的经纬度计算距离
2014/10/31 PHP
php使用ZipArchive提示Fatal error: Class ZipArchive not found in的解决方法
2014/11/04 PHP
php基于curl实现随机ip地址抓取内容的方法
2016/10/11 PHP
让ThinkPHP的模板引擎达到最佳效率的方法详解
2017/03/14 PHP
PHP Include文件实例讲解
2019/02/15 PHP
关于Laravel-admin的基础用法总结和自定义model详解
2019/10/08 PHP
解决laravel资源加载路径设置的问题
2019/10/14 PHP
通过隐藏iframe实现文件下载的js方法介绍
2014/02/26 Javascript
jQuery处理json数据返回数组和输出的方法
2015/03/11 Javascript
js实现简单div拖拽功能实例
2015/05/12 Javascript
如何解决手机浏览器页面点击不跳转浏览器双击放大网页
2016/07/01 Javascript
Bootstrap对话框使用实例讲解
2016/09/24 Javascript
利用jQuery解析获取JSON数据
2017/04/08 jQuery
vue项目首屏打开速度慢的解决方法
2019/03/31 Javascript
VSCode搭建Vue项目的方法
2020/04/30 Javascript
从零学Python之入门(四)运算
2014/05/27 Python
Python Pandas找到缺失值的位置方法
2018/04/12 Python
python删除本地夹里重复文件的方法
2020/11/19 Python
python实现zabbix发送短信脚本
2018/09/17 Python
Python实现查找字符串数组最长公共前缀示例
2019/03/27 Python
Python如何把多个PDF文件合并代码实例
2020/02/13 Python
python变量的作用域是什么
2020/05/26 Python
HTML5的结构和语义(2):结构
2008/10/17 HTML / CSS
详解Canvas 跨域脱坑实践
2018/11/07 HTML / CSS
HTML5页面嵌入小程序没有返回按钮及返回页面空白的问题
2020/05/28 HTML / CSS
美国最大的无人机经销商:DroneNerds
2018/03/20 全球购物
DC Shoes澳大利亚官方网上商店:购买DC鞋子
2019/10/25 全球购物
环境工程求职简历的自我评价范文
2013/10/24 职场文书
社会学专业求职信
2014/02/24 职场文书
出国英文推荐信
2014/05/10 职场文书
全国文明单位申报材料
2014/05/31 职场文书
低碳环保口号
2014/06/12 职场文书
倡议书范文大全
2015/04/28 职场文书
幼儿教师继续教育培训心得体会
2016/01/19 职场文书
pytorch 梯度NAN异常值的解决方案
2021/06/05 Python