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 驱动硬件 的相关文章

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

    ROS 服务 现在 想象一下你在你的电脑后面 你想从这个服务中获取天气 你 在你身边 被认为是客户端 在线天气服务是服务器 您将能够通过带有 URL 的 HTTP 请求访问服务器 将 HTTP URL 视为 ROS 服务 首先 您的计算机将
  • ROS 第四天 ROS中的关键组件

    1 Launch文件 通过XML文件实现多节点的配置和启动 可自动启动ROS Master
  • Ubuntu安装ROS

    原文链接 https blog csdn net qq 44830040 article details 106049992 这也是我在ubuntu里面安装ROS的第N次 以前每次安装过程都忘记总结了 导致每次安装ROS都浪费了很多的时间用
  • 树莓派4b 开启热点,设置自身ip与手机vnc连接

    此方法开启的热点 无法访问网络 1 下载现成的工具 git clone https github com oblique create ap git 如果无法访问github 这里下载 2 编译 cd create ap sudo make
  • 《学习篇》学会这18个常用ROS命令集合就能入门ROS了

    常用ROS命令概述 ROS常用命令可以按照其使用场景分为ROSshell命令 ROS执行命令 ROS信息命令 ROS catkin命令与ROS功能包命令 虽然很难从一开始就很熟练地使用所有的命令 但是随着使用的次数增多 你会发现常用的几个R
  • roslaunch error: ERROR: cannot launch node of type

    今天在因为github上有个之前的包更新了 重新git clone后出现了一个问题 ERROR cannot launch node of type crazyflie demo controller py can t locate nod
  • Python 按键和按键释放监听器

    我正在使用 python 代码控制一辆遥控玩具车 截至目前 代码如下 def getkey fd sys stdin fileno old termios tcgetattr fd new termios tcgetattr fd new
  • 在 ARM 上的 Linux 中写入和读取内存映射设备寄存器

    我正在尝试按照以下步骤读取和写入 ARM9 SAM9X25 上的寄存器 http infocenter arm com help index jsp topic com arm doc faqs ka3750 html我以以下代码结束 in
  • 什么是 void `std::allocator`?即:`std::allocator`

    自动生成ROS 机器人操作系统 message C 头文件包含如下类型定义 typedef std msgs Header
  • ROS AsyncSpinner 的多线程行为

    我试图了解 ROS 中的 AsyncSpinner 是如何工作的 因为我可能有一些误解 你可以找到类似的问题here As seen here它的定义提到 异步旋转器 产生几个线程 可配置 将并行执行回调 同时不会阻塞执行该操作的线程 叫它
  • 从 pcl::PointCloud 中删除点

    我是 PCL 新手 我正在使用 PCL 库 并且正在寻找一种从点云中提取点或将特定点复制到新点的方法 我想验证每个点是否符合条件 并且我想获得仅包含优点的点云 谢谢 使用 ExtractIndices 类 将要删除的点添加到 PointIn
  • 错误状态:平台不允许不安全的 HTTP:http://0.0.0.0:9090

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

    我根据 ROS 的 Wiki 页面创建了一个 ROS 工作区 我还使用创建了一个包catkin create pkg在我刚刚创建的工作区下 然后 按照 ROS Wiki 中的步骤使用以下命令构建包catkin make 构建包后 我插入命令
  • Raspberry Pi RPi.GPIO 错误并带有威胁回调

    我被 Python 包中的 wait for edge 函数困住了RPi http sourceforge net p raspberry gpio python wiki Inputs 我为 GPIO 下降添加了多个事件检测 只要回调函数
  • 如何访问 Heroku 中的 docker 容器?

    我已按照此处构建图像的说明进行操作 https devcenter heroku com articles container registry and runtime getting started https devcenter her
  • Sphinx:如何排除自动模块中的导入?

    我有一个用 Python 编写的 Raspberry Pi 项目 它使用 RPi GPIO 模块 代码上的所有工作都是在 Windows 机器上完成的 其中 RPi GPIO 不会安装 每次我尝试运行 autodoc 时 它都会崩溃 说它无
  • 可以在catkin工作区之外创建ROS节点吗?

    我想在catkin工作区之外创建一个ROS发布者节点 可以创建吗 当然可以 像对待任何其他 cpp 库或 python 包一样对待 ROS 在Python中你必须保留PYTHONPATH环境变量指向ros包 opt ros kinetic
  • Beaglebone GPIO 输入不起作用

    我正在使用 beaglebone 通过 sysfs 接口访问特定引脚的数字输入 我可以更改输出状态 但不能更改输入 我所做的是 我有两个引脚 pinA 和 pinB pinA 我将其输出 pinB 我将其输入 将 pinA 连接到 pinB
  • ROS 问题:libQt5Core.so.5:无法打开共享对象文件:没有这样的文件或目录

    当我跑步时 rosrun turtlesim turtlesim node 在 Ubuntu 上 我收到以下消息 opt ros noetic lib turtlesim turtlesim node 加载共享库时出错 libQt5Core
  • Beaglebone Black 上的 GPIO

    我目前遇到了 Beaglebone black GPIO 引脚的问题 我正在寻找一种正确的方法来读取 C 中的 GPIO 引脚 p8 4 的值 如果我理解正确的话 我尝试使用一个库 该库使用了在引入设备树之前不支持的旧方法 我尝试寻找其他解

随机推荐