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安装使用命令行交互模块pexpect的基础教程
May 12 Python
关于Python数据结构中字典的心得
Dec 04 Python
用tensorflow实现弹性网络回归算法
Jan 09 Python
使用Scrapy爬取动态数据
Oct 21 Python
python+PyQT实现系统桌面时钟
Jun 16 Python
python实现矩阵打印
Mar 02 Python
python opencv 二值化 计算白色像素点的实例
Jul 03 Python
python中tkinter的应用:修改字体的实例讲解
Jul 17 Python
python爬虫 urllib模块url编码处理详解
Aug 20 Python
详解Python利用random生成一个列表内的随机数
Aug 21 Python
详解pandas.DataFrame.plot() 画图函数
Jun 14 Python
Python matplotlib读取excel数据并用for循环画多个子图subplot操作
Jul 14 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
收音机玩机评测 406 篇视频合集
2020/03/11 无线电
php将文本文件转换csv输出的方法
2014/12/31 PHP
2017年最新PHP经典面试题目汇总(上篇)
2017/03/17 PHP
YII框架中使用memcache的方法详解
2017/08/02 PHP
php爬取天猫和淘宝商品数据
2018/02/23 PHP
div层的移动及性能优化
2010/11/16 Javascript
基于dom编程中 动态创建与删除元素的使用
2013/04/17 Javascript
JS JSON对象转为字符串的简单实现方法
2013/11/18 Javascript
详解Javacript和AngularJS中的Promises
2016/02/09 Javascript
js本地图片预览实现代码
2016/10/09 Javascript
jQuery学习笔记——jqGrid的使用记录(实现分页、搜索功能)
2016/11/09 Javascript
bootstrap css样式之表单
2017/01/19 Javascript
详谈JS中数组的迭代方法和归并方法
2017/08/11 Javascript
JS去掉字符串中所有的逗号
2017/10/18 Javascript
vue引入js数字小键盘的实现代码
2018/05/14 Javascript
webpack 3.X学习之多页面打包的方法
2018/09/04 Javascript
ES6 Set结构的应用实例分析
2019/06/26 Javascript
Python多线程编程简单介绍
2015/04/13 Python
Python里disconnect UDP套接字的方法
2015/04/23 Python
Pyhton中单行和多行注释的使用方法及规范
2016/10/11 Python
Opencv+Python 色彩通道拆分及合并的示例
2018/12/08 Python
Python3 Post登录并且保存cookie登录其他页面的方法
2018/12/28 Python
浅谈python之高阶函数和匿名函数
2019/03/21 Python
Python高级特性之闭包与装饰器实例详解
2019/11/19 Python
Pytorch 定义MyDatasets实现多通道分别输入不同数据方式
2020/01/15 Python
keras 多任务多loss实例
2020/06/22 Python
python Yaml、Json、Dict之间的转化
2020/10/19 Python
GitHub上值得推荐的8个python 项目
2020/10/30 Python
李维斯牛仔裤荷兰官方网站:Levi’s NL
2020/08/23 全球购物
编写用C语言实现的求n阶阶乘问题的递归算法
2014/10/21 面试题
葡萄牙语专业个人求职信
2013/12/10 职场文书
爱护公物标语
2014/06/24 职场文书
战马观后感
2015/06/08 职场文书
简历自我评价范文
2019/04/24 职场文书
Django操作cookie的实现
2021/05/26 Python
mysql序号rownum行号实现方式
2022/12/24 MySQL