GithubHelp home page GithubHelp logo

gaoxiang12 / slam_in_autonomous_driving Goto Github PK

View Code? Open in Web Editor NEW
1.8K 43.0 432.0 168.48 MB

《自动驾驶中的SLAM技术》对应开源代码

CMake 5.61% Python 1.24% C++ 92.95% C 0.05% Dockerfile 0.11% Shell 0.04%

slam_in_autonomous_driving's Introduction

SLAM in Autonomous Driving book (SAD book)

本书向读者系统介绍了惯性导航、组合导航、激光建图、激光定位、激光惯导里程计等知识。本仓库是书籍对应的源代码仓库,可以公开使用。

注意

  • 本书已于2023.7.10开始印刷,预计在两周内上架。届时我会更新各平台的链接信息。
  • 2023.8.9 本书目前是第二次印刷,在第一次上修正了一部分内容(但没有签名了),详情见代码的推送。
  • 电子工业出版社官方:https://item.jd.com/10080292102089.html
  • 京东自营: https://item.jd.com/13797963.html

本书的内容编排

  • 第1章,概述
  • 第2章,数学基础知识回顾,几何学、运动学、KF滤波器理论,矩阵李群
  • 第3章,误差状态卡尔曼滤波器,惯性导航、卫星导航、组合导航
  • 第4章,预积分,图优化,基于预积分的组合导航
  • 第5章,点云基础处理,各种最近邻结构,点云线性拟合
  • 第6章,2D激光建图,scan matching, 似然场,子地图,2D回环检测,pose graph
  • 第7章,3D激光建图,ICP,变种ICP,NDT,NDT LO, Loam-like LO,LIO松耦合
  • 第8章,紧耦合LIO,IESKF,预积分紧耦合LIO
  • 第9章,离线建图,前端,后端,批量回环检测,地图优化,切片导出
  • 第10章,融合定位,激光定位,初始化搜索,切片地图加载,EKF融合

本书的特点

  • 本书大概是您能找到的类似材料中,数学推导和代码实现最为简单的书籍。
  • 在这本书里,您会复现许多激光SLAM中的经典算法和数据结构。
    • 您需要自己推导、实现一个误差状态卡尔曼滤波器(ESKF),把IMU和GNSS的数据喂给它,看它如何推算自己的状态。
    • 您还会用预积分系统实现一样的功能,然后对比它们的运行方式。
    • 接下来您会实现一遍2D激光SLAM中的常见算法:扫描匹配、似然场、子地图,占据栅格,再用回环检测来构建一个更大的地图。这些都需要您自己来完成。
    • 在激光SLAM中,您也会自己实现一遍Kd树,处理近似最近邻,然后用这个Kd树来实现ICP,点面ICP,讨论它们有什么可以改进的地方。
    • 然后您会实现经典的NDT算法,测试它的配准性能,然后用它来搭建一个激光里程计。它比大部分现有LO快得多。
    • 您也会实现一个点面ICP的激光里程计,它也非常快。它工作的方式类似于Loam,但更简单。
    • 您会想要把IMU系统也放到激光里程计中。我们会实现松耦合和紧耦合的LIO系统。同样地,您需要推导一遍迭代卡尔曼滤波器和预积分图优化。
    • 您需要把上面的系统改成离线运行的,让回环检测运行地充分一些。最后将它做成一个离线的建图系统。
    • 最后,您可以对上述地图进行切分,然后用来做实时定位。
  • 本书的大部分实现都要比类似的算法库简单的多。您可以快速地理解它们的工作方式,不需要面对复杂的接口。
  • 本书会使用非常方便的并发编程。您会发现,本书的实现往往比现有算法更高效。当然这有一部分是历史原因造成的。
  • 本书每章都会配有动态演示,像这样:

希望您能喜欢本书的极简风格,发现算法的乐趣所在。

数据集

  • 数据集下载链接:

  • 百度云链接: https://pan.baidu.com/s/1ELOcF1UTKdfiKBAaXnE8sQ?pwd=feky 提取码: feky

  • OneDrive链接:https://1drv.ms/u/s!AgNFVSzSYXMahcEZejoUwCaHRcactQ?e=YsOYy2

  • 包含以下数据集。总量较大(270GB),请视自己硬盘容量下载。

    • UrbanLoco (ULHK,3D激光,道路场景)
    • NCLT (3D激光,RTK,校园场景)
    • WXB (3D激光,园区场景)
    • 2dmapping (2D激光,商场场景)
    • AVIA (大疆固态激光)
    • UTBM (3D激光,道路场景)
  • 其他的内置数据

    • 第3,4章使用文本格式的IMU,RTK数据
    • 第7章使用了一部分EPFL的数据作为配准点云来源
  • 您应该将上述数据下载至./dataset/sad/目录下,这样许多默认参数可以正常工作。如果不那么做,您也可以手动指定这些文件路径。如果您硬盘容量不足,可以将其他硬盘的目录软链至此处。

编译

  • 本书推荐的编译环境是Ubuntu 20.04。更老的Ubuntu版本需要适配gcc编译器,主要是C++17标准。更新的Ubuntu则需要您自己安装对应的ROS版本。
  • 在编译本书代码之前,请先安装以下库(如果您机器上没有安装的话)
    sudo apt install -y ros-noetic-pcl-ros ros-noetic-velodyne-msgs libopencv-dev libgoogle-glog-dev libeigen3-dev libsuitesparse-dev libpcl-dev libyaml-cpp-dev libbtbb-dev libgmock-dev
  • 之后,使用通常的cmake, make方式就可以编译本书所有内容了。例如
mkdir build
cd build
cmake ..
make -j8
  • 编译后各章的可执行文件位于bin目录下

适配Ubuntu18.04

为了在Ubuntu18.04上编译运行,需要安装gcc-9,并且使用对应版本的TBB。或者在docker环境下使用。

安装gcc-9

sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo update-alternatives --remove-all gcc
sudo update-alternatives --remove-all g++

#命令最后的1和10是优先级,如果使用auto选择模式,系统将默认使用优先级高的
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-7 1
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 10

sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-7 1
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-9 10

检查版本

g++ -v

编译程序

mkdir build
cd build
cmake .. -DBUILD_WITH_UBUNTU1804=ON
make -j8

在docker环境下使用

docker build -t sad:v1 .
./docker/docker_run.sh

进入docker容器后

cd ./thirdparty/g2o
mkdir build
cd build
cmake ..
make -j8
cd /sad
mkdir build
cd build
cmake ..
make -j8

常见问题

  1. 图形界面在2023年以后特定型号的笔记本端导致桌面卡死(GL硬件兼容性):#67
  2. 第5章test_nn编译时,gtest报gmock错误:#18
  3. 编译器版本问题:#4
  4. g2o编译问题(config.h找不到): #95

TODO项

  • LioPreiteg在某些数据集上不收敛

NOTES

  • [已确认] ULHK的IMU似乎和别家的不一样,已经去了gravity, iekf初期可能有问题
  • [已确认] NCLT的IMU在转包的时候转成了Lidar系,于是Lidar与IMU之间没有旋转的外参(本来Lidar是转了90度的),现在Lidar是X左Y后Z下,原车是X前Y右Z下。本书使用的NCLT数据均基于点云系, IMU的杆臂被忽略。
  • [已确认] NCLT的rtk fix并不是非常稳定,平均误差在米级

slam_in_autonomous_driving's People

Contributors

bowenbz avatar chengwei0427 avatar forloveandpeace avatar gaoxiang12 avatar mactarvish avatar mazhengg avatar qpc001 avatar shanmo avatar yuconglin avatar zijiechenrobotics avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

slam_in_autonomous_driving's Issues

第七章读后感

Provide Dataset link for foreigners

@gaoxiang12

Hi, Thanks for your great work!
I want to test many algorithms in this repository with your provided bagfile.
Unfortunately, Baidu driver is very difficult for foreigners to use. 😢

I'm sorry but, can you provide the data set using something like Google drive?
If possible, it would be of great help to me and other foreigners.

Regardless of my opinion, thank you for sharing a good repository. 👍

第四章读后感和问题

基于2/19更新的版本。可能有关问题在2/21版本已经修复。纯属个人观点,不一定对。

Page 88: 式(4.6c) g 后面的Delta_t_{ij}^2 好像累加不对,即使考虑到下一页Delta_t_{ij}的定义。
Page 91:式(4.15)第二个等号,加法的第一项感觉下标打错了?好像第二项泰勒展开后的下标也打错了。
Page 92:式(4.19)等号左边,括号内感觉少了个负号?
Page 93:式(4.21)等号右边的R感觉少了波浪帽子?
Page 93:式(4.25)第二个等号累加上限感觉是j-2?
Page 96:式(4.35)第二个等号以及以后的,右边分出来的那项的Jocabian下标感觉是j - 1?
Page 96:式(4.36)第四,五个等号Delta_v_ij应该需要加个波浪帽子?参照式(4.13).
左边感觉需要加{ij}的下标?
Page 96:式(4.37)第二,三个等号的左边第一项delta_{p}{ij}应该用大的Delta?
第三个等号的第三项b
{g,i}前面需要加个小delta?
Page 98:图 4-1两边下标都是i,会不会是一侧是i,另一侧应该是j?
Page 99:式(4.42)第一个等号右边感觉应该是 (R_i * Exp(phi_i))^T ?
Page 105: “VertexVelocity” 的 “oplusImpl” 和实际代码有点点不同,虽然实现的结果一样。
Page 106: “EdgeInertial”的代码应该是被搬到的了 src/ch4/g2o_types.cc(h)
Page 99: 式(4.44) J_{b,r} 和 J_{r,b} 同时存在,但应该指的同一个东西。

谢谢高博。

代码环境建议

高博你好!是否考虑给一个docker版本,这样就能使读者快速上手?

第四章 ./bin/test_preintegration 段错误 (核心已转储)

第四章代码test_preintegration 运行到IMUPreintegration::Integrate(const IMU &imu, double dt)的
// 更新噪声项
cov_ = A * cov_ * A.transpose() + B * noise_gyro_acce_ * B.transpose();

出现如下错误:
Program received signal SIGSEGV, Segmentation fault.
Eigen::internal::gemm_pack_lhs<double, long, Eigen::internal::const_blas_data_mapper<double, long, 0>, 8, 4, 0, false, false>::operator() (this=, blockA=0x7fffffffc330, lhs=..., depth=9, rows=9, stride=, offset=0) at /usr/include/eigen3/Eigen/src/Core/products/GeneralBlockPanelKernel.h:1757
1757 pstore(blockA+count, cj.pconj(A)); count+=PacketSize;

第二章建议

ver. 230214

  1. 式 (2.112)
    • 问题: 变量语义不够清晰, 等号左右都出现了 x_k, 因果性让人犯晕, 只有熟悉的人能知道表达什么意思.
    • 建议: 参考barfoot书中(式4.24a)表述更佳image

另, 建议每个章节的建议都有一个单独的issue下, 不需要close(直至书籍正式出版), 方便后续的人加入自己的见解, 同时看看自己的想法是否已经被提及, 不需要重复劳动. @gaoxiang12

Originally posted by @qlibp in #16 (comment)

第五章读后感

根据2/21更新版本。个人观点,不一定对。

  1. Page 121: 最后一句,”整体而言,自动驾驶使用的激光主要分为机械旋转式
    雷达(spining Lidar)与固态雷达(solid state Lidar)两种形式”. 感觉这句话的意思让人理解起来没有问题,但还是有些不太严谨。感觉 “整体而言,自动驾驶使用的激光雷达主要分为机械旋转式(spining Lidar)与固态(solid state Lidar)两种形式” 这样也许会好些。

  2. Page 122: 好像从这一页开始就直接用“雷达”代表激光雷达了,感觉是不是需要声明下,比如说本章用雷达代表激光雷达?不然可能会让人首先想到毫米波雷达。比如这句 “有些人认为 L4 自动驾驶离不开雷达,有些人则激烈地认为雷达是车辆的累赘”,如果不解释是激光雷达,会让人觉得有些疑惑。

  3. https://github.com/gaoxiang12/slam_in_autonomous_driving/blob/master/src/ch5/kdtree.cc#L181 这里感觉用int idx 就够了。

  4. https://github.com/gaoxiang12/slam_in_autonomous_driving/blob/master/src/ch5/kdtree.cc#L196 这里注释意思容易懂,但看代码的意思是上面的判定结果要么全部是负的,要么全部是正的?

  5. https://github.com/gaoxiang12/slam_in_autonomous_driving/blob/master/src/ch5/octo_tree.cc#L110 这样的话感觉就没法考虑点云坐标是负值的情况了。(3, 4, 5 已经提交了一个pull request)

  6. Page 162: “其中 Λ 为对角特征值矩阵,不妨令它的排列是从大到小的”. 这句话可能要改下,比如: “不妨令特征值的排列是....”.

  7. Page 165: “其中 f 为点到直线的垂直距离” 这句话看起来有些多余?

谢谢高博

第二章的一些意见: 第一部分

Page 15: (e1, e2, e3) 需要注明下 e1, e2, e3都属于R_{3} (下标3 ) 吗?
Page 17: 图2-1要注明来源吗? https://www.cvlibs.net/publications/Geiger2013IJRR.pdf
Page 17: 式 2.10 需要注明下 T_{wb} 的具体形式吗?比如建议读者参考式(2.82).虽然可能大部分读者都知道。
Page 17: 式 2.9 如果加一个 Barfoot书中文翻译版图6.2那样的图的话,感觉可以帮助一些初学者读者更好地理解。
Page 18,22: 这里直接提到了李代数,可能对于没有看过slam 14书的读者比较费解。不知道是不是需要加个注解,说李代数在slam 14书的第四讲有具体描述。
Page 18: 这里提到了不同的四元数定义,不知道是否需要注解下文献【10】的第三节有详细描述。
Page 23: 提到了以上内容在14讲里展开介绍过,但可能会让没有读过14讲的读者不理解这里说的“以上内容“具体包括哪些,是2.1.3节呢,还是整个2.1节。
Page 26: 括号里面的 “优化函数的目标更新量“ 对于有些缺乏这方面经验的读者来说可能有些突兀。可能要不然多加些解释,要不然直接去掉。等后面讲优化有关的内容的时候再提到这节的内容。
Page 26: 式 2.72不知道能否加个注解,解释下这个等式是可以推倒出来的,推倒过程可以见文献 [10]的(198)式。个人感觉这样会让读者理解容易些。同时个人感觉这里的½是由于式(2.69)的定义导致的。
Page 27: 不知道是否需要解释下式(2.78)的倒数第二个等号用到了一阶泰勒展开。
Page 30: 式(2.98) 我个人不太理解是如何推倒出来的,这里的w感觉和式(2.69)是一样的,所以不知道这里右雅克比是如何出现的。

谢谢高博。

第二章建议: 第二部分

我看的是230214 更新版本。

  1. 式 (2.110) 的二次项可能缺了一个½的系数。
  2. 式 (2.122) 感觉应该是 (J^{T} * Omega^{-1} * J) * Delta_{x} = - J^{T} * Omega^{-1} * e (如果不考虑累加的话)。我参考了barfoot书中文翻译版的第(4.125)式。

谢谢。

轨迹评测

高博你好,我正打算用evo评测精度,将所有pose导出后,发现位姿的数值都很小,这是增量ndt的轨迹,【每行内容:平移+四元数虚部+实部】看完代码也不知道为啥:
image

compilation error

The compilation order of CMake's add_subdirectory() may result in compilation error.

image

velodyne_msgs are found by catkin, the cmake invoke compilation on tools folder before common folder, which results in the following error(I guess)

Review of ch4

  • 改成位移、速度、旋转更合适一些
    image
  • 公式错误
    image
  • 下标错误
    image
  • 这里的”加上“和1中的”加上“不是一个意思,但是同时出现在上下文中感觉不太合适
    image
  • 加粗
    image
  • 不同文献当中对残差的具体计算并不完全一致,甚至有的论文和实现当中也并不一 致。[去掉当中]
  • 下标
    image

