【如何将Arduino与机器人操作系统(ROS)一起使用】

1. 简介

了解ROS或机器人操作系统,一种用于机器人技术的流行开源中间件!

在这里插入图片描述

Arduino板用于构建小型机器人,并具有简单的逻辑定义控制。但由于机载计算能力和软件有限,开发人员通常无法升级到更复杂的机器人。通常,随着建筑商变得越来越有经验,他们会寻找特定于机器人的软件,因为Arduino仅提供部分控制。

本教程介绍了一个中间件软件框架机器人操作系统(ROS),并引导您通过Arduino设置和使用ROS来创建更智能的机器人系统。

2. 什么是 ROS?

机器人操作系统(ROS)是最流行和广泛使用的机器人中间件软件框架之一。它是一个开源平台,可帮助制造商和开发人员开始使用机器人软件,而无需重新发明轮子。ROS 提供标准通信架构,用于无缝集成、使用、开发和部署机器人系统的不同组件,包括控制、感知、规划等。它是一个与语言无关的平台,为不同的计算机提供跨平台通信支持,无论其部署站点如何。

Arduino可能是最常用的开源微控制器开发板,它提供了易于使用的软件硬件界面和不断扩大的用户社区。Arduino主要兼容所有数字和模拟电路以及支持串行通信接口(如SPI,I2C和UART)的外部设备。

基于 ROS 的软件框架运行高级算法和流程,如机器人模型的™推理、过滤、运动策略生成、控制器算法等。安装在机器人上的Arduino控制器用于执行低级/嵌入式控制和传感。它包括任何或所有电机控制、温度和超声波传感器、IMU 和车轮编码器以及其他设备。

Arduino _Robot_AK_MP_image1.png

ROS - Arduino Interaction Pipeline (图片来源 - 原始)

3. ROS和Arduino之间的通信

ROS 通信模块在两种范式中在定制的 TCPROS 协议上运行:多对多发布者-订阅者方法和点对点更快的服务方法。本教程使用发布者/订阅者范例在计算机上运行的 Arduino 板和 ROS 之间进行通信。

rosserial ROS软件包使用Arduino的™通用异步接收器/发射器(UART)通信,并将电路板转换为ROS节点,该节点可以发布ROS消息并订阅消息。Arduino ROS节点发布者可以将数据(来自传感器或机器人状态)从开发板发送到运行ROS的机器,而Arduino ROS节点订阅者可以从机器获取指令。ros_lib Arduino 库使 Arduino 板能够与 ROS 通信。

4. 设置基础结构

4.1 软件设置

  1. 在机器(笔记本电脑/PC)上安装 ROS。此处提供了详细的步骤。

注意:这在运行在 Linux 机器上的 ROS 1 上有效

2.在机器上安装rosserial(发行版可以是kinetic/indigo/melodic)。

sudo apt-get install ros-<distro>-rosserial
sudo apt-get install ros-<distro>-rosserial-arduino
  1. 按照此处提到的说明在机器上安装 Arduino IDE。

  2. 在 IDE 中安装 ros_lib 包。

一个。安装软件包的最简单方法是从Arduino IDE本身。导航到 IDE 中的草图>包括库>管理库,然后搜索 rosserial 包

Arduino _Robot_AK_MP_image5.png

用于搜索新 Arduino 软件包的下拉菜单

b.Arduino IDE 将所有外部库存储在 ~/Arduino/libraries 文件夹位置下。它将这些库加载到开发环境中,并且可以在 IDE 中看到。安装后,可以在下拉列表中看到Rosserial Arduino库。

Arduino _Robot_AK_MP_image3.png

外部库显示在列表中

c.c. 安装后,示例草图也应在 IDE 中可见。

Arduino _Robot_AK_MP_image4.png

可用库中的示例草图

4.1 硬件设置

我们使用一个简单的设置来使用 Arduino 板作为发布者和订阅者。

