如何将Arduino与机器人操作系统(ROS)一起使用
1. 简介
了解ROS或机器人操作系统,一种用于机器人技术的流行开源中间件!
Arduino板用于构建小型机器人,并具有简单的逻辑定义控制。但由于机载计算能力和软件有限,开发人员通常无法升级到更复杂的机器人。通常,随着建筑商变得越来越有经验,他们会寻找特定于机器人的软件,因为Arduino仅提供部分控制。
本教程介绍了一个中间件软件框架机器人操作系统(ROS),并引导您通过Arduino设置和使用ROS来创建更智能的机器人系统。
![](https://www.geediy.net/wp-content/uploads/2024/05/aa-1024x606.png)
2. 什么是 ROS?
机器人操作系统(ROS)是最流行和广泛使用的机器人中间件软件框架之一。它是一个开源平台,可帮助制造商和开发人员开始使用机器人软件,而无需重新发明轮子。ROS 提供标准通信架构,用于无缝集成、使用、开发和部署机器人系统的不同组件,包括控制、感知、规划等。它是一个与语言无关的平台,为不同的计算机提供跨平台通信支持,无论其部署站点如何。
Arduino可能是最常用的开源微控制器开发板,它提供了易于使用的软件硬件界面和不断扩大的用户社区。Arduino主要兼容所有数字和模拟电路以及支持串行通信接口(如SPI,I2C和UART)的外部设备。
基于 ROS 的软件框架运行高级算法和流程,如机器人模型的™推理、过滤、运动策略生成、控制器算法等。安装在机器人上的Arduino控制器用于执行低级/嵌入式控制和传感。它包括任何或所有电机控制、温度和超声波传感器、IMU 和车轮编码器以及其他设备。
![](https://www.geediy.net/wp-content/uploads/2024/05/image-18.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 软件设置
- 在机器(笔记本电脑/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
- 按照此处提到的说明在机器上安装 Arduino IDE。
- 在 IDE 中安装 ros_lib 包。
安装软件包的最简单方法是从Arduino IDE本身。导航到 IDE 中的草图>包括库>管理库,然后搜索 rosserial 包
![](https://www.geediy.net/wp-content/uploads/2024/05/image-19-891x1024.png)
用于搜索新 Arduino 软件包的下拉菜单
b.Arduino IDE 将所有外部库存储在 ~/Arduino/libraries 文件夹位置下。它将这些库加载到开发环境中,并且可以在 IDE 中看到。安装后,可以在下拉列表中看到Rosserial Arduino库。
![](https://www.geediy.net/wp-content/uploads/2024/05/image-21.png)
外部库显示在列表中
c.c. 安装后,示例草图也应在 IDE 中可见。
![](https://www.geediy.net/wp-content/uploads/2024/05/image-20-892x1024.png)
可用库中的示例草图
4.1 硬件设置
我们使用一个简单的设置来使用 Arduino 板作为发布者和订阅者。
1.发布者:一个按钮连接到Arduino板,并切换它通过ROS向机器发送数字高/低信号。该消息显示在计算机上的终端中。
- 用户:LED 连接到 Arduino 板,并使用通过终端从 ROS 用户获得的说明打开/关闭。
![](https://www.geediy.net/wp-content/uploads/2024/05/image-22-1.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的可用串行端口列表中。编译代码,选择板类型并将其上传到板。
上传代码后,在计算机的™终端中执行以下命令。
- 启动 ROS 主控 – roscore
- 在机器上运行 rosserial 客户端 – rosrun rosserial_python serial_node.py /dev/tty<USB# 或 ACM#>
- 串行端口在运行时确定为 ttyUSB 或 ttyACM。确切的端口号可以从Arduino IDE或使用dmesg |格雷普·蒂。
- 读取已发布的数据,返回是否按下 Arduino 板上的按钮 – rostopic 回声button_press
- 发布数据以切换连接在 Arduino – rostopic pub toggle_led std_msgs/UInt16 上的 LED “数据:0” 数据为“0”以关闭 LED,“1”用于打开 LED。
使用多个终端选项卡执行指令并在同一屏幕中观察响应
![](https://www.geediy.net/wp-content/uploads/2024/05/623ee7ed74a04553a627fd05bd4da8cd.png)
rosserial提供了一个非常标准的平台,允许制造商和开发人员在Arduino和ROS之间无缝连接。它允许使用两种非常著名和有用的技术来探索机器人技术的新机会。这种方法允许以非常低的成本实现分布式计算、集中控制、控制抽象以及机器人系统的其他一些好处。