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 &
$ 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()を一定周期でポーリングする、というのがプログラミングの枠組みらしい