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

阿克曼-幻宇机器人系列教程4- 建图

在之前的文章中,我们介绍了如何登录机器人,如何实现上位机与下位机之间的互通,还介绍了机器人的topic和message,以及如何通过命令行对topic、message进行对应的操作。

接下来,我们就要运用前面所学的所有知识进行综合操作:运行机器人实现建图

通过Gmapping能力进行建图,使用RVIZ可视化工具(ROS专用可视化工具)将数据进行可视化。

因为RVIZ可视化工具只能运行在Linux系统上,所以需要分别考虑具备了Linux系统条件和仅有Windows系统的情况。

考虑到Windows系统上建图的准备工作较多,所以我们首先介绍Windows系统上的情况。

1.Windows系统建图

1.1 构建包含Linus操作系统的容器

1.1.1 构建原因

为了实现上位机(Windows电脑)对下位机(机器人上的树莓派)的操控,需要在上位机上安装ROS系统。

又因为ROS系统是基于Linus系统开发和测试的,所以我们需要在Windows电脑中构建Linus系统,阿克曼-幻宇机器人是基于Linus系统中的Ubuntu系统进行开发和测试,所以我们构建的是Ubuntu系统环境

1.1.2 构建过程

为了简化构建过程,我们借助Docker进行环境构建。

在本地电脑中创建文件,命名为Dockerfile,文档内容:

docker pull 对于某些独立显卡的,采用强制软解码(直接使用包含RVIZ等全功能的容器)

1.2 运行容器并与树莓派联通

1.2.1 运行容器

运行命令

docker run -it --rm tiryoh/ros-kinetic-desktop:latest

 在这种模式下,容器与宿主机共享网络,容器将使用宿主机的IP地址,并直接访问宿主机的网络资源。

使用宿主机网络命令

docker run -it --rm --network host tiryoh/ros-kinetic-desktop:latest
1.2.2 实现容器与树莓派联通
1.2.2.1 确保容器的宿主机和机器人树莓派处于同一局域网
  • 将机器人作为热点,宿主机连接机器人网络

  • 声明树莓派上的ROS服务地址

export ROS_MASTER_URI=http://192.168.12.1:11311/    # 树莓派上的 URI
  • 声明容器的IP地址

export ROS_HOSTNAME=192.168.12.170    # docker 内机器的 ip
  • 执行命令验证是否联通
rostopic list

1.3 为Docker Ubuntu赋予GUI能力

1.3.1 把宿主机的图像权限赋予给Docker
xhost +local:docker

说明:当不需要时,取消权限命令为:

xhost -local:docker
 1.3.2 启动带有GUI能力的容器并启动RVIZ
docker run -it --rm \--network host \      将宿主机网络赋予给容器--env="DISPLAY" \--env="QT_X11_NO_MITSHM=1" \  和上一行代码共同作用,把宿主机的显示能力赋予给容器--env="ROS_MASTER_URI=http://192.168.12.1:11311" \--env="ROS_HOSTNAME=192.168.12.78" \--env="LIBGL_ALWAYS_SOFTWARE=1" \      对于某些独立显卡的,采用强制软解码--volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" \  tiryoh/ros-kinetic-desktop:latestrviz

即可看到 RVIZ 可视化工具已经启动,通过添加话题和选择话题名称就可以查看相应话题数据。

 

1.4 Gmapping建图

通过上述步骤完成环境准备、上下位机之间的联通和可视化准备后,就可以开始准备Gmapping建图。

还差在宿主机中执行的最后三个操作以实现对机器人的操控:运行机器人、打开机器人键盘控制节点和运行Gmapping建图包。

1.4.1 运行机器人
终端 1
ssh huike@192.168.12.1  # 登陆树莓派
roslaunch huanyu_robot_start Huanyu_robot_start.launch  # 运行机器人
1.4.2 打开机器人键盘控制节点
终端 2
ssh huike@192.168.12.1  # 登陆树莓派
roslaunch turtlebot_teleop keyboard_teleop.launch  # 打开机器人键盘控制节点

 打开机器人键盘控制节点返回的信息我们主要关注以下信息

Control Your Turtlebot!
---------------------------
Moving around:
   u    i    o
   j    k    l
   m    ,    .
这一信息提供了机器人操作说明

1.4.3 运行Gmapping建图包
终端 3
ssh huike@192.168.12.1  # 登陆树莓派
roslaunch huanyu_robot_start gmapping_slam.launch  # 运行 Gmapping 建图包

 说明:SSH是为了访问树莓派,并为在机器人里执行操作做准备。

在数据窗口内查看地图和机器人姿态数据。RVIZ中的消息和话题选择如下:即可看到地图、激光点、机器人的 tf 位姿数据:

 完成上述三步准备工作后,按照第二部返回的操作说明移动机器人,尽量走一个闭合的曲线,使显示地图能满足整体建图需要。

2. Linux系统建图

学习了Windows系统建图后,Linux系统建图因为省去了很多环境准备、可视化等准备工作就相对容易得多了。

2.1 环境准备

  • 确保Linux系统是Ubuntu系统,如果不是手动换成此系统。

  • 执行命令安装包含kinetic版本、RVIZ可视化工具包:

    apt install -y ros-kinetic-desktop-full

2.2 Gmapping建图

将Linux系统电脑连上机器人热点,然后打开三个终端Launch三个相关包,打开RVIZ,完成话题和消息选择。

通过键盘指令移动机器人,尽量走一个闭合的曲线,使显示地图能满足整体建图需要。

3. 扩展知识

我们详细介绍下Dockerfile命令行的确认过程,并以全功能和仅含有kinetic版本的ROS系统的拉取容器对象不同分别说明容器制作命令行的不同。

Dockerfile命令行的确认过程

  • 确认机器人树莓派中运行的ROS系统版本 

  • 在Docker找到与之匹配的容器,然后在页面上找到对应的拉取命令                                           

以我所使用的阿克曼-幻宇机器人ROS系统为例:

当拉取的是包含了RVIZ全功能的容器

版本为kinetic,我在Docker中找到对应的包含RVIZ可视化工具、kinetic版本ROS系统的全功能容器,找到容器构建命令。

 容器地址:

https://hub.docker.com/r/tiryoh/ros-kinetic-desktop/

构建语句

docker pull tiryoh/ros-kinetic-desktop(直接使用包含RVIZ等全功能的容器)

当拉取的是仅包含kinetic版本ROS系统的的容器

拉取容器之后,需要执行定制化操作,比如安装RVIZ可视化工具

 容器地址:

https://hub.docker.com/_/ros/tags?name=kine

拉取语句:

docker pull ros:kinetic

执行上述命令构建的是不包含RVIZ可视化工具的容器,所以我们还需要下载对应的应用 

RUN apt update && apt install -y iputils-ping net-tools && apt install -y ros-kinetic-desktop-full    更新软件包索引,安装一些网络调试工具和完整的 ROS Kinetic 桌面版本。
docker build -t my/ros_kinetic:app   构建Docker镜像

这样就可以在Linux系统中运行RVIZ工具了。

相关文章:

阿克曼-幻宇机器人系列教程4- 建图

在之前的文章中,我们介绍了如何登录机器人,如何实现上位机与下位机之间的互通,还介绍了机器人的topic和message,以及如何通过命令行对topic、message进行对应的操作。 接下来,我们就要运用前面所学的所有知识进行综合…...

【方法论】如何构建金字塔框架

文章目录 一、自上而下法1、5步法2、案例说明:基于自上而下法构建金字塔结构来优化写作逻辑 二、自下而上法1、 自下而上法的“三步走”策略步骤1:列出所有思想要点步骤2:找出逻辑关系(因果或共性)步骤3:得…...

Ubuntu 18.04设置静态IP的方法(图形化操作)

0 前言 当路由器启用了DHCP功能,每次启动虚拟机下的Ubuntu(网络连接模式为桥接模式)分配到的IP可能是不一样的,不方便使用和调试(例如开发板加载镜像的主机IP地址也要跟着更改)。针对这些问题,…...

第12章 Java多线程机制

12.1 进程与线程 4种状态:新建、运行、中断和死亡。 (新建、运行、中断和死亡) 建立线程的两种方法:用Thread类或其子类。 线程新建后,必须调用 start () 方法使其进入就绪队列,才有机会获得 CPU 资源&a…...

AM32电调学习解读八:无感驱动相位波形解析

这是第八篇,本篇主要是解读换相波形,方便理解代码。 1、无感驱动波形图 1)ESC简图 2)比较器接线图 灵动微 BLDC 电机方波控制中的反电动势过零检测介绍 - 大大通(简体站) 3)未满duty波形 未满duty方便看出是高边驱…...

封装、继承、多态的理解

目录 1、封装 2、继承 3、多态 4、举例:计算机和外设 1、封装 封装是从使用者的角度,将某种复杂的事务,打包成一个整体,只对使用者提供方便使用的方式。 举例: 1> 胶囊:对于各种混合药物的封装 …...

使用vscode做python项目fastapi的开发

准备工作 安装必要软件 Python:确保安装 Python 3.8 或更高版本(FastAPI 推荐)。下载地址:https://www.python.org/downloads/ 验证安装: bash python --versionVS Code:下载并安装 VS Code:ht…...

多指标组合策略思路

一种基于多种技术指标和日历因素的综合交易策略,旨在通过复杂的条件判断来预测市场的短期走势,并据此进行买卖操作。 策略概述 该策略的核心思想是通过结合多个技术指标和日历因素来判断市场的短期趋势,并在合适的时机进行买入或卖出操作。 具…...

day29 python深入探索类装饰器

目录 一、类装饰器的初步理解 二、类装饰器与函数装饰器的对比 三、类装饰器的实现与应用 (一)为类添加日志功能 (二)动态方法绑定的两种方式 四、手动调用装饰器:类的“后天改造” 五、总结与展望 一、类装饰器…...

Rstudio换皮:自定义彩虹括号与缩进线

更换主题 Rstudio还是R语言最好用的IDE,默认的Rstudio已经自带了很多主题,可以自由选择。 更换内置主题 • 操作路径:Tools → Global Options → Appearance 在Editor Theme选项中切换主题,默认使用Textmate主题。RStudio提供…...

基于springboot+vue的车票管理系统

开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7数据库工具:Navicat12开发软件:eclipse/myeclipse/ideaMaven包:Maven3.3.9 系统展示 用户管理 班次时…...

计算机组成与体系结构:Snooping-Based Protocols(监听式协议)

目录 什么是监听式协议? Snooping 的总线模型 两种写策略:Write Update vs. Write Invalidate 1️⃣ Write-Invalidate(写失效) 2️⃣ Write-Update(写更新) 🔍 操作流程分析 &#x1f5…...

CSS 浮动(Float)及其应用

1. 什么是浮动(Float)? 浮动元素会脱离正常的文档流(Document Flow),并向左或向右移动,直到碰到父元素的边缘或另一个浮动元素。 基本语法 .float-left {float: left; }.float-right {float:…...

离散文本表示

目录 一、离散文本表示的底层逻辑 二、One-hot 编码 (一)One-hot 编码的精妙机制 (二)One-hot 编码的优势与局限 三、词袋法(Bag of Words) (一)词袋法的核心思想 &#xff08…...

Python异常处理与OOP深度解析及实战案例

**导读:**在现代软件开发中,异常处理与面向对象编程(OOP)是构建健壮、可维护程序的两大基石。本文深入解析了 Python 中的异常处理机制和 OOP 编程的核心概念,并通过实战案例帮助你掌握这些技术的实际应用。 文章从异常…...

KnowCard:我的知识卡片生成器是怎么炼成的?

我正在参加CodeBuddy「首席试玩官」内容创作大赛,本文所使用的 CodeBuddy 免费下载链接:腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴 起心动念:我想做个“笔记神器” 有时候,看着笔记本里密密麻麻的学习要点,我…...

JAVA EE(进阶)_进阶的开端

别放弃浸透泪水的昨天,晨光已为明天掀开新篇 ——陳長生. ❀主页:陳長生.-CSDN博客❀ 📕上一篇:JAVA EE_HTTP-CSDN博客 1.什么是Java EE Java EE(Java Pla…...

装甲PPT习题

装甲PPT习题 第一章 将 42.195 42.195 42.195, 0.0375551 0.0375551 0.0375551, 8.00033 8.00033 8.00033, 2.71828 2.71828 2.71828 按四舍五入写出上述各数具有四位有效数字的近似数。 考察三位有效数字重力加速度 g g g,若…...

EasyExcel动态表头

专家官方解答 : 在使用EasyExcel处理Excel动态表头的问题时,官方并不推荐使用includecolumnfieldnames方法。根据提供的知识内容,以下是如何实现动态表头的详细步骤和解释: 原因分析 动态表头的需求通常来源于希望根据用户的选…...

LoadBarWorks:一款赛博风加载动画生成器的构建旅程

我正在参加CodeBuddy「首席试玩官」内容创作大赛,本文所使用的 CodeBuddy 免费下载链接:腾讯云代码助手 CodeBuddy - AI 时代的智能编程伙伴 项目缘起:赛博与实用的结合 在日常开发中,我经常需要为不同的项目添加加载动画&#x…...

跨平台多用户环境下PDF表单“序列号生成的服务器端方案“

在PDF表单处理中,经常需要为每个表单生成唯一的序列号或表单编号。当所有表单都在同一台计算机上由同一用户处理时,可以通过JavaScript将编号存储在另一个表单或全局JavaScript数据中来实现。然而,当需要在多台计算机或多个用户环境中使用时&…...

二:操作系统之进程控制块(PCB)

进程的身份证与状态记录:深入理解进程控制块 (PCB) 在我们之前的博客中,我们探讨了进程是什么——程序的一次执行实例,以及进程在其生命周期中会经历的各种状态(新建、就绪、运行、等待、终止)。我们知道,…...

创建型:原型模式

目录 1、核心思想 2、实现方式 2.1 基本结构 2.2 代码示例(Java) 3、适用场景 4、new与clone实际场景建议 1、核心思想 目的:通过复制(克隆)现有对象来创建新对象,而不是通过new关键字实例化。对于那…...

从c++到python

从c到python 前言printprint格式化print按原始格式输出 input变量、常量和数据类型整型和type()浮点型复数字符串类型数据类型转换变量地址 注释关键字容器列表list下标索引常用功能 元组tuple字符串str字符串的成员函数:字符串初始化为几个固定字符字符和int型数据…...

仿腾讯会议——房间界面用户设置

1、房间界面设置 2、 添加新设计师界面类 3、设置用户设置 4、添加新类&&设置房间标题 5、设置控件 6、修改用户展示头文件 7、 设置用户名 8、客户端添加用户展示 9、测试数据 10、成功截图...

Vue+Go 自定义打字素材的打字网站

Typing_Key_Board 这是一个基于Vue 3和Go语言的自定义素材打字练习网站,灵感来源于常用字打字练习,解决了大多数网站无法自定义打字素材的问题。在 Typing_Key_Board (简称TKB)中,用户可以自定义打字素材进行练习,在复习代码的同…...

生产级编排AI工作流套件:Flyte全面使用指南 — Data input/output

生产级编排AI工作流套件:Flyte全面使用指南 — Data input/output Flyte 是一个开源编排器,用于构建生产级数据和机器学习流水线。它以 Kubernetes 作为底层平台,注重可扩展性和可重复性。借助 Flyte,用户团队可以使用 Python SDK…...

JUC入门(二)

5、8锁现象:就是关于锁的八个问题 谁来充当锁?要锁的是什么东西?这个锁有什么用? 其实锁的作用就是:哪个线程先拿到锁,谁就有先执行同步方法的权力 那么谁能充当锁?任何对象都可以充当锁 要…...

深入浅出:CPU寻址方式完全指南(从理论到实践)

引言:为什么需要寻址方式? 当我们写下一行高级语言代码(比如 int sum a b;),计算机底层是如何找到变量 a 和 b 的? 寻址方式(Addressing Modes) 就是 CPU 定位操作数的策略&#…...

PyQt5基本窗口控件(对话框类控件)

对话框类控件 QDialog 为了更好地实现人机交互,比如Windows及Linux等系统均会提供一系列的标 准对话框来完成特定场景下的功能,如选择字号大小、字体颜色等。在PyQt5中定 义了一系列的标准对话框类,让使用者能够方便和快捷地通过各个类完成…...

【PostgreSQL系列】PostgreSQL 复制参数详解

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

给easyui的textbox绑定回车事件

项目有一个textbox输入框,需要绑定一个回车搜索事件。 一开始想着,直接使用js的on或者jquery的keydown方法直接绑定,但是事件不生效。 $("#propName").textbox({width: 200,prompt: "请输入物品名称进行搜索" }).keydo…...

量子计算 | 量子密码学的挑战和机遇

量子计算在密码学中的应用现主要体现在对现有加密算法的威胁上。最著名的例子是Shor算法,该算法能够在多项式时间内分解大整数,从而威胁到基于大数分解的加密算法,如RSA加密。此外,量子计算还可以加速某些类型的密码分析&#xff…...

什么是着色器 Shader

本人就是图形学结课了,对 OpenGL着色器还有很多疑问嘿嘿 文章目录 为什么要有着色器vshaderfshader 本文围绕 vshader 和 fshader 代码示例讲解。 (着色器代码取自本人简单OpenGL项目 https://github.com/DBWGLX/-OpenGL-3D-Lighting-and-Shadow-Modeli…...

STM32H562----------启动时钟分析

1、H562启动过程分析 1.1、启动模式 复位方式有三种:上电复位、硬件复位和软件复位。当产生复位后,离开复位状态后 CM33 内核做的第一件事就是 读取堆栈指针 MSP 的初始值及程序计数器指针 PC 的初始值: 1、从地址 0x0000 0000 处读取出堆栈指针 MSP 的初始值,该值即栈…...

MIT 6.S081 2020 Lab4 traps 个人全流程

零、写在前面 做之前可以看看Chapter 4:Traps and systems calls,了解XV6 下的陷入机制 https://pdos.csail.mit.edu/6.828/2020/xv6/book-riscv-rev1.pdf 这个实验旨在探索系统调用如何实现了trap,会先做一个有关栈的练习,然后…...

基于YOLOv8-OBB的旋转目标检测:从数据制作到自动标注完整指南

一、引言 目标检测作为计算机视觉中的核心任务,广泛应用于安防监控、自动驾驶、工业质检等场景。传统的目标检测方法多使用水平边界框(HBB)进行目标定位。然而在一些特殊应用场景(如遥感图像、文本检测、PCB检测等)中…...

【自然语言处理与大模型】向量数据库:Chroma使用指南

Chroma是一款功能强大的开源 AI 应用数据库,专为高效数据存储与检索而设计。它不仅支持 Embedding 和 Metadata 的存储,还集成了多项核心功能,包括向量搜索、全文搜索、Document 存储、Metadata 过滤以及多模态检索。此外,Chroma …...

一文掌握工业相机选型计算

目录 一、基本概念 1.1 物方和像方 1.2 工作距离和视场 1.3 放大倍率 1.4 相机芯片尺寸 二、公式计算 三、实例应用 一、基本概念 1.1 物方和像方 在光学领域,物方(Object Space)是与像方(Image Space)相对的…...

【周输入】510周阅读推荐-3

前文 【周输入】510周阅读推荐-1-CSDN博客 【周输入】510周阅读推荐-2-CSDN博客 本次推荐 目录 前文 本次推荐 算法技术 模型产品 算法技术 vLLM和DeepSpeed部署模型的优缺点_vllm deepspeed-CSDN博客 优点缺点总结vLLM 适用于推理 优化内存管理 高效并行化 功能单…...

机器学习(11)——xgboost

文章目录 1. 算法背景和动机1.1. 提升算法(Boosting)1.2. XGBoost的改进动机2. 算法基础 3. 核心创新3.4 稀疏感知算法 4. 系统优化4.1 列块(Column Block)4.2 缓存感知访问4.3 外存计算 5. 算法细节5.1 树生长策略5.2 特征重要性评估5.3 自定义目标函数…...

大语言模型上下文长度:发展历程、局限与技术突破

1. 引言:什么是上下文长度及其重要性 上下文长度(Context Length),也称为上下文窗口(Context Window),指的是大语言模型(LLM)在处理和生成文本时能够有效记忆和利用的信…...

ControlNet简洁

ControlNet 什么是ControlNet ControlNet是一种用于控制扩散模型生成结果的网络结构。该结构可以将边缘图,结构图等信息注入扩散模型,从而能够对生成结果进行更为精细的控制。 ControlNet是怎么实现的 在模型结构方面,其大致结构如下图所…...

【C】C程序内存分配

文章目录 1. C程序内存布局 1. C程序内存布局 从低地址到高地址依次为: 代码段 存储内容:存放编译后的机器指令特点:代码段是只读的;可共享,多个进程可共享同一份代码 数据段 存储内容 已初始化的全局变量已初始化的静…...

论文学习:《引入TEC - LncMir,通过对RNA序列的深度学习来预测lncRNA - miRNA的相互作用》

长链非编码RNA ( long noncoding RNAs,lncRNAs )是一类长度通常大于200个核糖核苷酸的非编码RNA ,微小RNA ( microRNAs,miRNAs )是一类由22个核糖核苷酸组成的短链非编码RNA。近年来,越来越多的研究表明,lncRNA和miRNA…...

【每日一题丨2025年5.12~5.18】排序相关题

个人主页:Guiat 归属专栏:每日一题 文章目录 1. 【5.12】P1068 [NOIP 2009 普及组] 分数线划定2. 【5.13】P5143 攀爬者3. 【5.14】P12366 [蓝桥杯 2022 省 Python B] 数位排序4. 【5.15】P10901 [蓝桥杯 2024 省 C] 封闭图形个数5.【5.16】P12165 [蓝桥…...

AIDA64 extreme7.5 版本注册激活方法

一、AIDA 7.5 序列号 3BQN1-FUYD6-4GDT1-MDPUY-TLCT7 UVLNY-K3PDB-6IDJ6-CD8LY-NMVZM 4PIID-N3HDB-IWDJI-6DMWY-9EZVU 二、安装激活方法 激活步骤: 1、打开AIDA64软件,点击顶部菜单栏的“帮助”→“输入序列号” 2、将生成的序列号粘贴至输入框&a…...

Python 条件语句详解

条件语句是编程中用于控制程序流程的基本结构,Python 提供了几种条件语句来实现不同的逻辑判断。 1. if 语句 最基本的条件语句形式: if 条件:# 条件为真时执行的代码块示例: age 18 if age > 18:print("你已经成年了")2. …...

模型评估与调优(PyTorch)

文章目录 模型评估方法混淆矩阵混淆矩阵中的指标ROC曲线(受试者工作特征)AUCR平方残差均方误差(MSE)均方根误差(RMSE)平均绝对误差(MAE) 模型调优方法交叉验证(CV&#x…...

oppo手机安装APK失败报错:安装包异常

如果你的apk文件在oppo手机安装失败了,像这样: 先说我们当时解决方式: 如果还没上架应用市场的测试包,在上面图一中需要关闭“超级守护”,类似华为的纯净模式。如果开启了还还不行,安装页面的报错太笼统不…...