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

一、说明

本系列是关于学习如何使用 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公开。

  1. 一个进程中有多个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. 获取终端
alh 复制代码
source /opt/ros/$ROS_DISTRO/setup.bash 

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

  1. 运行演示监听器和说话者节点:

我们将使用"/opt/$ROS_DISTRO/lib/"中已经存在的demo_nodes_cpp包

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

alh 复制代码
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 -> odom``odom -> base_link

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

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

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

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

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

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

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

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

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

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

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

第 2 步 --- 设置本地化

首先,在凉亭中运行 TurtleBot3

为 ROS 2 提供终端 ---

abh 复制代码
source /opt/ros/galactic/setup.bash 

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

abh 复制代码
source ./install/setup.bash 

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

abh 复制代码
ros2 launch turtlebot3_gazebo turtlebot3_world.launch.py 

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

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

abh 复制代码
ros2 topic list

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

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

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

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

步骤 3 --- 设置静态地图

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

  • 安装 SLAM 工具箱
abh 复制代码
sudo apt install ros-<ros2-distro>-slam-toolbox 

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

abh 复制代码
sudo apt install ros-galactic-slam-toolbox 
  • 启动用于映射的 slam 工具箱包 ---

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

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

在新终端中,启动 rviz2

abh 复制代码
source /opt/ros/galactic/setup.bash
rviz2 

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

  1. 激光扫描 --- 主题 , 可靠性政策/scan``Best Effort
  2. 地图 --- 主题/map
  3. TF

这是我的 Rviz 观点------

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

在一个新的终端中------

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

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

  • 保存地图

在新终端中,运行nav2_map_server

abh 复制代码
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

  • 启动导航

在一个新的终端中------

abh 复制代码
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,但具有预设的可视化 ---

abh 复制代码
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->odom``nav2_bringup``amcl

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

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

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

  • 导航

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

让我们导航!

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

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

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

后记

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

相关推荐
NAGNIP2 小时前
一文搞懂深度学习中的通用逼近定理!
人工智能·算法·面试
冬奇Lab3 小时前
一天一个开源项目(第36篇):EverMemOS - 跨 LLM 与平台的长时记忆 OS,让 Agent 会记忆更会推理
人工智能·开源·资讯
冬奇Lab3 小时前
OpenClaw 源码深度解析(一):Gateway——为什么需要一个"中枢"
人工智能·开源·源码阅读
AngelPP7 小时前
OpenClaw 架构深度解析:如何把 AI 助手搬到你的个人设备上
人工智能
宅小年7 小时前
Claude Code 换成了Kimi K2.5后,我再也回不去了
人工智能·ai编程·claude
九狼7 小时前
Flutter URL Scheme 跨平台跳转
人工智能·flutter·github
ZFSS8 小时前
Kimi Chat Completion API 申请及使用
前端·人工智能
天翼云开发者社区9 小时前
春节复工福利就位!天翼云息壤2500万Tokens免费送,全品类大模型一键畅玩!
人工智能·算力服务·息壤
知识浅谈9 小时前
教你如何用 Gemini 将课本图片一键转为精美 PPT
人工智能
Ray Liang9 小时前
被低估的量化版模型,小身材也能干大事
人工智能·ai·ai助手·mindx