构建捡垃圾机器人的 ROS 2 项目

news2024/11/22 8:41:29
 

一、说明

        本系列是关于学习如何使用 ROS2、Docker 和 Github 设计、设置和维护机器人项目。
先决条件 — ROS2 软件包的基本知识、实现发布者、订阅者、操作并连接它们。

        我们之前在 ROS2 中了解了不同的部分。但是,在我们转向实际的基于硬件的项目之前,将它们很好地结合起来理解 ROS2 是关键。

        这是我们当前系列的议程— 第 1 部分:开始使用新的 ROS2 项目 — 演示带有垃圾拾取机器人自定义包的样板 ROS2 项目 第 2 部分:改进 ROS2 代码库 — 启动文件和 ROS 参数
第 3 部分:通过测试改进项目 — 添加 ROS 测试基础架构 第 4 部分:从业余爱好者到优质项目 —
在 Github 上为 CI/CD 添加 docker

二、垃圾捡拾机器人 —

以下是我们想要设计系统的方式 —

  1. 感知和解释 — 我们使用摄像头图像来查看机器人的附近,对其进行处理,并确定是否存在垃圾。该信息被转发到决策模块(大脑)。
  2. 决定 — 决策模块(大脑)从感知(和解释)中获取垃圾存在信息,并决定机器人是否应该采取行动。 如果大脑决定采取行动并移动机器人(因为存在垃圾),它会命令驱动模块这样做。
  3. 行动 —根据大脑的命令,驱动模块移动机器人(例如,使用电机)去收集垃圾。

注意:我们的朴素系统过于简单(只关注 ROS2 设计)。在本系列中,我们不考虑核心机器人算法、控件(开环/闭环)或视觉。这将在后面的课程中完成,我们将基于此处建立的基本 ROS2 思想。

我们将系统分为 3 个逻辑组件——感知、大脑和驱动。

如果我们想象我们的软件设计,我们应该有 3 个 ROS2 包(因此是节点)

  1. 感知 — 该节点将从机器人的摄像头获取输入图像并从中获取见解(例如垃圾的存在)。
  2. 脑—— 该节点从感知模块获取见解,处理此信息,并通知致动模块下一步该做什么。
    此外,大脑通常只关心每一帧中感知的视觉信息。但偶尔,大脑想知道感知相机的电池状态。
  3. 驱动 — 该节点将命令伺服电机移动机器人的四肢。想象一下,机器人走向垃圾桶,捡起它,移动到垃圾箱,然后收集它。使用致动代码控制运动

大脑模块实际上就像人脑一样,通过感觉器官(感知)接收信息,并通过电机(驱动)指挥适当的动作。甜!

接下来,本系列的第 1 部分将重点介绍如何使用垃圾收集机器人的自定义包构建一个样板 ROS2 项目。

让我们建造,好吗?

三、ROS2 有何不同 — 总结!

        1. 第三方中间件

        ROS1 与 ROS2:DDS

        ROS1有自己的中间件,它使用网络堆栈将信息从一个节点发送到正确的套接字,中间件再次接收到信息以将信息发送到正确的节点(过度简化)。
ROS2抛弃了中间,现在使用数据分发服务(DDS),这是一个可靠的行业标准的第三方中间件。

        2. 没有玫瑰大师

        Rosmaster是一项服务,方便两个节点找到彼此(如果它们希望通信)。接下来是它们直接相互连接。如果 rosmaster 在此过程中死亡,这些节点仍将连接,但没有新节点可以加入通信网络。

        在 ROS1 中,每个节点都需要知道主节点的位置(即使系统在多台机器上运行)。

        ROS2取消了rosmaster,节点可以直接找到彼此。

        3. Cpp 和 Python 的共享代码库

RCL

        ROS支持两种语言,Cpp和Python,底层实现在某些地方有所不同。例如,每个订阅者在 Python 中都有自己的线程,但在 Cpp.All
        对于 ROS1 来说都是如此,但 ROS2 具有相同的共享 C 实现。这个通用的代码库通过C++和Python中的ROS客户端库API公开。

        4. 一个进程中有多个ROS节点 ROS1不允许一个进程中
有多个ROS节点。ROS2 中的变化

        5. Python 构建要求
        在 ROS1 中更改 Python 文件不需要您构建项目。ROS2 需要你重新构建项目,这太糟糕了!😦

        6. 操作服务 操作服务
        不是核心 ROS1 库的一部分(而是 actionlib)。ROS2 核心库具有操作服务器

        7. 视窗支持
        ROS2 是视窗支持的!好吧,我真诚地希望你正在使用Linux 😛。

        8. 更改了启动基础结构
        ROS1 主要使用基于 XML 的启动文件。ROS2 有一个支持排序约束的 python 启动系统

四、为什么要迁移到 ROS2?

        这是一个很难回答的问题。此举有一些惯性,主要是因为 ROS2 社区仍然没有 ROS1 那么大。这导致更少的在线开发支持和更长的开发时间。

        但大多数著名的开源 ROS1 软件包已经或将很快达到生命周期的终点。面向未来的项目和技能提升是采取行动的两个原因。

五、ROS2 设置

第 1 阶段:安装 ROS2

在本课中,我们使用 ubuntu Focal(20.04.3 LTS),它支持 ROS2 Galactic。
这里有一个链接可以很好地解释 ROS2 的安装。他们在解释安装:)方面比我做得更好

第 2 阶段:测试 ROS2

为了测试我们的 ROS2 设置,我们执行以下操作:
1. 获取终端

source /opt/ros/$ROS_DISTRO/setup.bash 

如前所述,从今以后我将使用银河而不是$ROS_DISTRO

2. 运行演示监听器和说话者节点:
我们将使用“/opt/$ROS_DISTRO/lib/”中已经存在的demo_nodes_cpp包

在源终端中运行以下命令:

ros2 run demo_nodes_cpp listener & ros2 run demo_nodes_cpp talker 

您将看到以下内容:

如果是,我们可以确定我们的 ROS2 设置。
呜呜呜!我们已经准备好在 ROS2 中开始开发。让游戏开始 😉
转到本系列的第 2 部分 这里.

在第 1 部分中,我们在 Gazebo 中设置了 TurtleBot3 模拟,这构成了我们在 ROS 2 中所有移动机器人实验的基础。

下一步是什么? 我们现在了解如何使用 Nav2 在 ROS 2 中设置自主导航。在 ROS 1 中,我们使用了导航堆栈,它是多个包的组合,如 move_base、amcl 和地图服务器,仅举几例。

但是 Nav2 是镇上新的酷人,其中大多数软件包已经是其中的一部分,并且功能增强。制造商希望将“ ROS导航带出实验室”,或者简单地说,使其具有生产质量。

六、我们如何在 ROS 2 中设置自主导航?

为了回答这个问题,我们先来看看一些机器人导航概念,好吗?

有一秒钟,把自己放在机器人的鞋子里,你要求自主移动。假设有人说——“哎呀,搬到B位置!

你会怎么做?好吧,我想问以下两个问题——

  1. 我在哪里?
  2. 位置 B 在哪里,换句话说,我的周围(地图)是什么样的?

而这正是机器人真正需要的——

  1. 本地化 — 机器人在哪里?
  2. 映射 — 地图/世界是什么样的?

从技术上讲,这就是机器人大脑处理这些信息并决定移动所需要的。在这种情况下,我们机器人的大脑是导航包。直观,嗯?

因此,我们定义了导航所需的两条信息。

由于这仍然是一个基本的帖子,让我们避免理论(这很重要,但稍后),并转移到 ROS 2 中的 Nav2 包

正如我们所建立的,Nav2需要机器人的当前位置和地图。
在 ROS/ROS2 中,这转化为两个要求—

  • 机器人定位 — 变换和变换map -> odomodom -> base_link

Nav2 的预期输入是符合 REP-105 的两个 TF 转换。

全球定位系统(GPS,SLAM,运动捕捉)的工作至少可以提供转换。通常,这是 Nav2 的一部分用于此目的。map->odomamcl

测程系统的作用是提供->转换。里程计可以来自许多来源,包括激光雷达、雷达、车轮编码器、VIO 和 IMU。测程法的目标是提供基于机器人运动的平滑和连续的局部框架。全球定位系统将更新相对于全局帧的变换,以考虑测距漂移。odombase_link

机器人定位通常用于这种融合。它将采用各种类型的传感器,并为TF和主题提供连续和平滑的测程。典型的移动机器人设置可能具有以这种方式融合的车轮编码器、IMU 和视觉的测程计。N

然后,平滑输出可用于航位推算以实现精确运动,并在全局位置更新之间准确更新机器人的位置。

  • 地图 —在需要 SLAM(同时定位和映射)的应用程序中,这是与导航并行完成的。但目前,我们有兴趣使用静态地图(因此我们已经知道周围的地图)进行导航。在 ROS 2 中,SLAM 工具箱可用于生成静态地图,我们可以保存它以供导航。

如果这一切都有意义,那就太棒了。如果没有,请耐心等待。在下面的 ROS 2 中完成这项工作将澄清:)

从我内心深处,我相信边建边学的策略。那么,好吗?

七、使用 TurtleBot2 模拟设置基于 ROS 3 的导航—

        第 1 步 — 在凉亭中设置 ROS 2 和 TurtleBot3 以进行模拟
        请查看我们的第 0 部分和第 1 部分以完成此操作(如果您尚未完成)

如果你这样做了,你应该擅长在凉亭中运行TurtleBot3模拟。

        第 2 步 — 设置本地化

        首先,在凉亭中运行 TurtleBot3

        为 ROS 2 提供终端 —

source /opt/ros/galactic/setup.bash 

        转到我们在第 3 部分中构建的 TurtleBot1 包,然后获取终端 —

source ./install/setup.bash 

        运行海龟机器人3世界模拟 —

ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py 

        您应该看到模拟正在运行 —

现在,打开另一个终端,source ROS 2然后查找题目:

ros2 topic list

        看看!有一个主题,它给了我们测程值和转换。所以我们已经准备好了本地化,对吧?odomodom->base_link

        好吧,虽然我们将使用它,但在一般情况下,不完全是。
        当您使用真正的机器人时,这些测程值是嘈杂的并且容易漂移。因此,我们需要使用机器人定位包将它们与其他传感器输出(如 IMU(本地)和 GPS(全球))融合。

        在我们的例子中,odom 几乎没有任何噪声(我还没有找到一种方法来增加模型的 odom 噪声而不在代码中重新发布)。因此,我们将使用它。

        因此,对我们来说,本地化价值已经准备就绪。

        步骤 3 — 设置静态地图

        为此,我们使用 ROS 2 中的 SLAM 工具箱

  • 安装 SLAM 工具箱
sudo apt install ros-<ros2-distro>-slam-toolbox 

        我正在使用银河,所以——

sudo apt install ros-galactic-slam-toolbox 
  • 启动用于映射的 slam 工具箱包 —

        在一个新的终端中(当然,在采购 ROS 2 之后,一定要这样做)—

source /opt/ros/galactic/setup.bash
ros2 launch slam_toolbox online_async_launch.py 
  • 使用必要的可视化启动 Rviz2

        在新终端中,启动 rviz2

source /opt/ros/galactic/setup.bash
rviz2 

        添加以下内容以进行可视化

  1. 激光扫描 — 主题 , 可靠性政策/scanBest Effort
  2. 地图 — 主题/map
  3. TF

        这是我的 Rviz 观点——

  • 运行远程操作以移动机器人进行映射 —

        在一个新的终端中——

source /opt/ros/galactic/setup.bash
ros2 run teleop_twist_keyboard teleop_twist_keyboard 
  • 将 Gazebo 和 RViz 并排放置,然后 teleop 查看在 RViz 中创建的地图 —

        我通常会显着减慢机器人的速度以获得更好的地图

  • 保存地图

在新终端中,运行nav2_map_server

source /opt/ros/galactic/setup.bash
ros2 run nav2_map_server map_saver_cli -f ~/map 

        这会将地图保存在我们的主目录中(map.pgm 和 map.yaml)

        那是映射。

        而且。我们准备接下来导航!

                第 4 步 — 自主导航

        请杀死slam_toolbox节点、远程操作节点和 RViz。我们不再需要它们了。此时,只有 TurtleBot3 凉亭模拟应该运行

现在我们已经准备好本地化(主题)和映射(我们保存的地图),我们可以开始导航了/odom

  • 启动导航

        在一个新的终端中——

source /opt/ros/galactic/setup.bash
ros2 launch nav2_bringup bringup_launch.py use_sim_time:=True autostart:=True map:=/path/to/your-map.yaml 

        这将设置自主导航所需的所有节点,但会发出有关框架不存在的警告。我们会尽快解决这个问题。map

        在另一个终端中,启动 RViz,但具有预设的可视化 —

source /opt/ros/galactic/setup.bashros2 run rviz2 rviz2 -d $(ros2 pkg prefix nav2_bringup)/share/nav2_bringup/rviz/nav2_default_view.rviz 

        房车视图 —

        您将看到全局状态错误,这是关于地图不可用。
问题是,转换是由 amcl 发布的,它是作为上述的一部分推出的。但需要一个初始姿势才能开始工作。map->odomnav2_bringupamcl

        为此,请单击上方工具栏上的“2D 姿势估计”(绿色箭头之一),并通过在 RViz 中的地图上单击并拖动来根据凉亭(位置和标题)提供当前姿势。您应该尽可能精确(但小错误没问题)。

        一旦你这样做了,这应该是新的视图——

        现在,我们有了自主导航所需的所有转换:map->odom->base_link

  • 导航

        从底部开始,我们在这里;)

        让我们导航!

        要命令机器人自主移动,请转到 RViz 并单击 .现在,在 RViz 中的目的地上单击(用于位置)并拖动(用于方向)。下一个?观看凉亭里的魔术!Nav2 Goal

        你将看到 nav2 规划了一条路径(本地 + 全局)并开始移动机器人。如果这让你开心,你可以继续提供更多的 Nav2 目标!

        那么,我们已经成功地使用 Nav2 为 TurtleBot3 设置了自主导航,那就是本文的全部目标。

后记

        你接下来问什么?理想情况下,我想用一个物理的TurtleBot继续这个系列。也许我众包了一个TurtleBot。也许别的东西。我很想知道你想要什么。我们可以一起想办法!

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

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

相关文章

【C++】C++11——C++11介绍、初始化列表、声明、auto、decltype、nullptr、范围for循环

文章目录 C111.C11介绍2.初始化列表2.1&#xff5b;&#xff5d;初始化2.2 std::initializer_list 3.声明3.1auto3.2decltype3.3nullptr 4.范围for循环 C11 1.C11介绍 C11是C编程语言的一个版本&#xff0c;于2011年发布。C11引入了很多新特性&#xff0c;比如&#xff1a;类型…

多线程 - 单例模式

单例模式 ~~ 单例模式是常见的设计模式之一 什么是设计模式 你知道象棋,五子棋,围棋吗?如果,你想下好围棋,你就不得不了解一个东西,”棋谱”,设计模式好比围棋中的 “棋谱”. 在棋谱里面,大佬们,把一些常见的对局场景,都给推演出来了,照着棋谱来下棋,基本上棋力就不会差到哪…

思科:iOS和iOSXe软件存在漏洞

思科警告说,有人试图利用iOS软件和iOSXe软件中的一个安全缺陷,这些缺陷可能会让一个经过认证的远程攻击者在受影响的系统上实现远程代码执行。 中严重程度的脆弱性被追踪为 CVE-2023-20109 ,并以6.6分得分。它会影响启用Gdoi或G-Ikev2协议的软件的所有版本。 国际知名白帽黑客…

CSS鼠标指针表

(机翻)搬运自:cursor - CSS: Cascading Style Sheets | MDN (mozilla.org) 类型Keyword演示注释全局autoUA将基于当前上下文来确定要显示的光标。例如&#xff0c;相当于悬停文本时的文本。default 依赖于平台的默认光标。通常是箭头。none不会渲染光标。链接&状态contex…

最短路径专题2 Dijkstra 最短距离(堆优化版)

题目&#xff1a;样例&#xff1a; 输入 6 6 0 0 1 2 0 2 5 0 3 1 2 3 2 1 2 1 4 5 1 输出 0 2 3 1 -1 -1 思路&#xff1a; 根据题意&#xff0c;数据范围也小&#xff0c;也可以用朴素版的Dijsktra来做&#xff0c;朴素版的Dijsktra我做过了一遍了&#xff0c;可以看以一下我…

【统计学】Top-down自上而下的角度模型召回率recall,精确率precision,特异性specificity,模型评价

最近在学 logistic regression model&#xff0c;又遇见了几个之前的老面孔。 召回率recall, 精确率precision&#xff0c;特异性spcificity&#xff0c;准确率accuracy&#xff0c;True positive rate&#xff0c;false positive rate等等名词在学习之初遇到的困难在于&#x…

Vue3最佳实践 第六章 Pinia,Vuex与axios,VueUse 2(Vuex)

Vuex 状态管理 Vuex 是一种集中管理所有组件中数据的机制。它和Pinia一样都是解决使用 props 和 $emit 事件在组件之间传递数据时&#xff0c;当组件之间频繁传递&#xff0c;层级增加时管理数据就变得困难。Vue 的官方状态管理库已更改为Pinia&#xff0c;Pinia 具有与 Vue 几…

微信小程序-1

微信开发文档 https://developers.weixin.qq.com/miniprogram/dev/framework/ 报错在调试器的console里找 一、结构 Ctrl 放大字体 Ctrl - 缩小 设置 - - - 外观设置 - - - 可以修改喜欢的主题颜色 index.js index.json index.wxml 》 html <view class"box&qu…

【kubernetes】kubernetes中的StatefulSet使用

TOC 1 为什么需要StatefulSet 常规的应用通常使用Deployment&#xff0c;如果需要在所有机器上部署则使用DaemonSet&#xff0c;但是有这样一类应用&#xff0c;它们在运行时需要存储一些数据&#xff0c;并且当Pod在其它节点上重建时也希望这些数据能够在重建后的Pod上获取&…

Python爬虫案例入门教程(纯小白向)——夜读书屋小说

Python爬虫案例——夜读书屋小说 前言 如果你是python小白并且对爬虫有着浓厚的兴趣&#xff0c;但是面对网上错综复杂的实战案例看也看不懂&#xff0c;那么你可以尝试阅读我的文章&#xff0c;我也是从零基础python开始学习爬虫&#xff0c;非常清楚在过程中所遇到的困难&am…

字符编码的了解

前言&#xff1a; 在编写文件读取功能的过程中&#xff0c;我遭遇了一个棘手的乱码难题。经过细致的排查&#xff0c;发现这一问题的根源在于文件的字符编码。为了帮助大家有效地克服编码差异所带来的开发挑战&#xff0c;因此&#xff0c;我收集了字符集编码的相关知识&#x…

想要精通算法和SQL的成长之路 - 旋转链表

想要精通算法和SQL的成长之路 - 旋转链表 前言一. 旋转链表 前言 想要精通算法和SQL的成长之路 - 系列导航 一. 旋转链表 原题链接 由于k的大小可能超过链表长度&#xff0c;因此我们需要根据链表长度取模。那么我们首先需要去计算链表的长度是多少&#xff1a; if (head …

C# GraphicsPath 类学习

先在窗体放2个picturebox&#xff0c; 然后看一下如下代码&#xff1b; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; us…

Pytorch基础:Tensor的transpose方法

相关阅读 Pytorch基础https://blog.csdn.net/weixin_45791458/category_12457644.html?spm1001.2014.3001.5482 在Pytorch中&#xff0c;transpose是Tensor的一个重要方法&#xff0c;同时它也是一个torch模块中的一个函数&#xff0c;它们的语法如下所示。 Tensor.transpo…

window安装压缩版postgresql

环境&#xff1a; window 11 专业版postgresql-16.0-1-windows-x64-binaries.zip 一、下载 1.1 从官网下载 https://www.postgresql.org/download/windows/ 1.2 从百度网盘下载 链接&#xff1a;https://pan.baidu.com/s/1fmQbgWSzX4hN07Lgdzfz0g?pwddzyy 提取码&#…

汇编语言王爽第4版实验8答案(和你想的不一样)

实验8 分析一个奇怪的程序 E:\mywork\asm\p906.asm C:\>edit p906.asm assume cs:codecode segmentmov ax,4c00hint 21h start: mov ax,0 s:nop ; nop的机器码占一个字节nopmov di, offset smov si, offset s2mov ax, cs:[si]mov cs:[di],ax s0:jmp short s s1:mov ax,0in…

tauri为窗口添加阴影效果

需求 为窗口添加阴影效果&#xff0c;让窗口显得更立体。 实现方案 通过 tauri 中的 window-shadows 依赖实现。 编码 修改 label 标签内容 修改 src-tauri/tauri.conf.json 文件&#xff0c;设置 label 字段为 “customization” 增加shadows的依赖 修改 src-tauri…

第8期ThreadX视频教程:应用实战,将裸机工程移植到RTOS的任务划分,驱动和应用层交互,中断DMA,C库和中间件处理等注意事项

视频教程汇总帖&#xff1a;【学以致用&#xff0c;授人以渔】2023视频教程汇总&#xff0c;DSP第12期&#xff0c;ThreadX第8期&#xff0c;BSP驱动第26期&#xff0c;USB实战第5期&#xff0c;GUI实战第3期&#xff08;2023-10-01&#xff09; - STM32F429 - 硬汉嵌入式论坛 …

函数、函数的傅里叶级数展开、傅里叶级数的和函数之间的关系

1.函数、函数的傅里叶级数展开、傅里叶级数的和函数之间的关系 1.1 傅里叶级数中的系数公式推导 我们先来推导一下傅里叶级数中的系数公式&#xff0c;其实笔者已经写过一篇相关笔记&#xff0c;详见&#xff1a;为什么要把一个函数分解成三角函数?(傅利叶级数) f ( x )…

MySQL 索引优化实践(单表)

目录 一、前言二、表数据准备三、常见业务无索引查询耗时测试3.1、通过订单ID / 订单编号 查询指定订单3.2、查询订单列表 四、订单常见业务索引优化实践4.1、通过唯一索引和普通索引优化通过订单编号查询订单信息4.2、通过普通联合索引优化订单列表查询4.2.1、分析查询字段的查…