当前位置: 首页 > news >正文

ROS地图/像素坐标描点调试【Python源码实现】

在这里插入图片描述

文章目录

  • ROS python 地图描点调试工具
    • 1. Rviz描点
      • 1.1 需求描述
      • 1.2 visualization Marker
      • 1.3 工程实践
    • 2. 静态地图图片描点
      • 2.1 需求描述
      • 2.2 工程实践

ROS python 地图描点调试工具

1. Rviz描点

1.1 需求描述

在ROS开发中,有时会加载图片文件转为地图载入move_base,这个时候调试程序的时候会有像素坐标系到map坐标系的转换,需要确认自己的程序是否正确的达到了转换的目的,那么需要这样一个工具来描点,然后消除点,可以用Debug的方式逐步运行,保证绘点和消除点的效果正确性。

1.2 visualization Marker

visualization_msgs/Marker 是 ROS 中的一种消息类型,用于在可视化工具如 RViz 中描述可视化元素的属性,如点、线、箭头、文本等。它用于向 ROS 可视化工具发送信息以在可视化工具中呈现和显示这些元素。以下是 visualization_msgs/Marker 消息的主要字段:

header:标识可视化元素所在的坐标系。
ns:命名空间,用于将多个可视化元素进行分组或区分。
id:可视化元素的唯一标识符。
type:可视化元素的类型,例如点、线、箭头等。
action:描述对可视化元素的操作,如添加、修改或删除。
pose:描述可视化元素的位姿,通常包括位置和方向。
scale:可视化元素的尺寸或大小,具体含义取决于元素的类型。
color:可视化元素的颜色。
lifetime:可视化元素的生存时间,用于控制元素在可视化工具中的显示时间。
frame_locked:一个布尔值,指示可视化元素是否相对于特定坐标系固定。
visualization_msgs/Marker 消息的类型字段 type 决定了要呈现的可视化元素类型。常见的 type 包括:

Marker.POINTS:用于表示点云数据。
Marker.LINE_STRIP 和 Marker.LINE_LIST:用于表示线段。
Marker.ARROW:用于表示箭头。
Marker.CUBE 和 Marker.CYLINDER:用于表示立方体和圆柱体等形状。
Marker.TEXT_VIEW_FACING:用于表示面向视图的文本。
等等…
通过发布 visualization_msgs/Marker 消息,在 ROS 可视化工具中呈现和控制这些可视化元素的显示、修改和删除。这对于在机器人操作和感知任务中实时可视化数据非常有用。
visualization Marker action

namedescription
Marker.ADD添加新的Marker到场景中
Marker.MODIFY修改已存在的Marker的属性,如位置、颜色等
Marker.DELETE删除已存在的Marker,只有具有与该消息相同namespace和ID的可视化元素将被删除
Marker.DELETEALLrviz中添加了具有相同namespace和ID的多个Marker,并发布了一个带有Marker.DELETEALL操作的消息,那么所有这些Marker都将被删除。

1.3 工程实践

# -*-coding:utf-8-*-
# !/usr/bin/env python
# Author:Moresweet
# Date:20230907
# Blog:https://blog.csdn.net/qq_38853759?type=blogimport rospy
from rospy import Duration
from visualization_msgs.msg import Marker
from geometry_msgs.msg import Point
import jsondef draw_markers_from_json_string(json_string):rospy.init_node('rviz_marker_publisher')marker_pub = rospy.Publisher('test_visual_point', Marker, queue_size=10)# Load points from JSON stringpoints = json.loads(json_string)# 消除点marker = Marker()marker.header.frame_id = "map"  # Adjust the frame_id as neededmarker.type = Marker.POINTSmarker.action = Marker.ADDmarker.scale.x = 0.1  # Point sizemarker.scale.y = 0.1marker.color.r = 1.0  # Redmarker.color.a = 1.0  # Fully opaquefor point in points:x = point["point"]["x"]y = point["point"]["y"]z = point["point"]["z"]point = Point()point.x = xpoint.y = ypoint.z = zmarker.points.append(point)marker.header.stamp = rospy.Time.now()marker_pub.publish(marker)# rate = rospy.Rate(10)  # 10 Hz# while not rospy.is_shutdown():#     marker.header.stamp = rospy.Time.now()#     marker_pub.publish(marker)#     rate.sleep()if __name__ == '__main__':try:json_string = '[{"point": {"x": 1.0, "y": 2.0, "z": 0.0}}, {"point": {"x": 3.0, "y": 4.0, "z": 0.0}}]'  # Replace with your JSON stringdraw_markers_from_json_string(json_string)marker_pub = rospy.Publisher('/test_visual_point', Marker, queue_size=10)marker = Marker()marker.header.frame_id = "map"marker.type = Marker.POINTSmarker.action = Marker.DELETEmarker.header.stamp = rospy.Time.now()marker.lifetime = Duration(1.0)marker_pub.publish(marker)except rospy.ROSInterruptException:pass

在rviz中添加Marker
在这里插入图片描述在这里插入图片描述
设置话题在这里插入图片描述
运行程序

在这里插入图片描述
以debug的形式,消除点
在这里插入图片描述点位消失
在这里插入图片描述

2. 静态地图图片描点

2.1 需求描述

在图片格式的地图中,地图有自己的像素坐标系,对于转换关系在笔者之前的博客中已有提及。那么在map坐标系到像素坐标系的转换中,需要验证像素坐标系生成是否正确,这一点比较重要,像素坐标系的像素点表达了占据栅格信息。

2.2 工程实践


# -*-coding:utf-8-*-
# !/usr/bin/env python
# Author:Moresweet
# Date:20230907
# Blog:https://blog.csdn.net/qq_38853759?type=blogimport rospy
from rospy import Duration
from visualization_msgs.msg import Marker
from geometry_msgs.msg import Point
import jsondef draw_markers_from_json_string(json_string):rospy.init_node('rviz_marker_publisher')marker_pub = rospy.Publisher('test_visual_point', Marker, queue_size=10)# Load points from JSON stringpoints = json.loads(json_string)# 消除点marker = Marker()marker.header.frame_id = "map"  # Adjust the frame_id as neededmarker.type = Marker.POINTSmarker.action = Marker.ADDmarker.scale.x = 0.1  # Point sizemarker.scale.y = 0.1marker.color.r = 1.0  # Redmarker.color.a = 1.0  # Fully opaquefor point in points:x = point["point"]["x"]y = point["point"]["y"]z = point["point"]["z"]point = Point()point.x = xpoint.y = ypoint.z = zmarker.points.append(point)marker.header.stamp = rospy.Time.now()marker_pub.publish(marker)# rate = rospy.Rate(10)  # 10 Hz# while not rospy.is_shutdown():#     marker.header.stamp = rospy.Time.now()#     marker_pub.publish(marker)#     rate.sleep()if __name__ == '__main__':try:json_string = '[{"point": {"x": 1.0, "y": 2.0, "z": 0.0}}, {"point": {"x": 3.0, "y": 4.0, "z": 0.0}}]'  # Replace with your JSON stringdraw_markers_from_json_string(json_string)marker_pub = rospy.Publisher('/test_visual_point', Marker, queue_size=10)marker = Marker()marker.header.frame_id = "map"marker.type = Marker.POINTSmarker.action = Marker.DELETEmarker.header.stamp = rospy.Time.now()marker.lifetime = Duration(1.0)marker_pub.publish(marker)except rospy.ROSInterruptException:pass

在这里插入图片描述

相关文章:

ROS地图/像素坐标描点调试【Python源码实现】

文章目录 ROS python 地图描点调试工具1. Rviz描点1.1 需求描述1.2 visualization Marker1.3 工程实践 2. 静态地图图片描点2.1 需求描述2.2 工程实践 ROS python 地图描点调试工具 1. Rviz描点 1.1 需求描述 在ROS开发中,有时会加载图片文件转为地图载入move_ba…...

2023年7月京东笔记本电脑行业品牌销售排行榜(京东数据平台)

随着智能手机、平板电脑等移动互联设备的普及,人们对于个人电脑的依赖减轻,加之电脑的更换率较低,因此当前PC端消费市场整体出现疲态,笔记本电脑的出货量不断下降,今年7月份也同样呈现这一趋势。 根据鲸参谋电商数据分…...

用户忠诚度:小程序积分商城的用户保持方法

随着移动互联网的蓬勃发展,小程序积分商城已经成为了许多企业私域营销的热门选择。这个商城不仅可以吸引用户参与,还可以提高用户的忠诚度,进一步加深用户与品牌的互动关系。然而,要实现用户的忠诚度,需要一系列的策略…...

[前端] 使用lerna version更新版本号

lerna version 是一个用于管理 monorepo(多包存储库)的工具,它可以帮助您在多个相关包之间协调版本号的更新和发布。以下是使用 lerna version 更新版本号的一般步骤: 安装 Lerna: 首先,您需要在您的项目中…...

winform嵌入浏览器 webView2

1、项目引用nuget 2、winform窗体中初始化 var webView new WebView2();webView.Source new Uri(url);webView.Dock DockStyle.Fill;//接收js调用c#函数的消息webView.WebMessageReceived CoreWebView2_WebMessageReceivedAsync; this.panel1.Controls.Add(…...

stm32---用外部中断实现红外接收器

一、红外遥控的原理 红外遥控是一种无线、非接触控制技术,具有抗干扰能力强,信息传 输可靠,功耗低,成本低,易实现等显著优点,被诸多电子设备特别是 家用电器广泛采用,并越来越多的应用到计算机系…...

Filter过滤器及HttpServletRequest和HttpServletResponse

拦截器(Interceptor)和过滤器(Filter)的执行顺序 tomcat->Filter->Interceptor->Controller 过滤器(Filter)概述? Filter过滤器是JavaWeb的三大组件之一,三大组件分别为&…...

02-打包代码与依赖

打包代码与依赖说明 在开发中,我们写的应用程序通常需要依赖第三方的库(即程序中引入了既不在 org.apache.spark包,也不再语言运行时的库的依赖),我们就需要确保所有的依赖在Spark应用运行时都能被找到 对于Python而…...

Kotlin(五) 循环语句

目录 For循环 关键字 until step downTo Java中主要有两种循环语句:while循环和for循环。而Kotlin也提供了while循环和for循环,其中while循环不管是在语法还是使用技巧上都和Java中的while循环没有任何区别,因此我们就直接跳过不进行讲解…...

数字孪生产品:数字化时代的变革引擎

数字孪生技术,作为一项前沿的科技创新,正在不断改变我们的世界。它为各行各业的发展提供了无限的可能性,成为了当今数字化时代的一大亮点。数字孪生产品,作为数字孪生技术的具体应用,将在未来发挥越来越重要的作用。 数…...

对接西部数据Western Digital EDI 系统

近期我们为国内某知名电子产品企业提供EDI解决方案,采用知行之桥 EDI 系统作为核心组件,成功与西部数据Western Digital(简称西数)建立EDI连接,实现数据安全且自动化传输。 EDI实施需求 EDI连接 传输协议:A…...

ClickHouse进阶(十):Clickhouse数据查询-4

进入正文前,感谢宝子们订阅专题、点赞、评论、收藏!关注IT贫道,获取高质量博客内容! 🏡个人主页:含各种IT体系技术,IT贫道_Apache Doris,大数据OLAP体系技术栈,Kerberos安全认证-CSDN博客 📌订阅…...

FPGA原理与结构——FIFO IP核的使用与测试

一、前言 本文介绍FIFO Generator v13.2 IP核的具体使用与例化,在学习一个IP核的使用之前,首先需要对于IP核的具体参数和原理有一个基本的了解,具体可以参考: FPGA原理与结构——FIFO IP核原理学习https://blog.csdn.net/apple_5…...

ABB CMA120 3DDE300400面板

人机界面:ABB CMA120 3DDE300400 面板通常具有用户友好的人机界面,可用于监视和控制连接设备和系统的操作。 图形显示:该面板通常具有高分辨率的液晶显示屏,用于显示图形界面和实时数据,以便操作员更容易理解和管理工…...

【代码随想录day25】动态规划:01背包理论基础

题目 有n件物品和一个最多能背重量为w 的背包。第i件物品的重量是weight[i],得到的价值是value[i] 。每件物品只能用一次,求解将哪些物品装入背包里物品价值总和最大。 代码 dp[i][j]: 表示从0~i个物品中选物品放到容量为j的背包中所能获得的最大价值 …...

Python Opencv实践 - 轮廓检测

import cv2 as cv import numpy as np import matplotlib.pyplot as pltimg cv.imread("../SampleImages/map.jpg") print(img.shape) plt.imshow(img[:,:,::-1])#Canny边缘检测 edges cv.Canny(img, 127, 255, 0) plt.imshow(edges, cmapplt.cm.gray)#查找轮廓 #c…...

c#保留两位小数

1.使用ToString()方法和格式字符串 double number 3.1415926; string result number.ToString(“F2”); // 将number转换为字符串,并保留两位小数 Console.WriteLine(result); // 输出结果为 “3.14” 2.使用字符串插值和格式字符串 double number 3.1415926;…...

[machineLearning]非监督学习unsupervised learning

1.什么是非监督学习 常见的神经网络是一种监督学习,监督学习的主要特征即为根据输入来对输出进行预测,最终会得到一个输出数值.而非监督学习的目的不在于输出,而是在于对读入的数据进行归类,选取特征,打标签,通过对于数据结构的分析来完成这些操作, 很少有最后的输出操作. 从…...

C语言深入理解指针(非常详细)(四)

目录 字符指针变量数组指针变量数组指针变量是什么数组指针变量怎么初始化 二维数组传参的本质函数指针变量函数指针变量的创建函数指针变量的使用代码typedef关键字 函数指针数组转移表 字符指针变量 字符指针在之前我们有提到过,(字符)&am…...

知识库建设:从0到1搞定知识库建设的方法论分享

如果我们想要搭建一个知识库,前提是我们要明确知道这个知识库是干什么用的,只有了解知识库的应用场景才能知道如何去建设知识库。 知识库建设 以常见的电商客服为例,客户会经常咨询什么时候发货,怎么退货,怎么换货………...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子&#xff08…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以?

Golang 面试经典题:map 的 key 可以是什么类型?哪些不可以? 在 Golang 的面试中,map 类型的使用是一个常见的考点,其中对 key 类型的合法性 是一道常被提及的基础却很容易被忽视的问题。本文将带你深入理解 Golang 中…...

React Native在HarmonyOS 5.0阅读类应用开发中的实践

一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...

2021-03-15 iview一些问题

1.iview 在使用tree组件时,发现没有set类的方法,只有get,那么要改变tree值,只能遍历treeData,递归修改treeData的checked,发现无法更改,原因在于check模式下,子元素的勾选状态跟父节…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...