將 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 Library@^0.9.1
您也可以使用 Raspberry Pi 代替 PC。
環境設置#
在您的 PC 或 Raspberry Pi 上#
您需要安裝所需的 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 或 Raspberry Pi 相同的網絡,ESP32 應該開始向 ROS 系統發送 "hello world!" 消息。您可以使用 rqt_console 等工具可視化此輸出,或簡單地在終端中監控輸出。
如果一切設置正確,您應該會看到類似以下的畫面:
就這樣!您的 ESP32 現在已經通過 WiFi 連接到 ROS。這個基本框架可以成為更複雜項目的基礎,其中 ESP32 與 ROS 互動以控制機器人或其他設備。
最後的想法#
我們剛剛走過了將 ESP32 通過 WiFi 連接到 ROS 的過程。雖然這個示例相對簡單,但它為更複雜的項目提供了一個強大的基礎。ROS 是一個強大的系統,用於控制和管理機器人,將其與靈活且強大的 ESP32 整合開啟了廣泛的可能性。無論您是在構建無人機、移動機器人還是任何其他需要與 ROS 介面的設備,本指南提供了您開始所需的基本知識。
所以現在輪到您了。祝您編程愉快!