四元数实现三维绕轴旋转

MATLAB 四元数旋转函数 %四元数旋转法,输入theta是旋转角度(右手系),v是旋转轴矢量,u是原始点位置矢量,输出U是旋转后的点位置矢量 function U=QuaternionRotate(theta,v,u) v=v./sqrt(sum(v.*v));%归一化 q=[cos(theta/2),v(1)*sin(theta/2),v(2)*sin(theta/2),v(3)*sin(theta/2)]; qt=quatconj(q);%取共轭 w=[0,u];%纯四元数 W=quatm 阅读详情

  前段时间要用到空间旋转,所以看了一下四元数方面的资料。顺便就做了一个三维绕轴旋转的测试小程序。
参考了一下绕任意空间轴旋转三维图形
  那篇博客里面是采用的罗德里格旋转的算法实现的。
  这里采用四元数,另外,采用了动态的显示,以及画出了一个旋转轴,方便观察。
四元数的资料可以参考下面的文章
四元数
  写的很不错,另外,秦永元的《惯性导航》里面也写的很清楚。
  需要说明的是选择旋转轴经过的点时需在区间内选择。
  下面是主程序的matlab代码:

clear all;
close all;
% 随机生成转轴通过的点(需确保在xyz所包围的立方体内部)
origin=rand(1,3)*5;
% origin=[5 5 0];
% 随机生成转轴方向
direct=rand(1,3);
% direct=[0 0 1];
% 随机生成旋转角度
theta=rand*5;
[x,y,z]=peaks;

% 图像显示的立方体边界
xmin=-10;xmax=20;ymin=-10;ymax=20;zmin=-10;zmax=20;
xyz=[xmin xmax;ymin ymax;zmin zmax];
directZero=find(~abs(direct));   %找出等于零的元素索引
directNum=length(directZero);
dotCros=NaN(6,3);

%     运用直线的两点式方程确定旋转轴与显示六面体的六个面的六个交点
if(directNum==3)
    error('Not valid vector.');   
else
    for k=1:3
        tCrossMin=(xyz(k,1)-origin(k))/direct(k);
        dotCros((k-1)*2+1,:)=[tCrossMin*direct(1)+origin(1) tCrossMin*direct(2)+origin(2) tCrossMin*direct(3)+origin(3)];

        tCrossMax=(xyz(k,2)-origin(k))/direct(k);
        dotCros((k-1)*2+2,:)=[tCrossMax*direct(1)+origin(1) tCrossMax*direct(2)+origin(2) tCrossMax*direct(3)+origin(3)];
    end
end
% 确定六个点里面的直线与六面体的两个交点,即旋转轴的端点
lineDot=zeros(2,3);
% 数值的精度
dataRoundNum=3;
xyz=round(xyz,dataRoundNum);
dotCros=round(dotCros,3);
s=1;
for k=1:6
    if(xyz(1,1)<=dotCros(k,1) && dotCros(k,1)<=xyz(1,2) && xyz(2,1)<=dotCros(k,2)...
            && dotCros(k,2)<=xyz(2,2) && xyz(3,1)<=dotCros(k,3) && dotCros(k,3)<=xyz(3,2))
        lineDot(s,:)=dotCros(k,:);
        s=s+1;
        if(s>2)
            break;
        end
    end
end

set(gcf,'name','旋转显示','Numbertitle','off');
plot3([lineDot(1,1) lineDot(2,1)],[lineDot(1,2) lineDot(2,2)],[lineDot(1,3) lineDot(2,3)],'r');
ax1=gca;ax1.BoxStyle='full';box on;
axis([xmin xmax ymin ymax zmin zmax]);
title('四元数绕轴旋转')
hold on;
fig=mesh(x,y,z);
hold off;

P=[x(:),y(:),z(:)];
for k=1:500
%     Pr=rot3d(P,origin,direct,(theta+k*0.5));
    Pr=rot3dQuad(P,origin,direct,theta+k*0.1);  %四元数旋转函数
    xr=reshape(Pr(:,1),size(x));
    yr=reshape(Pr(:,2),size(x));
    zr=reshape(Pr(:,3),size(x));
    hold on;
    fig.delete;
    fig=mesh(xr,yr,zr);
    hold off;
    pause(0.1);
