ROS main函数中订阅器的编写.md
编写步骤
- 初始化ROS系统
- 订阅 chatter 话题
- 进入自循环,等待消息的到达
- 当消息到达,调用 chatterCallback() 函数
示例
#include "ros/ros.h"
#include "std_msgs/String.h"
void chatterCallback(const std_msgs::String::ConstPtr& msg)
{
ROS_INFO("I heard: [%s]", msg->data.c_str());
}
int main(int argc, char **argv)
{
ros::init(argc, argv, "listener");
ros::NodeHandle n;
ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);
ros::spin();
return 0;
}
订阅器
ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);
功能:告诉 master节点我们要订阅 chatter 话题上的消息。当有消息发布到这个话题时,ROS 就会调用 chatterCallback()
函数。第二个参数是队列大小,以防我们处理消息的速度不够快,当缓存达到 1000 条消息后,再有新的消息到来就将开始丢弃先前接收的消息。
返回对象:NodeHandle::subscribe()
返回 ros::Subscriber
对象,你必须让它处于活动状态直到你不再想订阅该消息。当这个对象销毁时,它将自动退订 chatter 话题的消息。
有各种不同的 NodeHandle::subscribe() 函数,允许你指定类的成员函数,甚至是 Boost.Function
对象可以调用的任何数据类型。roscpp overview 提供了更为详尽的信息。
循环接收
ros::spin()
ros::spin() 进入自循环,可以尽可能快的调用消息回调函数。如果没有消息到达,它不会占用很多 CPU,所以不用担心。一旦 ros::ok() 返回 false,ros::spin() 就会立刻跳出自循环。这有可能是 ros::shutdown() 被调用,或者是用户按下了 Ctrl-C,使得 master 告诉节点要终止运行。也有可能是节点被人为关闭的。
还有其他的方法进行回调,但在这里我们不涉及。想要了解,可以参考 roscpp_tutorials package 里的一些 demo 应用。需要更为详尽的信息,可以参考 roscpp overview。
回调函数
void chatterCallback(const std_msgs::String::ConstPtr& msg)
{
ROS_INFO("I heard: [%s]", msg->data.c_str());
}
这是一个回调函数,当接收到 chatter 话题的时候就会被调用。消息是以 boost shared_ptr 指针的形式传输,这就意味着你可以存储它而又不需要复制数据。
不同消息回调函数的参数写法
消息类型 | 回调函数参数 |
---|---|
std_msgs::String | const std_msgs::String::ConstPtr& msg |
sensor_msgs::Image | const sensor_msgs::ImageConstPtr& msg |
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。