SLAM十四讲ch3课后习题

news2024/11/16 2:55:22

1.验证旋转矩阵是正交矩阵。

2.验证四元数旋转某个点后,结果是一个虚四元数(实部为零),所以仍然对应到一个三维空间点

注意:目前市面上所有的博客都说旋转四元数的逆是共轭除以模的平方 ,这么算很正确但是计算量很大并且复杂化了。我们前面说到,旋转四元数通常是单位四元数。这是因为旋转四元数的定义要求其模长(或长度)为1。这样的要求确保了当四元数用于表示三维空间中的旋转时,不会引入缩放(即保持物体的大小不变)。

前面ch3的博客中的部分截图

      所以,既然我们假设 ( q_r ) 是一个单位四元数,那么它的逆就等于它的共轭。因此,旋转后的四元数仍然是一个虚四元数。

        但如果 ( q_r ) 不是单位四元数,那么它的逆不是简单的共轭,而是共轭除以模的平方。

 

3.假设我有一个大的 Eigen 矩阵,我想把它的左上角 3 × 3 的块取出来,然后赋值为I_3*3。请编程实现此事。

        要在 Eigen 中实现将一个大的矩阵的左上角 3x3 的块赋值为 3x3 单位矩阵I,可以使用 Eigen 提供的块操作功能。下面是一个示例代码:

#include <iostream>
#include <Eigen/Dense>

int main() {
    // 创建一个大小为 5x5 的矩阵
    Eigen::MatrixXd mat = Eigen::MatrixXd::Random(5, 5);

    std::cout << "原始矩阵:" << std::endl;
    std::cout << mat << std::endl;

    // 将左上角 3x3 的子矩阵赋值为单位矩阵
    mat.block<3, 3>(0, 0) = Eigen::Matrix3d::Identity();

    std::cout << "修改后的矩阵:" << std::endl;
    std::cout << mat << std::endl;

    return 0;
}

代码说明:

1.

Eigen::MatrixXd mat = Eigen::MatrixXd::Random(5, 5);

创建一个随机的 5x5 矩阵。

2.

mat.block<3, 3>(0, 0)

使用 block 函数选择矩阵的一个子块。这里的 <3, 3> 表示块的大小,(0, 0) 表示块的起始位置(左上角)。

3.

Eigen::Matrix3d::Identity()

生成一个 3x3 的单位矩阵。

4.将这个单位矩阵赋值给 mat.block<3, 3>(0, 0),即修改原矩阵左上角的 3x3 子矩阵。

4.设有小萝卜一号和小萝卜二号位于世界坐标系中。小萝卜一号的位姿为:q1 = [0.35, 0.2, 0.3, 0.1], t2 = [0.3, 0.1, 0.1]Tq 的第一项为实部。请你把 q 归一化后再进行计算)。这里的 q t 表达的是 Tcw,也就是世界到相机的变换关系。小萝卜二 号的位姿为 q2 = [0.5, 0.4, 0.1, 0.2], t = [0.1, 0.5, 0.3]T。现在,小萝卜一号看到某个点在自身的坐标系下,坐标为 p = [0.5, 0, 0.2]T,求该向量在小萝卜二号坐标系下的坐标。请编程实现此事

所需的知识基础详细请见我之前ch3的博客中1.2中的欧式变换部分:

视觉SLAM ch3—三维空间的刚体运动icon-default.png?t=N7T8https://blog.csdn.net/Johaden/article/details/141023487

解题思路

步骤 1: 归一化四元数 q1

四元数 q1 的归一化可以通过计算其模长并除以模长来完成。

步骤 2: 构建变换矩阵

四元数可以用来表示旋转,而平移向量 t 可以用来表示平移。变换矩阵 T 是一个 4x4 的矩阵,它由四元数对应的旋转矩阵和平移向量构成。具体形式如下:

T=\begin{bmatrix} R & t\\0 & 1 \end{bmatrix}

其中 R 是由四元数转换来的旋转矩阵。

步骤 3: 构建变换矩阵 T12