1.发布者:一个按钮连接到Arduino板,并切换它通过ROS向机器发送数字高/低信号。该消息显示在计算机上的终端中。

  1. 用户:LED 连接到 Arduino 板,并使用通过终端从 ROS 用户获得的说明打开/关闭。

Arduino _Robot_AK_MP_image6.png

硬件连接 - (图片来源 - 原始)

4.3 代码和说明

Arduino Code

#include <ros.h>
#include <std_msgs/String.h>
#include <std_msgs/UInt16.h>

#define BUTTON 8
#define LED 13

ros::NodeHandle node_handle;

std_msgs::String button_msg;
std_msgs::UInt16 led_msg;

void subscriberCallback(const std_msgs::UInt16& led_msg) {
    
    
  if (led_msg.data  == 1) {
    
    
    digitalWrite(LED, HIGH); 
  } else {
    
    
    digitalWrite(LED, LOW);
  }
}

ros::Publisher button_publisher("button_press", &button_msg);
ros::Subscriber<std_msgs::UInt16> led_subscriber("toggle_led", &subscriberCallback);

void setup()
{
    
    
  pinMode(LED, OUTPUT);
  pinMode(BUTTON, INPUT);
  
  node_handle.initNode();
  node_handle.advertise(button_publisher);
  node_handle.subscribe(led_subscriber);
}

void loop()
{
    
     
  if (digitalRead(BUTTON) == HIGH) {
    
    
    button_msg.data = "Pressed";
  } else {
    
    
    button_msg.data = "NOT pressed";
  }

  button_publisher.publish( &button_msg );
  node_handle.spinOnce();
  
  delay(100);
}

4.4 解释

该代码导入 std_msgs::字符串和 std_msgs::UInt16 的ros_lib库和标准 ROS 消息。声明变量用于存储 ROS 数据类型和 Arduino 板引脚。

该代码声明一个名为 button_publisher 的发布者,该发布者将std_msgs::String 数据类型button_msg发布到button_press主题。同样,名为 led_subscriber 的订阅者订阅toggle_led主题,该主题获取 std_msgs::UInt6 数据类型。

声明 ROS 节点句柄,然后在 setup() 方法中初始化。节点句柄播发发布者并订阅主题。

subscriberCallback() 是在 Arduino 订阅者节点上接收数据时调用的方法。回调方法检查 ROS 主题数据是否为 HIGH,并相应地切换连接的 LED。

最后,loop() 方法运行一个无限循环,从按钮读取信息并将其发布到 ROS。节点句柄调用 spinOnce() 来处理通信。

4.5 程序执行

通过USB电缆将Arduino Uno板连接到笔记本电脑,并确认该板出现在Arduino IDE的可用串行端口列表中。编译代码,选择板类型并将其上传到板。

上传代码后,在计算机的™终端中执行以下命令。

  1. 启动 ROS 主控 - roscore
  2. 在机器上运行 rosserial 客户端 - rosrun rosserial_python serial_node.py /dev/tty<USB# 或 ACM#>
  3. 串行端口在运行时确定为 ttyUSB 或 ttyACM。确切的端口号可以从Arduino IDE或使用dmesg |格雷普·蒂。
  4. 读取已发布的数据,返回是否按下 Arduino 板上的按钮 - rostopic 回声button_press
  5. 发布数据以切换连接在 Arduino - rostopic pub toggle_led std_msgs/UInt16 上的 LED “数据:0” 数据为“0”以关闭 LED,“1”用于打开 LED。
    Arduino _Robot_AK_MP_image2.png

使用多个终端选项卡执行指令并在同一屏幕中观察响应

rosserial提供了一个非常标准的平台,允许制造商和开发人员在Arduino和ROS之间无缝连接。它允许使用两种非常著名和有用的技术来探索机器人技术的新机会。这种方法允许以非常低的成本实现分布式计算、集中控制、控制抽象以及机器人系统的其他一些好处。

猜你喜欢

转载自blog.csdn.net/vor234/article/details/129642541