动态点跟随

这个行为树从一个起点实现了一个导航行为,试图随着时间跟踪一个动态点。这个 "dynamic point" 可以是一个人,另一个机器人,一个虚拟的胡萝卜,任何东西。唯一的要求是你想要跟随的位姿被发布到 GoalUpdater BT节点中描述的话题。 [校准@混沌无形]

在这棵树中,我们以1 hz的频率重新规划,就像在 导航到点 using the `` ComputePathToPose'' 节点中一样。然而,这一次当我们重新规划时,我们根据更新的目标话题中的最新信息来更新 goal 。在我们规划了一条通往这个动态点的路径后,我们使用``TruncatePath`` 节点,从动态点附近的路径末端移除路径点。这个行为树节点很有用,这样机器人就能始终保持与障碍物的最少的"distance",即使它停下来。它还能平滑任何与试图向成本地图中可能被占用的空间进行路径规划有关的非路径行为。 [校准@混沌无形]

通往动态点的新路径被计算和截断后,再次通过``FollowPath``节点传递给控制器。然而,请注意,它是在一个`KeepRunningUntilFailure'装饰器节点下,确保控制器继续执行,直到出现故障模式。此行为树将无限时间执行,直到导航请求被抢占或取消。 [校准@混沌无形]

<root main_tree_to_execute="MainTree">
  <BehaviorTree ID="MainTree">
    <PipelineSequence name="NavigateWithReplanning">
      <RateController hz="1.0">
        <Sequence>
          <GoalUpdater input_goal="{goal}" output_goal="{updated_goal}">
            <ComputePathToPose goal="{updated_goal}" path="{path}" planner_id="GridBased"/>
          </GoalUpdater>
         <TruncatePath distance="1.0" input_path="{path}" output_path="{truncated_path}"/>
        </Sequence>
      </RateController>
      <KeepRunningUntilFailure>
        <FollowPath path="{truncated_path}" controller_id="FollowPath"/>
      </KeepRunningUntilFailure>
    </PipelineSequence>
  </BehaviorTree>
</root>