第六章读后感

根据2/21更新版本,纯属个人建议。

  1. Page 169: “然而,大部分轮机器人的运动方式” 这里“轮”字感觉多余?

  2. Page 175: 6.9式 好像需要一个转置才能和Jacobian的定义对上?同样的疑问也存在与6.17, 6.22. 但和代码里面是一致的。代码里面的J其实是转置后的Jacobian.

  3. Page 183: 式 6.19 p 的上标不一致。

  4. 代码中,https://github.com/gaoxiang12/slam_in_autonomous_driving/blob/master/src/ch6/multi_resolution_likelihood_field.cc#L162 把chi2排序之后好像没有进一步使用?不知道有啥目的。

  5. Page 206: 式(6.24) 有误,感觉应该是代码里面所说的 T_S1_S2 = T_S1_C * T_C_W * T_W_S2。

谢谢高博。

gmock报错

按照sudo apt install libgmock-dev已经安装好了gmock,cmake通过,make时仍然gmock报错如下

1676535196175

征集各位读者和审稿人的寄语

本书在标题后几页设置“推荐语”一节,目前我联系到几位教授来帮忙写了几句推荐语。同时,我也希望能够有读者角度的推荐或者寄语。如果各位审稿同学愿意分享在本书阅读过程中的一些体会,可以收集到本贴,最后会在纸质出版物上体现出来。

  • 您可以直接在楼下回复,也可以通过邮件发送给我。
  • 您可以添加一个署名,可以是真名也可以是笔名、网名。您也可以同时提供一个称谓,没有也可以。

感谢各位对本书的喜爱与支持!

运行./bin/test_loosely_lio 已放弃 (核心已转储)

高博,您好!在运行第7章代码./bin/test_loosely_lio时, 出现了 “已放弃 (核心已转储)“的错误,用gdb看的时候发现断在了pangolin_window_impl.cc 的 pangolin::FinishFrame() ; ( 是通过pangolin_window.cc的第23行 impl_->render_thread_ = std::thread([this]() { impl_->Render(); });进去的)。感觉和Pangolin显示有关,继续运行了第8章./bin/test_lio_iekf , 也出现了同样的问题。我安装的Pangolin版本是v0.8 https://github.com/stevenlovegrove/Pangolin/releases/tag/v0.8 (尝试了其他版本v0.7, v0.6应该都不对,编译不过去)。
1
2

Comments on Chapter 10

第10章主要是关于初始化方面的疑问。

书中采用多分辨率NDT得到初始定位,初始分辨率为10,这个能最高允许RTK误差多少米,有大概的经验值么?

如果初始RTK信号差,比10m更远,能否简单降低NDT初始分辨率得到初始定位,还是说可能需要执行一些搜索策略?

如何运行?How to run compiled code?

Screenshot from 2023-02-22 13-36-56
我直接运行bin文件夹下的可执行代码,出现如上错误,显然是ros的库没有被正确调用。这个工程似乎和一般的ros工程编译不太一样,把我整不会了:)。
烦请高博或其他路过的大佬指点下。

第一章的一些个人意见

第一章:
Page 3: “车辆应该能够在上述信号的识别结果基础上控制车辆的油门、方向盘等执行机构”. 建议加上 “刹车”, 虽然可以被“等” 所代表,但是由于其重要性,单独列出来也比较合理。
Page 3, 4: 图 1-1感觉无法体现出高清地图. 可能出于版权考虑,能用的图片很少。您看https://stacks.stanford.edu/file/druid:zx701jr9713/JesseThesisFinal2-augmented.pdf 里面的图2.2, 2.3能用吗?不知道论文里面的图加上引用的话,书是否能用。
Page 7: 图1-3 和 1-4 不知道是否需要把一些公司的标识给遮掩一下?
Page 10: 其实L2功能为了最后的定位效果,目前也会使用HD map. 参考链接:https://www.ushrauto.com/our-take/2020/3/25/9zs3e4tvotc3rsid34agvr0d6lx037

Comments on Chapter 8

