matlab和Eigen库中的一些旋转矩阵(方向余弦矩阵)、四元数和欧拉角之间的转换和绘图的注意事项

欧拉角、方向余弦矩阵与四元数变换(MATLAB官方函数实现) 欧拉角、方向余弦矩阵和四元数是导航领域中常用的表示方式,课程中会讲授相关的理论并要求自己编写函数进行实现,以起到学习巩固的目的。但之间的转换具有不同的计算方式,对于不同项目的坐标系的定义不同、代码风格也不同,几乎每一个导航代码包都会配套自己的实现方法,对于多个项目融合可能会带来一定的影响。因此在个人组织项目时选择使用MATLAB官方的函数来进行实现,尽量避免了多个项目进行组合时出现多个命名相似但功能有差异的函数编写。 阅读详情

最近用matlab和Eigen库中的一些旋转矩阵(方向余弦矩阵)、四元数和欧拉角之间的转换和绘图,弄得我有些头疼,把遇到的问题记录一下,以防以后又脑阔疼....有不同的理解可以再评论区批评指正~

主要问题有两个

1、matlab工具箱自带的的姿态转换函数定义有歧义(quat2eul()和quat2angle( )定义不一样),会导致转换出来的欧拉角结果出错;

2、eigen库中使用欧拉角转换eulerAngles()时,得到的结果每轴相差180度(看起来不太对,其实真正结果时对的)

  • 定义

首先要明确一下欧拉角、旋转矩阵、四元数的在表示旋转时的定义,参考:

https://zh.wikipedia.org/wiki/%E6%AC%A7%E6%8B%89%E8%A7%92

https://zh.wikipedia.org/wiki/%E6%97%8B%E8%BD%AC%E7%9F%A9%E9%98%B5

https://zh.wikipedia.org/wiki/%E5%9B%9B%E5%85%83%E6%95%B8

很可惜地,對於夾角的順序和標記,夾角的兩個軸的指定,並沒有任何常規。科學家對此從未達成共識。每當用到歐拉角時,我們必須明確的表示出夾角的順序,指定其參考軸。

这就是欧拉角很烦人的原因...很多情况下,我感觉在说欧拉角的时候,并没有提到其的旋转轴的顺序,故在画图的时候一般使用欧拉角来表示比较直观,就非常非常的头疼(也可能是我太菜了orz)...

所以,对于姿态表示欧拉角是不唯一的,而旋转矩阵和四元数是唯一的!

欧拉角的表示方式有24种,即2×(3*2*2)种,2代表内旋和外旋,即是固定坐标轴转还是按转动后的坐标轴转的;3代表第一次旋转的3个轴向,接着2代表除了上次的那个轴外的另外两个轴向,还有一个2也是代表除了上次的那个轴外的另外两个轴向。

内旋(intrinsic rotations) = 旋转轴(rotated axis)

外旋(extrinsic rotations) = 固定轴(static/fixed axis)

https://zhuanlan.zhihu.com/p/85108850

所以我们在使用欧拉角转旋转矩阵和四元数的时候,要首先分清时内旋还是外旋,然后在分清其旋转轴向...

比如该图代表的就是按转动后的坐标轴(蓝色的)计算欧拉角的,即为内旋

 

在一般的导航定位,比如无人车、无人机等的欧拉角表示,如果没有说明,则很可能是内旋的ZYX顺序。

 

  • Matlab函数转换

一般情况下,我们做完位姿解算,会使用matlab画出误差曲线来判断结果是否准确,这个时候一般用欧拉角来绘图比较直观,然而在绘图的时候,有时候会感觉画出来的欧拉角很奇怪,比如欧拉角上下相反...

在MATLAB工具包使用了两种不同的方式来表示四元数,在空航天工具箱中使用的四元数惯例本质上是其机器人学工具箱中使用的四元数惯例的共轭。 有关这些区别的更多详细信息,请参见以下链接:

https://ww2.mathworks.cn/matlabcentral/answers/352465-what-is-the-aerospace-blockset-quaternion-convention?s_tid=answers_rc1-2_p2_MLT

https://ww2.mathworks.cn/matlabcentral/answers/465053-rotation-order-of-quatrotate

Robotics Toolbox的是quat2eul( )

Aerospace Toolbox的是quat2angle( )

https://ww2.mathworks.cn/matlabcentral/answers/523677-quat2eul-quat-and-dcm2angle-r-difference-for-zyx-sequence

并且在matlab中,四元数的定义是a+bi+cj+dk,即w、x、y、z.

