如何使用rosserial的多个传感器使用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 / Range消息类型发布传感器的范围。

在帖子末尾,您将学习如何识别Raspberry PI上的Arduino Board,以及如何在Arduino上运行的ROS节点通告的终端显示的终端。

要了解如何使用来自ROS的Sensor_MSGS包来发送超声波传感器的范围读数,只需继续阅读。

在您开始使用Sensor_Msgs / Range消息类型之前

在开始连接传感器并写第一行代码之前,让我们确定我们拥有所有硬件部件:

  • 1 x arduino uno
  • 1 x USB电缆
  • 3 x HC-SR04
  • 1 x覆盆子pi 4运行ros melodic
  • 1 x面包板
  • 女性到女性/男性到男性/女性到男性跳线电线
硬件设置

要为覆盆子PI 4供电,我使用aUSB-C电源,输出为5.1V,3.0A。覆盆子PI 4的5V USB端口提供足够的电源来运行Arduino Uno板。三种超声波传感器使用a供电7.4V电池组A.降压转换器为传感器提供5V输出。

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

注意:要在本文中进一步,我想您有一个正在运行ROS Melodic的覆盆子PI 4。如果没有,请深吸一口气并阅读如何在Raspberry Pi 4(Raspbian Buster)上安装ROS Melodic,Rosserial和更多

当然,如果您计划建立一个简单的移动机器人来检测障碍,如果这一教程势不可挡。您不需要为简单机器人提供此类基础架构。但是,如果您计划以富有成效和专业的方式构建高级机器人,这是您可以启动的程度。

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

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

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

  • 工作电压:DC 5V
  • 工作电流:15mA
  • 工作频率:40kHz
  • 范围:从2cm到4米
  • 测距准确度:3mm
  • 触发输入信号:10μsttl脉冲

对于连接,我使用女性到男性跳线,面包板,三个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,电池组和覆盆子PI 4

三个超声波传感器的硬件设置,Arduino,电池组和覆盆子PI 4

由于我们准备PI来运行ROS和Arduino IDE,您可以使用PI与监视器,键盘和鼠标,或通过VNC Viewer使用VNC查看器来编写和上传Arduino板上的草图。

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

在编写第一行代码之前,让我们重新制作超声波传感器的工作原理。

它引起了声波(根据规格至少10US),它通过空气传播,如果有一个物体反射声波,则传感器测量Ping返回接收器的时间。为了计算传感器和检测到的对象之间的距离,我们考虑行程时间和声音的速度。

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

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

此时在教程中,我们将在Arduino UNO板上创建一个ROS节点,并使用分布式计算环境将传感器输出发送到覆盆子PI。

从ROS框架中包含的许多软件包中,包传感器_MSGS包含常用传感器的消息集。使用超声波传感器,我们使用范围消息类型。此消息类型从超声波传感器发送单个读数,该传感器沿着测量距离的弧形有效。

Line 9,我们导入纽约与HC-SR04超声波传感器合作的库。您可以使用使用的库管理库来自Arduino IDE。以搜索表单类型纽约,以及在Manager屏幕中,您可以选择安装最新版本的库。

第10行,我们导入SimpleKalmanFilter.图书馆过滤超声波传感器’S输出。您可以使用使用的库管理库来自Arduino IDE。以搜索表单类型简单帕尔曼,以及在Manager屏幕中,您可以选择安装最新版本的库。

第11-13行:我们导入ROS套餐。Ros.H.是标准库,是在Arduino上运行的每个ROS节点的一部分。我们需要包括Ros.H.罗斯节点中使用的任何消息的标题。
罗斯 / time.h.标题代表ROS时钟时间。
sensor_msgs. /范围是用于广告从超声波传感器沿着测量的距离的超声波传感器读取单个范围读取的消息定义。

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

第55行: nodeHandle.是表示ROS节点的对象。罗斯 :: nodeHandle.将在Arduino Board上启动节点。

第58-69行:循环通过所有传感器,并且当传感器ping循环完成时,添加结果onesensorcycle().

第72-75行:收到新Ping时,将传感器距离添加到数组。

第85-91行:我们过滤传感器的读数。将读数存储不同于0,如果传感器返回0,则返回最后的有效输出。通过这种方式,我们过滤超声波传感器的假读数。

第100-102行:开始计数时间的功能Millis()。我更喜欢使用Millis()代替延迟()从两个原因起:Millis()比它更准确延迟(),并且是一个非阻塞的替代方案延迟().

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

第108-115行:写下设置范围消息对象。第一个参数是辐射_TYPE.传感器 - 超声.
frame_id.用于指定该消息中包含的数据的参考点。
field_of_view.表示距离读数在弧度中有效的弧的大小。 HC-SR04具有30度的理论视野。在上一篇文章中,我确实测试了确定操作检测范围最精确的区域。由于我们的目标是准确地检测机器人前面的大部分物体,我们设定了15度的视野,即约为0.26弧度。
最大限度范围是被视为有效的测量值的值。

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

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

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

第161行:ROS网络监控套接字连接,以将邮件从主题推送到队列上。我们发送新消息然后使用罗斯 :: SpinOnce()告诉ROS的新消息到达。

3.如何识别raspberry pi上的arduino板并通过rosserial运行ROS节点

一旦Arduino连接到PI并且上传草图,我们就可以识别Arduino板。

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

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

如果您只有一个连接到PI的Arduino,则只能看到一个抽象控制调制解调器(ACM):

ls dev ttyacm.

ls dev ttyacm.

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

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

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

笔记:如果您有一些奇怪的错误,如“包中的不匹配协议版本('!'):丢失同步或rosserial_python来自不同的ros释放而不是rosserial ...”“,您必须停止在Arduino上运行的节点,关闭Arduino IDE然后再次运行命令:rosrun rosserial_python serial_node.py / dev / ttyacm *

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

步骤1:打开一个新终端并运行命令:

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

罗斯topic列表节点

罗斯topic列表节点

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

的范围

的范围“/ultrasound_center”

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

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

然后我们进一步进一步并在Arduino上编写ROS节点以发布传感器的范围。我们使用Sensor_msgs / Range消息类型发布以宣传范围。

一旦ROS节点在Arduino上运行,我们将识别PI上的电路板并检查结果。

6评论» Write a comment

  1. 为什么?

    SimpleKalmanFilter..Kf_left(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 = SifirySorkalman;

    • 你好,
      2, 2 and 0.01 are the e_mea, e_est, q of the Kalman filter library. [//github.com/denyssene/SimpleKalmanFilter]
      是的,有一个拼写错误:它应该是Range_Right.Range = SifirySorkalman;

  2. 嗨谢谢你,非常有用。
    帮助我走出了大休眠时间!
    但是
    我得到了这个警告
    罗斯_sr04_scanner.ino:139:51:警告:ISO C ++禁止将字符串常量转换为‘char*’ [-Wwrite-strings]
    sensor_msg_init.(Range_right,“/ultrasound_right”);
    我也在左边和中心得到它。有任何想法吗?
    再次感谢

发表评论

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