< >
Home » ROS2与Navigation2入门教程 » ROS2与Navigation2入门教程-配置行为树XML节点(Behavior Tree XML Nodes)

ROS2与Navigation2入门教程-配置行为树XML节点(Behavior Tree XML Nodes)

说明:

  • 介绍如何配置行为树XML节点(Behavior Tree XML Nodes)

概述

  • 软件包nav2_behavior_tree提供了几个特定于导航的节点,这些节点已预先注册好且可以包含在行为树中。

  • 查看这个简介以了解行为树的工作原理以及动作、条件、控制和装饰器之间的区别。

  • 由于SingleTrigger BT节点不含参数,未在下面列出该节点。

动作插件

  • 提供多个动作插件 Wait,Spin,BackUp等

Wait

  • 该插件可以调用由nav2_recoveries模块实现的ROS 2的Wait动作服务器。在nav2行为树中此动作可用作恢复行为。

  • 输入端口:

wait_duration端口:数据类型为double,默认值为1.0。端口描述—用于设置等待的时间(单位为秒)。
server_name端口:数据类型为string,默认值为N/A。端口描述—用于设置动作服务器名称。
server_timeout端口:数据类型为double,默认值为10.0。端口描述—用于设置动作服务器的超时时间(单位为ms)。
  • 示例:
<Wait wait_duration="1.0" server_name="wait_server" server_timeout="10"/>

Spin

  • 该插件可以调用由nav2_recoveries模块实现的ROS 2的Spin动作服务器。

  • 该插件会按给定的角度执行原地旋转。在nav2行为树中此动作可用作恢复行为。

  • 输入端口:

spin_dist端口:数据类型为double,默认值为1.57。端口描述—用于设置旋转角度(单位为弧度radians)。
server_name端口:数据类型为string,默认值为N/A。端口描述—用于设置动作服务器名称。
server_timeout端口:数据类型为double,默认值为10.0。端口描述—用于设置动作服务器的超时时间(单位为ms)。
  • 示例:
<Spin spin_dist="1.57" server_name="spin" server_timeout="10"/>

BackUp

  • 该插件可以调用ROS 2的BackUp动作服务器,使机器人后退特定的位移量。它会执行给定距离的线性平移。

  • 在nav2行为树中该插件可用作恢复行为。

  • 模块nav2_recoveries实现了BuckUp动作服务器。

  • 输入端口:

backup_dist端口:数据类型为double,默认值为-0.15。端口描述—用于设置后退的总距离(单位为m)。
backup_speed端口:数据类型为double,默认值为0.025。端口描述—用于设置后退的速度(单位为m/s)。
server_name端口:数据类型为string,默认值为N/A。端口描述—用于设置动作服务器名称。
server_timeout端口:数据类型为double,默认值为10.0。端口描述—用于设置动作服务器的超时时间(单位为ms)。
  • 示例:
<BackUp backup_dist="-0.2" backup_speed="0.05" server_name="backup_server" server_timeout="10"/>

ComputePathToPose

  • 该插件可调用nav2_planner模块实现的ComputePathToPose ROS 2动作服务器。

  • 可以用server_name输入端口重映射该服务器地址。

  • 输入端口:

    start端口:数据类型为geometry_msgs::msg::PoseStamped,默认值为N/A。端口描述—用于设置开始位姿,为可选端口。仅在没有留空时使用该端口。可以接受黑板变量,例如 “{start}”。
    goal端口:数据类型为geometry_msgs::msg::PoseStamped,默认值为N/A。端口描述—用于设置目标位姿。可以接受黑板变量,例如 “{goal}”。
    planner_id端口:数据类型为string,默认值为N/A。端口描述—用于设置要使用的规划器插件类型的映射名称,例如GridBased。
    server_name端口:数据类型为string,默认值为N/A。端口描述—用于设置动作服务器名称。
    server_timeout端口:数据类型为double,默认值为10.0。端口描述—用于设置动作服务器的超时时间(单位为ms)。

  • 输出端口:

