ch2
一、使用g++编译.cpp为可执行文件并运行(P30)
g++ helloSLAM.cpp
./a.out运行
二、使用cmake编译
mkdir build
cd build
cmake ..
make
CMakeCache.txt
文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的CMakeCache.txt
文件,或者在构建过程中仍然引用了旧的路径。我们需要彻底清理并重新开始。详细解决步骤
步骤1:彻底清理源代码目录和构建目录
删除源代码目录中的
CMakeCache.txt
文件(如果存在):rm /home/huang/slam/learn/slambook2/ch2/CMakeCache.txt
删除整个构建目录:
rm -rf /home/huang/slam/learn/slambook2/ch2/build
步骤2:重新创建构建目录并运行
cmake
重新创建
build
文件夹:mkdir /home/huang/slam/learn/slambook2/ch2/build
进入
build
文件夹:cd /home/huang/slam/learn/slambook2/ch2/build
运行
cmake
:cmake ..
详细解释
删除
CMakeCache.txt
文件:这个文件存储了上次运行cmake
时的配置信息,如果路径发生变化,需要删除它以避免冲突。删除整个构建目录:确保没有残留的文件或配置信息,避免干扰新的构建过程。
重新创建构建目录并运行
cmake
:确保在新的、干净的环境中重新配置项目。
cmake
的作用:
cmake
是一个跨平台的构建系统生成器,它根据CMakeLists.txt
文件生成适合特定构建系统的配置文件(如Makefile
)。在运行
cmake
后,build
目录中会生成Makefile
和其他必要的配置文件。
make
的作用:
make
是一个构建工具,它根据Makefile
中的规则来编译源代码,生成目标文件(如.o
文件),并最终链接生成可执行文件或库。
make
会自动解析Makefile
中的依赖关系,确保只有在相关文件发生变化时才重新编译。
ch3
一、安装Eigen库(P51)
sudo apt-get update
sudo apt-get install libeigen3-dev
二、查找Eigen库
sudo uodatedb
locate eigen3
sudo updatedb
:
这个命令会更新 locate
数据库。locate
数据库是一个包含系统中所有文件路径的索引,用于快速查找文件。
使用 sudo
是因为更新数据库需要管理员权限。
locate eigen3
:
这个命令会搜索系统中所有包含 “eigen3” 的文件路径。它会返回一个列表,显示所有匹配的文件路径。
三、编译并运行eigenMatrix.cpp
有多个库就locate要用的那个,修改CMakeLists.txt中的地址。(慎用rm -rf,因为我有多个eigen库,版本不同,没细想就用rm -rf删了很多,不知道之后运行其他代码文件会不会报错。orz..)
根据下载的库的位置修改:
运行结果:
注意是在useEigen的文件夹中build:
四、Eigen几何模块
mkdir build
cd build
cmake ..
make
坐标变换
1.cmake..警告:
CMakeLists.txt
文件中存在一些问题。
1>缺少 project()
命令
2>缺少 cmake_minimum_required()
命令
解决方法:
修改CMakeLists.txt:
cmake_minimum_required(VERSION 3.16)
project(MyProject)
# 包含 Eigen 的头文件目录
include_directories("/usr/local/include/eigen3")
# 添加 coordinateTransform 可执行文件
add_executable(coordinateTransform coordinateTransform.cpp)
# 查找 Pangolin 库
find_package(Pangolin REQUIRED)
include_directories(${Pangolin_INCLUDE_DIRS})
# 添加 plotTrajectory 可执行文件
add_executable(plotTrajectory plotTrajectory.cpp)
target_link_libraries(plotTrajectory ${Pangolin_LIBRARIES})
然后重新编译
2.无法找到文件:
huang@huang-System-Product-Name:~/slam/learn/slambook2/ch3/examples/build$ ./plotTrajectory cannot find trajectory file at ./examples/trajectory.txt
解决方法:
在plotTrajectory.cpp中:
修改第10行为绝对路径:
运行:
./coordinateTransform
可视化演示(显示运动轨迹)
编译失败 :
从错误信息来看,编译器无法识别
Isometry3d
类型,这通常是因为没有正确包含 Eigen 的相关头文件。
解决方法:
在 plotTrajectory.cpp
文件中,添加头文件:
#include <Eigen/Geometry>
运行:
./plotTrajectory
显示相机的位姿
左侧实时显示相机位姿对应旋转矩阵、平移、欧拉角和四元数。
1. 旋转矩阵
旋转矩阵是一个 3×3 的正交矩阵,用于表示相机坐标系相对于世界坐标系的旋转。旋转矩阵 R 满足 RTR=I 和 det(R)=1,其中 I 是单位矩阵,det 表示行列式。
2. 平移向量
平移向量是一个 3 维向量,表示相机坐标系相对于世界坐标系的平移。通常与旋转矩阵一起使用,可以表示为一个 4×4 的齐次变换矩阵:
![]()
其中 R 是旋转矩阵,t 是平移向量。
3. 欧拉角
欧拉角是三个角度的集合,用于描述相机坐标系相对于世界坐标系的旋转。欧拉角有多种表示方式,如 ZYX、XYZ 等,每种方式对应不同的旋转顺序。欧拉角易于直观理解,但存在万向节死锁问题,即在某些特定角度下,两个轴的旋转会重合,导致无法表示某些旋转。
4. 四元数
四元数是一个 4 维向量,用于表示旋转。四元数 q 可以表示为 q=w+xi+yj+zk,其中 w,x,y,z 是实数,i,j,k 是虚数单位。四元数的模长为 1,即 w2+x2+y2+z2=1。四元数可以避免万向节死锁问题,且在插值和组合旋转时更加方便。
转换关系
旋转矩阵到欧拉角:可以通过旋转矩阵的元素计算出欧拉角。
旋转矩阵到四元数:可以通过旋转矩阵的迹和元素计算出四元数。
欧拉角到旋转矩阵:可以通过欧拉角的三个角度计算出旋转矩阵。
欧拉角到四元数:可以通过欧拉角的三个角度计算出四元数。
四元数到旋转矩阵:可以通过四元数的元素计算出旋转矩阵。
四元数到欧拉角:可以通过四元数的元素计算出欧拉角。
暂无评论内容