[セットトップ]ROSの学習(19)rosserialでsubscriberを作成する


前のブログでは、arduinoを使用してpublisherノードを作成しました.次にsubscriberを作成し、arduinIDEを開きます.
arduino

File->Examples->rosを選択lib->Blinkでは、サンプルプログラムを開くことができます.コードは次のとおりです.
/*
 * rosserial Subscriber Example
 * Blinks an LED on callback
 */

#include <ros.h>
#include <std_msgs/Empty.h>

ros::NodeHandle nh;

void messageCb( const std_msgs::Empty& toggle_msg){
  digitalWrite(13, HIGH-digitalRead(13));   // blink the led
}

ros::Subscriber<std_msgs::Empty> sub("toggle_led", &messageCb );

void setup()
{
  pinMode(13, OUTPUT);
  nh.initNode();
  nh.subscribe(sub);
}

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

コードの説明を見てみましょう.
#include <ros.h>
#include <std_msgs/Empty.h>

前の例のようにrosを含める必要がありますh,同様にメッセージを含むヘッダファイルが必要である.
ros::NodeHandle nh;

上の行のコードはノードハンドルを作成し、私たちのプログラムはパブリッシャとサブスクライバを作成することができ、ノードハンドルもシリアル通信と関係があります.
void messageCb( const std_msgs::Empty& toggle_msg){
  digitalWrite(13, HIGH-digitalRead(13));   // blink the led
}

subscriberのパラメータとしてメッセージの常参照を使用する必要があるコールバック関数を作成した.コールバック関数messageCbでは、メッセージのタイプはstd_です.msgs::Empty、メッセージの名前はtoggle_msg.
コールバック関数ではtoggle_を参照できます.msgですが、空いているので必要ありません.メッセージを受け取ると、aduinoボードのLEDを点滅させます.
ros::Subscriber<std_msgs::Empty> sub("toggle_led", &messageCb );

上のコードは話題toggle_ledにはsubscriberが確立され、タイプはstd_msgs::Empty.Subscriberを使用する場合は、上
の形式で、メッセージのタイプを説明します.その2つのパラメータは、サブスクリプションするトピックと使用するコールバック関数です.
void setup()
{
  pinMode(13, OUTPUT);
  nh.initNode();
  nh.subscribe(sub);
}

arduinoのsetup関数では、rosのノードハンドルを初期化し、購読するすべてのトピックを通知し、聞きたいすべてのトピックを購読する必要があります.
void loop()
{
  nh.spinOnce();
  delay(1);
}

最後にloop関数ではros::spinOnce()を呼び出し,この関数ではすべてのROS通信のコールバック関数が処理される.loop関数では、他の処理をしてはいけません.この関数ros::spinOnce()はsubscriberのコールバック関数にメッセージを渡すからです.
arduinIDEでuploadボタンをクリックし、プログラムを実行します.次にroscoreを実行します.
roscore

次にrosserialクライアントアプリケーションを実行し、arduinoメッセージをROSシステムの他の部分に転送します.
rosrun rosserial_python serial_node.py /dev/ttyACM0

最後に、arduinoボードのLEDランプの変化を確認するコマンドを入力します.
rostopic pub toggle_led std_msgs/Empty --once

上記コマンドを1回実行するとLEDランプが点灯し、実行すると次回は消灯します.このように繰り返し実行すると、振りが変化します.