end

这里也可以调用上面提到的博客里面的旋转函数rot3d。下面是基于四元数旋转的matlab函数。

function Pr=rot3dQuad(P,origin,direct,theta)
% 将坐标点P绕着,过origin点,方向为dirct的直线,旋转theta角
% P:需要旋转的做标集合,n×3矩阵
% origin:转轴通过的点,1×3向量
% direct:转轴方向向量,1×3向量
% theta:旋转角度,单位弧度
Pr=zeros(size(P));
direct=direct(:)/norm(direct);
q1=quaternion(cos(theta/2),sin(theta/2)*direct(1),sin(theta/2)*direct(2),sin(theta/2)*direct(3));
originQuad=quaternion(0,origin(1),origin(2),origin(3));
for k=1:size(P,1)
    q2=quaternion(0,P(k,1),P(k,2),P(k,3));
    q=q1*(q2-originQuad)*q1'+originQuad;
    [~,b,c,d]=parts(q);
    Pr(k,:)=[b c d];
end

四元数部分的代码未优化。
下面是一个效果图。
三维旋转图
附注1:
昨天发现在某些情况下旋转轴计算错误的情况,原因是在下面的判断中

    if(xyz(1,1)<=dotCros(k,1) && dotCros(k,1)<=xyz(1,2) && xyz(2,1)<=dotCros(k,2)...
            && dotCros(k,2)<=xyz(2,2) && xyz(3,1)<=dotCros(k,3) && dotCros(k,3)<=xyz(3,2))

由于计算精度的问题,会出现交点某一轴的坐标和其上下界相差极小的情况,比如,上界是10.0,而交点由于计算误差为

10.000000000000002

所以上面的程序进行了修正,比之前增加了下面几行:

% 数值的精度
dataRoundNum=3;
xyz=round(xyz,dataRoundNum);
dotCros=round(dotCros,3);

表示精确到小数点后三位。

Matlab---逆时针旋转三维矩阵(permute、flipud) 先给出一个随机的三维矩阵a,将矩阵a绕z轴逆时针旋转90°,能得到下方矩阵c的形式,下面演示如何把矩阵a变成矩阵c的样子。一个三维矩阵,如何绕着z轴逆时针旋转90°?(及z方向不变,xy平面的数组逆时针旋转)上下翻转后,结果就和目标矩阵c一致啦,实现了三维矩阵绕z轴进行了一个逆时针的旋转。二维矩阵如何逆时针旋转? 阅读详情

相关推荐

三维旋转不再难:手把手教你理解绕任意轴旋转的矩阵推导

本文深入浅出地讲解了三维空间中绕任意轴旋转的矩阵推导方法。通过将复杂的旋转变换分解为平移、坐标轴对齐等简单步骤,手把手引导读者理解并掌握罗德里格斯旋转公式背后的几何原理与推导逻辑,适用于图形学、机器人学等领域的开发与学习。

pandas7gardener的博客 234

MATLAB之四元数表示旋转

旋转向量为[0,0,1],旋转角度为180°,由此由旋转向量转四元数q2为[0,0,0,1];quatconj(q): 求共轭四元数;quatconj(q) = [1,0,1,0]假设三维点[1,0,0]绕轴旋转180°变为[-1,0,0];quatdivide(q,r): 求取两个四元数除法;设三维点[1,0,0]用四元数表示为p[0,1,0,0];quatmultiply(q,r): 求取两个四元数乘法;quatlog(q): 求四元数自然对数;quatpower(q): 求四元数幂;

weixin_42068054的博客 2195

Unity/C# 与 Lua中实现3D空间点绕任意轴旋转

本文介绍了三维空间中点绕任意轴旋转的数学原理及实现方法。核心公式为p2=o+((p1-o)*Quaternion.AngleAxis(angle,axis)),分解为三个步骤:计算方向向量、应用四元数旋转、平移回世界坐标。文章详细解释了四元数旋转的概念,并提供了Unity(C#)和Lua两种环境下的代码示例,特别指出不同环境中乘法顺序的差异。该方法适用于游戏开发中的技能指示器、物体环绕运动等场景,结合几何示意图可直观理解向量旋转过程。

小小一枚游戏开发程序媛 2046

使用Matlab机器人工具箱完成四元数到旋转矩阵的转换,附程序

使用Matlab机器人工具箱完成四元数到旋转矩阵的转换,附程序

Time_Memory_cici的博客 2387

MATLAB - 四元数(quaternion)

三维空间中的所有旋转都可以用旋转轴和围绕该轴的角度来描述。与旋转矩阵相比,四元数的优势在于旋转轴和旋转角度易于解释。要旋转该点,需要定义一个旋转轴和一个旋转角度。四元数的表示形式为 a+bi+cj+dk,其中 a、b、c 和 d 为实数,i、j 和 k 为基元,满足等式:i2 = j2 = k2 = ijk =-1。,其中 θ 是旋转角度,[ub、uc 和 ud] 是旋转轴。) ,其中 θ 是旋转角度,[ub、uc 和 ud] 是旋转轴。四元数是一种四元超复数,用于三维旋转和定向。

机器人控制与仿真应用 3260

Day470&471.Netty概述&Netty高性能架构设计 -netty

Netty概述 一、原生 NIO 存在的问题 NIO 的类库和 API 繁杂,使用麻烦:需要熟练掌握 Selector、ServerSocketChannel、SocketChannel、ByteBuffer等。 需要具备其他的额外技能:要熟悉 Java 多线程编程,因为 NIO 编程涉及到 Reactor 模式,你必须对多线程和网络编程非常熟悉,才能编写出高质量的 NIO 程序。 开发工作量和难度都非常大:例如客户端面临断连重连、网络闪断、半包读写、失败缓存、网络拥塞和异常流的处理等等。 JDK NIO

阿昌爱Java 1572

旋转矩阵

1. 简介 计算机图形学中的应用非常广泛的变换是一种称为仿射变换的特殊变换,在仿射变换中的基本变换包括平移、旋转、缩放、剪切这几种。本文以及接下来的几篇文章重点介绍一下关于旋转的变换,包括二维旋转变换、三维旋转变换以及它的一些表达方式(旋转矩阵、四元数、欧拉角等)。 2. 绕原点二维旋转 首先要明确旋转在二维中是绕着某一个点进行旋转,三维中是绕着某一个轴进行旋转。二维旋转中最简单的...

dashaowei3861的博客 324

形位公差标注的常见误区与优化策略

本文深入解析机械设计中形位公差标注的常见误区与优化策略,特别针对NX2406用户提供实用技巧。从标注冗余、基准选择到公差值设定等五大误区入手,结合工程图实例展示如何提升标注精度与效率,帮助工程师避免常见错误,优化设计流程,确保零件功能实现与制造可行性。

info6的博客 245

XNA中三维空间物体的几种旋转方法

通过绕三个坐标轴的旋转之和。 X、Y、Z分别描述绕三个坐标轴的旋转角度(0~360)。这三个角度称为欧拉角。绕X轴旋转的角称为倾斜角(pitch),绕Y轴旋转的角称为翻滚角(head或yaw),绕Z轴旋转的角称为摇摆角(roll)。物体的朝向一般可以用欧拉角表示,因此朝向的插值问题可以简单地转化为三个欧拉角的插值问题。但欧拉角表示也有它的局限性。因为旋转矩阵是不可交换的,基于欧

enginetanmary的专栏 1811

cutlass2.x源码解读之PitchLinearStripminedThreadMap

TensorCoord:使用layout::PitchLinearCoord作为张量坐标。Shape:使用模板参数Shape_作为tile的形状,kThreads:线程总数,定义为模板参数Threads。kElementsPerAccess:每次访问的元素数,定义为模板参数ElementsPerAccess。ThreadAccessShape:线程访问的形状,使用layout::PitchLinearShape定义。内部实现细节:ShapeVec。

jiangjkd的专栏 790

Apollo control模块横向控制原理及核心代码逐行解析

看完这篇文章,你会对apollo横向控制有一个整体的概念

weixin_39199083的博客 2万+

四元数与三维向量相乘运算

