ROSserial86 Library

簡単な紹介

ROSserial86 は 86Duino Coding 208 がサポートを開始したライブラリであり、このライブラリは専ら 86Duino が応用する rosserial の為のものであり、86Duino とロボット作業システム ROS (Robot Operating System) 間の疎通をサポートする。以下 rosserial の公式紹介写真である:

ROSserial86 は rosserial_arduinorosserial_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 である。下図を参照願いたい:

1

シリアルポート経由して 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 線、アース接続)する。下記を参考願いたい:

4

全貌は下図の通り:

2-1

ネットを経由し 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 が直接ネットワークにより接続される方法である:

3

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 モジュールの接続ピンの名称である:

3

上図を参考にし、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 ブースをつなげることによる、完成全貌は下記に示した通りである:
3


ライブラリリスト

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.