如何对带有玫瑰色的多个传感器使用sensor_msgs / 范围(ROS)

在本教程中,您将学习如何使用rosserial通信发布三个HC-SR04传感器的范围,包括:

1.三个超声波传感器和Arduino。
2.如何在Arduino上编写ROS节点并发布传感器范围。
3.如何在Raspberry Pi上识别Arduino板并通过rosserial运行ROS节点。
4.如何使用Linux终端显示范围。

传感器,Arduino和Raspberry Pi之间的数据流图

传感器,Arduino和Raspberry Pi之间的数据流图

不同的项目可能有不同的要求。在本教程的最后,您将拥有一个灵活的结构,可以添加更多的传感器,或仅使用一个传感器,或使用另一种类型的传感器(例如,红外传感器)。

您无需具备有关ROS的丰富知识即可了解本教程。您需要的是一台Raspberry Pi 4之类的计算机,该计算机运行ROS,传感器,Arduino和学习和构建的时间。

我们走得更远,学习如何在Arduino上编写ROS节点,并使用ROS的sensor_msgs / 范围消息类型发布传感器的范围。

在文章的结尾,您将学习如何在Raspberry Pi上识别Arduino板,以及如何在终端上显示由Arduino上运行的ROS节点通告的范围。

要了解如何使用ROS的sensor_msgs软件包发送超声波传感器的范围读数,只需保持读数不变即可。

开始使用sensor_msgs / 范围消息类型之前

在开始连接传感器并编写第一行代码之前,请确保我们具有所有硬件部件:

  • 1个Arduino UNO
  • 1 X USB电缆
  • 3 X HC-SR04
  • 1 X运行ROS Melodic的Raspberry Pi 4
  • 1 X面包板
  • 母对母/公对公/母对公跳线
硬件设定

为了给Raspberry Pi 4供电,我使用了 USB-C电源,在3.0A时输出5.1V。 树莓派 4的5V USB端口提供了足够的电源来运行Arduino UNO板。三个超声波传感器使用 7.4V电池组 和一个 降压转换器 为传感器提供5V输出。

以上设置仅用于连接和测试超声检测系统。如果将传感器,Arduino和Pi安装在移动机器人上,则整个检测系统将依靠电池运行,包括Pi板。

注意:为使本文更进一步,我想您有一个运行ROS Melodic的Raspberry Pi 4。如果没有,请深呼吸并阅读 如何在Raspberry Pi 4(Raspbian Buster)上安装ROS Melodic,rosserial等

当然,如果您打算构建一个简单的移动机器人来检测障碍物,那么本教程将不胜枚举。对于简单的机器人,您不需要这样的基础结构。但是,如果您打算以高效且专业的方式构建高级机器人,那么这就是您可以开始的地方。

1.三个超声波传感器和Arduino

在本部分的教程中,我将向您展示如何将HC-SR04传感器连接到Arduino。

首先,让我们看一下HC-SR04规格:

  • 工作电压:DC 5V
  • 工作电流:15mA
  • 工作频率:40KHz
  • 范围:2cm至4m
  • 测距精度:3mm
  • 触发输入信号:10µS TTL脉冲

对于连接,我使用了母对公跳线,一个面包板,三个HC-SR04和一个Arduino UNO板。

连接数

传感器1:

  • Vcc -> breadboard -> 5V battery
  • Trig -> pin 3 (digital pin)
  • Echo -> pin 2 (digital pin)
  • GND -> breadboard -> GND

传感器2:

  • Vcc -> breadboard -> 5V battery
  • Trig -> pin 5 (digital pin)
  • Echo -> pin 4 (digital pin)
  • GND -> breadboard -> GND

传感器3:

  • Vcc -> breadboard -> 5V battery
  • Trig -> pin 7 (digital pin)
  • Echo -> pin 6 (digital pin)
  • GND -> breadboard -> GND

公用接地:将Arduino的接地连接到面包板的接地。

三个超声波传感器,Arduino,电池组和Raspberry Pi 4的硬件设置

三个超声波传感器,Arduino,电池组和Raspberry Pi 4的硬件设置

由于我们准备好要运行ROS和Arduino IDE的Pi,因此您可以将Pi与监视器,键盘和鼠标一起使用,或者通过VNC Viewer来将草图编写并上传到Arduino板上。

一旦传感器连接到Arduino板,我们就可以开始编写草图以读取输出并转换它们的读数。为了编写草图,我使用了Arduino IDE。我喜欢使用简单的工具,并且不花时间在定制和配件上。目前,Arduino IDE在微控制器编程方面满足了我的需求。

在编写第一行代码之前,我们先概述一下超声波传感器的工作原理。

它会在空中传播声波(根据规格至少持续10us),如果有物体反射声波,则传感器会测量声波返回到接收器所花费的时间。为了计算传感器与检测到的物体之间的距离,我们考虑了传播时间和声音的速度。

信息: 声音根据温度以不同的速度在空气中移动。由于我们使用声音的速度来衡量ping返回接收器所花费的时间,因此环境温度会影响超声传感器的精度。温度补偿不是本教程的一部分,但是您可以稍后在代码中添加它。

2.如何在Arduino上编写ROS节点并发布传感器范围

在本教程的这一点上,我们将在Arduino UNO板上创建一个ROS节点,并使用分布式计算环境将传感器输出发送到Raspberry Pi。

从ROS框架中包含的许多软件包中,sensor_msgs软件包均包含一组常用传感器的消息。对于超声波传感器,我们使用“范围”消息类型。此消息类型从超声传感器发送单个范围读数,该读数在沿测得距离处的弧线上有效。

Line 9,我们导入 新平 与HC-SR04超声波传感器配合使用的库。您可以使用 管理图书馆 来自Arduino IDE。在搜索表单中键入 新的,然后在管理器屏幕中,您可以选择安装该库的最新版本。

10号线,我们导入 SimpleKalmanFilter 库以过滤超声波传感器’的输出。您可以使用 管理图书馆 来自Arduino IDE。在搜索表单中键入 简单的卡尔曼,然后在管理器屏幕中,您可以选择安装该库的最新版本。

11-13行:我们导入ROS包。 罗斯 是标准库,并且是在Arduino上运行的每个ROS节点的一部分。我们需要包括 罗斯 ROS节点中使用的任何消息的标头。
罗斯 / time.h 标头代表ROS时钟时间。
sensor_msgs / 范围.h 是一个消息定义,用于广告从超声传感器沿测得的距离沿弧有效的单个范围读数。

38-42行: 创造 新的 所有传感器的对象。对象的参数是触发和回波引脚,以及传感器的最大距离。

55号线: 节点句柄 是代表ROS节点的对象。 罗斯:: 节点句柄 将启动Arduino板上的节点。

58-69行:循环遍历所有传感器,并在传感器ping周期完成后,将结果添加到 一个传感器周期().

72-75行:收到新的ping后,将传感器距离添加到阵列。

85-91行:我们过滤传感器的读数。存储不同于0的读数,如果传感器返回0,则返回最后一个有效输出。这样,我们可以过滤超声波传感器的错误读数。

100-102行:使用开始计时的功能 毫()。我更喜欢使用 毫() 代替 延迟() 有两个原因: 毫()延迟(),并且是 延迟().

104-106行:检查时间是否过去并返回true。

108-115行:写的设置 范围 消息对象。第一个参数是 radiation_type 传感器的– 超音波.
frame_id 用于指定该消息中包含的数据的参考点。
视野 表示距离读数有效的弧度(以弧度为单位)。 HC-SR04的理论视场为30度。在上一篇文章中,我进行了测试以确定操作检测范围的最准确区域。由于我们旨在准确检测机器人前面的大多数物体,因此我们将视场设置为15度,大约为0.26弧度。
最高 范围是被认为有效的测量值。

118-120行:我们定义了三个类型的对象 范围,然后我们给出主题的名称– 范围_left, 范围_center范围_right.

123-125行:我们使用 广告() 创建一个方法 发行人,用于发布主题范围。

143-160行:我们检查时间并每40毫秒发布一次。读取传感器返回的值。然后我们用 h.now() 返回当前时间,然后发布范围值。

161号线:ROS网络监视套接字连接,以将主题中的消息推送到队列中。我们发送新消息,然后使用 罗斯:: SpinOnce() 告诉ROS有新消息到达。

3.如何在Raspberry Pi上识别Arduino板并通过rosserial运行ROS节点

将Arduino连接到Pi并上传草图后,我们可以确定Arduino板。

第1步: 打开终端以启动roscore可执行文件:

第2步: 打开一个新的终端并运行以下命令:

如果只有一个Arduino连接到Pi,则应该只看到一个抽象控制调制解调器(ACM):

ls 开发者 ttyACM

ls 开发者 ttyACM

第三步: 通过串行连接运行可执行文件:

通过串行连接运行可执行文件

通过串行连接运行可执行文件

注意: 如果您遇到一些奇怪的错误,例如“数据包('!')中协议版本不匹配:同步丢失或rosserial_python来自与rosserial…不同的ros版本,”,您必须停止在Arduino上运行的节点,关闭Arduino IDE然后再次运行命令:rosrun 罗斯serial_python serial_node.py / 开发者 / ttyACM *

4.如何使用Linux终端显示范围

第1步: 打开一个新终端并运行以下命令:

现在可以在ROS网络中访问在Arduino上运行的节点。

罗斯topic列表节点

罗斯topic列表节点

第2步: 在终端中运行一个传感器的输出。在下面您可以看到“/ultrasound_center”:

的范围"/ultrasound_center"

的范围“/ultrasound_center”

概要
障碍物检测适用于从初始位置移动到目标位置并避免其路径上有任何障碍物的任何机器人。

第一步是将传感器连接到Arduino开发板。

然后,我们走得更远,在Arduino上编写一个ROS节点以发布传感器的范围。我们使用sensor_msgs / 范围消息类型进行发布以公布范围。

一旦ROS节点在Arduino上运行,我们就在Pi上确定板子并检查结果。

6条评论 » Write a comment

  1. 为什么要跟随?

    SimpleKalmanFilter KF_左(2,2,0.01);
    SimpleKalmanFilter KF_Center(2,2,0.01);
    SimpleKalmanFilter KF_Right(2,2,0.01);

    您能解释一下为什么使用值2、2和0.01吗?

    在您的循环功能中有些错误…

    范围_left.range = leftSensorKalman;
    范围_center.range = centerSensorKalman;
    范围_right.range = centerSensorKalman;

    我认为应该是range_right.range = rightSensorKalman;

  2. 您好,先生,我们可以在玩具车上测试此代码,以进行物体检测和避免碰撞。

  3. 嗨,为此,非常有用。
    帮了我大忙!
    一件事
    我得到这个警告
    ROS_sr04_scanner.ino:139:51:警告:ISO C ++禁止将字符串常量转换为‘char*’ [-Wwrite-strings]
    sensor_msg_init(range_right,“/ultrasound_right”);
    我也把这个放在左边和中间。有任何想法吗?
    再次感谢

发表回覆 法哈德 取消回复

您的电子邮件地址不会被公开。 必需的地方已做标记 *