Raspberry Pi 上 ROS 服务器/客户端通过GPIO 驱动硬件

2023-11-18

ROS 服务

现在,想象一下你在你的电脑后面,你想从这个服务中获取天气。

你,在你身边,被认为是客户端,在线天气服务是服务器。您将能够通过带有 URL 的 HTTP 请求访问服务器。将 HTTP URL 视为 ROS 服务。

首先,您的计算机将向服务器发送请求。该请求将包含一条消息,在这种情况下是您的位置。然后服务器将处理请求,并发送响应。响应还将包含一条消息。

注意,为了通信,客户端发送的请求必须是一个位置,否则服务器将无法处理数据。并且服务器必须发回天气,否则客户端将无法理解响应是什么。

一项服务的多个客户

我们现在有一个客户端和一个服务器通过 ROS 服务进行通信。

但是,如果我们有多个客户呢? 这不是问题,所有客户端都会通过 HTTP URL 向服务器发送一个包含位置的请求。 然后服务器将处理请求并将响应发送回每个客户端。 请注意,同一服务不应超过一台服务器。

如您所见,在此示例中,我们有 3 个不同的计算机节点,一个节点用于天气服务。 HTTP URL 可以看作是一个 ROS 服务。

计算机节点包含一个服务客户端。该服务客户端将调用 ROS 服务并发送一个带有位置的请求。

另一方面,天气服务包含一个 ROS 服务服务器,它将处理所有请求并通过 ROS 服务发回响应。

同样,节点内的所有客户端和服务器都不知道彼此。他们只看到 ROS 服务接口。

机器人的例子

现在,让我们看另一个例子,这次直接处理机器人技术。此示例可以是真实 ROS 应用程序的一部分。

假设您的应用程序中有一个控制 LED 面板的节点。

该节点正在处理硬件以打开和关闭 LED。当然,您希望该节点能够与其他 ROS 节点通信。例如,其他节点可以要求此节点打开或关闭特定 LED。

在本例中,您创建了一个名为“Set Led”的 ROS 服务。在 Led 面板节点内,您为此 ROS 服务创建一个服务服务器。

现在,您有另一个处理电池的节点。其中一项功能是检查电池电量是否不足,并在发生时通知用户。为此,电池节点将包含一个用于“Set Led”服务的服务客户端。

想象一下,电池电量不足。当检测到时,电池节点将向 ROS 服务发送请求。它将发送一个 LED 编号和一个状态。

作为 LED 面板节点的服务器将期望接收该信息。如果数据结构与预期相同,则节点可以处理信息,并根据要求打开第三个 LED。

完成后,服务器将发回响应。 此处的此响应将包含成功标志。 在整个 ROS 服务过程中,电池节点都在等待。 收到此成功标志后,电池节点知道请求的操作已成功完成。

就这样,通讯结束了。服务器仍在运行并等待新请求。

稍后,在给电池充电后,电池节点检测到电池现在已充满。然后它将决定向“Set Led”服务发送一个新请求,以关闭第三个 LED。

服务器接收此请求,执行操作,并返回一个成功标志。通讯完成。

示例到此为止。您现在应该对什么是 ROS 服务以及何时应该使用它们有了更好的了解。

什么是ROS服务

ROS 服务是一个客户端/服务器系统。

以下是 ROS 服务的一些主要特征:

  • 它是同步的。客户端发送请求,并阻塞直到收到响应。
  • 您应该仅将 ROS 服务用于计算和快速操作。 例如,客户端将发送一些数据,并接收另一条数据,就像我们在天气服务中看到的那样。 您还可以将服务用于快速操作,例如,如果您想启用或禁用执行器,或任何立即操作。 由于服务调用被阻塞,你不希望你的客户端被卡住太久。
  • 服务由名称和一对消息定义。一条消息是请求,一条消息是响应。您必须尊重通信双方的数据格式。
  • 至于节点和主题,您可以直接在 ROS 节点内创建服务客户端和服务器,例如使用 c++ 的 rosccp 库和 Python 的 rospy 库。
  • 最后,也是很重要的一点,一个服务服务器只能存在一次,但可以有多个客户端。基本上,服务将在您创建服务器时创建。

本文介绍

在本教程中,我将向您展示如何在 Raspberry Pi 上编写完整的 ROS 服务。

您将看到如何创建 ROS 服务的两端:客户端和服务器。此外,为了让它更有趣,我们将使用 Raspberry Pi GPIO 驱动真正的硬件(使用中断)。

这是本教程的目标:当用户按下按钮时打开 LED,当用户松开按钮时关闭它。

Raspberry Pi

您可以使用 Raspberry Pi 4 或更早版本:3B、3B+。

设置

Raspberry Pi 上的 ROS 服务服务器

代码

代码分解

Raspberry Pi 上的 ROS 服务客户端

代码

代码分解

Raspberry Pi 上测试 ROS 服务

测试应用程序

调试您的 Raspberry Pi ROS 服务

参考链接

