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

news2025/1/19 20:23:03

在这里插入图片描述

文章目录

  • 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=blog

import rospy
from rospy import Duration
from visualization_msgs.msg import Marker
from geometry_msgs.msg import Point
import json


def 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 string
    points = json.loads(json_string)

    # 消除点
    marker = Marker()
    marker.header.frame_id = "map"  # Adjust the frame_id as needed
    marker.type = Marker.POINTS
    marker.action = Marker.ADD
    marker.scale.x = 0.1  # Point size
    marker.scale.y = 0.1
    marker.color.r = 1.0  # Red
    marker.color.a = 1.0  # Fully opaque

    for point in points:
        x = point["point"]["x"]
        y = point["point"]["y"]
        z = point["point"]["z"]
        point = Point()
        point.x = x
        point.y = y
        point.z = z
        marker.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 string
        draw_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.POINTS
        marker.action = Marker.DELETE
        marker.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=blog

import rospy
from rospy import Duration
from visualization_msgs.msg import Marker
from geometry_msgs.msg import Point
import json


def 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 string
    points = json.loads(json_string)

    # 消除点
    marker = Marker()
    marker.header.frame_id = "map"  # Adjust the frame_id as needed
    marker.type = Marker.POINTS
    marker.action = Marker.ADD
    marker.scale.x = 0.1  # Point size
    marker.scale.y = 0.1
    marker.color.r = 1.0  # Red
    marker.color.a = 1.0  # Fully opaque

    for point in points:
        x = point["point"]["x"]
        y = point["point"]["y"]
        z = point["point"]["z"]
        point = Point()
        point.x = x
        point.y = y
        point.z = z
        marker.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 string
        draw_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.POINTS
        marker.action = Marker.DELETE
        marker.header.stamp = rospy.Time.now()
        marker.lifetime = Duration(1.0)
        marker_pub.publish(marker)
    except rospy.ROSInterruptException:
        pass

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/982742.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

算法——组合程序算法解析

组合就是从m个元素的数组中求n个元素的所有组合&#xff0c;代码如下&#xff1a; #include <iostream> #include <vector> using namespace std; // 递归求解组合 void combinations(vector<int>& nums, vector<int>& combination, int star…

RK3568开发笔记(七):在宿主机ubuntu上搭建Qt交叉编译开发环境,编译一个Demo,目标板运行Demo测试

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/132733901 红胖子网络科技博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV、OpenGL、ffmpeg、OSG、单片机、软硬…

【C++】—— 单例模式详解

前言&#xff1a; 本期&#xff0c;我将要讲解的是有关C中常见的设计模式之单例模式的相关知识&#xff01;&#xff01; 目录 &#xff08;一&#xff09;设计模式的六⼤原则 &#xff08;二&#xff09;设计模式的分类 &#xff08;三&#xff09;单例模式 1、定义 2、…

MySQL的故事——创建高性能的索引

创建高性能的索引 文章目录 创建高性能的索引一、索引基础二、索引的优点三、高性能的索引策略 一、索引基础 要理解MySQL中索引是如何工作的&#xff0c;最简单的方法就是去看看一本书的“索引 ”部分&#xff1a;如果在一本书中找到某个特定主题&#xff0c;一般会先看书的“…

Linux修复损坏的文件系统

如何判断文件系统是否损坏 当文件系统受损时&#xff0c;将会出现一些明显的迹象。例如&#xff0c;文件或文件夹无法访问、文件大小异常、系统启动慢或无法启动等。此外&#xff0c;系统也可能发出一些错误信息&#xff0c;如"Input/output error"、"Filesyst…

怎么观察敌人的具体情况

怎么观察敌人的具体情况&#xff1f; 【安志强趣讲《孙子兵法》第32讲】 【原文】 杖而立者&#xff0c;饥也&#xff1b;汲而先饮者&#xff0c;渴也&#xff1b;见利而不进者&#xff0c;劳也&#xff1b;鸟集者&#xff0c;虚也&#xff1b;夜呼者&#xff0c;恐也&#xff…

Nginx参数配置详细说明【全局、http块、server块、events块】【已亲测】

Nginx重点参数配置说明 本文包含Nginx参数配置说明全局块、http块、server块、events块共计30多个参数配置与解释&#xff0c;其中常见参数包含配置错误出现的错误日志&#xff0c;能让你更快的解决问题。 该文的所有参数大部分经过单独测试&#xff0c;错误都是自己收集出来的…

【opencv】多版本安装

安装opencv3.2.0以及对应的付费模块 一、安装多版本OpenCV如何切换 按照如下步骤安装的OpenCV&#xff0c;在CMakeLists.txt文件中&#xff0c;直接指定opencv的版本就可以找到相应版本的OpenCV&#xff0c;为了验证可以在CMakeLists.txt文件中使用如下指令输出版本验证&…

26.篮球练习

题目 Description 小徐酷爱打篮球&#xff0c;在小学期的前两周半都在练习篮球。 今天&#xff0c;小徐想要练习如何突破。练习场地可由如下所示的网格图表示&#xff0c;图中的位置可用坐标表示。 其中A点(0,0)为小徐的起始位置&#xff0c;B点(n,m)为小徐想要到达的位置。…

漏洞分析|Adobe ColdFusion WDDX 序列化漏洞利用

0x01 概述 在上一篇有关 Adobe ColdFusion 序列化漏洞&#xff08;CVE-2023-29300&#xff09;的文章中&#xff0c;我们对已公开的 JNDI 利用链&#xff08;CVE-2023-38204&#xff09;进行了复现。JNDI 利用链受目标出网的限制&#xff0c;在不出网的情况下无法很好地利用。…

二叉树的递归遍历和非递归遍历

目录 一.二叉树的递归遍历 1.先序遍历二叉树 2.中序遍历二叉树 3.后序遍历二叉树 二.非递归遍历(栈) 1.先序遍历 2.中序遍历 3.后序遍历 一.二叉树的递归遍历 定义二叉树 #其中TElemType可以是int或者是char,根据要求自定 typedef struct BiNode{TElemType data;stru…

核心实验11合集_hybrid接口特殊用法_ENSP

项目场景一&#xff1a; 核心实验11合集_hybrid接口特殊用法_ENSP 前期用户少&#xff0c;只有一个vlan段&#xff0c;如今需要划分不同vlan&#xff0c;使用hybrid接口实现。&#xff08;不可更改ip地址&#xff09; 实搭拓扑图&#xff1a; 具体操作&#xff1a; sw1: [sw1…

​Bigemap软件在农业行业中的应用

​Bigemap软件在农业上面的一些应用 在农业工作者平时的工作应用中 Bigemap可以帮助农业用户更好地管理土地、作物和水资源 &#xff1b;提高农业生产效率和质量 &#xff1b;以及 野外调查定位&#xff0c;地层分析论证&#xff0c;水文地质调查等&#xff0c; 大部分的农业…

TypeScript断言

什么是断言&#xff1f; 一个编译时语法&#xff0c;用于告诉编译器用户比编译器更加确定变量的类型&#xff0c;进而解除编译错误&#xff0c;类型断言有点类似于其他语言的类型转换&#xff0c;但它没有运行时的影响&#xff0c;只是在编译阶段起作用。所以&#xff0c;即使通…

typescript删除array中的空值

使用.flat() 可以看到&#xff0c;调用之后空值被清清除了&#xff0c;如果本身就是1维数组就无所谓&#xff0c;但如果本身是多维数组&#xff0c;又不想数组维度被改变的话就需要传入0&#xff0c;才不会导致数据维度改变

如何启动股票量化系统QTYX-Python3.7/3.9环境安装Anaconda+Pycharm及TaLib

前言 我们的股票量化分析系统QTYX提供两种形式使用&#xff1a; EXE安装文件。好处是不需要安装Python环境&#xff0c;双击安装EXE文件就能使用QTYX的功能。Python源码。好处是可以学习和调试源码&#xff0c;并且在此基础上二次开发&#xff0c;把自己的想法加进去&#xff0…

Bigemap软件在农业上面的一些应用

在农业工作者平时的工作应用中 Bigemap可以帮助农业用户更好地管理土地、作物和水资源 &#xff1b;提高农业生产效率和质量 &#xff1b;以及 野外调查定位&#xff0c;地层分析论证&#xff0c;水文地质调查等&#xff0c; 大部分的农业用户在Bigemap软件上需要使用到以下 的…

ViTPose+:迈向通用身体姿态估计的视觉Transformer基础模型 | 京东探索研究院

身体姿态估计旨在识别出给定图像中人或者动物实例身体的关键点&#xff0c;除了典型的身体骨骼关键点&#xff0c;还可以包括手、脚、脸部等关键点&#xff0c;是计算机视觉领域的基本任务之一。目前&#xff0c;视觉transformer已经在识别、检测、分割等多个视觉任务上展现出来…

IOC和注解

想要学好spring&#xff0c;必须时时刻刻想着&#xff0c;spring的本质就是一个容器&#xff0c;放java对象的容器&#xff0c;java对象在spring容器中也叫做bean对象。 文章目录 一、spring介绍1、什么是框架2、框架的作用![在这里插入图片描述](https://img-blog.csdnimg.cn…

0014Java程序设计-springboot旅行景点推荐系统

摘要目 录概述1.1研究背景1.2 开发意义1.3 研究现状1.4 研究内容1.5 论文结构 系统实现开发环境 摘要 互联网的广泛运用给生活带来很多便捷。 因而&#xff0c;将旅游地介绍与现如今互联网紧密结合&#xff0c;利用Java技术搭建旅游地强烈推荐系统&#xff0c;完成旅游地强烈推…