Arduino开发板经常用于制作一些小型的机器人,并具有简单的逻辑定义控制。但是,由于板载计算能力和软件有限,开发人员常常无法升级到更复杂的机器人。通常,随着开发人员变得越来越有经验,他们会寻专用于机器人的软件,因为Arduino仅提供部分控件。
在本篇文章中,我们主要介绍了中间件软件框架Robot Operating System(ROS),并引导您通过Arduino设置和使用ROS来创建更智能的机器人系统。
什么是ROS?
机器人操作系统(ROS)是最流行和使用最广泛的机器人中间件软件框架之一。这是一个开放源代码平台,可帮助创客和开发人员在无需重新发明轮子的情况下开始使用机器人软件。 ROS提供了一种标准的通信体系结构,用于无缝集成、使用、开发和部署机器人系统的不同组件,包括控制、感知、计划等。这是一个与语言无关的平台,无论部署在何处,都可以为不同的计算机提供跨平台的通信支持。
Arduino可能是最常用的开源微控制器开发板,它提供了易于使用的软件-硬件界面以及不断扩展的用户社区。 Arduino几乎与所有数字和模拟电路以及支持串行通信接口(如SPI、I2C和UART)的外部设备兼容。
基于ROS的软件框架运行高级算法和流程,例如机器人模型的推理、过滤、运动策略生成、控制器算法等。安装在机器人上的Arduino控制器用于执行低级/嵌入式控制和传感。它包括、电动机控制、温度和超声传感器、IMU和车轮编码器以及其他设备。
ROS-Arduino交互管道
ROS与Arduino之间的通信
ROS通信模块基于自定义的TCPROS协议进行操作,使用两种方式:多对多发布者-订阅者方法和点对点更快服务方法。本篇文章使用发布者/订阅者在Arduino开发板和机器上运行的ROS之间进行通信。
rosserial ROS软件包使用Arduino的通用异步接收器/发送器(UART)通信,并将开发板转换为ROS节点,该节点可以发布ROS消息,也可以订阅消息。 Arduino ROS节点发布者可以从板上将数据(从传感器或机器人状态)发送到运行ROS的机器,而Arduino ROS节点订阅者可以从机器获取指令。 ros_lib Arduino库使Arduino开发板能够与ROS通信。
建立基础架构
软体设置
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
3. 根据此处提到的说明在计算机上安装Arduino IDE。
4. 在IDE中安装ros_lib软件包。
a. 安装软件包的最简单方法是使用Arduino IDE。导航到IDE中的Sketch 》 Include Library 》 Manage Library,然后搜索rosserial软件包
下拉菜单搜索新的Arduino软件包
b. Arduino IDE将所有外部库存储在〜/ Arduino / libraries文件夹位置下。它将这些库加载到开发环境中,并且可以在IDE中看到。安装后,可以在下拉列表中看到Rosserial Arduino库。
外部库显示在列表中
C. 安装后,应该在IDE中看到示例草图。
库中的可用示例草图
硬件设置
我们使用简单的设置将Arduino开发板用作发布者和订阅者。
1. 发布者:一个按钮连接到Arduino开发板上,并且被切换以通过ROS将数字高/低信号发送到机器。该消息显示在机器的终端中。
2. 订阅者:一个LED连接到Arduino开发板上,并使用通过终端从ROS用户那里获得的指令来打开/关闭LED。
硬件连接
代码和说明
Arduino代码
#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);
}
说明
该代码导入了ros_lib库和std_msgs :: String和std_msgs :: UInt16的标准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()来处理通信。
程序执行
通过USB电缆将Arduino Uno开发板连接到笔记本电脑,并确认该板出现在Arduino IDE的可用串行端口列表中。编译代码,选择板子类型并将其上传到开发板。
上载代码后,在机器的终端上执行以下命令。
1. 启动ROS Master-roscore
2. 在计算机上运行rosserial客户端-rosrun rosserial_python serial_node.py / dev / tty 《USB#或ACM#》
3. 在运行时确定ttyUSB或ttyACM的串行端口。可以从Arduino IDE或使用dmesg | grep tty找到确切的端口号。
4. 读取是否按Arduino板上的按钮返回的已发布数据-rostopic echo button_press
5. 发布数据以切换Arduino上连接的LED-rostopic pub toggle_led std_msgs / UInt16“ data:0”数据为“ 0”关闭LED,“ 1”打开LED。
使用多个终端选项卡执行指令并在同一屏幕上观察响应
rosserial提供了一个非常标准的平台,允许创客和开发人员在Arduino和ROS之间无缝连接。它可以使用两种非常著名和有用的技术来探索机器人技术的新机遇。这种方法允许以非常低的成本为机器人系统提供分布式计算、集中控制、控制抽象以及其他一些好处。
编辑:hfy
全部0条评论
快来发表一下你的评论吧 !