视觉SLAM十四讲 Chapter3 课后练习

本文探讨了视觉SLAM技术中的关键数学概念,包括验证旋转矩阵的正交性,四元数旋转后的点仍对应三维空间点,以及各种姿态表示之间的转换。通过编程实现,展示了如何从大矩阵中提取并替换3x3子矩阵,以及如何使用四元数和变换矩阵在不同坐标系间转换点的位置。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

在这里插入图片描述

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

在这里插入图片描述

3.画表总结旋转矩阵、旋转向量(轴角)、欧拉角、四元数的转换关系

在这里插入图片描述

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

assignment5.cpp

//2019.08.05
#include <iostream>
#include <ctime>
using namespace std;

//Eigen部分
#include <Eigen/Core>
//稠密矩阵的代数运算(逆、特征值等)
#include <Eigen/Dense>

#define MATRIX_SIZE 15

int main()
{
	//用随机数填充一个double类型的N*N矩阵
	Eigen::Matrix<double,MATRIX_SIZE ,MATRIX_SIZE > matrix_NN = Eigen::MatrixXd::Random(MATRIX_SIZE,MATRIX_SIZE);
	cout <<"matrix_NN:"<<endl<<matrix_NN<<endl;

	//定义一个3*3的double矩阵,用于盛放matrix_NN左上角3*3的内容
	Eigen::Matrix3d matrix_33;	
	
	//初始化为3*3的单位阵,用于对matrix_NN左上角进行赋值
	Eigen::Matrix3d matrix_I33 = Eigen::Matrix3d::Identity();

	//将matrix_NN左上角3*3的块取出来,放到matrix_33中
	matrix_33 = matrix_NN.topLeftCorner(3,3);
	cout <<"matrix_33:"<<endl<<matrix_33<<endl;

	//将matrix_I33 赋值到matrix_NN左上角3*3的块中
	matrix_NN.topLeftCorner(3,3) = matrix_I33;
	cout <<"matrix_NN:"<<endl<<matrix_NN<<endl;
	
	return 0;
}

CMakeLists.txt

#2019.08.05
#添加Eigen的头文件
include_directories("/usr/include/eigen3")

#添加一个可执行程序
add_executable( assignment5 assignment5.cpp )

运行结果:
在这里插入图片描述

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

assignment7.cpp

//2019.08.05
#include <iostream>
#include <cmath>
using namespace std;

#include <Eigen/Core>
//Eigen几何模块
#include <Eigen/Geometry>

//先根据q1和t1,将pc1转换到世界坐标系pw中,然后根据q2和t2,将pw转换到pc2
int main()
{
	Eigen::Quaterniond q1(0.35,0.2,0.3,0.1);
	q1.normalize();//对q1进行归一化
	Eigen::Vector3d t1(0.3,0.1,0.1);
	Eigen::Quaterniond q2(-0.5,0.4,-0.1,0.2);
	q2.normalize();//对q2进行归一化
	Eigen::Vector3d t2(-0.1,0.5,0.3);
	Eigen::Vector3d pc1(0.5,0,0.2);
	Eigen::Vector3d pc2,pw;

	//将pc1转换成pw
	pw = q1.inverse()*(pc1 - t1);
	cout<<"pw:"<<pw.transpose()<<endl;

	//将pw转换成pc2
	pc2 = q2*pw + t2;
	cout<<"pc2:"<<pc2.transpose()<<endl;

	return 0;
}

CMakeLists.txt

#2019.08.05
#添加Eigen的头文件
include_directories("/usr/include/eigen3")

#添加一个可执行程序
add_executable( assignment7 assignment7.cpp )

运行结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值