YungeCui / BoW3D

[RA-L] BoW3D: Bag of Words for Real-Time Loop Closing in 3D LiDAR SLAM.
277 stars 39 forks source link

一些疑问 #1

Closed chengwei0427 closed 1 year ago

chengwei0427 commented 1 year ago

你好, @YungeCui 感谢你对开源社区的贡献,很棒的工作; 不过我在测试中,遇到一些问题,想向你请教一下; 在编译后,使用kitti数据进行测试,在241行之前,加了打印mScoreFrameID.size(),但是这个数据一直为0; https://github.com/YungeCui/BoW3D/blob/b6ccbd6327d2d5967ffbab4e30021eb3e1c935f0/src/BoW3D.cpp#L241 然后我修改example.cpp和Bow3D.cpp,执行后,还是无法找到闭环数据; 测试数据:2011_09_29_drive_0004_sync

YungeCui commented 1 year ago

你好, @chengwei0427 你是在KITTI的哪个序列上进行的测试?KITTI上的00,02, 05, 06,07,08存在闭环,如果在其它序列上,可能会出现你所说的一直为0的情况。另外,就是存在闭环的序列,开始阶段也可能一直为0,你可以试试06序列,这个序列比较短,且后段部分存在较多的闭环帧。

YungeCui commented 1 year ago

另外,我在06序列上测试了是否存在你所说的问题,测试结果是在存在闭环帧的位置mScoreFrameID.size()是不为0的,你也可以在我说的这个序列上试一下。

chengwei0427 commented 1 year ago

我用的任乾在知乎上提供的数据集,只下载了部分数据(2011_09_29_drive_0004_sync) https://pan.baidu.com/s/1TyXbifoTHubu3zt4jZ90Wg#list/path=%2F 测试数据:https://pan.baidu.com/s/1TyXbifoTHubu3zt4jZ90Wg 提取码: n9ys

你可以看下我上面的test.zip里的代码,我修改了一下bow3d.cpp里的retrieve函数,在example中,每次都先update,然后retrieve,这样可以让Bow3d中的mvframe保留了当前帧的数据,一般来说,retrieve时会检索到自己的,但是实际测试中并没有检索到。(当然,也可能是我理解有偏差)

YungeCui commented 1 year ago

检测不到自己的,那个时候还没有更新词袋,你可以看一下main函数,将当前帧update到database是在retrieve函数之后,因此是先检测当前帧,然后再将当前帧添加到database中。因此是不存在你说的这个问题的。

chengwei0427 commented 1 year ago

你好, @YungeCui 我是想把BoW3D这部分融入我自己的mapping算法里面的,为了方便在后端增加闭环部分,所以做了函数的调整(先update当前帧,然后在retrieve当前存储的mvFrame中的最后一个数据,理论上来说,在database里是可以检索到自己的【第一条的test.zip里有修改后的代码】);也可能代码没有看太明白;

YungeCui commented 1 year ago

为什么要先update再retrieve?这个逻辑是存在问题的。 另外假设先update,再retrieve,你看retrieve代码中存在: if(frameId - (*placesIter).first < 300) { continue; } 所以只要回环帧与当前帧的ID差在300以内,是检测不到的。所以你把当前帧加进去,由于当前帧(回环)与当前帧的ID差为0,所以也是检测不到当前帧的。

chengwei0427 commented 1 year ago

我刚刚看了下,这个地方我修改后的阈值还是不够小,所以重叠率还不足以保证能检测到。感谢耐心解答。