为了从一个坐标系转换到另一个坐标系,我们可以利用以下等式:

这里 (T1w)^{-1} 表示小萝卜一号坐标系到世界坐标系的变换,而 T2w 表示世界坐标系到小萝卜二号坐标系的变换。

步骤 4: 应用变换 T12 到点 p 上

将点 p 转换成齐次坐标形式 [p_x, p_y, p_z, 1],然后乘以变换矩阵 T12,得到的结果就是点 p 在小萝卜二号坐标系下的坐标。

#include <iostream>
#include <Eigen/Dense>
#include<Eigen/Core>
#include<Eigen/Geometry>

using namespace std;
using namespace Eigen;

int main() {
    // 步骤 1: 归一化四元数 q1
    Quaterniond q1(0.35, 0.2, 0.3, 0.1);
//创建了一个 Quaterniond 类型的对象 q1,它表示一个四元数。四元数的构造函数接受四个参数,按照实部、虚部的顺序传入。在这里,实部为 0.35,虚部依次为 0.2, 0.3, 0.1。
    q1.normalize();  //q1.normalize(); 将 q1 归一化,使得它的模等于 1。

    // 步骤 2: 构建变换矩阵 T1w 和 T2w
    Vector3d t1(0.3, 0.1, 0.1);
    Vector3d t2(-0.1, 0.5, 0.3);  //分别表示小萝卜一号和小萝卜二号的平移向量。

    Matrix4d T1w = Matrix4d::Identity();
    Matrix4d T2w = Matrix4d::Identity();
    T1w.block<3, 3>(0, 0) = q1.toRotationMatrix(); //q1.toRotationMatrix() 将四元数转换为对应的旋转矩阵。
    //T1w.block<3, 3>(0, 0) 选择 T1w 的左上角 3x3 子块,将旋转矩阵赋值给它。
    T1w.block<3, 1>(0, 3) = t1; //T1w.block<3, 1>(0, 3) 选择 T1w 的右上角 3x1 子块,将平移向量 t1 赋值给它。
    T2w.block<3, 3>(0, 0) = Quaterniond(-0.5, 0.4, -0.1, 0.2).toRotationMatrix(); //同样,这里创建了一个新的 Quaterniond 对象来表示小萝卜二号的四元数,并将其转换为旋转矩阵,赋值给 T2w 的左上角 3x3 子块。
    T2w.block<3, 1>(0, 3) = t2;//平移向量 t2 赋值给 T2w 的右上角 3x1 子块。

    // 步骤 3: 构建变换矩阵 T12
    Matrix4d T12 = T2w * T1w.inverse();//T1w.inverse() 计算 T1w 的逆矩阵,表示从相机坐标系到世界坐标系的变换。
    //T2w * T1w.inverse() 计算从小萝卜一号到小萝卜二号坐标系的变换矩阵 T12。

    // 步骤 4: 应用变换 T12 到点 p 上
    Vector3d p(0.5, 0, 0.2);
    Vector4d p_homogeneous(p.x(), p.y(), p.z(), 1.0);//将点 p 转换为齐次坐标形式 p_homogeneous,添加了一个额外的维度,其值为 1。
    Vector4d p_transformed = T12 * p_homogeneous;
    //使用变换矩阵 T12 将点 p 从齐次坐标形式转换到小萝卜二号坐标系下的坐标。

    // 输出结果
    cout << "Transformed point in Robot 2 coordinate system: "
         << p_transformed.head<3>() << endl;//p_transformed.head<3>() 返回前三个元素,即 x, y, z 坐标。

    return 0;
}
之前ch3中的博客截图

        上面的截图表示,即使p_homogeneous(p.x(), p.y(), p.z(), 1.0)中最后那个1.0不写,理论上来说,Eigen库会将三维向量自动拓展为齐次坐标形式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2080972.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

免费分享:2023甘肃省地质灾害点数据集(附下载方法)

滑坡&#xff0c;在一定自然条件下的斜坡上的十体或岩体在外界的影响和自身的作用下沿着一定的软弱面或带&#xff0c;发生以水平心移为主的变形现象。地面沉降又称为地面下沉或地陷&#xff0c;是在自然或人类工程的影响下&#xff0c;由于地下松散土层固结收缩压密作用&#…

无人机飞手培训考证,超视距大载重吊运组装训练全学就业有保障

关于无人机飞手培训考证&#xff0c;是否必须学习超视距飞行、大载重吊运以及组装训练以确保就业保障&#xff0c;这个问题涉及多个方面&#xff0c;以下是对各点的详细分析&#xff1a; 一、超视距飞行 必要性分析&#xff1a; 超视距飞行是无人机高级应用中的一个重要领域…

大模型备案全网最详细流程解读(附附件+重点解读)

文章目录 一、语料安全评估 二、黑盒测试 三、模型安全措施评估 四、性能评估 五、性能评估 六、安全性评估 七、可解释性评估 八、法律和合规性评估 九、应急管理措施 十、材料准备 十一、【线下流程】大模型备案线下详细步骤说明 十二、【线上流程】算法备案填报流…

Cesium 全球视角 和 多方案镜头切换

一.切换镜头 镜头切换&#xff0c;在一个Pawn里的多个镜头。可以使用UE中World Settings里的玩家控制器中&#xff0c;默认的控制器行为会对当前开启的Camera组件进行激活处理。 谁激活谁就是主相机。 Cast<UCameraComponent>(m_childComponentMap[it.CameraName])-&g…

VLDB 2024丨与 TiDB 一起探索数据库学术前沿

VLDB 2024 将于2024年8月26日至8月30日在中国广州举行。VLDB 是数据库领域的顶级国际会议&#xff0c;旨在为数据管理、可扩展数据科学、数据库研究者、供应商、从业者、应用开发者和用户提供交流平台。 2024年的VLDB会议涵盖了数据管理、数据库架构、图形数据管理、数据隐私与…

切换JDK版本

JDK&#xff08;Java Development Kit&#xff09;是Java开发工具包&#xff0c;它包含了Java的开发环境和运行环境。JDK是整个Java的核心&#xff0c;包括了Java运行环境&#xff08;Java Runtime Environment, JRE&#xff09;、Java工具和Java基础的类库&#xff08;rt.jar&…

九、枚举和注解

文章目录 一、枚举介绍二、自定义类实现枚举三、enum关键字实现枚举3.1 enum案例3.2 enum关键字实现枚举注意事项3.3 enum常用方法说明3.4 enum实现接口 四、JDK内置的基本注解类型4.1 注解的理解4.2 基本的Annotation介绍4.3 Override4.4 Deprecated4.5 SuppressWarnings 五、…

【性能优化】:设计模式与技术方案解析(二)

引言 在 【性能优化】&#xff1a;探索系统瓶颈的根源&#xff08;一&#xff09;文章中&#xff0c;我们已经分析了手动结算的弊端和瓶颈&#xff0c;本文来分析下怎么优化系统性能。 需求分析 既然手动结算耗时费力易出错&#xff0c;那么能不能开发一个**程序自动化处理*…

ARM32开发——(十八)RTC实时时表

1. RTC内置实时时钟 1.1 RTC时钟介绍 RTC是实时时钟(Real-Time Clock)的缩写。它是一种硬件模块或芯片,用于提供准确的日期和时间信息。 GD32F407上有RTC的外设,它提供了一个包含日期(年/月/日)和时间(时/分/秒/亚秒)的日历功能。除亚秒用二进制码显示外,时间和日期都以BCD码…

JSP中的动态INCLUDE与静态INCLUDE:简明对比

JSP中的动态INCLUDE与静态INCLUDE&#xff1a;简明对比 1、静态INCLUDE2、动态INCLUDE3、总结 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 在JSP开发中&#xff0c;页面包含分为动态INCLUDE和静态INCLUDE两种&#xff0c;它们各有特点。…

详细分析Oracle中的ALL_TAB_COLUMNS视图语句

