RTAB-Map

—Stars

面向机器人感知与自主导航的实时外观建图系统,融合视觉、RGB-D、双目与 LiDAR 数据,覆盖回环检测、图优化、定位和三维建图,并提供 C++ 核心、Qt 桌面工具及 ROS / ROS 2 集成。

Visual · LiDAR SLAMLoop Closure · Graph OptimizationC++ · Qt · ROS / ROS 2
DESKTOP SLAM · GUI RESOURCE LIFECYCLE

没有任务,就不应该留下进度窗口

一个对话框何时创建,决定错误返回之后是否还会残留孤立的 UI 资源。

REQUEST · DETECT MORE LOOP CLOSURES
INTRA-SESSIONOFF
INTER-SESSIONOFF
SELECTED NODES0
NO EXECUTABLE WORK
BEFORE · ALLOCATE THEN VALIDATE
rtabmap-databaseViewerCancel
SHOW DIALOG→WARNING→RETURN
1 ORPHANED WINDOW
AFTER · VALIDATE THEN ALLOCATE
OPTIONS VALID?NO
warning→RETURN · 0 DIALOGS
YES→same 7 lines→RUN
无效请求

三个检测入口同时不可用

`DatabaseViewer::detectMoreLoopClosures()` 在验证检测选项之前就创建并显示 `ProgressDialog`。当 intra-session 与 inter-session 都关闭、同时又没有选择图节点时,函数弹出配置警告后直接返回,但已经可见的进度窗口没有任何任务可以推进或完成,因而成为无法正常收尾的孤立对话框。

顺序错误

先显示窗口,再发现任务不能开始

进度窗口不是输入表单,而是“有效任务已经开始”的运行期资源;它的生命周期必须由同一条工作路径负责取消、推进和关闭。若请求连前置条件都不满足,就不存在可报告的进度。与其在每个错误出口补清理逻辑,不如让校验闸门支配资源创建,从控制流上保证失败发生时对话框尚不存在。

前置闸门

校验支配资源创建与生命周期

将原有七行 `ProgressDialog` 构造与配置代码原样移动到无效选项检查之后:错误配置现在只显示警告并返回,创建的对话框数量为零;合法配置仍沿用相同父对象、`WA_DeleteOnClose`、取消按钮、宽度与显示行为,回环检测本身没有改变。

行为边界

错误路径归零,正常路径完全不变

无效检测请求现在只显示配置警告,不会创建任何进度资源;合法请求仍使用原有父对象、自动销毁、取消按钮和显示流程。错误路径的窗口数量归零,正常回环检测的执行行为保持不变。

RTAB-Map DatabaseViewer 在无效回环检测配置下遗留进度对话框的原始问题截图
无任务可执行,进度窗口却已被创建

截图中 intra-session 与 inter-session 均未启用,回环检测没有任何合法搜索范围;但空白进度窗口已经覆盖 DatabaseViewer,既不会推进,也无法经过正常完成路径关闭。修复把参数校验前移,在创建对话框之前直接终止无效请求。