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 / Overview。另请参阅有关更复杂数据类型的信息的Limitations。