将 ESP32 与 ROS 通过 WiFi 集成#
在这篇博客文章中,我将指导您如何使用 WiFi 将 ESP32 开发板连接到机器人操作系统(ROS)。这是一个适合初学者的指南,将带您了解如何使用 rosserial_arduino 库将 ESP32 与 ROS 集成,该库为 Arduino 开发板提供了 ROS 通信协议。
查看我的 GitHub。
https://github.com/Xiangyu-Fu/ESP32_ROS_wifi
先决条件#
在我们开始之前,请确保您拥有以下开发环境:
- Ubuntu 20.04
- ROS Noetic
- PlatformIO espressif32
- ESP32 Arduino 框架
- frankjoshua/Rosserial Arduino 库 @^0.9.1
您也可以使用树莓派代替 PC。
环境设置#
在您自己的 PC 或树莓派上#
您需要安装所需的 ROS 软件包。在终端中使用以下命令:
$ sudo apt-get install ros-${ROS_DISTRO}-rosserial-arduino
$ sudo apt-get install ros-${ROS_DISTRO}-rosserial
安装必要的软件包后,启动 ROS 主节点:
$ roscore
然后,在一个新的终端窗口中,运行 rosserial 节点:
$ rosrun rosserial_python serial_node.py tcp
这将启动与我们的 ESP32 通过 TCP 连接的 ROS 节点。
在您的嵌入式设备上(这里是 ESP32)#
确保您已将适当的示例代码烧录到开发板上。您可以使用 PlatformIO 环境或 Arduino IDE 来完成此操作。
运行示例#
依赖项#
第一步是包含必要的库。这些是 Arduino 核心库、用于连接网络的 WiFi 库以及用于与 ROS 系统交互的 ROS 库。
#include <arduino.h>
#include "WiFi.h"
#include <ros.h>
#include <std_msgs/String.h>
我们定义几个全局变量:
- Arduino 开发板和 ROS 服务器的 IP 地址。
- ROS 服务器的服务器端口。
- WiFi 网络的 SSID 和密码。
- 我们将发送到 ROS 服务器的消息(“hello world!”)以及我们将发送的频率。
- ROS 节点的句柄和用于向 ROS 系统发送消息的发布者。
连接到 WiFi#
我们的setupWiFi()
函数将 Arduino 开发板连接到 WiFi 网络。它会重复检查连接状态,并在每次尝试时打印一个句号,直到连接建立。一旦连接成功,它会打印出 WiFi 连接的 SSID 和本地 IP 地址。
void setupWiFi()
{
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) { delay(500);Serial.print("."); }
Serial.print("SSID: ");
Serial.println(WiFi.SSID());
Serial.print("IP: ");
Serial.println(WiFi.localIP());
}
主设置#
在setup()
函数中,我们初始化串行通信以进行调试,设置 WiFi 连接,建立与 ROS 服务器的连接,初始化 ROS 节点,并宣传发布者。
void setup(){
Serial.begin(115200);
setupWiFi();
nh.getHardware()->setConnection(server, serverPort);
nh.initNode();
Serial.print("ROS IP = ");
Serial.println(nh.getHardware()->getLocalIP());
nh.advertise(chatter);
}
主循环#
在主loop()
中,我们检查时间,如果自上次消息以来已经过去足够的时间,我们就发送一条新消息。我们还检查连接状态,并相应地在串行监视器中打印消息。在这些检查之后,我们调用nh.spinOnce()
来处理任何传入的消息,然后延迟一毫秒。
void loop(){
if(millis() - last_time >= period)
{
last_time = millis();
if (nh.connected())
{
Serial.println("Connected");
str_msg.data = hello;
chatter.publish( &str_msg );
} else {
Serial.println("Not Connected");
}
}
nh.spinOnce();
delay(1);
}
就是这样!现在您可以开始使用 Arduino 通过 WiFi 与 ROS 进行交互。祝您编码愉快!
一旦您设置好一切,并且 ESP32 连接到与您的 PC 或树莓派相同的网络,ESP32 应该开始向 ROS 系统发送 “hello world!” 消息。您可以使用像 rqt_console 这样的工具可视化此输出,或者简单地在终端中监控输出。
如果一切设置正确,您应该会看到类似于以下的屏幕:
就是这样!您的 ESP32 现在已通过 WiFi 连接到 ROS。这个基本框架可以成为更复杂项目的基础,在这些项目中,ESP32 与 ROS 交互以控制机器人或其他设备。
最后思考#
我们刚刚走过了将 ESP32 通过 WiFi 连接到 ROS 的过程。虽然这个例子相对简单,但它为更复杂的项目提供了强大的基础。ROS 是一个强大的系统,用于控制和管理机器人,将其与灵活且强大的 ESP32 集成,打开了广泛的可能性。无论您是在构建无人机、移动机器人还是任何其他需要与 ROS 接口的设备,这个指南提供了您入门所需的基础。
所以现在轮到您了。祝您编码愉快!