rosserial_arduino学习笔记4《example subsciber》

1 点亮LED:创建订阅者

1.1 程序

现在我们已经在上一个教程中创建了一个ROS发布者,我们将创建一个订阅者。如果你已经按照Arduino IDE安装教程,你可以通过从Arduino示例菜单中选择ros_lib - > Blink来打开下面的sketch。

这应该在IDE中打开以下代码:

/*
 * 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);
}

1.2 程序解释

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

和以前一样,我们需要将ros.h包含在任何其他ROS Arduino程序中。我们还包括消息的头文件,在本例中为Empty消息。

ros::NodeHandle nh;

接下来,我们需要实例化节点句柄,这允许我们的程序创建发布者和订阅者。节点句柄还负责串口通信。

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

然后,我们为订户创建回调函数。回调函数必须将常量引用作为其参数。在我们的回调messageCb中,消息的类型是std_msgs :: Empty,消息名称是toggle_msg。

在我们的回调中,我们可以引用toggle_msg,但由于它是空的,所以没有必要。我们每次收到消息时都会点亮Arduino上的LED灯。

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

我们需要实例化我们将要使用的发布者和订阅者。这里我们实例化一个主题名为“toggle_led”的订阅者,以及类型为std_msgs :: Empty的消息。对于订阅者,您必须记住在消息上对订阅者进行template。它的两个参数是它将要订阅的主题以及它将使用的回调函数。

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

在Arduino设置功能中,您需要初始化ROS节点句柄,advertise正在发布的任何主题,并订阅您想要收听的任何主题。

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

最后,在循环函数中,我们调用ros :: spinOnce(),其中处理所有ROS通信回调。我们不需要在loop()中进行任何额外的处理,因为ros :: spinOnce()将处理将消息传递给订阅者回调。

1.3 上传代码

要将代码上传到Arduino,请使用Arduino IDE中的上传功能。这与上传任何其他sketch并没有什么不同。

1.4 运行代码

现在,在新的终端窗口中启动roscore

roscore

接下来,运行rosserial客户端应用程序,将Arduino消息转发给ROS的其余部分。确保使用正确的串口:

rosrun rosserial_python serial_node.py /dev/ttyACM0

最后,您可以使用rostopic切换LED :

rostopic pub toggle_led std_msgs / Empty --once

或者使用pub -r 这个参数令LED不断的闪烁。

rosserial_arduino学习笔记4《example subsciber》

进一步阅读

有关发布者和订阅者的详细信息,请参阅rosserial / Overview。另请参阅有关更复杂数据类型的信息的Limitations。