0310版本:

  • page 308:8.2.1第1段,“第3”应为“第3章”
  • page 309: 8.2.2要点2,“过程关”应为“过程相关”
  • page 319: 第5点, “如图??”

Comments on Chapter 9

0313版本:

  • page 328: 第2点最后缺句号。

其他疑问:

本章采用先算出关键帧位姿再离线图优化的方式,相比增量在线图优化的优缺点是什么呢?

rtk的异常值剔除能够以在线增量的方式做么?

离线全量图优化会不会有规模太大优化不动的问题?

回环放到第二步优化而不是第一阶段的考虑是什么?

第二阶段只是做回环加位姿图优化感觉可能是次优的,位姿链更新之后特征关联关系可能不对了,导致新的重影,是否需要考虑做BALM类似的BA优化?

谢谢高博

Review of ch3

0306版本

  • 3.1:在自动驾驶中,惯性导航也是十分基础的定位功能。[不通顺]
  • 它在求导之后就 是车辆在世界坐标系下的速度与加速度 $a_w$ , $v_w$。[这里的 a_w 和 v_w 需要调换位置]
  • 有些车辆还存在各种机械震动,比如悬挂系统,车辆本身的运动部件(刷子,滚筒、机械臂等)
  • [去掉这个而]离散时间的零偏本身是加在被测物理量上的...而连续时间的方差需要在离散方差上乘或除以一个平方时间单位
  • 我们也可以简单地称为陀螺白噪声和加速度计白噪声。可见这个 IMU 的指标... [应该是0.66和0.11???]
  • 其幅值就由运行时零偏稳定性描述,在该手册中为 [应该是14.5???]
  • 卫星导航属于内部原理非常复杂,然而输出结果十分简单的类型。[不通顺]
  • 他往往无法很直观想象出来。
  • b,c 最好保持一致
    image
  • image
  • 如果把观测量和噪声量整理的一个向量,我们也可以把上式整理成矩阵形式。[不通顺] 不过这里的矩阵形式将含有很多的零项,相比上式并不会有明显简化,所以我们就先使用这种散开的公式
  • 没有见过下面这个公式,感觉正确的推导应该直接近似为 $\dot{\delta\theta}_\times$,接着再继续推导。
    image
  • 且希望更新的是误差状态,因此要计算观测方程相比于误差状态的雅可比矩阵
  • 其他几都是平凡的,只有旋转部分,因为... [几项]
  • 书中原话:“该问题实际意义是做了切空间投影,即把一个切空间中的高斯分 布投影到另一个切空间中”
    image
  • 并保持其他部分为单位矩阵,可以得到一个完整的雅可比阵
  • image
  • image

另外关于重力的处理,书中写的是“注意在本书的系统里,我们会估计初始的重力方向,所以车辆姿态可以视为 I,重力则不一定垂直指向−Z 轴。在另一些材料里,也可以认为重力固定,而初始状态不确定。那样的推导会稍微麻烦一些”
在用GNSS的姿态进行更新时,gnss的姿态应该时北东地或者东北天的吧,并且重力就是垂直的,不知道这里有没有处理。

Comments on Chapter 6

0310版本
page 197: 式(6.4)上方文字“角度与距离”应为“距离与角度”

第二章疑问

ver. 230214

  1. 式(2.95) & 式(2.99)
    • 疑问: 为什么式(2.95)是对扰动量的李代数求偏导, 式(2.99)是对SO(3)求偏导?

Originally posted by @qlibp in #16 (comment)

make error

Is there a function named "jr" or "jr_inv" in SO3?

slam_in_autonomous_driving/src/ch4/imu_preintegration.cc:58:25: error: ‘jr’ is not a member of ‘SO3’ {aka ‘Sophus::SO3<double>’}
   58 |     Mat3d rightJ = SO3::jr(omega);  // 右雅可比
error: ‘Sophus::SO3Base<Sophus::SO3<double> >::SO3Product<Sophus::SO3<double> >’ {aka ‘class Sophus::SO3<double>’} has no member named ‘jr_inv’
  209 |         _jacobianOplusXi.block<3, 3>(0, 0) = (_measurement.so3().inverse() * v->estimate().so3()).jr_inv();  // dR/dR

第三章一些读后感和问题

纯属个人观点,不一定对。

Page 39: “我们不必关心IMU的内部测量原因” 这里感觉该用 “原理”?
Page 52: 3.3.2节,这里的RTK设备也适用于普通的GNSS信号,不知道是否要注释一下?
Page 64: 式(3.36)第四个等号,delta_theta^后面的那个a好像该加个波浪帽?

https://github.com/gaoxiang12/slam_in_autonomous_driving/blob/master/src/ch3/utm_convert.cc#L31 这一行 const double& 没有必要用const reference, 应该直接double就可以达到一样的效果。

https://github.com/gaoxiang12/slam_in_autonomous_driving/blob/master/src/ch3/process_gnss.cc#L17https://github.com/gaoxiang12/slam_in_autonomous_driving/blob/master/src/ch3/run_eskf_gins.cc#L17 这里三行的三个参数是根据本书提供的数据固定的吗,还是读者可以自己设置?

https://github.com/gaoxiang12/slam_in_autonomous_driving/blob/master/src/ch3/process_gnss.cc#L79 这里是否需要注释下这个原点是如何确定的?

3.5.5 节我跑的结果(在不用轮速测量的情况下)看起来有两个地方发散更明显,我在两个电脑上跑的结果类似。不知道这是否是个问题。
以下是截图。
Screenshot from 2023-02-19 16-15-21

谢谢高博。

第7章小建议

这部分的雷达里程计和lio系统最后只有地图没有精度分析,建议用ground truth坐下定量分析。
image

Comments

根据文稿316的版本:

P139, 图5-2 建议说明r=Range。
P149, “把每次结果与之间的结果进行比较” , “之间的”是否应为 “之前的” ?
P206, “既可以用于 scan to scan 匹配,也可以用于 scan-to-map 的配准” , 前后的scan to …建议统一(是否使用小短线) 。
P215,“那么它的占据概率主会逐渐上升至1”, 是否多了“主”?
P223, “我们每次求解是的相对于当前子地图的位姿”, 应为“求解的是”。
P223, “一些关键帧拷至新的子地图中”, 是否是“拷贝”?
P280, 图7-10, 建议说明图中“l, j,m”的表示。
P285, 图7-12, 建议同样指出角点和平面点的颜色(如图7-11)。
P328, “仅有平移信息而不含位姿信息”, 这句话少了句号。
P195,运行./dataset/sad/2dmapping/test_2d_lidar.bag, 在下载的数据集中没有名为test_2d_lidar.bag这个文件,应为 "floor*.bag"。

谢谢高博!

如何从原始数据集生成rosbag?

我一开始试着从百度网盘下载,结果巨慢。没钱买超级会员。我想问问作者和其他读者,方便告诉一下如何自己生成某些rosbag吗?

我目前一些观察和猜测:

  1. NCLT数据是下载对应日期的某些原始数据,然后通过那个python script转换吗? 对于某个确定的session, 是需要所有的 *.tar.gz文件吗?
  2. UTBM数据大部分可以从 https://epan-utbm.github.io/utbm_robocar_dataset/ 直接下载。
  3. Avia数据可以从 https://drive.google.com/drive/folders/1YL5MQVYgAM8oAWUm7e3OGXZBPKkanmY1 直接下载。
  4. ULHK数据 如何从 https://github.com/weisongwen/UrbanLoco 转换?
  5. WXB 数据好像式可选项目,看起来不是必须的。
  6. 2dmapping数据不大,我就慢慢下好了。

谢谢各位。

Section 3.5 小建议

  1. page 71, 3.5.2 第一段: “更新过程以前协方差矩阵” 中的“以前”应为“以及”?
  2. page 73 第一段: “\Delta” 似乎应为 "\delta"
  3. page 81, 评注第2点:缺了句号。
  4. page 81, 3.5.6第1段: “变为 IMU 积分为递推” 中第二个 “为" 疑似多余
  5. page 82, 式(3.73): 括号多余了

一些细节问题