输入输出说明:q_in为输入四元数对应的vec,依次对伊你该四元数坐标(w,x,y,z),v_in为对应的三维向量,v_out为v_in对应的载当前四元数旋转下输出的三维向量。这里需要将三维向量v扩充为四元数(0,v), 如c(0,0,10)变为c(0,0,0,10);共轭四元数:q*=(w,-x,-y,-z) 则为 (√2/2 , 0 ,-√2/2 , 0)按照上述公式可得到新四元数(0,10,0,0),则旋转后新坐标为(10,0,0)将最后得到的四元数(0,10,0,0)......

格物致知 2936

GD32H7实战:5步搞定YOLO轻量化模型部署到MCU(附避坑指南)

本文详细介绍了如何将YOLO轻量化模型部署到GD32H7 MCU的完整实战流程。通过五个关键步骤,涵盖环境搭建、模型训练、格式转换到工程集成,并重点分享了使用GD32AI-ModelZoo工具链进行MCU部署的避坑指南,帮助开发者在资源受限的边缘设备上实现高效目标检测。

weixin_29070861的博客 446

关于四元数的理解

摘要:本文从复数概念出发,逐步推导四元数的数学原理。首先通过复数乘法解释平面旋转,引出旋转矩阵表示法;然后介绍叉乘与三维旋转的关系;最后重点阐述四元数的代数形式及其旋转变换特性。作者通过具体例子展示了四元数双边乘法实现三维旋转的过程,验证了代数计算与几何结果的统一性,并强调了单位四元数在旋转操作中的重要性。文中包含详细的数学推导和直观的几何解释,有助于理解四元数在三维空间旋转中的应用原理。

2401_89513839的博客 1320

【Windows Server 2019】活动目录 (Active Directory) ——将计算机加入域和脱离域

博文介绍了如何将计算机加入AD域和脱离AD域,包括加入域,验证客户机加入到域后的信息,使用域账户用户在客户机上登录,使用本地账户用户在计算机上登录,脱离域。

VMware, Windows, Linux, Cisco, Container, Kubernetes, Kali 6169

GEE高阶应用——如何绘制2000-2022年土地利用变化轨迹时序图

土地利用变化是指在一定时间范围内,土地利用类型和结构发生的变化。时序变化是指这种变化随时间的推移而发生的序列变化。土地利用变化轨迹的时序变化具体介绍如下:首先,土地利用变化轨迹的时序变化体现在土地利用类型的演变上。在过去的几十年里,随着人口的增加、经济的发展和城市化的推进,土地利用类型发生了显著的变化。传统的农田逐渐减少,而城市、工业、交通、居住等用地的面积不断扩大。同时,随着环境保护意识的提高,生态保护用地、森林、湿地等绿色用地的面积也在增加。

此星光明博客 1113

matlab中四元数与三维向量的乘,四元数与三维向量相乘运算法则

四元数与三维向量相乘运算法则四元数与三维向量相乘运算法则参考网站:https://www.cnblogs.com/jeason1997/p/9822353.html四元数和向量相乘可以表示这个向量按照这个四元数进行旋转之后得到的新的向量。例如:向量 c(0,0,10) 绕着Y轴旋转90°,得到新的向量是 c(10,0,0)。通常四元ss被记为(w,x,y,z)或(x,y,z,w),以下q表示四元数...

weixin_33179966的博客 2276

手把手教你学Simulink--基于储能系统的建模与仿真场景:-锂电池储能系统充放电管理策略仿真

《锂电池储能系统充放电管理的Simulink建模与仿真》摘要 本文详细介绍了使用Simulink+SimscapeElectrical对锂电池储能系统进行充放电管理策略建模的全过程。从系统结构设计入手,重点阐述了锂电池模型、充放电控制器、热管理系统等核心模块的搭建方法,并提供了完整的仿真流程。文章详细说明了如何实现荷电状态管理、温度控制和功率限制等关键策略,通过仿真分析了电池电压、电流、SoC和温度等关键指标的变化规律。最后提出了基于仿真结果的优化建议,包括参数整定、算法改进等方面,为锂电池储能系统的安全高

MHD0815的博客 1万+

计算机图形与OpenGL学习七(三维几何变换3.三位旋转的四元数方法及程序实例)

三位旋转的四元数方法在上一节,我们知道了四元数是什么,一个四元数如何作用于一个向量,实现向量的旋转,接下来我们再进行简单的学习,如果理解困难,请出门左转传送至:四元数是什么?四元数有什么用?四元数由一个标量部s和一个向量部v组成,可以看作一个有序对:也可以把四元数看作高阶复数(区别于二维复数),带有一个实部(标量部分)和三个复部(向量v的元素)。绕经过原点的任意轴旋转,可以通过建立有下列标量部和向...

lhs322的博客 1531

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

threejs 第十用 四元数简单camera

按前面写过的四元数旋转 就是要构造一个q Pq-1代表了P绕轴转x度的一次旋转变换 threejs里面封装了 就不需要全部算了。就用个接口 threejs中,先构造一个q=setFromAxisAngle(axis, -angle)好像q就已经是得出一个qPq-1了。。乘原来的qua就直接得到新的qua 取得P=camera.quaternion 然后P multiply q,再归一化,最后...

webgpu 2588

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

用四元数旋转三维空间中的点

第二个代码是使用scipy.spatial.transform.Rotation库旋转空间点。这里调用的库也可以选择 numpy-quaternion。写了两个代码,第一个是完整的实现使用四元数旋转空间点的算法。(将(1,0,0)绕Y轴旋转90度)工程上更推荐第二种,第一种仅用来学习。

A1008612121的博客 460

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

旋转变换-旋转矩阵

1. 简介计算机图形学中的应用非常广泛的变换是一种称为仿射变换的特殊变换,在仿射变换中的基本变换包括平移、旋转、缩放、剪切这几种。本文以及接下来的几篇文章重点介绍一下关于旋转的变换,包括二维旋转变换、三维旋转变换以及它的一些表达方式(旋转矩阵、四元数、欧拉角等)。2. 绕原点二维旋转首先要明确旋转在二维中是绕着某一个点进行旋转,三维中是绕着某一个轴进行旋转。二维旋转中最简单的场景是绕着坐标原点进行...

温顺的野狼 1581

机器人学实战:如何用Python实现绕任意轴的旋转矩阵(附完整代码)

本文详细介绍了如何使用Python实现绕空间任意轴的旋转矩阵,基于罗德里格斯旋转公式提供完整代码实现,适用于机器人控制和三维图形处理。文章包含数学推导、Python代码示例、性能优化技巧及实际应用案例,帮助开发者快速掌握旋转矩阵的核心技术。

data3的博客 679

姿态解算公式

最近在学习姿态分解,总结出下面的公式: 这里对于什么是姿态分解不做分析,只总结公式: 1.右手坐标系,左乘矩阵,ZXY顺规 绕Z轴旋转 φ 绕X轴旋转 θ 绕Y轴旋转γ 由于矩阵为左乘矩阵,则整体旋转矩阵为 R = RyRxRz = 四元数法姿态解算 : 1.初始化四元数; ZXY顺规 由四元数表示空间中一个向量绕某轴旋转一定的角度 绕Z轴旋转φ角 绕X轴旋转θ角 绕Y轴旋转γ角 则该向量在空间中的旋转可以表示为: 化简得到: 利用四元数表示旋转矩阵: ..

dddgggd的博客 1575

已知父物体位置和子节点相对位置,计算子节点世界位置

//父结点 Transform parent = gameobj1.transform.parent; //结点偏差 Vector3 offset = new Vector3(gameobj1.transform.localPosition.x * parent.transform.localScale.x, gameobj...

shujianlove0的博客 1304

摄像机旋转

三维场景中的旋转,是摄像机本身在世界坐标系中绕Y轴进行旋转,从而改变位置,而其他的姿态不变,也就是摄像机的Position向量绕着世界坐标系的Y轴进行旋转。 三种方式: 1,采用角度(不通用),此方法适合目标点是世界坐标系原点。 private float angleFirst = 0; private void RotateYFirst(float ...

weixin_30780221的博客 174
上一篇: 平方根UKF算法
下一篇: 时间抽取(DIT)基2FFT算法(matlab)
netccdn
博客等级 码龄12年 40粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值