ROSserial86 Library
簡単な紹介
ROSserial86 は 86Duino Coding 208 がサポートを開始したライブラリであり、このライブラリは専ら 86Duino が応用する rosserial の為のものであり、86Duino とロボット作業システム ROS (Robot Operating System) 間の疎通をサポートする。以下 rosserial の公式紹介写真である:
ROSserial86 は rosserial_arduino と rosserial_embeddedlinux の機能を結合し、86Duino が USB Device インターフェイス、シリアルポート、インターネットを通じて ROS データを発信できるようにする。このライブラリを使用し、86Duino を完全な ROS の節点と見做すことが可能となり、直接 ROS トピック(ROS Topics)を発信、購読することが可能となり、また ROS(ROS Services)、TF 変換発信、ROS システム時間取得を提供或いは請求可能となる。
なぜなら ROSserial86 は rosserial を互換し、ユーザーが rosserial の公式ウィキペディア記事を参考にし ROSserial86 の使用を学習することが可能だからである。
ROSserial86 は使用上 rosserial 唯一の違ったものであり、ROSserial86 が接点において初期化時異なる連接方式を選択することを許可する。下に私たちは簡単な例を挙げて ROS 方式連接の方法について説明する。
説明と例
USB Device インターフェイスを経由し ROS を連接する
もし 86Duino の USB Device インターフェイスを使用して連線をするのなら、使用方式と rosserial_arduino はそれぞれ異なっており、initNode()
を呼び出し節点初期化する時に如何なるパラメーターも必要としない。例としてのプログラミングは下記の通り:
#include <ros.h> //引入 rosserial 開始ドキュメント #include <std_msgs/String.h> //rosserial データ定義組込み //節点処理を宣告し、ROS との間の疎通を実現する ros::NodeHandle nh; // std_msgs::String のデータ宣言 std_msgs::String str_msg; //発信者の発するデータを宣言し、データを chatter トピックに送る ros::Publisher chatter("chatter", &str_msg); char hello[13] = "hello world!"; void setup() { nh.initNode(); //節点初期化、USB を使用して疎通を行う nh.advertise(chatter); //節点を利用し発信者のデータを発信可能とする } void loop() { str_msg.data = hello; //データの資料を hello 文字列内に組み込む chatter.publish( &str_msg ); // str_msg をトピック chatter へ発信 nh.spinOnce(); //節点に callback の処理をさせる delay(1000); }
ハードウェア接続方式: 86Duino を USB Device に直接インターフェイスを通じてまさに起動している rosserial server に連接(例えば rosserial_python)することにより host のメインパソコンは OK である。下図を参照願いたい:
シリアルポート経由して ROS に接続する
シリアルポートを使用して連線を進行するには、initNode()
を初期化時に呼び出し、指定のシリアルポートをパラメーターとすれば OK である。例えば、nh.initNode("/Serial1")
であり、目下サポートするシリアルポートパラメーターは “/Serial1″、”/Serial2″、”/Serial3″ である。シリアルポートのボーレートは初期化前に呼び出した nh.getHardware()->setBaud(baudrate)
に設定し、あらかじめボーレートを 57600 とする。参考プログラミングは下記の通り:
#include <ros.h> // rosserial を組込み #include <std_msgs/String.h> // rosserial データ定義入力 //節点処理者が ROS 間の疎通実現することを宣告 ros::NodeHandle nh; // std_msgs::String データ宣告 std_msgs::String str_msg; //発信者の発信データを宣告し、chatter トピックにデータ発信 ros::Publisher chatter("chatter", &str_msg); char hello[13] = "hello world!"; void setup() { nh.getHardware()->setBaud(57600); // baudrate 設定 nh.initNode("/Serial1"); //節点初期化、Serial1 を使用し ROS を接続する nh.advertise(chatter); //節点が発信者のデータ発信可能とする } void loop() { str_msg.data = hello; //データ資料を hello 文字列に組み込む chatter.publish( &str_msg ); // str_msg を chatter トピックに発信 nh.spinOnce(); //節点で callback 関数を処理 delay(1000); }
ハードウェア接続方式:この例の中で私たちは RoBoard RB-100 を用いて、その中の rosserial server(例えばrosserial_python)を起動させ ROS のメイン端末とし、86Duino を rosserial クライアント端末とし、Serial1 と RoBoard の COM3 を連接(86Duino の TX が連線する RoBoard の RX 線、86Duino の RX が連線する RoBoard の TX 線、アース接続)する。下記を参考願いたい:
全貌は下図の通り:
ネットを経由し ROS を接続
ネットを使用し、Ethernet ライブラリを呼び出し、86Duino の IP アドレスを設定し、その後 initNode()
を呼び出し節点を初期化する時、ROS 主機の IP アドr巣を入力すれば OK であり、使用方式と rosserial_embeddedlinux は同じである。参考プログラミング例は下記の通り:
#include <ros.h> //rosserial 入力 #include <std_msgs/String.h> // rosserial データ定義入力 #include <Ethernet.h> // Ethernet ライブラリ入力 //節点処理者が ROS 間の疎通を実現することを宣告 ros::NodeHandle nh; //std_msgs::String データ宣告 std_msgs::String str_msg; //発信者が情報発信を宣告し、データを chatter トピックに発信する ros::Publisher chatter("chatter", &str_msg); char hello[13] = "hello world!"; void setup() { IPAddress ip(192,168,0,2); Ethernet.begin(NULL, ip); //ネットワーク設定初期化 nh.initNode("192.168.0.1"); //節点初期化、192.168.0.1 の ROS を主機と連線する nh.advertise(chatter); //節点が発信者によるデータ発信可能とする } void loop() { str_msg.data = hello; //データ資料を hello 文字列に組み込む chatter.publish( &str_msg ); // str_msg を chatter トピックに発信 nh.spinOnce(); //節点で callback 関数を処理 delay(1000); }
ハードウェア接続方式:直接 86Duino を Ethernet ネットワークケーブルの穴に差し込めば OK であり、下図に示したのは ROS 主機と 86Duino が直接ネットワークにより接続される方法である:
86Duino がネットワークを通じ ROS トピック(ROS Topic)に発するデータの参考プログラミング:
#include <Arduino.h> #include <ros.h> //rosserial 入力 #include <std_msgs/String.h> //rosserial データ定義入力 #include <Ethernet.h> //Ethernet ライブラリ入力 //節点処理を宣告し、ROS との間の疎通を実現する ros::NodeHandle nh; //rosserial_arduino::Adc adc_msg データ宣告 rosserial_arduino::Adc adc_msg; //発信者がデータ発信を宣告し、adc トピックにデータを発信する ros::Publisher p("adc", &adc_msg); void setup() { pinMode(13, OUTPUT); IPAddress ip(192,168,0,2); Ethernet.begin(NULL, ip); //ネットワーク設定初期化 nh.initNode("192.168.0.1"); //節点初期化、192.168.0.1 の ROS 主機に連線する nh.advertise(p); //節点が発信者がデータ発信することを可能とする } int averageAnalog(int pin) { int v = 0; for (int i = 0; i < 4; i++) v += analogRead(pin); return v / 4; } long adc_timer; void loop() { adc_msg.adc0 = averageAnalog(0); adc_msg.adc1 = averageAnalog(1); adc_msg.adc2 = averageAnalog(2); adc_msg.adc3 = averageAnalog(3); adc_msg.adc4 = averageAnalog(4); adc_msg.adc5 = averageAnalog(5); p.publish(&adc_msg); //adc_msg を adc トピックに発信 nh.spinOnce(); //節点で callback 関数を処理 delay(10); }
ESP8266 WiFi モジュールを経由し ROS に接続する
ESP8266 WiFi モジュールを使用し無線ネットワークによる接続を行うには、initNode()
を呼び出す前に setESP8266(HardwareSerial, Baudrate)
と setWiFi("SSID", "PASSWORD")
を使用して WiFi をつなぐ設定をする必要がある。
その後 initNode()
を呼び出し節点を初期化する時は、ROS 主機のアドレスを入力すれば OK である、参考プログラミングは下記の通り:
#include <ros.h> //rosserial 入力 #include <std_msgs/String.h> //rosserial データ定義入力 //処理者による ROS との間の疎通実現を宣告する ros::NodeHandle nh; //std_msgs::String データ宣告 std_msgs::String str_msg; //発信者がデータ発信を宣告し、chatter トピックにデータを発信する ros::Publisher chatter("chatter", &str_msg); char hello[13] = "hello world!"; void setup() { //ESP8266 接続の 86Duino シリアルポートをボーレート設定 nh.getHardware()->setESP8266(Serial1, 115200); //接続したい WiFi AP の SSID とパスワード設定 nh.getHardware()->setWiFi("SSID", "PASSWORD"); nh.initNode("192.168.0.1"); //節点初期化、192.168.0.1 の ROS 主機接続 nh.advertise(chatter); //節点が発信者がデータ発信可能とする } void loop() { str_msg.data = hello; //データ資料を hello 文字列に組み込む chatter.publish( &str_msg ); //str_msg を chatter トピックに発信 nh.spinOnce(); //節点で callback 関数を処理 delay(1000); }
ハードディスク接続方法:この参考例の中で私たちは ESP8266 の VCC と CH_PD を全て 86Duino の 3.3V に接続し、並びに ESP8266 と 86Duino Serial1、すなわちUTXD と 86Duino の RX1、 URXD TX1 を繋いだ事になる。
下図は ESP8266 WiFi モジュールの接続ピンの名称である:
上図を参考にし、ESP8266 WiFi モジュールと 86Duino の接続方式を下図に示すこととする:
Pins of ESP8266 | Pins of 86Duino | Notes |
UTXD | RX1 | (Serial1: 86Duino PIN 0) |
CH_PD | 3.3V | Boot mode – must be 3.3v to enable WiFi |
RST | N/C | |
VCC | 3.3V | |
GND | GND | |
GPIO0 | N/C | |
GPIO2 | N/C | |
URXD | TX1 | (Serial1: 86Duino PIN 1) |
ノートパソコンを rosserial のメイン端末とし、86Duino を rosserial のクライアント端末とし、同様の WiFi ブースをつなげることによる、完成全貌は下記に示した通りである:
The text of the 86Duino reference is a modification of the Arduino reference, and is licensed under a Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain.