【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

相关文章

SpringMVC高效获取JavaBean对象指南

《SpringMVC高效获取JavaBean对象指南》SpringMVC通过数据绑定自动将请求参数映射到JavaBean,支持表单、URL及JSON数据,需用@ModelAttribute、@Requ... 目录Spring MVC 获取 JavaBean 对象指南核心机制:数据绑定实现步骤1. 定义 Ja

Python打印对象所有属性和值的方法小结

《Python打印对象所有属性和值的方法小结》在Python开发过程中,调试代码时经常需要查看对象的当前状态,也就是对象的所有属性和对应的值,然而,Python并没有像PHP的print_r那样直接提... 目录python中打印对象所有属性和值的方法实现步骤1. 使用vars()和pprint()2. 使

Nexus安装和启动的实现教程

《Nexus安装和启动的实现教程》:本文主要介绍Nexus安装和启动的实现教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、Nexus下载二、Nexus安装和启动三、关闭Nexus总结一、Nexus下载官方下载链接:DownloadWindows系统根

MySQL JSON 查询中的对象与数组技巧及查询示例

《MySQLJSON查询中的对象与数组技巧及查询示例》MySQL中JSON对象和JSON数组查询的详细介绍及带有WHERE条件的查询示例,本文给大家介绍的非常详细,mysqljson查询示例相关知... 目录jsON 对象查询1. JSON_CONTAINS2. JSON_EXTRACT3. JSON_TA

C#之List集合去重复对象的实现方法

《C#之List集合去重复对象的实现方法》:本文主要介绍C#之List集合去重复对象的实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C# List集合去重复对象方法1、测试数据2、测试数据3、知识点补充总结C# List集合去重复对象方法1、测试数据

CnPlugin是PL/SQL Developer工具插件使用教程

《CnPlugin是PL/SQLDeveloper工具插件使用教程》:本文主要介绍CnPlugin是PL/SQLDeveloper工具插件使用教程,具有很好的参考价值,希望对大家有所帮助,如有错... 目录PL/SQL Developer工具插件使用安装拷贝文件配置总结PL/SQL Developer工具插

Java调用C#动态库的三种方法详解

《Java调用C#动态库的三种方法详解》在这个多语言编程的时代,Java和C#就像两位才华横溢的舞者,各自在不同的舞台上展现着独特的魅力,然而,当它们携手合作时,又会碰撞出怎样绚丽的火花呢?今天,我们... 目录方法1:C++/CLI搭建桥梁——Java ↔ C# 的“翻译官”步骤1:创建C#类库(.NET

Java中的登录技术保姆级详细教程

《Java中的登录技术保姆级详细教程》:本文主要介绍Java中登录技术保姆级详细教程的相关资料,在Java中我们可以使用各种技术和框架来实现这些功能,文中通过代码介绍的非常详细,需要的朋友可以参考... 目录1.登录思路2.登录标记1.会话技术2.会话跟踪1.Cookie技术2.Session技术3.令牌技

MyBatis编写嵌套子查询的动态SQL实践详解

《MyBatis编写嵌套子查询的动态SQL实践详解》在Java生态中,MyBatis作为一款优秀的ORM框架,广泛应用于数据库操作,本文将深入探讨如何在MyBatis中编写嵌套子查询的动态SQL,并结... 目录一、Myhttp://www.chinasem.cnBATis动态SQL的核心优势1. 灵活性与可

Python使用Code2flow将代码转化为流程图的操作教程

《Python使用Code2flow将代码转化为流程图的操作教程》Code2flow是一款开源工具,能够将代码自动转换为流程图,该工具对于代码审查、调试和理解大型代码库非常有用,在这篇博客中,我们将深... 目录引言1nVflRA、为什么选择 Code2flow?2、安装 Code2flow3、基本功能演示