Skip to content

初始化扫描阶段 start_yaw_ 是否可能未及时更新,导致 frontier 状态异常? #47

Description

@engine1wu

你好,感谢开源 ApexNav。我们在复现 HM3D ObjectNav v2 评测时观察到一个可能的问题,想确认这是否是预期行为,或者是否与论文内部评测代码有所不同。
我们使用公开仓库当前 release 代码运行 HM3D v2 val split 时,发现不少 episode 会在初始化扫描后很早进入 no frontier,但从保存的视频/BEV 可视化看,环境中似乎仍然存在明显可探索的 frontier。
我们检查到一个可能相关的时序问题:
在 src/planner/exploration_manager/src/exploration_fsm.cpp 中,ExplorationFSM::FSMCallback() 的初始化扫描阶段会执行:

if (fd_->init_action_count_ < 1 + 12 + 1 + 12) {
  ...
  fd_->init_action_count_++;
  transitState(ROS_STATE::PUB_ACTION, "FSM");
  updateFrontierAndObject();
}

而 updateFrontierAndObject() 内部会调用:
frt_map->dormantSeenFrontiers(start_pos2d, fd_->start_yaw_(0));
fd_->start_yaw_ 初始化为 zero,并且在原代码里似乎直到初始化扫描结束后的 main planning branch 才会被设置为当前 fd_->odom_yaw_。但是初始化扫描过程中机器人会原地旋转,每次 turn 后 odom yaw 都已经改变。这样 dormantSeenFrontiers() 在初始化过程中可能会一直使用 stale yaw=0 来做 FOV 判断,从而把一些实际上不在当前视野内的 active frontiers 提前移动到 dormant frontiers。

我们做了一个小修改:在初始化扫描阶段调用 updateFrontierAndObject() 之前,同步当前 pose/yaw:

fd_->start_pt_ = fd_->odom_pos_;
fd_->start_yaw_(0) = fd_->odom_yaw_;

这个修改后,我们之前观察到的几个早期 no frontier case 不再复现,全量复测中,no frontier 失败数量也明显下降。
想请教:
初始化扫描阶段调用 updateFrontierAndObject() 时,是否本来就应该使用当前 odom yaw?
公开 release 代码是否和论文中 HM3D v2 评测使用的代码完全一致?
这个 start_yaw_ 在初始化扫描阶段保持默认值 0 是否是预期设计?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions