【Nav2中文网】五、普通教程(六)动态对象追踪

2023-12-27 12:50

本文主要是介绍【Nav2中文网】五、普通教程(六)动态对象追踪,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

  • 本教程来自:Nav2中文网
  • Nav2交流社区:https://fishros.org.cn/forum
  • ROS2/Nav2千人交流群:(QQ)139707339
  • 更多精彩教程请关注微信公众号:鱼香ROS
  • 欢迎添加机器人小伊微信,解锁机器人学习特殊服务

动态对象追踪 [待校准@1238]

  • 概述
  • 教程指南

概述

本教程展示了如何将Nav2用于从A点到B点以外的不同任务。在这种情况下,我们将使用Nav2无限期地跟踪一个移动的物体。 [校准@混沌无形]

此任务在跟踪一个人或另一个机器人的情况下非常有用。以下是可以使用此功能创建的应用程序的一些示例视频。 “Carry My Luggage” RoboCup家庭测试,其中 CATIE Robotics 团队成功执行测试,以及这个真实的 (未来的) 世界应用: [校准@混沌无形]

The requirements for this task are as follows:

  • 变化仅限于用于导航的行为树。当需要时,这行为树可以在 NavigateToPose 行动中选择,或可以是默认行为树。它是由运行时可配置的插件组成的。 [校准@混沌无形]
  • 规划器和控制器的配置将不会被修改。 [校准@混沌无形]
  • 该行动将无限期地运行,直到它被发起者取消。 [校准@混沌无形]

检测要跟踪的动态物体(如人)不在本教程的范围内。如下图所示,您的应用程序应该为感兴趣的对象提供一个检测器,将初始位姿发送到 NavigateToPose 动作(action),并在任务期间更新话题。存在许多不同类型的探测器,你可以利用它们来实现这一应用: [校准@混沌无形]

../../_images/main_diagram.png

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](https://github.com/ros-planning/navigation2/blob/main/nav2_bt_navigator/behavior_trees/follow_point.xml)>_的电池,包括在 [](http://dev.nav2.fishros.com/doc/tutorials/docs/navigation2_dynamic_point_following.html#id1)nav2_bt_navigator包中。 [校准@混沌无形]

1- 设置Rviz的点击点 [校准@混沌无形]

我们将使用RViz而不是一个完整的应用程序,这样你就可以在家里测试,而不需要找一个探测器来开始。我们将使用工具栏上的 “ “clicked point” ” 按钮替换对象检测,以向Nav2提供目标更新。这个按钮允许你将坐标数据发布到话题 /clicked_point 。这个点需要通过clicked_point_to_pose程序发送到行为树上,该程序来自这个 仓库 <[https://github.com/fmrico/nav2_test_utils](https://github.com/fmrico/nav2_test_utils)>_。在你的工作区克隆这个仓库,构建,并在终端输入。 [校准@混沌无形]

ros2runnav2_test_utilsclicked_point_to_pose

或者,您可以在你rviz配置文件 goal_updates 中重新映射此话题。 [校准@混沌无形]

2- 在Nav2模拟中运行动态对象跟踪 [校准@混沌无形]

在终端启动Nav2: [校准@混沌无形]

ros2launchnav2_bringuptb3_simulation_launch.pydefault_bt_xml_filename:=/path/to/bt.xml

打开RViz,在初始化机器人位置后,命令机器人导航到任何位置。使用按钮点击的点来模拟对感兴趣的物体进行新的检测,如本教程头部的视频所示。 [校准@混沌无形]

当你有探测器检测障碍率较高 (1 hz,10 hz,100 hz) 时,你会看到一个反应更灵敏的机器人跟随你检测到的感兴趣的对象! [校准@混沌无形]

  • 本文主要校准贡献:混沌无形
  • 本文遵循知识共享协议,禁止未授权商用转载

这篇关于【Nav2中文网】五、普通教程(六)动态对象追踪的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/543201

相关文章

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

Ubuntu中远程连接Mysql数据库的详细图文教程

《Ubuntu中远程连接Mysql数据库的详细图文教程》Ubuntu是一个以桌面应用为主的Linux发行版操作系统,这篇文章主要为大家详细介绍了Ubuntu中远程连接Mysql数据库的详细图文教程,有... 目录1、版本2、检查有没有mysql2.1 查询是否安装了Mysql包2.2 查看Mysql版本2.

Elasticsearch 在 Java 中的使用教程

《Elasticsearch在Java中的使用教程》Elasticsearch是一个分布式搜索和分析引擎,基于ApacheLucene构建,能够实现实时数据的存储、搜索、和分析,它广泛应用于全文... 目录1. Elasticsearch 简介2. 环境准备2.1 安装 Elasticsearch2.2 J

Linux系统中卸载与安装JDK的详细教程

《Linux系统中卸载与安装JDK的详细教程》本文详细介绍了如何在Linux系统中通过Xshell和Xftp工具连接与传输文件,然后进行JDK的安装与卸载,安装步骤包括连接Linux、传输JDK安装包... 目录1、卸载1.1 linux删除自带的JDK1.2 Linux上卸载自己安装的JDK2、安装2.1

C#如何动态创建Label,及动态label事件

《C#如何动态创建Label,及动态label事件》:本文主要介绍C#如何动态创建Label,及动态label事件,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#如何动态创建Label,及动态label事件第一点:switch中的生成我们的label事件接着,

SpringCloud动态配置注解@RefreshScope与@Component的深度解析

《SpringCloud动态配置注解@RefreshScope与@Component的深度解析》在现代微服务架构中,动态配置管理是一个关键需求,本文将为大家介绍SpringCloud中相关的注解@Re... 目录引言1. @RefreshScope 的作用与原理1.1 什么是 @RefreshScope1.

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S

Linux卸载自带jdk并安装新jdk版本的图文教程

《Linux卸载自带jdk并安装新jdk版本的图文教程》在Linux系统中,有时需要卸载预装的OpenJDK并安装特定版本的JDK,例如JDK1.8,所以本文给大家详细介绍了Linux卸载自带jdk并... 目录Ⅰ、卸载自带jdkⅡ、安装新版jdkⅠ、卸载自带jdk1、输入命令查看旧jdkrpm -qa

Java使用Curator进行ZooKeeper操作的详细教程

《Java使用Curator进行ZooKeeper操作的详细教程》ApacheCurator是一个基于ZooKeeper的Java客户端库,它极大地简化了使用ZooKeeper的开发工作,在分布式系统... 目录1、简述2、核心功能2.1 CuratorFramework2.2 Recipes3、示例实践3

springboot简单集成Security配置的教程

《springboot简单集成Security配置的教程》:本文主要介绍springboot简单集成Security配置的教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录集成Security安全框架引入依赖编写配置类WebSecurityConfig(自定义资源权限规则