详情参阅 亚图跨际

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Raspberry Pi 上 ROS 服务器/客户端通过GPIO 驱动硬件 的相关文章

  • 树莓派配置热点官网操作指引

    参考官方原说明链接 https www raspberrypi org documentation computers configuration html enable routing and ip masquerading 1 安装接入
  • 树莓派4B(buster)的源更换为北外(清华)国内源

    树莓派4B buster 的源更换为北外 清华 国内源 1 登陆到树莓派 ssh pi your raspi IP 2 备份源文件 sudo cp etc apt sources list etc apt sources list bak
  • 《学习篇》学会这18个常用ROS命令集合就能入门ROS了

    常用ROS命令概述 ROS常用命令可以按照其使用场景分为ROSshell命令 ROS执行命令 ROS信息命令 ROS catkin命令与ROS功能包命令 虽然很难从一开始就很熟练地使用所有的命令 但是随着使用的次数增多 你会发现常用的几个R
  • 用于Arduino的S4A图形化编程图文详解

    文章结构 1 说明 2 实操 2 1 S4A安装 2 2 Arduino IDE 安装 2 3 下载S4A的固件 2 4 连接 2 5 刷入S4A固件 2 6 打开S4A并测试 3 附录 Uno引脚图 1 说明 作者还拥有个人公众号 会写一
  • ROS1 ROS2学习

    ROS1 ROS2学习 安装 ROS ROS1 ROS2 命令行界面 ROS2 功能包相关指令 ROS 命令行工具 ROS1 CLI工具 ROS2 CLI工具 ROS 通信核心概念 节点 Node 节点相关的CLI 话题 Topic 编写发
  • 在 ARM 上的 Linux 中写入和读取内存映射设备寄存器

    我正在尝试按照以下步骤读取和写入 ARM9 SAM9X25 上的寄存器 http infocenter arm com help index jsp topic com arm doc faqs ka3750 html我以以下代码结束 in
  • [Firefly-Linux] RK3568 gpio-leds驱动详解

    文章目录 一 GPIO 介绍 二 RK3568 GPIO 状况 三 GPIO 引脚计算 四 ITX 3568JQ LED 4 1 LED 原理图 4 2 LED 设备树
  • 如何将曲面拟合到一组数据点并获得曲面方程

    乌班图 ROS 思维 Python程序 我正在尝试获取适合点云数据中的一组点的表面方程 数据来自激光雷达扫描仪 我在 rviz 中选择整个扫描的一部分 并获得该选择的坐标选定表面的图片 所选曲面并不总是如此线性 因为材质中可能存在轻微的曲线
  • 不使用ros编译roscpp(使用g++)

    我正在尝试在不使用ROS其余部分的情况下编译roscpp 我只需要订阅一个节点 但该节点拥有使用旧版本ROS的节点 并且由于编译问题 我无法将我的程序与他的程序集成 我从git下载了源代码 https github com ros ros
  • 如何为连接到 I2C gpio 扩展器的虚拟 mdio-gpio 设备配置 ACPI *.asl

    我正在使用 Q7 模块 x86 并尝试在 Linux 上使用 ACPI SSDT Overlay 配置我们的外设 但我对此很挣扎 我想我误解了ACPI的一些核心概念 Problem CPU gt I2C gt PCA9575 GPIO Ex
  • 错误状态:平台不允许不安全的 HTTP:http://0.0.0.0:9090

    我正在尝试从我的 flutter 应用程序连接到 ws local host 9090 使用 rosbridge 运行 的 Ros WebSocket 服务 但我在 Flutter 中收到以下错误 错误状态 平台不允许不安全的 HTTP h
  • mmap 比 ioremap 慢

    我正在为运行 Linux 2 6 37 的 ARM 设备进行开发 我正在尝试尽快切换 IO 引脚 我制作了一个小内核模块和一个用户空间应用程序 我尝试了两件事 使用以下命令直接从内核空间操作 GPIO 控制寄存器ioremap mmap G
  • gpiod - 在设备树中使用标签

    我想用libgpiod通过自定义板上的用户空间控制一些 GPIO 我有一个 i MX6UL 处理器 它有数百个引脚 我将只使用其中 8 个 作为 GPIO 我读到了关于libgpiod因为它正在取代旧的 sysfs API 我很高兴您可以为
  • catkin_make 编译报错 Unable to find either executable ‘empy‘ or Python module ‘em‘...

    文章目录 写在前面 一 问题描述 二 解决方法 参考链接 写在前面 自己的测试环境 Ubuntu20 04 一 问题描述 自己安装完 anaconda 后 再次执行 catkin make 遇到如下问题 CMake Error at opt
  • 如何订阅“/scan”主题、修改消息并发布到新主题?

    我想通过订阅message ranges来改进turtlebot3的LDS 01传感器 通过应用一些算法修改messange ranges并将其发布到新主题 如下所示 但是当我运行编码时出现错误 错误是 遇到溢出的情况 错误是 运行时警告
  • 如何从里程计/tf数据获取投影矩阵?

    我想将视觉里程计的结果与 KITTI 数据集提供的事实进行比较 对于地面中的每一帧 我都有一个投影矩阵 例如 1 000000e 00 9 043683e 12 2 326809e 11 1 110223e 16 9 043683e 12
  • Python使用sudo启动时找不到模块

    我有一个使用 Google Assistant 库的脚本 并且必须从那里导入一些模块 我发现这只适用于 Python 虚拟环境 这真的很奇怪 在同一个文件夹中 我有一个使用 GPIO 引脚并且必须使用 root 的脚本 它们相互交互 因此当
  • ROS中spin和rate.sleep的区别

    我是 ROS 新手 正在尝试了解这个强大的工具 我很困惑spin and rate sleep功能 谁能帮助我了解这两个功能之间的区别以及何时使用每个功能 ros spin and ros spinOnce 负责处理通信事件 例如到达的消息
  • 如何使用一个凉亭同时创建两个地图?

    如下图所示 现在我的gazebo正在运行2个slam gmapping包 首先是 turtlebot slam gmapping 发布到 map 主题 第二个是 slam gmapping 发布到与第一个相同的 map 主题 我想创建一个新
  • 如何将 boost::asio 与 Linux GPIO 结合使用

    我有一个单线程 Linux 应用程序 使用 boost asio 进行异步输入 输出 现在我需要扩展此应用程序以读取 GPIO 输入 sys class gpio gpioXX value 可以在边沿触发的 GPIO 输入上使用 boost

随机推荐