当前位置: 首页 > article >正文

关于ZYZ旋转和XYZ旋转

ZYZ旋转和XYZ旋转

  • 概述
  • 1、XYZ旋转
  • 2、ZYZ旋转

概述

  1. 以下公式默认为右手坐标系;
  2. ZYZ通常可以避免死解情况,因此在六轴末端解算时常被用到;
  3. 参考文章

1、XYZ旋转

XYZ旋转一般是绕固定轴旋转(外旋),旋转矩阵的构成为:RzRyRx。
MATLAB代码:

function R = RotationZYX(xyz)
X = [1, 0, 0; ...
    0, cos(xyz(1)), -sin(xyz(1)); ...
    0, sin(xyz(1)), cos(xyz(1))];
Y = [cos(xyz(2)), 0, sin(xyz(2)); ...
    0, 1, 0; ...
    -sin(xyz(2)), 0, cos(xyz(2))];
Z = [cos(xyz(3)), -sin(xyz(3)), 0; ...
    sin(xyz(3)), cos(xyz(3)), 0; ...
    0, 0, 1];
R = Z * Y * X;
end

C++代码:

cv::Mat EulerToMat(cv::Point3f Euler)
{
	float alpha = Euler.x / 180 * CV_PI;
	float belta = Euler.y / 180 * CV_PI;
	float gamma = Euler.z / 180 * CV_PI;

	cv::Mat Rx = (cv::Mat_<float>(3, 3) << 
			1, 0, 0, 
			0, cos(alpha), -sin(alpha), 
			0, sin(alpha), cos(alpha));

	cv::Mat Ry = (cv::Mat_<float>(3, 3) <<
			cos(belta), 0, sin(belta),
			0, 1, 0,
			-sin(belta), 0, cos(belta)
			);

	cv::Mat Rz = (cv::Mat_<float>(3, 3) <<
			cos(gamma), -sin(gamma), 0,
			sin(gamma), cos(gamma), 0,
			0, 0, 1
			);

	return Rz * Ry * Rx;
}

2、ZYZ旋转

XYZ旋转一般是绕自身轴旋转(内旋),旋转矩阵的构成为:RxRyRz。
在这里插入图片描述
MATLAB代码:

syms a b c
Ra=[cos(a) -sin(a) 0; sin(a) cos(a) 0; 0 0 1];
Rb=[cos(b) 0 sin(b); 0 1 0;-sin(b) 0 cos(b)];
Rc=[cos(c) -sin(c) 0;sin(c) cos(c) 0;0 0 1];
Rzyz=Ra*Rb*Rc

% 定义姿态旋转角度
angle1 = deg2rad(-8.668);  % 绕z轴旋转角度
angle2 = deg2rad(146.282);   % 绕y轴旋转角度
angle3 = deg2rad(175.557);  % 绕新z轴旋转角度

r11 = cos(angle1) * cos(angle2) * cos(angle3) - sin(angle1) * sin(angle3); 
r12 = -cos(angle1) * cos(angle2) * sin(angle3) - sin(angle1) * cos(angle3); 
r13 = cos(angle1) * sin(angle2);
r21 = sin(angle1) * cos(angle2) * cos(angle3) + cos(angle1) * sin(angle3); 
r22 = -sin(angle1) * cos(angle2) * sin(angle3) + cos(angle1) * cos(angle3); 
r23 = sin(angle1) * sin(angle2);
r31 = -sin(angle2) * cos(angle3); 
r32 = sin(angle2) * sin(angle3); 
r33 = cos(angle2);

% 姿态旋转矩阵
ZYZ_matrix = [r11 r12 r13; r21 r22 r23; r31 r32 r33];

C++代码:

float angle1 = config.ReadFloat("Parmeter", "angleA", 0.0);
float angle2 = config.ReadFloat("Parmeter", "angleE", 0.0);
float angle3 = config.ReadFloat("Parmeter", "angleR", 0.0);
angle1 = angle1 * CV_PI / 180;
angle2 = angle2 * CV_PI / 180;
angle3 = angle3 * CV_PI / 180;

float r11 = cos(angle1) * cos(angle2) * cos(angle3) - sin(angle1) * sin(angle3);
float r12 = -cos(angle1) * cos(angle2) * sin(angle3) - sin(angle1) * cos(angle3);
float r13 = cos(angle1) * sin(angle2);
float r21 = sin(angle1) * cos(angle2) * cos(angle3) + cos(angle1) * sin(angle3);
float r22 = -sin(angle1) * cos(angle2) * sin(angle3) + cos(angle1) * cos(angle3);
float r23 = sin(angle1) * sin(angle2);
float r31 = -sin(angle2) * cos(angle3);
float r32 = sin(angle2) * sin(angle3);
float r33 = cos(angle2);
cv::Mat ZYZ_matrix = (cv::Mat_<float>(3, 3) << r11, r12, r13, r21, r22, r23, r31, r32, r33);

http://www.kler.cn/a/229970.html

相关文章:

  • python的openpyxl库设置表格样式:字体/边框/对齐/颜色等
  • CTF之密码学(BF与Ook)
  • Uniapp 安装安卓、IOS模拟器并调试
  • 【SpringCloud详细教程】-04-服务容错--Sentinel
  • SpringBoot 项目中使用 spring-boot-starter-amqp 依赖实现 RabbitMQ
  • 前端适配:常用的几种方案
  • 介绍 MSTest Runner – CLI、Visual Studio 等
  • 前端实现搜索框筛选
  • 【DDD】学习笔记-数据模型与对象模型
  • 微信小程序for循环嵌套
  • 使用STM32 HAL库配置和控制外设接口
  • 【SQL高频基础】1141.查询近30天活跃用户数
  • 基于SSM的实习管理系统(有报告)。Javaee项目。ssm项目。
  • vue2 自定义指令 v-highlight 文本高亮显示分享
  • 常用加密算法
  • 爬虫(三)
  • ELFK日志采 - QuickStart
  • 机器人抓取 [ 题目/摘要 ] 更新中..
  • Golang与Erlang有什么差异
  • 动态规划C语言
  • SpringBoot 事务管理Transactional 数据回滚 数据一致性
  • 工业笔记本丨行业三防笔记本丨亿道加固笔记本定制丨极端温度优势
  • containerd中文翻译系列(五)客户端选项
  • 10英寸安卓车载平板电脑丨ONERugged车载工业平板:解决农业工作效率
  • 符号绑定和函数绑定
  • 详解WebRTC rtc::Thread实现