nav2_gps_waypoint_follower_demo 不能在ros2 humble中直接使用的解决方法
GIT上的nav2_gps_waypoint_follower_demo是基于ros-iron编写的,其中followGpsWaypoints(wps) service只能在Iron上使用。
解决方法:
第一步:将interactive_waypoint_follower.py修改为如下代码:
import rclpy
from rclpy.node import Node
from nav2_simple_commander.robot_navigator import BasicNavigator
from geometry_msgs.msg import PointStamped
from nav2_gps_waypoint_follower_demo.utils.gps_utils import latLonYaw2Geopose
from nav2_msgs.action import FollowWaypoints
from geometry_msgs.msg import PoseStamped
from robot_localization.srv import FromLLclass InteractiveGpsWpCommander(Node):"""ROS2 node to send gps waypoints to nav2 received from mapviz's point click publisher"""def __init__(self):super().__init__(node_name="gps_wp_commander")self.navigator = BasicNavigator("basic_navigator")self.mapviz_wp_sub = self.create_subscription(PointStamped, "/clicked_point", self.mapviz_wp_cb, 1)self.localizer = self.create_client(FromLL, '/fromLL')while not self.localizer.wait_for_service(timeout_sec=1.0):self.get_logger().info('Service not available, waiting again...')self.client_futures = []self.get_logger().info('Ready for waypoints...')def mapviz_wp_cb(self, msg: PointStamped):"""clicked point callback, sends received point to nav2 gps waypoint follower if its a geographic point"""if msg.header.frame_id != "wgs84":self.get_logger().warning("Received point from mapviz that ist not in wgs84 frame. This is not a gps point and wont be followed")returnwps = [latLonYaw2Geopose(msg.point.y, msg.point.x)]for wp in wps:self.req = FromLL.Request()self.req.ll_point.longitude = wp.position.longitudeself.req.ll_point.latitude = wp.position.latitudeself.req.ll_point.altitude = wp.position.altitudeself.get_logger().info("Waypoint added to conversion queue...")self.client_futures.append(self.localizer.call_async(self.req))def command_send_cb(self, future):self.resp = PoseStamped()self.resp.header.frame_id = 'map'self.resp.header.stamp = self.get_clock().now().to_msg()self.resp.pose.position = future.result().map_pointself.navigator.goToPose(self.resp)def spin(self):while rclpy.ok():rclpy.spin_once(self)incomplete_futures = []for f in self.client_futures:if f.done():self.client_futures.remove(f)self.get_logger().info("Following converted waypoint...")self.command_send_cb(f)else:incomplete_futures.append(f)self.client_futures = incomplete_futuresdef main():rclpy.init()gps_wpf = InteractiveGpsWpCommander()gps_wpf.spin()if __name__ == "__main__":main()
将logged_waypoint_follower.py改为如下代码:
import rclpy
from nav2_simple_commander.robot_navigator import BasicNavigator
import yaml
from ament_index_python.packages import get_package_share_directory
import os
import sys
import time
from robot_localization.srv import FromLL
from rclpy.node import Node
from nav2_gps_waypoint_follower_demo.utils.gps_utils import latLonYaw2Geopose
from nav2_msgs.action import FollowWaypoints
from geometry_msgs.msg import PoseStampedclass YamlWaypointParser:"""Parse a set of gps waypoints from a yaml file"""def __init__(self, wps_file_path: str) -> None:with open(wps_file_path, 'r') as wps_file:self.wps_dict = yaml.safe_load(wps_file)def get_wps(self):"""Get an array of geographic_msgs/msg/GeoPose objects from the yaml file"""gepose_wps = []for wp in self.wps_dict["waypoints"]:latitude, longitude, yaw = wp["latitude"], wp["longitude"], wp["yaw"]gepose_wps.append(latLonYaw2Geopose(latitude, longitude, yaw))return gepose_wpsclass GpsWpCommander(Node):"""Class to use nav2 gps waypoint follower to follow a set of waypoints logged in a yaml file"""def __init__(self, wps_file_path):super().__init__('minimal_client_async')self.navigator = BasicNavigator("basic_navigator")self.wp_parser = YamlWaypointParser(wps_file_path)self.localizer = self.create_client(FromLL, '/fromLL')while not self.localizer.wait_for_service(timeout_sec=1.0):self.get_logger().info('service not available, waiting again...')def start_wpf(self):"""Function to start the waypoint following"""self.navigator.waitUntilNav2Active(localizer='controller_server')wps = self.wp_parser.get_wps()wpl = []for wp in wps:self.req = FromLL.Request()self.req.ll_point.longitude = wp.position.longitudeself.req.ll_point.latitude = wp.position.latitudeself.req.ll_point.altitude = wp.position.altitudelog = 'long{:f}, lat={:f}, alt={:f}'.format(self.req.ll_point.longitude, self.req.ll_point.latitude, self.req.ll_point.altitude)self.get_logger().info(log)self.future = self.localizer.call_async(self.req)rclpy.spin_until_future_complete(self, self.future)self.resp = PoseStamped()self.resp.header.frame_id = 'map'self.resp.header.stamp = self.get_clock().now().to_msg()self.resp.pose.position = self.future.result().map_pointlog = 'x={:f}, y={:f}, z={:f}'.format(self.future.result().map_point.x, self.future.result().map_point.y, self.future.result().map_point.z)self.get_logger().info(log)self.resp.pose.orientation = wp.orientationwpl += [self.resp]self.navigator.followWaypoints(wpl)print("wps completed successfully")def main():rclpy.init()# allow to pass the waypoints file as an argumentdefault_yaml_file_path = os.path.join(get_package_share_directory("node"), "config", "demo_waypoints.yaml")if len(sys.argv) > 1:yaml_file_path = sys.argv[1]else:yaml_file_path = default_yaml_file_pathgps_wpf = GpsWpCommander(yaml_file_path)gps_wpf.start_wpf()if __name__ == "__main__":main()
第二步:除了上述代码需要修改,nav2_no_map_params.yaml也需要修改,该文件中bt_navigator节点下的内容改为nav2 humble里面默认的部分,另外,建议global_costmap中的width/height改大,例如从50改到500,不然容易出现超出global_costmap范围的提示。
参考链接(tks
LuukBerkel ):
nav2_gps_waypoint_follower_demo does not work on ros2 humble???! · Issue #77 · ros-planning/navigation2_tutorials · GitHub
相关文章:
nav2_gps_waypoint_follower_demo 不能在ros2 humble中直接使用的解决方法
GIT上的nav2_gps_waypoint_follower_demo是基于ros-iron编写的,其中followGpsWaypoints(wps) service只能在Iron上使用。 解决方法: 第一步:将interactive_waypoint_follower.py修改为如下代码: import rclpy from rclpy.node …...
华为OD机试 - 螺旋数字矩阵
1 题目描述 疫情期间,小明隔离在家,百无聊赖,在纸上写数字玩。他发明了一种写法: 给出数字个数 n (0 < n ≤ 999)和行数 m(0 < m ≤ 999),从左上角的 1 开始&…...
Vue响应式内容丢失处理
对数组和对象进行不当的修改会使Vue的对象丢失响应式,这时可以直接console.log丢失的对象,看是否有getter和setter 对于数组和对象,只有使用 Vue 提供的一些方法(如 push()、pop()、splice()、set() 等)进行修改才会触…...

Linux安装Rabbitmq
说明:本文章主要是rabbitmq在Linux系统上的安装,文章中包含了rabbitmq的下载及依赖下载 1.版本选取,这里的选取主要是版本的兼容问题 去这个网址查看mq和erlang版本兼容:RabbitMQ Erlang Version Requirements | RabbitMQ 2.相…...

在nginx 服务器部署vue项目
以人人快速开发的开源项目:renren-fast-vue 为例 注:这里开始认为各位都会使用nginx 打包vue项目 npm run build 测试打包的项目是否可以运行 serve dist 可以正常运行 编译报错请移步到:renren-fast-vue1.2.2 项目编译报错: build g…...

制作一个简单的HTML个人网页
制作一个简单的HTML个人网页 1.1 硬件1.1.1 一台电脑1.1.2 配置要求 1.2 系统1.3 软件 二、制作一个简单的HTML个人网页1.创建一个HTML网页1.1 新建文本文档1.2 另存文本文档1.3 命名为index.html 2.编写HTML代码2.1 打开HTML2.2 复制HTML代码2.3 粘贴HTML代码2.4 保存HTML 3.预…...

HM2019创建载荷工况
该案例中将介绍载荷、工况、约束的创建 步骤一:首先创建两个载荷集(Load Collector)用来存放载荷和约束 步骤二:在Analysis面板下创建约束(Analysis→constraints) 注意:Load type选择SPC表示统计过程控制(Statistical Process Control) 步…...
Effective C++ 学习笔记 条款14 在资源管理类中小心copying行为
条款13导入这样的观念:“资源取得时机便是初始化时机”(Resource Acquisition Is Initialization,RAII),并以此作为“资源管理类”的脊柱,也描述了auto_ptr和tr1::shared_ptr如何将这个观念表现在heap-base…...

c++数据结构算法复习基础-- 3 --线性表-单向链表-笔试面试常见问题
1、单链表逆序 思路图 代码实现 //著: 链表结构里记得加 friend void ReverseLink(Clink& link); void ReverseLink(Clink& link) {Node* p link.head_->next_;while( p nullptr){return;}Node* q p->next_;link.head_->next_ nullptr;while(p ! nullpt…...

【踩坑专栏】追根溯源,从Linux磁盘爆满排查故障:mycat2与navicat不兼容导致日志暴增
昨天遇到了一个比较奇怪的问题,就是在挂起虚拟机的时候,虚拟机提示我XX脚本正在运行,很奇怪,我没有运行脚本,为什么会提示我这个呢。今天恢复虚拟机,也提示了一下脚本的问题,而且发现Linux明显异…...

DolphinScheduler——奇富科技的调度实践
目录 一、技术架构 二、业务挑战 2.1 调度任务量大 2.2 运维复杂 2.3 SLA要求高 三、调度优化实践 3.1 重复调度 3.2 漏调度 3.3 Worker服务卡死 3.4 任务重复运行 四、服务监控 4.1 方法耗时监控 4.2 任务调度链路监控 五、用户收益 原文大佬的这篇调度系统案例…...

2024年最全洗地机选购攻略盘点丨希亦、小米、云鲸、海尔洗地机哪款值得入手?
在现代家居清洁中,洗地机是不可或缺的得力助手,它融合了吸尘、拖地等多种功能。面对市场上琳琅满目的洗地机品牌和型号,选择一个可靠的品牌至关重要。优质的品牌能够提供高品质的产品,使您的清洁工作更加轻松高效。本文将向您推荐…...
HTML笔记3
21,label标签 <label for"...">...</label> <label>...</label> <!DOCTYPE html> <html lang"en"> <head> <meta charset"UTF-8"> <meta name"viewport" content&qu…...

利用Python副业赚钱,看完这篇你就懂了!
Python都可以做哪些副业? 1、兼职处理数据Excel整理数据功能虽然很强大,但在Python面前,曾经统治职场的它也的败下阵来。因为Python在搜集数据整理分析数据的过程中更加便捷,通过几行代码还可以实现自动化操作。 如果你学会Pyth…...
FP16(半精度浮点数)、FP32(单精度浮点数)和INT8
在深度学习和计算机视觉领域中,FP16(半精度浮点数)、FP32(单精度浮点数)和INT8(8 位整数)是常见的数据类型或精度表示方式。它们在不同的场景下有各自的优势和用途。 FP16(半精度浮…...
MySQL数据管理二
1.数据库的完整性 数据库中的数据是从外界输入的,而数据的输入由于种种原因,会发生输入无效或错误信息。保证输入的数据符合规定,成为了数据库系统,尤其是多用户的关系数据库系统首要关注的问题。 它是应防止数据库中存在不符合语…...
sqoop-import 详解
文章目录 前言一、介绍1. sqoop简介2. sqoop import的作用3. 语法3.1 sqoop import 语法3.2 导入配置属性 二、导入参数1. 常见参数2. 验证参数3. 导入控制参数4. 用于覆盖映射的参数5. 增量导入参数6. 输出行格式参数7. 输入解析参数8. Hive 参数9. HBase 参数10. Accumulo 参…...

第二周opencv
一、边缘检测算子 边缘检测算子是用于检测图像中物体边界的工具。边缘通常表示图像中灰度值或颜色发生显著变化的地方。边缘检测有助于识别图像中的物体形状、轮廓和结构。这些算子通过分析图像的灰度或颜色梯度来确定图像中的边缘。 梯度算子 要得到一幅图像的梯度,…...

python_读取txt文件绘制多条曲线II
从给定的列表中来匹配txt文件对应列的数据; import matplotlib.pyplot as plt import re from datetime import datetime from pylab import mplmpl.rcParams["font.sans-serif"] ["SimHei"] # 设置显示中文字体 mpl.rcParams["axes.un…...
java排序简单总结和推荐使用套路(数据排序,结构体排序)
了解int和Integer的区别 int是Java的基本数据类型,用于表示整数值。Integer是int的包装类,它是一个对象,可以包含一个int值并提供一些额外的功能。 Java集合框架中的集合类(如List、Set、Map)只能存储对象,…...

(十)学生端搭建
本次旨在将之前的已完成的部分功能进行拼装到学生端,同时完善学生端的构建。本次工作主要包括: 1.学生端整体界面布局 2.模拟考场与部分个人画像流程的串联 3.整体学生端逻辑 一、学生端 在主界面可以选择自己的用户角色 选择学生则进入学生登录界面…...

YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...

CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...

苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...
Java 加密常用的各种算法及其选择
在数字化时代,数据安全至关重要,Java 作为广泛应用的编程语言,提供了丰富的加密算法来保障数据的保密性、完整性和真实性。了解这些常用加密算法及其适用场景,有助于开发者在不同的业务需求中做出正确的选择。 一、对称加密算法…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
Element Plus 表单(el-form)中关于正整数输入的校验规则
目录 1 单个正整数输入1.1 模板1.2 校验规则 2 两个正整数输入(联动)2.1 模板2.2 校验规则2.3 CSS 1 单个正整数输入 1.1 模板 <el-formref"formRef":model"formData":rules"formRules"label-width"150px"…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...