path端口:数据类型为nav_msgs::msg::Path,默认值为N/A。端口描述—用于设置动作服务器创建的路径。可以接受黑板变量,例如 “{path}”。
  • 示例:
<ComputePathToPose goal="{goal}" path="{path}" planner_id="GridBased" server_name="ComputePathToPose" server_timeout="10"/>

FollowPath

  • 该插件可以调用ROS 2的FollowPath动作服务器,该动作服务器由加载的控制器插件模块实现。

  • 可以使用server_name输入端口重映射该服务器地址。

  • 输入端口:

path端口:数据类型为string,默认值为N/A。端口描述—用于设置要遵循(跟随)的路径,可以接受黑板变量,例如“{path}”。
controller_id端口:数据类型为string,默认值为N/A。端口描述—用于设置要使用的控制器插件类型的映射名称,例如FollowPath。
goal_checker_id端口:数据类型为string,默认值为N/A。端口描述—用于设置要使用的目标检测器插件类型的映射名称,例如SimpleGoalChecker。
server_name端口:数据类型为string,默认值为N/A。端口描述—用于设置动作服务器名称。
server_timeout端口:数据类型为double,默认值为10.0。端口描述—用于设置动作服务器的超时时间(单位为ms)。
  • 示例:
<FollowPath path="{path}" controller_id="FollowPath" goal_checker_id="precise_goal_checker" server_name="FollowPath" server_timeout="10"/>

NavigateToPose

  • 该插件可以调用ROS 2的NavigateToPose动作服务器,该动作服务器由bt_navigator模块实现。

  • 输入端口:

goal端口:数据类型为PoseStamped,默认值为N/A。端口描述—用于设置目标位姿,可以接受黑板变量,例如 “{goal}”。
server_name端口:数据类型为string,默认值为N/A。端口描述—用于设置动作服务器名称。
server_timeout端口:数据类型为double,默认值为10.0。端口描述—用于设置动作服务器的超时时间(单位为ms)。
  • 示例:
<NavigateToPose goal="{goal}" server_name="NavigateToPose" server_timeout="10"/>

ClearEntireCostmap

  • 该插件可以调用成本地图清除动作服务器。

  • 输入端口:

service_name端口:数据类型为string,默认值为N/A。端口描述—用于设置负责清除成本地图的成本地图服务名称。
server_timeout端口:数据类型为double,默认值为10.0。端口描述—用于设置动作服务器的超时时间(单位为ms)。
  • 示例:
<ClearEntireCostmap name="ClearLocalCostmap-Subtree" service_name="local_costmap/clear_entirely_local_costmap"/>

ClearCostmapExceptRegion

  • 该插件可以调用除例外区域外的成本地图清除动作服务器。

  • 输入端口:

reset_distance端口:数据类型为double,默认值为1.0。端口描述—用于设置不会在成本地图上清除的、以机器人为中心的正方形区域的边长(成本地图的所有其余部分都会被清除)。
service_name端口:数据类型为string,默认值为N/A。端口描述—用于设置负责清除成本地图的成本地图服务名称。
server_timeout端口:数据类型为double,默认值为10.0。端口描述—用于设置动作服务器的超时时间(单位为ms)。
  • 示例:
<ClearCostmapExceptRegion name="ClearLocalCostmap-Subtree" service_name="local_costmap/clear_except_local_costmap"/>

ClearCostmapAroundRobot

  • 该插件可以调用成本地图清除机器人周围区域动作服务器。

  • 输入端口:

reset_distance端口:数据类型为double,默认值为1.0。端口描述—用于设置在成本地图上会被清除的、以机器人为中心的正方形区域的边长(成本地图的所有其余部分不会被清除)。
service_name端口:数据类型为string,默认值为N/A。端口描述—用于设置负责清除成本地图的成本地图服务名称。
server_timeout端口:数据类型为double,默认值为10.0。端口描述—用于设置动作服务器的超时时间(单位为ms)。
  • 示例:
<ClearCostmapAroundRobot name="ClearLocalCostmap-Subtree" service_name="local_costmap/clear_around_local_costmap"/>

ReinitializeGlobalLocalization

  • 该插件可用于在机器人严重离域或被绑架问题情况下使用AMCL触发全局重定位。

  • 输入端口:

service_name端口:数据类型为string,默认值为N/A。端口描述—用于设置服务名称。
server_timeout端口:数据类型为double,默认值为10.0。端口描述—用于设置服务器超时时间(单位为ms)。
  • 示例:
<ReinitializeGlobalLocalization service_name="reinitialize_global_localization"/>

TruncatePath

  • 该插件是一个自定义控制节点,用于修改路径使其更短。

  • 它会移除距离目标位姿比某个设定距离更近的路径部分。

  • 产生的结果路径最终位姿会将机器人定向到原始目标位姿。

  • 输入端口:

input_path端口:数据类型为nav_msgs/Path,默认值为N/A。端口描述—用于设置要截断的原始路径。
distance端口:数据类型为double,默认值为1.0。端口描述—用于为路径截断设置到原始目标位姿的距离。
  • 输出端口:
output_path端口:数据类型为nav_msgs/Path,默认值为N/A。端口描述—用于设置截断结果路径。
  • 示例:
<TruncatePath distance="1.0" input_path="{path}" output_path="{truncated_path}"/>

PlannerSelector

  • 该插件用于选择规划器服务器将会使用的规划器。

  • 它会订阅planner_selector话题以接收带有要使用的规划器名称的命令消息。它通常在ComputePathToPoseAction前面使用。

  • selected_planner输出端口会被传递给ComputePathToPoseAction的planner_id输入端口。

  • 如果在话题没有提供规划器名称,则会使用default_planner。

  • 这个话题的任何发布者都需要配置一些定义为reliable和transient_local的QoS。

  • 输入端口:

topic_name端口:数据类型为string,默认值为planner_selector。端口描述—用于设置用来接收选择命令消息的话题名称。这可用于支持多个PlannerSelector的节点。
default_planner端口:数据类型为string,默认值为N/A。端口描述—用于设置规划器的默认值(如果未从输入话题接收到所选规划器的消息)。
  • 输出端口:
selected_planner端口:数据类型为string,默认值为N/A。端口描述—输出的所选规划器ID。这个selected_planner字符串通常通过planner_id输入端口传递给ComputePathToPose行为。
  • 示例:
<PlannerSelector selected_planner="{selected_planner}" default_planner="GridBased" topic_name="planner_selector"/>

ControllerSelector

  • 该插件用于选择控制器服务器将会使用的控制器。

  • 它会订阅controller_selector话题以接收带有要使用的控制器名称的命令消息。

  • 它通常在FollowPathAction前面使用。selected_controller输出端口会被传递给FollowPathAction的controller_id输入端口。

  • 如果在话题没有提供控制器名称,则会使用default_controller。

  • 这个话题的任何发布者都需要配置一些定义为reliable和transient_local的QoS。

  • 输入端口:

topic_name端口:数据类型为string,默认值为controller_selector。端口描述—用于设置用来接收选择命令消息的话题名称。这可用于支持多个ControllerSelector的节点。
default_controller端口:数据类型为string,默认值为N/A。端口描述—用于设置控制器的默认值(如果未从输入话题接收到所选控制器的消息)。
  • 输出端口:

    selected_controller端口:数据类型为string,默认值为N/A。端口描述—输出的所选控制器ID。这个selected_controller字符串通常通过controller_id输入端口传递给FollowPath行为。

  • 示例:

<ControllerSelector selected_controller="{selected_controller}" default_controller="FollowPath" topic_name="controller_selector"/>

GoalCheckerSelector

  • 该插件用于选择goal_checker服务器将会使用的目标检测器(GoalChecker)。

  • 它会订阅goal_checker_selector话题以接收带有要使用的目标检测器名称的命令消息。

  • 它通常在FollowPathAction前面使用。

  • selected_goal_checker输出端口会被传递给FollowPathAction的goal_checker_id输入端口。

  • 如果在话题上没有提供目标检测器名称,则会使用default_goal_checker。

  • 这个话题的任何发布者都需要配置一些定义为reliable和transient_local的QoS。

  • 输入端口:

topic_name端口:数据类型为string,默认值为goal_checker_selector。端口描述—用于设置用来接收选择命令消息的话题名称。这可用于支持多个GoalCheckerSelector的节点。
default_goal_checker端口:数据类型为string,默认值为N/A。端口描述—用于设置目标检测器的默认值(如果未从输入话题接收到所选目标检测器的消息)。
  • 输出端口:
selected_goal_checker端口:数据类型为string,默认值为N/A。端口描述—输出的所选目标检测器ID。这个selected_goal_checker字符串通常通过goal_checker_id输入端口传递给FollowPath行为。
  • 示例:
<GoalCheckerSelector selected_goal_checker="{selected_goal_checker}" default_goal_checker="precise_goal_checker" topic_name="goal_checker_selector"/>

NavigateThroughPoses

  • 该插件可以调用ROS 2的NavigateThroughPoses动作服务器,该服务器由bt_navigator模块实现。

  • 输入端口:

goals端口:数据类型为vector<geometry_msgs::msg::PoseStamped>,默认值为N/A。端口描述—用于设置多个目标位姿,可以接受黑板变量,例如 “{goals}”。
server_name端口:数据类型为string,默认值为N/A。端口描述—用于设置动作服务器名称。
server_timeout端口:数据类型为double,默认值为10.0。端口描述—用于设置动作服务器的超时时间(单位为ms)。
  • 示例:

ComputePathThroughPoses

  • 该插件可以调用由nav2_planner模块实现的ROS 2的ComputePathThroughPoses动作服务器。

  • 可以使用server_name输入端口重映射该服务器地址

  • 输入端口:

start端口:数据类型为geometry_msgs::msg::PoseStamped,默认值为N/A。端口描述—用于设置开始位姿,为可选端口。仅在没有留空时使用该端口。可以接受黑板变量,例如 “{start}”。
goals端口:数据类型为vector<geometry_msgs::msg::PoseStamped>,默认值为N/A。端口描述—用于设置多个目标位姿。可以接受黑板变量,例如 “{goals}”。
planner_id端口:数据类型为string,默认值为N/A。端口描述—用于设置要使用的规划器插件类型的映射名称,例如GridBased。
server_name端口:数据类型为string,默认值为N/A。端口描述—用于设置动作服务器名称。
server_timeout端口:数据类型为double,默认值为10.0。端口描述—用于设置动作服务器的超时时间(单位为ms)。
  • 输出端口:
path端口:数据类型为nav_msgs::msg::Path,默认值为N/A。端口描述—用于设置动作服务器创建的路径。可以接受黑板变量,例如 “{path}”。
  • 示例:
<ComputePathThroughPoses goals="{goals}" path="{path}" planner_id="GridBased" server_name="ComputePathThroughPoses" server_timeout="10"/>

RemovePassedGoals

  • 该插件可以查看输入端口goal并删除机器人靠近或最近经过的任何点。

  • 该插件用于剔除从ComputePathToPoses传递过来的目标点,以启用只对当前任务目标进行重新规划的功能。

  • 输入端口:

radius端口:数据类型为double,默认值为0.5。端口描述—用于设置半径(单位为m),以便BT节点删除机器人已通过点列表中该半径范围内的通过点。
global_frame端口:数据类型为string,默认值为“map”。端口描述—用于设置参考坐标系。
robot_base_frame端口:数据类型为string,默认值为“base_link”。端口描述—用于设置机器人底座坐标系。
input_goals端口:数据类型为geometry_msgs::msg::PoseStamped,默认值为N/A。端口描述—设置用于检查是否在当前迭代中通过了任何目标点的一个目标点向量。
  • 输出端口:
output_goals端口:数据类型为geometry_msgs::msg::PoseStamped,默认值为N/A。端口描述—设置用于移除机器人附近目标点的一个目标点向量。
  • 示例:
<RemovePassedGoals radius="0.6" input_goals="{goals}" output_goals="{goals}"/>

条件插件

  • 提供多个条件插件GoalReached,GoalUpdater,InitialPoseReceived等

GoalReached

  • 该插件可以检查到目标位姿的距离,如果到目标位姿的距离小于预先定义的阈值,则行为树会返回SUCCESS,否则会返回FAILURE。

  • 参数:

transform_tolerance参数:已在Behavior-Tree Navigator中定义和申明。
goal_reached_tol参数:数据类型为double,默认值为0.25。参数描述—用于设置接受位姿作为目标位姿的容忍误差(单位为m)。
  • 示例:
bt_navigator:
  ros__parameters:
    # other bt_navigator parameters
    transform_tolerance: 0.1
    goal_reached_tol: 0.25
  • 输入端口:
goal端口:数据类型为string,默认值为N/A。端口描述—用于设置要检查的目标位姿,可以接收黑板变量,例如 “{goal}”。
global_frame端口:数据类型为string,默认值为“map”。 端口描述—用于设置参考坐标系。
robot_base_frame端口:数据类型为string,默认值为“base_link”。 端口描述—用于设置机器人底座坐标系。
  • 示例:
<GoalReached goal="{goal}" global_frame="map" robot_base_frame="base_link"/>

TransformAvailable

  • 该插件可以检查TF变换是否可用。

  • 如果找不到TF变换,则返回失败。

  • 一旦找到了TF变换,就会始终返回成功。

  • 该插件对于初始条件检查很有用。

  • 输入端口:

child端口:数据类型为string,默认值为“”。端口描述—用于设置TF变换的子坐标系。
parent端口:数据类型为string,默认值为“”。端口描述—用于设置TF变换的父坐标系。
  • 示例:
<TransformAvailable parent="odom" child="base_link"/>

DistanceTraveled

  • 该插件是一个当已行进了一个可配置的距离时会返回成功的节点。

  • 参数:

transform_tolerance参数:已在Behavior-Tree Navigator中定义和申明。
  • 示例:
bt_navigator:
  ros__parameters:
    # other bt_navigator parameters
    transform_tolerance: 0.1
  • 输入端口:
Distance端口:数据类型为double,默认值为1.0。端口描述—用于设置在返回成功前必须行进的距离(单位为m)。
global_frame端口:数据类型为string,默认值为“map”。端口描述—用于设置参考坐标系。
robot_base_frame端口:数据类型为string,默认值为“base_link”。 端口描述—用于设置机器人底座坐标系。
  • 示例:
<DistanceTraveled distance="0.8" global_frame="map" robot_base_frame="base_link"/>

GoalUpdater

  • 该插件可以检查黑板中的全局导航目标是否已更改。

  • 如果目标相同,会返回失败;如果目标发生变化,则会返回成功。

  • 示例:

<GoalUpdated/>

InitialPoseReceived

  • 该插件是一个当初始位姿通过/initial_pose发送至AMCL时会返回成功的节点。

  • 示例:

<InitialPoseReceived/>

IsStuck

  • 该插件可以确定机器人是否未朝着目标前进。

  • 如果机器人被卡住并且没有前进,则条件会返回SUCCESS,否则会返回FAILURE。

  • 示例:

<IsStuck/>

TimeExpired

  • 该插件是一个在经过一段时间后会返回成功的节点。

  • Seconds参数:数据类型为double,默认值为1.0。参数描述—用于设置返回成功需要经过的时间(单位为秒)。

  • 示例:

<TimeExpired seconds="1.0"/>    

