ArduinoでROSを使う(rosserial)→Ubuntuのみで利用可能

rosserialを使うためにはroslib(Arduinoライブラリ)を~/sketchbook/libraries/ 以下に作成する必要がある
コマンドラインで行う

$ sudo apt-get install ros-kinetic-rosserial ros-kinetic-rosserial-arduino
$ cd ~/sketchbook/libraries
$ rosrun rosserial_arduino make_libraries.py .

これでArduinoへのインストールが完了した

Arduinoを起動する

$ sudo apt-get install arduino
$ arduino &

roslibがExampleの中に出現する

$ roscore #忘れてた!!
$ rosrun rosserial_python serial_node.py _port:=/dev/ttyACM0
$ rostopic pub /led std_msgs/Bool true
$ rostopic pub /led std_msgs/Bool false
$ rqt_graph


以下の.ino がテンプレートになりそう。

#include <ros.h>
#include <std_msgs/Bool.h>
#include <std_msgs/String.h>

ros::NodeHandle node;
std_msgs::String chat;
ros::Publisher pub("arduino",&chat);

void ledCallback(const std_msgs::Bool &is_led_on){
	if(is_led_on.data){
		digitalWrite(13,HIGH);
		chat.data = "led on!";
	} else {
		digitalWrite(13,LOW);
		chat.data = "led off.";
	}
	pub.publish(&chat);
}

ros::Subscriber<std_msgs::Bool> sub("led",&ledCallback);

void setup(){
	pinMode(13,OUTPUT);
	node.initNode();
	node.subscribe(sub);
	node.advertise(pub);
}

void loop(){
	node.spinOnce();
	delay(1);
}

Ubuntuターミナル上にて、
$ rostopic pub /led で/ledトピックにBool true/falseを設定する
$ rostopic echo /arduino で/arduinoトピックのString値をCallbackで取得できる

Arduino上ではspinOnce()を一定周期でポーリングする、というのがプログラミングの枠組みらしい