ESP32 を WiFi 経由で ROS に統合する#
このブログ記事では、ESP32 ボードを Robot Operating System(ROS)に WiFi を使用して接続する方法を説明します。これは初心者向けのガイドで、rosserial_arduino ライブラリを使用して ESP32 と ROS を統合するプロセスを案内します。このライブラリは Arduino ボード用の ROS 通信プロトコルを提供します。
私の GitHub を見てください。
https://github.com/Xiangyu-Fu/ESP32_ROS_wifi
前提条件#
始める前に、次の開発環境が整っていることを確認してください:
- Ubuntu 20.04
- ROS Noetic
- PlatformIO espressif32
- ESP32 Arduino Framework
- frankjoshua/Rosserial Arduino Library@^0.9.1
PC の代わりに Raspberry Pi を使用することもできます。
環境設定#
自分の 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);
}
これで完了です!これで WiFi 経由で Arduino を ROS と一緒に使用する準備が整いました。コーディングを楽しんでください!
すべての設定が完了し、ESP32 が PC または Raspberry Pi と同じネットワークに接続されていると、ESP32 は「hello world!」メッセージを ROS システムに送信し始めるはずです。この出力は、rqt_console のようなツールを使用して視覚化するか、単にターミナルで出力を監視することができます。
すべてが正しく設定されていれば、次のような画面が表示されるはずです:
これで完了です!あなたの ESP32 は WiFi 経由で ROS に接続されています。この基本的なフレームワークは、ESP32 が ROS と対話してロボットや他のデバイスを制御するより複雑なプロジェクトの基盤となることができます。
最後の考え#
ESP32 を WiFi 経由で ROS に接続するプロセスを説明しました。この例は比較的シンプルでしたが、より複雑なプロジェクトのための強力な基盤を提供します。ROS はロボットを制御および管理するための堅牢なシステムであり、柔軟で強力な ESP32 と統合することで、幅広い可能性が開かれます。ドローン、モバイルロボット、または ROS とインターフェースする必要がある他のデバイスを構築している場合、このガイドは始めるために必要な基本を提供します。
さあ、あなたの番です。コーディングを楽しんでください!