https://ww2.mathworks.cn/help/robotics/ref/quaternion.html

一般我们定义的四元数是按右手法则的,即拇指朝向旋转轴(xyz的方向),四指指向旋转方向(w代表旋转大小),这和Robotics Toolbox的是quat2eul( ) 的函数是吻合的,而Aerospace Toolbox的是quat2angle( )则是左手法则,故差一个共轭!

这些在使用相应函数时都要注意。

另外,这个工具箱有时候不好安装,要激活matlab的权限,对有的破解版来说比较麻烦,所以我觉得还是直接自己写一个转换代码比较方便T_T

这里代码的定义是一般无人机使用的欧拉角的定义,即内旋的ZYX

function [rpy] = q2euler(q)
% [qx qy qz qw] --> [roll, pitch, yaw] 

	qx = q(1);
	qy = q(2);
	qz = q(3);
    qw = q(4);
	
	roll = atan2(2*(qw*qx+qy*qz), 1-2*(qx*qx+qy*qy));
	pitch = asin(2*(qw*qy-qz*qx));
	yaw = atan2(2*(qw*qz+qx*qy), 1-2*(qy*qy+qz*qz));

    rpy = [roll, pitch, yaw];
end
function [rpy] = c2euler(c)
%UNTITLED2 此处显示有关此函数的摘要
%   此处显示详细说明
    rpy(1) = atan2(c(3,2),c(3,3));
    rpy(2) = atan2(-c(3,1),sqrt(c(3,2)^2+c(3,3)^2));
    rpy(3) = atan2(c(2,1),c(1,1));
end

具体请参考

https://www.cnblogs.com/tiandsp/p/10733607.html

  • Eigen库转换

在Eigen库中有互相转换的函数,见如下代码示例

旋转矩阵转欧拉角时,若该旋转矩阵是之前由欧拉角转换来的,想得到之前的欧拉角的值,则旋转轴的顺序必须一致,如从ZYX顺序来的,则使用eulerAngles()是得用ZYX顺序,即(2,1,0),得到的为ypr的值。

注意,Eigen库中eulerAngles()是默认内旋的方式

* \returns the Euler-angles of the rotation matrix \c *this using the convention defined by the triplet (\a a0,\a a1,\a a2)
  *
  * Each of the three parameters \a a0,\a a1,\a a2 represents the respective rotation axis as an integer in {0,1,2}.
  * For instance, in:
  * \code Vector3f ea = mat.eulerAngles(2, 0, 2); \endcode
  * "2" represents the z axis and "0" the x axis, etc. The returned angles are such that
  * we have the following equality:
  * \code
  * mat == AngleAxisf(ea[0], Vector3f::UnitZ())
  *      * AngleAxisf(ea[1], Vector3f::UnitX())
  *      * AngleAxisf(ea[2], Vector3f::UnitZ()); \endcode
  * This corresponds to the right-multiply conventions (with right hand side frames).
  * 
  * The returned angles are in the ranges [0:pi]x[-pi:pi]x[-pi:pi].

int main(int argc, char **argv)
{
Eigen::Vector3d rpy_raw, ypr;
    rpy_raw << 30, 60, 150;
    rpy_raw = rpy_raw * M_PI / 180;

    Eigen::Matrix3d c;

    //输入部分为YPR,所以转换的输出也是YPR
    c = Eigen::AngleAxisd(rpy_raw[2], Eigen::Vector3d::UnitZ()) * Eigen::AngleAxisd(rpy_raw[1], Eigen::Vector3d::UnitY()) * Eigen::AngleAxisd(rpy_raw[0], Eigen::Vector3d::UnitX());
    ypr = c.eulerAngles(2, 1, 0);

    cout << ypr.transpose() * 180 / M_PI << endl;

    return 0;
}

这个是按ZYX转的

下面这个是按照XYZ方式旋转的

//主函数
int main(int argc, char **argv)
{

    Eigen::Vector3d rpy_raw, rpy_1;
    rpy_raw << 30, 60, 150;
    rpy_raw = rpy_raw * M_PI / 180;

    Eigen::Matrix3d c;

    //输入部分为RPY,所以转换的输出也是RPY
    c = Eigen::AngleAxisd(rpy_raw[0], Eigen::Vector3d::UnitX()) * Eigen::AngleAxisd(rpy_raw[1], Eigen::Vector3d::UnitY()) * Eigen::AngleAxisd(rpy_raw[2], Eigen::Vector3d::UnitZ());
    // c = Eigen::AngleAxisd(rpy_raw[2], Eigen::Vector3d::UnitZ()) * Eigen::AngleAxisd(rpy_raw[1], Eigen::Vector3d::UnitY()) * Eigen::AngleAxisd(rpy_raw[0], Eigen::Vector3d::UnitX());
    rpy_1 = c.eulerAngles(0, 1, 2);

    cout << rpy_1.transpose() * 180 / M_PI << endl;

    return 0;
}

