ROS-rosserial概述(3)
程序员文章站
2022-07-12 09:43:05
...
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-rosserial概述(5)