如何从平面图或蓝图为 ROS 创建地图

news2024/11/24 21:07:50

如何从平面图或蓝图为 ROS 创建地图

在这里插入图片描述
在本教程中,我将向您展示如何从平面图或蓝图为 RViz(ROS 的 3D 可视化程序)创建地图。为 RViz 创建地图是使机器人能够在环境中自主导航的重要步骤。

我们经常使用机器人的激光雷达来构建地图。这很好,但如果您根据手头已有的平面图或蓝图创建地图,通常可以构建出更好、更准确的地图。

  1. 您需要做的第一件事是获取平面图或蓝图。确保它是 .png 格式。

  2. 将图像保存到最终要加载地图的目录。

  3. 安装地图服务器

sudo apt-get install ros-melodic-map-server

使用 Paint.net 等程序根据需要编辑图像文件。

  1. 使用 OpenCV 将图像转换为二进制格式。这是它的代码。我将程序命名为 convert_to_binary.py。
import cv2 # Import OpenCV
   
# read the image file
img = cv2.imread('mii_floor_plan_4.png')
   
ret, bw_img = cv2.threshold(img, 220, 255, cv2.THRESH_BINARY)
   
# converting to its binary form
bw = cv2.threshold(img, 240, 255, cv2.THRESH_BINARY)
  
# Display and save image 
cv2.imshow("Binary", bw_img)
cv2.imwrite("mii_floor_plan_4_binary.png", bw_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

我的图像名称是 mii_floor_plan_4_binary.png。这是图像。

在这里插入图片描述
现在,让我们创建 .pgm 和 .yaml 地图文件。 ROS 需要这两种文件格式才能在 RViz 上显示地图。将下面的代码 MakeROSMap.py 写在与 .png 图像文件相同的目录中。

import numpy as np
import cv2
import math
import os.path
 
#
#  This is a start for the map program
#
prompt = '> '
 
print("What is the name of your floor plan you want to convert to a ROS map:") 
file_name = input(prompt)
print("You will need to choose the x coordinates horizontal with respect to each other")
print("Double Click the first x point to scale")
#
# Read in the image
#
image = cv2.imread(file_name)
#
# Some variables
#
ix,iy = -1,-1
x1 = [0,0,0,0]
y1 = [0,0,0,0]
font = cv2.FONT_HERSHEY_SIMPLEX
#
# mouse callback function
# This allows me to point and 
# it prompts me from the command line
#
def draw_point(event,x,y,flags,param):
  global ix,iy,x1,y1n,sx,sy
  if event == cv2.EVENT_LBUTTONDBLCLK:
    ix,iy = x,y
    print(ix,iy)
#
# Draws the point with lines around it so you can see it
#
    image[iy,ix]=(0,0,255)
    cv2.line(image,(ix+2,iy),(ix+10,iy),(0,0,255),1)
    cv2.line(image,(ix-2,iy),(ix-10,iy),(0,0,255),1)
    cv2.line(image,(ix,iy+2),(ix,iy+10),(0,0,255),1)
    cv2.line(image,(ix,iy-2),(ix,iy-10),(0,0,255),1)
#
# This is for the 4 mouse clicks and the x and y lengths
#
    if x1[0] == 0:
      x1[0]=ix
      y1[0]=iy
      print('Double click a second x point')   
    elif (x1[0] != 0 and x1[1] == 0):
      x1[1]=ix
      y1[1]=iy
      prompt = '> '
      print("What is the x distance in meters between the 2 points?") 
      deltax = float(input(prompt))
      dx = math.sqrt((x1[1]-x1[0])**2 + (y1[1]-y1[0])**2)*.05
      sx = deltax / dx
      print("You will need to choose the y coordinates vertical with respect to each other")
      print('Double Click a y point')
    elif (x1[1] != 0 and x1[2] == 0):
      x1[2]=ix
      y1[2]=iy
      print('Double click a second y point')
    else:
      prompt = '> '
      print("What is the y distance in meters between the 2 points?") 
      deltay = float(input(prompt))
      x1[3]=ix
      y1[3]=iy    
      dy = math.sqrt((x1[3]-x1[2])**2 + (y1[3]-y1[2])**2)*.05
      sy = deltay/dy 
      print(sx, sy)
      res = cv2.resize(image, None, fx=sx, fy=sy, interpolation = cv2.INTER_CUBIC)
      # Convert to grey
      res = cv2.cvtColor(res, cv2.COLOR_BGR2GRAY)
      cv2.imwrite("KEC_BuildingCorrected.pgm", res );
      cv2.imshow("Image2", res)
      #for i in range(0,res.shape[1],20):
        #for j in range(0,res.shape[0],20):
          #res[j][i][0] = 0
          #res[j][i][1] = 0
          #res[j][i][2] = 0
      #cv2.imwrite("KEC_BuildingCorrectedDots.pgm",res)
        # Show the image in a new window
        #  Open a file
      prompt = '> '
      print("What is the name of the new map?")
      mapName = input(prompt)
 
      prompt = '> '
      print("Where is the desired location of the map and yaml file?") 
      print("NOTE: if this program is not run on the TurtleBot, Please input the file location of where the map should be saved on TurtleBot. The file will be saved at that location on this computer. Please then tranfer the files to TurtleBot.")
      mapLocation = input(prompt)
      completeFileNameMap = os.path.join(mapLocation, mapName +".pgm")
      completeFileNameYaml = os.path.join(mapLocation, mapName +".yaml")
      yaml = open(completeFileNameYaml, "w")
      cv2.imwrite(completeFileNameMap, res );
        #
        # Write some information into the file
        #
      yaml.write("image: " + mapLocation + "/" + mapName + ".pgm\n")
      yaml.write("resolution: 0.050000\n")
      yaml.write("origin: [" + str(-1) + "," +  str(-1) + ", 0.000000]\n")
      yaml.write("negate: 0\noccupied_thresh: 0.65\nfree_thresh: 0.196")
      yaml.close()
      exit()
 
cv2.namedWindow('image', cv2.WINDOW_NORMAL)
cv2.setMouseCallback('image',draw_point)
#
#  Waiting for a Esc hit to quit and close everything
#
while(1):
  cv2.imshow('image',image)
  k = cv2.waitKey(20) & 0xFF
  if k == 27:
    break
  elif k == ord('a'):
    print('Done')
cv2.destroyAllWindows()

我的两个输出文件是 floorplan4.pgm 和 floorplan4.yaml。

打开 yaml 文件(floorplan4.yaml)并将 pgm 图像的完整路径放入图像标签中。

image: /home/focalfossa/catkin_ws/maps/floorplan4.pgm
resolution: 0.050000
origin: [-1,-1, 0.000000]
negate: 0
occupied_thresh: 0.65
free_thresh: 0.196

要找出完整路径,您可以转到 Linux 中的文件资源管理器并右键单击图像。然后转到属性。

保存文件并关闭它。

现在载入地图。在新的终端窗口中,键入:

rosrun map_server map_server floorplan4.yaml

打开 rviz

点击左下角的添加,添加地图显示。

在地图部分的主题下,选择 /map。

您应该会在屏幕上看到保存的地图。

在这里插入图片描述

reference

@misc{BibEntry2023Jun,
title = {{How to Create a Map for ROS From a Floor Plan or Blueprint {\textendash} Automatic Addison — xn–siqwnon76wa479ac7k3qhmv8fryvb ROS xn–5bry2jjet02a {\textendash} Automatic Addison}},
year = {2023},
month = jun,
note = {[Online; accessed 5. Jun. 2023]},
url = {https://automaticaddison.com/how-to-create-a-map-for-ros-from-a-floor-plan-or-blueprint}
}

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

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

相关文章

【openeuler】Yocto embedded sig例会 (2023-01-12)

Yocto & embedded sig例会 (2023-01-12)_哔哩哔哩_bilibili

群智能算法-模拟退火

一.基本理念 模拟退火算法(Simulated Annealing,简称SA) 的思想最早是由Metropolis等提出的.其出发点就是基于物理中固体物质的退火过程与一般的组合优化问题之间的相似性。模拟退火法是一种通用的优化算法,其物理退火过程由以下三部分组成。 加温过程:我…

AutoHand插件使用指南

一、设置 1.软件包设置 Auto Hand 包括四个内置的输入选项。AutoHand不直接管理输入,而是包含各种脚本,充当所选输入系统和Auto Hand之间的桥梁。 这里只介绍OpenXR(Action Based),首先作如下设置: 我这里用的是HTC Vive Pro: 找到并导入AutoHand插件中的OpenXR这个包:…

java错题记录(一)

一、观察下类代码,输出正确的是 String s1 "coder"; String s2 "coder"; String s3 "coder" s2; String s4 "coder" "coder"; String s5 s1 s2; System.out.println(s…

SELD2022:(一)数据集收集与组织详解

前言:声音事件检测与定位(SELD)作为DCASE挑战赛的子任务,从2019年开始已经举办了好几届。该子任务的目标也从2022年开始由原来的在仿真数据集上设计更优声学模型,过渡到了在真实数据集上进行模型优化。相对而言&#x…

Omnipeek 分析wifi包简单介绍

通常打开一个.pkt文件,我们先看到的是如下内容。 这个场景下的数据基本是不能分析的。。 因为抓空口包1分20秒基本有10w包了,所以通常会对所抓的空口包进行过滤然后分析。 写个例子: 我本次抓包的目的是看路由器mesh的wps 组网过程&#xf…

海睿思分享 | 低代码开发直面行业变革:革新,创新?

软件体系结构从单体集群服务时期,历经领域驱动设计、微服务架构等阶段,软件产品的开发过程的变革正在潜移默化地进行。 在软件逻辑架构设计、物理架构设计、构建与部署这一系列化的过程中,存在可缩减的设计与开发成本,曾经看似不可…

力扣高频SQL50题(基础版)——第六天

力扣高频SQL50题(基础版)——第六天 1 平均售价 1.1 题目内容 1.1.1 基本题目信息1 1.1.2 基本题目信息2 1.1.3 示例输入输出 1.2 示例sql语句 SELECT u.product_id,ROUND(SUM(p.price*u.units)/SUM(u.units),2) average_price FROM UnitsSold u INNER JOIN Prices p ON u.…

Linux :: 文件内容操作【6】:文件中指定中间部分(第多少行 到 第多少行)行内容输出 及 初步认识管道

前言:本篇是 Linux 基本操作篇章的内容! 笔者使用的环境是基于腾讯云服务器:CentOS 7.6 64bit。 学习集: C 入门到入土!!!学习合集Linux 从命令到网络再到内核!学习合集 注&#xff…

OpenAI的人工智能语音识别模型Whisper详解及使用

1 whisper介绍 拥有ChatGPT语言模型的OpenAI公司,开源了 Whisper 自动语音识别系统,OpenAI 强调 Whisper 的语音识别能力已达到人类水准。 Whisper是一个通用的语音识别模型,它使用了大量的多语言和多任务的监督数据来训练,能够在…

Linux中使用ls命令按大小对所有文件进行排序

按大小列出目录中的文件(排序) ls -lSh

AI版女网红“半藏森林”上线,服务项目让人意想不到

目前首批网红明星“AI克隆人”已提前上线,主营业务就是打造各种名人版AI聊天机器人,用户付费便可与之聊天。其后台报名参加AI克隆人的网红明星“全网粉丝总数已超过5亿”。该公司这波上线的网红明星AI克隆人,包括此前因“疑似插足他人恋情”&…

腾讯工作3个月,做测试的一些感悟...

普通二本计算机专业毕业,从毕业后,第一份接触测试的工作是在一家通讯小公司,大部分接触的工作是以功能测试为主,一直都是几千块钱工资,还一度被派出差,以及兼职各种产品、运维、运营的活,感觉自…

TS学习操作

一.TypeScript环境安装与运行 1.全局安装 TypeScript : npm install -g typescript 2.校验 : tsc -v 二.如何运行 1.创建一个day01.ts文件夹 2.使用tsc ./day01.ts 将typescript代码转行成js代码 3.在html页面导入day01.js 4.创建配置文件 tsc --i…

力扣LeetCode算法题 第8题-字符串转换整数 (atoi)

以上为题目要求: /*** params Leetcode_test007* return Leetcode_test007* Author bigeZhong* disc**请你来实现一个myAtoi(string s)函数,使其能将字符串转换成一个 32 位有符号整数(类似 C/C 中的 atoi 函数)。** 函数myAtoi(…

java实现打包下载

背景:项目中下载功能单个文件正常下载多个文件或者包含文件夹打压缩包下载 上代码 controller RestController RequestMapping("/file") public class FileController {RequestMapping(value "/downloadFilePack", method RequestMethod.G…

SpringCloud 规则持久化

SpringCloud 规则持久化 文章目录 SpringCloud 规则持久化1 规则持久化2 规则持久化方案2.1 阿里云 Ahas[最方便/付费]2.2 在 Nacos Server 配置规则, 完成持久化 -官方推荐2.3 将规则持久化到本地文件, 定时同步 3 Nacos Server 配置中心-规则持久化实例 1 规则持久化 **规则…

MySQL压缩版本安装

MySQL压缩版本安装 首先分享mysql-8.0.23版本的压缩包,请有需要的朋友自取。 链接:https://pan.baidu.com/s/1h46ZCkGLbikhDOu5_0p2nw 提取码:wwd2 1、解压压缩包 1、将下载的压缩包放置到安装的位置后并解压,笔者将文件夹放到…

WPF BUG汇总:WPF Debug运行是 实时可视化树无效,无法查看代码

文章目录 往期回顾前言问题解决方案 往期回顾 WPF MaterialDesign 初学项目实战(0):github 项目Demo运行 前言 最近打算去深圳工作,投了几个简历之后发现深圳的C#方向上,WPF招聘的比较多。这里介绍一下,工业计算机&…

ChatGLM-6B的windows本地部署使用

ChartGPT最近特别火,但是收费,而且国内访问不太方便,所以找了个类似的进行学习使用 ChatGLM-6B,开源支持中英文的对话大模型,基于 General Language Model (GLM) 架构,具有62亿参数,简单说非常…