若时四元数的话,只需要先把四元数转成旋转矩阵,再转成欧拉角即可

    Eigen::Quaterniond q;
    Eigen::Matrix3d c;
    c = q.toRotationMatrix();

回到最初的问题,为什么使用eulerAngles()有时候得到的欧拉角会相差180度

代码如下

int main(int argc, char **argv)
{
    Eigen::Vector3d rpy_raw;
    rpy_raw << -1, 2, 3;
    rpy_raw = rpy_raw * M_PI / 180;

    Eigen::Matrix3d c;
    c = Eigen::AngleAxisd(rpy_raw[2], Eigen::Vector3d::UnitZ()) * Eigen::AngleAxisd(rpy_raw[1], Eigen::Vector3d::UnitY()) * Eigen::AngleAxisd(rpy_raw[0], Eigen::Vector3d::UnitX());
    Eigen::Vector3d rpy_tran = c.transpose().eulerAngles(2, 1, 0) / M_PI * 180;
    std::cout << rpy_tran[2] << " " << rpy_tran[1] << " " << rpy_tran[0] << std::endl;

    return 0;

输出结果

-178.896 -178.055 176.964

正确的结果应该时-1,2,3的,我们转换得到的结果貌似每轴和正确结果都相差180度

回到eulerAngles()定义中去,有一句话

The returned angles are in the ranges [0:pi]x[-pi:pi]x[-pi:pi].

即row的角度范围时【0-180°】,当我们row小于0时,Eigen库会把YZ两轴旋转180度,从而达到让X轴旋转角度大于0°的目的,各位可以试一试按ZYX的方式旋转,将ZY分别旋转180度,原本X为负的旋转角就变成了正的!

这就是Eigen库输出的欧拉角看起来不太对的原因了!其实我们用到欧拉角,主要还是在画图中,比较直观,计算姿态的话直接用旋转矩阵和四元数,就没有这么多麻烦事了~

坐标变换学习笔记—代码篇Matlab 坐标变换学习笔记—代码篇Eigen四元数 →\to→ 旋转矩阵四元数 →\to→ 欧拉角旋转矩阵 →\to→ 四元数旋转矩阵 →\to→ 欧拉角 在matlab中,下面两个目录下均有关于四元数,旋转矩阵,欧拉角间变换的函数文件(quat2dcm.m, dcm2quat.m, angle2dcm.m, dcm2angle.m等)。 C:\Program Files\Polyspace\R2020a\toolbox\aero\aero\ C:\Program Files\Polyspace\R2020a\mcr 阅读详情

相关推荐

基于Qt与OpenGL的机器人仿真器开发:从零搭建桌面级机械臂仿真平台

机器人仿真技术是机器人学与自动化领域的核心基础,它通过计算机模拟真实机器人的运动、感知与控制逻辑,为算法验证、系统设计与教育培训提供了高效、安全且低成本的虚拟环境。其基本原理在于构建机器人的数学模型(如运动学与动力学方程),并利用计算机图形学技术进行实时三维可视化。在工程实践中,采用Qt框架与OpenGL图形库的组合,能够高效地实现跨平台的图形用户界面与高性能三维渲染,这对于开发桌面级机器人仿真软件具有重要价值。这种技术方案广泛应用于工业机器人离线编程、科研算法验证以及自动化教学等场景。本文聚焦于如何整合Q

weixin_33910385的博客 327

matlab 机器人 地图,ROS与Matlab语言入门教程-从距离传感器更新占有网格地图

该例程演示如何使用距离传感器的数据创建或更新地图,以及如何使用Robotics System Toolbox™中的转换函数(如“quat2eul”和“axang2rotm”)。该例程根据距离传感器的读数和机器人的已知位姿创建地图。出于本例程的目的,距离传感器记录和机器人位姿作为消息存储于rosbag文件,该文件由Gazebo仿真器中的仿真机器人TurtleBot生成。Gazebo仿真器还发布了机器...

weixin_39930144的博客 525

matlab开发-序列或四元数数据可视化

matlab开发-序列或四元数数据可视化。从IMU可视化四元数数据的简单代码(例如mpu6050 dmp)

ROS static_transform_publisher MATLAB 四元数格式转换

可以使用quat2eul将四元数转换为欧拉角,默认的旋转顺序为ZYX。而在MATLAB中,四元数的第一位为w。

sinat_28924869的博客 598

关于MII、RMII、GMII、RGMII、PHY、网络变压器、RJ45的硬件总结

文章目录前言一、网络传输结构及原理1.以太网的工作原理2.TCP/IP协议3.数据链路层(MAC)二、介质独立接口MII,RMII,GMII,RGMII1.MII(Media Independent interface)2.RMII(Reduced Media Independent Interface)3.GMII(Gigabit Medium Independent)4.RGMII(Reduced Gigabit Media Independent Interface)三、物理层芯片(PHY)二、使用步

weixin_44415816的博客 3万+

生物信息学避坑指南:Scissor算法参数alpha和cutoff的黄金设置法则

本文深入解析了生物信息学中Scissor算法的关键参数alpha和cutoff的黄金设置法则,帮助研究者有效整合bulk RNA与单细胞数据,识别单细胞亚群。通过实战验证的调参策略,避开常见陷阱,获得可靠的生物学发现,特别适用于肿瘤异质性研究和免疫细胞分型等场景。

weixin_33734785的博客 451

自动驾驶传感器坐标系的欧拉角转换细节剖析

概述 当前自动驾驶和辅助驾驶火热,要想实现这些,一般都需要在车身及底盘上不同位置安装多种类型的传感器,而每种传感器都有自身的坐标系,因此在使用这些传感器的时候势必要统一到一个坐标系下使用,一般这个坐标系就是车体坐标系。坐标系之间的变换关系包含多种表示形式,一般有旋转矩阵表示、旋转向量表示、四元数表示、欧拉角表示等,其中最复杂的当属欧拉角,在这针对最近对传感器坐标系标定的研究基础上,对不同坐标系间的欧拉角转换做一个资料整合。 欧拉角的定义 定义一个欧拉角,需要明确下面5条: 三个旋转角的组合方式 旋转角度的

TimeRiverForever的博客 1165

一文梳理金融风控建模全流程(Python)

。借助A卡模型,银行或金融机构能够根据申请人的个人信息和历史数据,对其进行风险评估。这种评估能够帮助金融机构判断借款人是否具备偿还贷款的能力和意愿。

weixin_43420291的博客 4776

三维旋转表示法:从旋转矩阵、欧拉角到四元数插值的工程实践

在三维图形学和机器人学中,描述物体在空间中的朝向变化是核心问题。旋转矩阵作为最基础的代数描述,通过正交矩阵直接对向量进行线性变换,但其冗余性和插值困难限制了其在动画中的应用。欧拉角因其直观性成为人机交互的首选,但存在万向节死锁的固有缺陷,导致在特定姿态下丢失自由度。为了解决这些问题,四元数应运而生,它通过四个数值高效、无奇异地表示旋转,其核心价值在于实现了平滑的球面线性插值,成为连接不同旋转表示法的关键桥梁。在姿态解算等工程实践中,四元数插值技术,特别是结合了罗德里格斯公式的离散化更新方法,能够有效融合多传

weixin_34054866的博客 381

【STM32实战】利用STM32CubeMX配置PWM互补输出驱动电机

本文详细介绍了如何利用STM32CubeMX配置STM32高级定时器的PWM互补输出功能,以驱动电机等需要半桥/全桥电路的应用。通过图形化界面设置定时器参数、使能互补通道并配置关键的死区时间,结合代码示例演示了如何启动PWM输出和动态调整占空比,确保输出安全、精确的互补信号,避免MOS管直通风险,提升驱动可靠性。

weixin_29161785的博客 535

FPGA八股文(2)——笔试的FPGA问题汇总(持续更新)

常见FPGA笔试题的概念总结

居安士的博客 8907

四元数、欧拉角、旋转矩阵之间互相转换

一、理论 四元数 欧拉角 欧拉角有两种: 静态:即绕世界坐标系三个轴的旋转,由于物体旋转过程中坐标轴保持静止,所以称为静态 动态:即绕物体坐标系三个轴的旋转,由于物体旋转过程中坐标轴随着物体做相同的转动,所以称为动态 使用动态欧拉角会出现万向锁现象;静态欧拉角不存在万向锁的问题。一个典型的万向锁问题可以表述如下: 先仰45°再俯90°,这与先俯90°再仰45°是等价的。事实上,一旦选择±90°作为俯角,就会导致第一次旋转和第三次旋转等价, 整个旋转表示系统被限制在只能绕竖直轴旋转,.

努力努力努力 2074

1.为什么要学习SIMULINK

用户也可以自定义和创建自己的模块,利用这些模块,用户可以创建层次化的系统模型,可以自上而下或自下而上地阅读模型,也就是说,用户可以查看最顶层的系统,然后通过双击模块进入下层的子系统查看模型,这不仅方便了工程人员的设计,而且可以使自己的模型方块图功能更清晰,结构更合理。此外,利用示波器模块或其他的显示模块,用户可以在仿真运行的同时观察仿真结果,而且还可以在仿真运行期间改变仿真参数,并同时观察改变后的仿真结果,最后的结果数据也可以输出到MATLAB工作区进行后续处理,或利用命令在图形窗口中绘制仿真曲线。

FPGA/MATLAB学习教程/源码/项目合作开发 1546

方向余弦阵与四元数相互转化_四元数(Quaternions)

四元数最早于1843年由Sir William Rowan Hamilton发明,作为复数(complex numbers)的扩展。直到1985年才由Shoemake把四元数引入到计算机图形学中。四元数在一些方面优于Euler angles(欧拉角)和matrices。任意一个三维空间中的定向(orientation,即调置朝向)都可以被表示为一个绕某个特定轴的旋转。给定旋转轴及旋转角度,很容易把...

weixin_39627751的博客 1744

【数据集实例】CMIP6气候模式数据下载-以河东地区为例

以河东地区为例,介绍CMIP6数据下载及处理

WW、forever的博客 4943

【思考模型框架】采用双钻模型:发散(桌面研究/用户访谈)→收敛(需求归类/优先级排序),输出需求规格书、追踪矩阵及产品待办清单。

设计思维双钻模型是一种以用户为中心的需求管理方法,通过"发散-收敛"的双循环确保问题定位准确、方案切实可行。第一钻石(探索→定义)聚焦"找对问题",运用用户访谈、田野调查等方法挖掘真实需求;第二钻石(开发→交付)解决"做对方案",通过原型测试、A/B测试验证可行性。该模型强调低保真验证、多团队协作和真实用户测试,避免资源浪费与伪需求开发。典型应用场景包括产品功能优化、用户体验提升等需要精准落地的需求场景。核心价值在于建立从用户痛点到解决方案的可控闭

奶爸的编程之路,也就一周冷个三天 319

一文弄懂四元数的使用以及与欧拉角的关系(附带MATLAB演示)

四元数的使用 四元数可以理解成一个四维空间的量(其由四个变量组成),常用在三维旋转坐标下求取一个向量的坐标。四元数可以抽象地理解成对一种三维旋转方式的代表,这个旋转方式由两部分组成:一部分是旋转轴,这个可以用一个三维向量表示v=(vx,vy,vz)v = (v_x,v_y,v_z)v=(vx​,vy​,vz​),另一部分则是坐标系顺该旋转轴旋转角度,逆时针为正,例如θ\thetaθ。 再已知这两部分的前提下,旋转操作是唯一的,我们用四元数来表示这种旋转操作,记为: q=(cosθ2,vxsinθ2,vysi

ZYunfei的博客 6061

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

matlab 欧拉角 方向余弦,旋转矩阵、欧拉角之间转换

学习过程中涉及欧拉角和旋转矩阵的转换,索性整理学习一下欧拉角四元数和旋转矩阵的概念以及matlab中的互相转换本文摘自各大课本,博客,自己学习整理使用,侵删MATLAB矩阵乘法从左到右依次相乘用R表示旋转矩阵。yaw(偏航) pitch(俯仰) roll(横滚)分别表示Z Y X轴的转角。q=[q0,q1,q2,q3]’表示单位四元数。1旋转矩阵(方向余弦矩阵)当确定一个点在空间中的位置后,要确定...

weixin_32236415的博客 4075

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

C++ Eigen 库中旋转向量、旋转矩阵、欧拉角、四元数的定义及互相转换

今天看师兄写的使用力反馈设备操作机械臂的代码,里边涉及到了Eigen 库中的旋转变换,表征旋转变换的有旋转向量Eigen::AngleAxisd、欧拉角Eigen::Vector3d、旋转矩阵Eigen::Matrix3d以及四元数Eigen::Quaterniond,关于它们的定义以及相互转换,我在网上找到了两篇非常不错的博客,写的这么好,咱就没有必要再整理一遍了(其实是懒),存了存了,写在这里也分享给需要的朋友~ Eigen库使用教程之旋转矩阵,旋转向量和四元数的初始化和相互转换的实现 eigen 中四

huangjunsheng123的博客 2834

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

matlab 角度转四元数_关于四元数的研究

世界的意义在世界之外 ---维特根斯坦《逻辑哲学论》我们知道,形容旋转用三维的正交分解,用欧拉角 三个角度即可表示,而欧拉角因为 有万向锁的问题,而导致了四元数 的产生,来解决这个万象锁(主要是因为有的引擎欧拉角的旋转是有先后顺序的,只要三个维度一起旋转,理论上是不存在万向锁的问题)的问题,一开始的理解为: 为空间任一向量,而 为围绕此向量旋转的角度,貌似可以解决欧拉角的万向锁问题,因为 ...

weixin_28910411的博客 713

origin柱状图同时有两组数和两组数差值_简单搞定四元数

更多无人机知识请关注同名公众号:无人机系统技术1 前言 上一篇讲到了欧拉角表示姿态时会遇到万向锁的问题,这就导致同一种空间状态欧拉角的表示方式不唯一,当出现万向锁现象时,同一种旋转有无数种欧拉角表示形式,从而导致了欧拉角差值时出现问题,因为当你俯仰角接近90°时,两组千差万别的欧拉角表示可以是同一种旋转。所以为了解决这些问题,数学上想出了用四元数的形式来表征姿态的方法。2 四元数由来四元数是由爱...

weixin_39963440的博客 950

matlab 四元数可视化_手撕three.js之四元数

番外webgl与四元数最近一直琢磨着实(手)现(撕)一个精简three.js的引擎,在实现过程中总会想到利用ArrowHelper那东西进行可视化的调试,所以决定优先实现一个ArrowHelper。 ArrowHelper长这样,那个绿箭头:在几番尝试后发现,实现ArrowHelper关键的知识点是就是四元数,使用其他稀奇古怪方式实现都不靠谱。之前也有接触过四元数,但都是停留在会用的程度上,不知其...

weixin_39981400的博客 659

matlab 四元数可视化_matlab平台水下机器人运动仿真

############更新于2020年10月21号二维曲线跟踪——内卷链接:https://pan.baidu.com/s/1MQNPMa-09R37zrUqnBlRYQ 提取码:eq39 解压后在matlab中启动uuv_pd_start.m文件############更新于2020年5月25日单独分出来的直线跟踪部分。链接:https://pan.baidu.com/s/1bvdfEhvIQ...

weixin_39880150的博客 1507

四元数乘法_MATLAB开发自动驾驶第十七课-用于自动驾驶的旋转、方向和四元数...

四元数是一个四部分的超复数,用于描述三维旋转和方向。四元数在许多领域都有应用,包括航空航天、计算机图形学和虚拟现实。在自动驾驶中,惯性测量单元(IMU)等传感器以四元数的形式传递方向读数。要将这些数据用于定位, 可以使用四元组对象捕获它,对其进行数学运算,或将其转换为其他旋转格式,如欧拉角和旋转矩阵。 可以使用四元数来执行三维点和框架旋转。- 使用点旋转, 可以在一个静态参考框架中旋转点。- 使...

weixin_33293858的博客 1186

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

在matlab和python if中的旋转变换(四元数、欧拉角、旋转矩阵)等

在matlab和python tf中的旋转变换(四元数、欧拉角、旋转矩阵等)目录1. 基本的认识2. 变换矩阵3. 欧拉角4. 四元数5. matlab中相互转换6. python tf中相互转换7. 一点补充 目录 1. 基本的认识 空间中的坐标变换包括平移和旋转。 平移变换较为简单,只需要加上一个位置矢量即可。 旋转变换常见的有三种表示方式:旋转矩阵、欧拉角、四元数。 注:由于博主本人知识有限以及篇幅的缘故,博文十分简略,阅读本篇博客前需要一定的知识基础,有问题欢迎一起交流讨论。 2. 变换矩阵 根

wushang137的博客 2107
上一篇: ros多线程数据处理方法(在主函数中循环处理消息与回调函数循环冲突解决方法)
下一篇: C/C++ 中的 static, extern 的變數
文锦渡
博客等级 码龄11年 122粉丝 28原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

文锦渡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值