目录 1. 基本知识2. Demo 1. 基本知识 ALL_TAB_COLUMNS 是 Oracle 数据库的一个数据字典视图&#xff0c;用于提供关于数据库中所有可见表的列信息 对于数据库管理、开发和调试非常有用 基本的字段描述如下&#xff1a; 字段名描述OWNER列出表所在的所有者&#xff08;sche…

神经网络——CIFAR10小实战

1.引子 Sequential的使用&#xff1a;将网络结构放入其中即可&#xff0c;可以简化代码。 找了一个对CIFAR10进行分类的模型。 2.代码实战 from torch import nn from torch.nn import Conv2d, MaxPool2d, Flatten, Linearclass Tudui(nn.Module):def __init__(self):super(T…

SOMEIP_ETS_069: Unaligned_SOMEIP_Messages_overUDP

测试目的&#xff1a; 验证设备&#xff08;DUT&#xff09;能够处理在单个UDP包中发送的三个SOME/IP消息&#xff0c;并且即使其中一个SOME/IP消息未对齐&#xff0c;DUT仍能对所有三个请求给出正确的响应。 描述 本测试用例旨在检查DUT在通过UDP协议接收到包含一个未对齐S…

【Pytorch】Linear 层,举例:相机参数和Instance Feaure通过Linear层生成Group Weights

背景 看论文看到这个pipeline&#xff0c;对于相机参数和Instance Fature 的融合有点兴趣&#xff0c;研究如下&#xff1a; Linear 层 Linear 层是最基本的神经网络层之一&#xff0c;也称为全连接层。它将输入与每个输出神经元完全连接。每个连接都有一个权重和一个偏置。…

inflight 守恒算法负反馈解析

终于说到这个话题了。 bbr 不好吗&#xff0c;我自己也做过很多关于 bbr 的仿真验证&#xff0c;现网数据分析以及数学建模&#xff0c;结论均指向 bbr 是一个公平高效且天然不会引发 bufferbloat 的算法&#xff0c;但细节值得商榷&#xff1a; 非理想哑铃拓扑下测量误差的叠…

Dubbo3框架概述

1 什么是分布式系统? 《分布式系统原理与范型》定义: “分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像单个相关系统” 分布式系统(distributed system)是建立在网络之上的软件系统。 简单来说:多个(不同职责)人共同来完成一件事! 任何一台服务器都无法…

Dockerfile+私有仓库

使用Dockerfile创建应用镜像 在Docker file中定义所需要执⾏的指令&#xff0c;使⽤ docker build创建镜 像&#xff0c;过程中会按照dockerfile所定义的内容进⾏打开临时性容器&#xff0c;把docker file中命令全部执⾏完成&#xff0c;就得到了⼀个容器应⽤镜像&#xff0c;每…

PHP-开发工具下载-配置-使用

.1.下载 使用各种人工智能工具推荐的php免费开发工具。 文心一言推荐的工具 讯飞星火的回答 kimi的回答 根据自己的了解&#xff0c;最终选择vscode这款开发工具。 .2.配置 文心一言的回答 讯飞星火的回答 kimi的回答 最终选择使用PHP Debug 插件来支持。 安装中文插件。 …

NASA数据集:MetOp-A ASCAT 第 2 级海洋表面风矢量,针对沿岸海洋进行了优化

MetOp-A ASCAT Level 2 Ocean Surface Wind Vectors Optimized for Coastal Ocean 简介 该数据集包含 MetOp-A 上的高级散射计&#xff08;ASCAT&#xff09;以 12.5 公里采样分辨率&#xff08;注&#xff1a;有效分辨率为 25 公里&#xff09;进行的近实时 2 级沿岸海面风矢…

实战OpenCV之图像的数学运算

基础入门 在OpenCV中&#xff0c;图像的数学运算是一种基本而强大的工具&#xff0c;可以用于多种图像处理任务&#xff0c;包括&#xff1a;图像增强、图像融合、特征提取等。这些运算包括加法、减法、乘法和除法等基本的数学操作。 加法运算&#xff1a;可以用来合并两个图像…