- 一.李群与李代数
现在对推到理解不深,这里就简要说说我的理解.常用于表示位姿变换的是旋转矩阵R和变换矩阵T.
-
旋转矩阵R
-
1.R是三维的正交的正交行列式为1的特殊矩阵,可称为"三维特殊正交矩阵";此外,其满足数据概念李群的"封结幺逆"性质,故本身属于一类李群.
-
2.旋转矩阵R对应李群和李代数的数据记号分别为SO(3)和so(3),其中SO(3)是3×3矩阵,so(3)是三维向量
-
3.记so(3)中的一个三维向量为u=(ux,uy,uz),可以表示绕xyz轴的旋转;记u的反对成矩阵为u^,是一个3×3矩阵.李群与李代数在0~360°内是一一映射的,即为SO(3)=exp(so(3)^),根据前面的参数,即为R=exp(u^);同理也有对数映射,将R=exp(u^)反过来就好.
-
4.根据R=exp(u^),可知旋转矩阵R的导数可由旋转向量u指定,指导着如何在旋转矩阵中进行微分运算.
-
变换矩阵T:
T是3×3矩阵,其李群记为SE(3);对应李代数为se(3),为六维向量
-
二.Eigen3/sophus/pangolin库安装
库版本问题,直接用
sudo apt-get instal **
安装的不可行,参考下面第一篇博客安装Eigen3.3以上版本的如Eigen3.3.7可行.
此外,在编译example时,由于pangolin这个库会去/usr/local/eigen3
找eigen,这里本着治标的原则:输入:sudo ln -s /usr/local/include/eigen3 /usr/include/eigen3
,参考第二篇.
参考链接:
https://blog.csdn.net/weixin_44684139/article/details/104803225
https://blog.csdn.net/weixin_38874698/article/details/108424705
- 三.程序编译运行
我把程序主要分为两个部分,一个是useSophus.cpp,另一个是example部分.
1.第一个部分文件组织如下图:
其中CMakelists.txt改写如下:
cmake_minimum_required(VERSION 2.8)
project(useSophus)
SET( CMAKE_CXX_FLAGS "-std=c++11 -O3")
# 为使用 sophus,需要使用find_package命令找到它
find_package(Sophus REQUIRED)
include_directories(${Sophus_INCLUDE_DIRS})
# Eigen
include_directories("/usr/local/include/eigen3")
add_executable(useSophus src/useSophus.cpp)
命令如下:
mkdir build && cd build
camke ..
make
./useSophus
输出结果如下,是对理论的验证
2.第二个部分文件组织如下图:
此时可以把上面的example.zip解压缩,此时只在example文件内编译.
CMakelists.txt文件如下:
cmake_minimum_required(VERSION 2.8)
SET( CMAKE_CXX_FLAGS "-std=c++11 -O3")
find_package(Pangolin REQUIRED)
include_directories(${Pangolin_INCLUDE_DIRS})
include_directories("/usr/local/include/eigen3")
add_executable(trajectoryError src/trajectoryError.cpp)
target_link_libraries(trajectoryError ${Pangolin_LIBRARIES})
对src/trajectoryError.cpp文件的第11,12行中的地址进行改写,实在不行可以参考下面写全局路径.
string groundtruth_file = "/home/wang/my_learning/slambook2/1111/slambook2-master/ch4/example/src/groundtruth.txt";
string estimated_file = "/home/wang/my_learning/slambook2/1111/slambook2-master/ch4/example/src/estimated.txt";
运行结果如下:
@meng