IsBatteryLow

  • 该插件可以通过订阅sensor_msgs/BatteryState话题并检查电池百分比/电压是否低于指定的最小值来检查电池是否电量过低。

  • 默认情况下,百分比(范围0到1)用于检查电池电量是否不足。

  • 将 is_voltage 参数设置为true以使用电压作为检查指标。

  • 当电池百分比/电压低于指定值时会返回SUCCESS,否则会返回FAILURE。

  • 示例:

<IsBatteryLow min_battery="0.5" battery_topic="/battery_status" is_voltage="false"/>

控制插件

  • 提供多个控制插件,PipelineSequence,RoundRobin,RecoveryNode等

PipelineSequence插件

  • 勾选第一个子节点直到它成功,然后勾选第一个和第二个子节点直到第二个成功。

  • 再然后勾选第一个、第二个和第三个子节点,直到第三个成功,依此类推。

  • 如果在任何时候子节点返回RUNNING,那就不会改变行为。

  • 而如果在任何时候一个子节点返回FAILURE,这会停止所有子节点并返回FAILURE。

  • 示例:

<PipelineSequence>
<!--Add tree components here--->
</PipelineSequence>

RoundRobin插件

  • 用于为BT子节点创建循环行为的自定义控制流节点。

  • 示例:

<RoundRobin>
<!--Add tree components here--->
</RoundRobin>

RecoveryNode

  • RecoveryNode是一个有两个子节点的控制流节点。

  • 当且仅当第一个子节点返回SUCCESS时,它才会返回SUCCESS。只有当第一个子节点返回FAILURE时,才会执行第二个子节点。如果第二个子节点返回SUCCESS,则会再次执行第一个子节点。

  • 用户可以指定在返回FAILURE之前应该执行多少次恢复动作。在nav2中,RecoveryNode包含在行为树中,用于在发生故障时执行恢复动作。

  • 输入端口:

number_of_retries端口:数据类型为int,默认值为1。端口描述—用于设置执行恢复动作的次数。
  • 示例:
<RecoveryNode number_of_retries="1">
<!--Add tree components here--->
</RecoveryNode>

装饰器插件

  • 提供多个装饰器插件,RateController,DistanceController,SpeedController等

RateController

  • 该插件是一个控制勾选其子节点频率的节点。勾选频率(tick rate)可以作为参数提供给该节点。当该节点没有勾选其子节点时,会返回 RUNNING。

  • 目前,在导航软件堆栈中,RateController插件用于调节ComputePathToPose和GoalReached节点被勾选的频率。

  • 输入端口:

hz端口:数据类型为double,默认值为10.0。端口描述—用于设置对一个动作或者一组动作进行控制的频率。
  • 示例:
<RateController hz="1.0">
<!--Add tree components here--->
</RateController>

DistanceController

  • 该插件是一个基于其行进距离控制其子节点勾选频率的节点。

  • 重新规划前要行驶的距离可以作为参数提供给该节点。当该节点没有勾选其子节点时会返回RUNNING。

  • 目前,在导航软件堆栈中,DistanceController插件用于调节ComputePathToPose和GoalReached节点被勾选的频率。

  • 输入端口:

distance端口:数据类型为double,默认值为1.0。端口描述—用于设置为触发诸如规划路径之类的动作而行进的距离(单位为m)。
global_frame端口:数据类型为string,默认值为“map”。 端口描述—用于设置参考坐标系。
robot_base_frame端口:数据类型为string,默认值为“base_link”。 端口描述—用于设置机器人基座坐标系。
  • 示例:
<DistanceController distance="0.5" global_frame="map"     robot_base_frame="base_link">
  <!--Add tree components here--->
</DistanceController>

SpeedController

  • 该插件是一个基于当前机器人速度控制其子节点勾选频率的节点。

  • 最大和最小重新规划频率可以作为参数连同最大和最小速度一起提供给该节点。当节点没有勾选其子节点时会返回RUNNING。

  • 目前,在导航软件堆栈中,SpeedController插件用于调节ComputePathToPose和GoalReached节点被勾选的频率。

  • 输入端口:

min_rate端口:数据类型为double,默认值为0.1。端口描述—用于设置可以勾选子节点的最小频率(单位为hz)。
max_rate端口:数据类型为double,默认值为1.0。端口描述—用于设置可以勾选子节点的最大频率(单位为hz)。
min_speed端口:数据类型为double,默认值为0.0。端口描述—用于设置机器人的最小速度(单位为m/s),低于该速度时会以最小频率勾选子节点。
min_speed端口:数据类型为double,默认值为0.5。端口描述—用于设置机器人的最大速度(单位为m/s),高于该速度时会以最大频率勾选子节点。
filter_duration端口:数据类型为double,默认值为0.3。端口描述—用于设置让机器人速度平滑所需的持续时间(单位为秒)。
  • 示例:
<SpeedController min_rate="0.1" max_rate="1.0" min_speed="0.0" max_speed="0.5" filter_duration="0.3">
  <!--Add tree components here--->
</SpeedController>

GoalUpdater

  • 该插件是一个自定义控制节点,用于更新目标位姿。

  • 它会订阅一个话题,在该话题上它可以接收一个更新后的目标位姿并使用该位姿,而不是使用在行动中指示的位姿。该插件对于动态物体跟踪任务很有用。

  • 参数:

change_goal_topic参数:数据类型为string,默认值为“goal_update”。参数描述—用于设置接收更新后目标位姿的话题。
  • 输入端口:
input_goal端口:数据类型为geometry_msgs/PoseStamped,默认值为N/A。端口描述—用于设置最初的目标位姿。
output_goal端口:数据类型为geometry_msgs/PoseStamped,默认值为N/A。端口描述—用于设置更新后的目标位姿。如果订阅没有收到目标位姿,则会是input_goal。
  • 示例:
<ChangeGoal input_goal="{goal}" output_goal="{updated_goal}">
  <!--Add tree components here--->
</ChangeGoal>

示例

  • 下面这个示例行为树会以1 Hz的频率定期重新规划全局路径,并且还具有恢复动作。
<root main_tree_to_execute="MainTree">
  <BehaviorTree ID="MainTree">
    <RecoveryNode number_of_retries="6" name="NavigateRecovery">
      <PipelineSequence name="NavigateWithReplanning">
        <RateController hz="1.0">
          <RecoveryNode number_of_retries="1" name="ComputePathToPose">
            <ComputePathToPose goal="{goal}" path="{path}" planner_id="GridBased"/>
            <ClearEntireCostmap name="ClearGlobalCostmap-Context" service_name="global_costmap/clear_entirely_global_costmap"/>
          </RecoveryNode>
        </RateController>
        <RecoveryNode number_of_retries="1" name="FollowPath">
          <FollowPath path="{path}" controller_id="FollowPath"/>
          <ClearEntireCostmap name="ClearLocalCostmap-Context" service_name="local_costmap/clear_entirely_local_costmap"/>
        </RecoveryNode>
      </PipelineSequence>
      <ReactiveFallback name="RecoveryFallback">
        <GoalUpdated/>
        <SequenceStar name="RecoveryActions">
          <ClearEntireCostmap name="ClearLocalCostmap-Subtree" service_name="local_costmap/clear_entirely_local_costmap"/>
          <ClearEntireCostmap name="ClearGlobalCostmap-Subtree" service_name="global_costmap/clear_entirely_global_costmap"/>
              <Spin spin_dist="1.57"/>
          <Wait wait_duration="5"/>
        </SequenceStar>
      </ReactiveFallback>
    </RecoveryNode>
  </BehaviorTree>
</root>

参考:

  • https://navigation.ros.org/configuration/packages/configuring-bt-xml.html

纠错,疑问,交流: 请进入讨论区点击加入Q群

获取最新文章: 扫一扫右上角的二维码加入“创客智造”公众号


标签: ros2与navigation2入门教程