2024/1/7

        在之前的基础上,已经完成了骨架机器人和nav2导航的结合,实现了nav2在骨架机器人上运行,所以接下来是为了实现在骨架机器人上运行跟踪模块,实现对人员的跟踪。

        因为nav2的基础导航系统建立在bringup包上,根据navigation2-main\nav2_bringup\params的nav2_params.yaml,可获取一下的行为树配置代码:

bt_navigator:

ros__parameters:

global_frame: map

robot_base_frame: base_link

odom_topic: /odom

bt_loop_duration: 10

default_server_timeout: 20

wait_for_service_timeout: 1000

action_server_result_timeout: 900.0

navigators: ["navigate_to_pose", "navigate_through_poses"]

navigate_to_pose:

plugin: "nav2_bt_navigator/NavigateToPoseNavigator"

navigate_through_poses:

plugin: "nav2_bt_navigator/NavigateThroughPosesNavigator"

# 'default_nav_through_poses_bt_xml' and 'default_nav_to_pose_bt_xml' are use defaults:

# nav2_bt_navigator/navigate_to_pose_w_replanning_and_recovery.xml

# nav2_bt_navigator/navigate_through_poses_w_replanning_and_recovery.xml

# They can be set here or via a RewrittenYaml remap from a parent launch file to Nav2.

plugin_lib_names:

- nav2_compute_path_to_pose_action_bt_node

...

- nav2_is_battery_charging_condition_bt_node

error_code_names:

- compute_path_error_code

- follow_path_error_code

其中:

1. 总体配置:

bt_navigator: 定义了行为树导航器的配置部分。ros__parameters: 指明了以下参数是 ROS 参数。

2. 基础参数:

global_frame: 定义了全局坐标系的名称(通常为 "map")。robot_base_frame: 定义了机器人本体坐标系的名称(通常为 "base_link")。odom_topic: 指定了里程计数据的 ROS 话题名称。bt_loop_duration: 设置了行为树的循环周期。default_server_timeout: 设置了默认服务器超时时间。wait_for_service_timeout: 设置了等待服务启动时的超时时间。action_server_result_timeout: 设置了等待行为树节点执行结果的超时时间。

3. 导航器类型:

navigators: 列出了可用的导航器类型,通常包括:

navigate_to_pose:用于导航到单个目标点。navigate_through_poses:用于导航一系列目标点。

4. 导航器插件:

navigate_to_pose 和 navigate_through_poses: 分别指定了对应导航器的插件名称。

5. 行为树节点库:

plugin_lib_names: 列出了行为树导航器所需的节点库名称,用于实现各种导航行为和条件判断。

6. 错误代码:

error_code_names: 列出了需要监控的错误代码名称,用于在导航过程中进行错误处理。

而这两个默认的导航器对应的xml文件如下:

navigate_to_pose:

navigate_through_poses:

navigate_to_pose对应的行为树:

所以为了实现跟踪,需要在此行为树的基础上加上跟踪的子树。

跟踪的子树

参考:nav2跟踪动态点

任务要求如下:

改变仅限于用于导航的行为树。该行为树可以在需要时在 NavigateToPose 行为中选择,也可以是默认行为树。它由可在运行时配置的插件组成。规划器和控制器的配置不会改变。该行为将无限期运行,直到被启动者取消。对要跟随的动态物体(如人)的检测不在本教程的范围内。如图所示,您的应用程序应该为感兴趣的物体提供一个检测器,将初始位姿发送给 NavigateToPose 行为,并在任务期间更新它。您可以利用许多不同类型的检测器来实现这个应用程序:

跟踪动态点的行为树xml:

此行为树以 1 Hz 重新规划一条新路径,并将该路径传递给控制器以遵循。

首先,让我们让此行为一直运行,直到出现故障。为此,我们将使用控制节点KeepRunningUntilFailure。

然后,我们将使用装饰器 GoalUpdater 来接受我们尝试遵循的动态对象姿势的更新。该节点将当前目标作为输入并订阅主题/goal_update。它设定了新目标 updated_goal,就好像收到了有关该主题的新目标一样。

为了与目标保持一定距离,我们将使用 动作节点 .此节点修改路径,使其变短,因此我们不会尝试导航到感兴趣的对象。我们可以设置到目标的所需距离 输入端口 .TruncatePathdistance

作为参考,此确切的行为树可供您使用包 nav2_bt_navigator 中包含的。

行为树如下:

nav2_bringup导航包 launch文件结构

参考:nav2_bringup导航包 launch文件结构

1 localization_launch.py

作用:启动地图服务,在地图上给机器人定位。

2 slam_launch.py

作用:slam同步定位建图,储存地图。

3 navigation_launch.py

作用:启动导航核心节点,行为树 规划器 控制器 恢复器 路点跟随

4 rviz_launch.py

作用:启动rviz2可视化机器人及导航

5 bringup_launch.py

通过条件选择condition=IfCondition(slam),二选一启动:

slam_launch.py

localization_launch.py

'slam',default_value='False  所以默认启动 localization_launch.py

启动 navigation_launch.py

作用:这是一个通过launch文件套娃集齐了nav2导航需要的所有节点,按默认设置启动地图服务,在地图上给机器人定位,启动导航行为树 规划器 控制器 恢复器 路点跟随。

如果没有实体机器人,开启gazebo仿真机器人+bringup_launch.py+rviz_launch.py

如果有实体机器人,启动机器人底盘程序+bringup_launch.py+rviz_launch.py  nav2导航服务全部节点就都集齐了,可以开始自由导航了。

如果想同时建图并导航只需给launch文件加参数,启动 bringup_launch.py slam:=True 这时在陌生环境不需要提供地图,程序会一边建图,一边导航。

注意仿真机器人所有节点 use_sim_time=true (启用仿真时间),实体机器人所有节点use_sim_time=false (不启用仿真时间),时间设置错了会出现莫名其妙的问题。

6 spawn_tb3_launch.py

作用:启动gazebo节点,在gazebo规定位置生成机器人

7 tb3_simulation_launch.py

作用:生成gazebo仿真机器人,启动导航服务,rviz显示机器人导航

8 multi_tb3_simulation_launch.py

作用:总体来说是在gazebo仿真环境生成多个机器人并导航。

如何修改代码?

在上述navigation_launch.py中,我们可以看到

        在这个部分启动的就是行为树节点,也就是来自 'nav2_bt_navigator' 包的行为树,默认的行为树是上面说到的:

navigate_to_posenavigate_through_poses

  所以我们要在这个部分加入上述的动态点跟踪的xml,也就是navigation2-main\nav2_bt_navigator\behavior_trees\follow_point.xml

        在bringup的配置文件navigation2-main\nav2_bringup\params\nav2_params.yaml

        所以一下子就是启动两个导航器。

总结:

        所以接下来应该就是要在 navigation2-main\nav2_bt_navigator\src\navigators中模仿navigate_to_pose.cpp写一个navigate_follow_point的导航器。

  可能也可以把这个行为树加入到navigate_to_pose或navigate_through_poses之中。

推荐链接

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: