动态对象追踪
概述
本教程展示了如何将Nav2用于从A点到B点以外的不同任务。在这种情况下,我们将使用Nav2无限期地跟踪一个移动的物体。 [校准@混沌无形]
此任务在跟踪一个人或另一个机器人的情况下非常有用。以下是可以使用此功能创建的应用程序的一些示例视频。 "Carry My Luggage" RoboCup家庭测试,其中 CATIE Robotics 团队成功执行测试,以及这个真实的 (未来的) 世界应用: [校准@混沌无形]
The requirements for this task are as follows:
变化仅限于用于导航的行为树。当需要时,这行为树可以在
NavigateToPose
行动中选择,或可以是默认行为树。它是由运行时可配置的插件组成的。 [校准@混沌无形]规划器和控制器的配置将不会被修改。 [校准@混沌无形]
该行动将无限期地运行,直到它被发起者取消。 [校准@混沌无形]
检测要跟踪的动态物体(如人)不在本教程的范围内。如下图所示,您的应用程序应该为感兴趣的对象提供一个检测器,将初始位姿发送到 NavigateToPose
动作(action),并在任务期间更新话题。存在许多不同类型的探测器,你可以利用它们来实现这一应用: [校准@混沌无形]
Tutorial Steps
0- Create the Behavior Tree
让我们从这个简单的行为树开始。此行为树以1 hz重新规划新路径,并将该路径传递给控制器来跟踪: [校准@混沌无形]
<root main_tree_to_execute="MainTree">
<BehaviorTree ID="MainTree">
<PipelineSequence name="NavigateWithReplanning">
<RateController hz="1.0">
<ComputePathToPose goal="{goal}" path="{path}" planner_id="GridBased"/>
</RateController>
<FollowPath path="{path}" controller_id="FollowPath"/>
</PipelineSequence>
</BehaviorTree>
</root>
首先,让我们让这个行为运行到出现故障为止。为此,我们将使用 KeepRunningUntilFailure
控制节点。 [校准@混沌无形]
<root main_tree_to_execute="MainTree">
<BehaviorTree ID="MainTree">
<PipelineSequence name="NavigateWithReplanning">
<RateController hz="1.0">
<ComputePathToPose goal="{goal}" path="{path}" planner_id="GridBased"/>
</RateController>
<KeepRunningUntilFailure>
<FollowPath path="{path}" controller_id="FollowPath"/>
</KeepRunningUntilFailure>
</PipelineSequence>
</BehaviorTree>
</root>
然后,我们将使用装饰器 GoalUpdater
来接受我们试图跟踪的动态对象位姿的更新。该节点将当前目标作为输入,并订阅话题 /goal_update
。如果收到关于这个话题的新目标,则它将新目标定为 updated_goal
。 [校准@混沌无形]
<root main_tree_to_execute="MainTree">
<BehaviorTree ID="MainTree">
<PipelineSequence name="NavigateWithReplanning">
<RateController hz="1.0">
<GoalUpdater input_goal="{goal}" output_goal="{updated_goal}">
<ComputePathToPose goal="{updated_goal}" path="{path}" planner_id="GridBased"/>
</GoalUpdater>
</RateController>
<KeepRunningUntilFailure>
<FollowPath path="{path}" controller_id="FollowPath"/>
</KeepRunningUntilFailure>
</PipelineSequence>
</BehaviorTree>
</root>
为了与目标保持一定距离,我们将使用动作节点 TruncatePath
。这个节点修改了路径,使其变短,这样我们就不会试图导航到感兴趣的对象。我们可以用输入端口``distance``来设置到目标的理想距离。 [校准@混沌无形]
<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>
现在,你可以保存此行为树,并把它应用在导航任务中。 [校准@混沌无形]
作为参考,这个确切的行为树是` 可用于 <https://github.com/ros-planning/navigation2/blob/main/nav2_bt_navigator/behavior_trees/follow_point.xml>`_ 的电池,包括在 ``nav2_bt_navigator``包中。 [校准@小鱼]
1- 设置Rviz的点击点 [校准@混沌无形]
我们将使用RViz而不是一个完整的应用程序,这样你就可以在家里测试,而不需要找一个探测器来开始。我们将使用工具栏上的 “ "clicked point" ” 按钮替换对象检测,以向Nav2提供目标更新。这个按钮允许你将坐标数据发布到话题 /clicked_point
。这个点需要通过``clicked_point_to_pose``程序发送到行为树上,该程序来自`这个 仓库 <https://github.com/fmrico/nav2_test_utils>`_。在你的工作区克隆这个仓库,构建,并在终端输入。 [校准@混沌无形]
ros2 run nav2_test_utils clicked_point_to_pose
或者,您可以在你rviz配置文件 goal_updates
中重新映射此话题。 [校准@混沌无形]