我阅读的版本是 0307
p272 "好在我们已经在第3 给大家推导了误差状态卡尔曼滤波器"中,第3后面应该加“章”字。
p201 最后一行:导致回环没有被正确检到。感觉是“检测”到。
p202 最下面一行的代码排布有点问题,最好到后面去
P266 图7-14在纸质版的情况下很可能看不出区别,建议放大细节

当前还没有全部看完,但是收获颇丰,后续发现问题会继续在此处留言,感谢高博的知识分享。

My steps to go through compiling the repo

I installed the following libraries before running cmake and make to build the whole repo in Ubuntu 20.04:

ROS Noetic (http://wiki.ros.org/noetic/Installation/Ubuntu)
pcl-ros (if you didn't choose to install ros-noetic-desktop-full): sudo apt install ros-noetic-pcl-ros
velodyne-msgs: sudo apt install ros-noetic-velodyne-msgs
opencv: sudo apt install libopencv-dev
glog: sudo apt install libgoogle-glog-dev
eigen3: sudo apt install libeigen3-dev
suitesparse: sudo apt install libsuitesparse-dev
pcl: sudo apt install libpcl-dev
yaml-cpp: sudo apt install libyaml-cpp-dev
tbb: sudo apt install libbtbb-dev
gmock: sudo apt install libgmock-dev
the system libraries above all together: sudo apt install -y libopencv-dev libgoogle-glog-dev libeigen3-dev libsuitesparse-dev libpcl-dev libyaml-cpp-dev libbtbb-dev libgmock-dev
Pangolin: https://github.com/stevenlovegrove/Pangolin
g2o: use the one in the thirdparty folder

I am hoping this summary can help others. BTW, I can testify that the building won't go through in Ubuntu 18.04 (as Xiang Gao suggested). I had to install Ubuntu 20.04 to build the repo.

第三部分读后感

根据3/16更新版本。

  1. Page 312: (对于式 8.11) “卡尔曼增益左侧部分” 和 “右侧” 应该是“分母部分”和“分子部分”?

  2. https://github.com/gaoxiang12/slam_in_autonomous_driving/blob/master/src/ch8/lio-preinteg/lio_preinteg.cc#L410 这里为何+- y的阈值不对称呢?

  3. Page 341: “”/bin/dump_map −−pose_source opti2” 里面pose_source的斜杠应该不需要.加了斜杠好像会导致程序用默认的pose_source设置,就是lidar.

  4. Page 342: 图 9-6的地图好像不是根据mapping.yaml里面默认的nclt/20120429.bag 所构建的,好像是20120115.bag。但这个估计也不是啥大问题。

到这里书稿就看完了。谢谢高博写书。

第九章地图切片大小不统一

Screenshot from 2023-02-27 17-17-57

如图,索引0覆盖范围是其它索引的两倍。如图所示,0_0.pcd 大小为200x200,0_1.pcd大小为200x100,1_1.pcd大小为100x100.

导致这个问题的原因是代码采用了int()来取证,导致索引0覆盖了-100到100的整整200米的范围。建议采用floor()来取整以确保地图切片大小一致。
int gx = int((pt.x - 50.0) / 100); int gy = int((pt.y - 50.0) / 100);

关于ch10中lidarLocalization的处理

Hi高博,
感谢您的付出和奉献。
有个问题想请教下,ch10中的lidarLocalization函数中为什么使用松耦合的方式来修正,使用ch8紧耦合的方式来做可以吗?或者说,在定位的框架中,松耦合的处理要更好一些?

Review of ch2, etc.

0306版本

  • 14:最后加上回环检测,形成完成的 SLAM 系统。

  • 5.3第1段:传统在 SLAM 应用中,我们关心的元素往往是基本的

  • 6.1第1段:然而,大部分轮机器人的运动方式某个固定的平面当中

  • 173:就会涉及到光线投射算法(ray casting)和栅格化算法(rasterization),栅格化算法加粗

  • 8.1第2段:与雷达里程计进行融合合

  • 9.4第1段:点云地图的质量很大程度来来自充分的回环检测
    322 却是对场景静态三维结构的一个很好的描述

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.