欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

ROS-rosserial概述(3)

程序员文章站 2022-07-12 09:43:05
...

Publishers and Subscribers

rossserial概述官网链接

1. 发布到话题

可以使用ros :: Publisher类创建一个句柄来将消息发布到话题。首先必须创建一个发布者可以使用的消息,然后在setup()中调用advertise

#include <ros.h>
ros::NodeHandle nh;

// before your setup() function
std_msgs::String str_msg;
ros::Publisher pub("foo", &str_msg);

void setup(){
    ...
    nh.advertise(pub);
    ...
}

然后,可以调用publish来发布消息:

void loop()
{
   pub.publish( &str_msg );
   nh.spinOnce();
}

2. 订阅话题

订阅话题的第一步是引用头文件创建回调函数

  • 所有rosserial消息的头文件都将位于ros_lib文件夹中的package_name/msg_name下。

    例如,应该通过#include <std_msgs/Float64.h>引用std_mgs/Float64。

  • 要定义回调,需要创建一个返回为void的函数,并将消息类型的常量引用作为其参数。

#include <std_msgs/Float64.h>
void messageCb(const std_msgs::Float64& msg)
  if(msg.data > 1.0)
    digitalWrite(13, HIGH-digitalRead(13));   // blink the led
}

  • 然后为了实际设置连接,必须创建一个静态分配的ros :: Subscriber,它是在你的消息类型上模板化的,并在setup()函数中调用NodeHandle :: subscribe
#include <ros.h>
ros::NodeHandle nh;

void messageCb(const std_msgs::Float64& msg)
  if(msg.data > 1.0)
    digitalWrite(13, HIGH-digitalRead(13));   // blink the led
}

ros::Subscriber<std_msgs::Float64> sub("your_topic", &messageCb);

void setup()
{
    ...
    nh.subscribe(sub);
    ...
}

在此程序的生命周期内,订阅者永远不会超出范围,这一点非常重要。如果超出范围,则在收到下一条消息时,程序将崩溃。
rosserial依赖于如订阅者一样的全局对象来绕过目标系统的有限内存。

相关标签: ros