ROS main函数中订阅器的编写.md缓存
#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 提供了更为详尽的信息。code
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 指针的形式传输,这就意味着你能够存储它而又不须要复制数据。get
消息类型 | 回调函数参数 |
---|---|
std_msgs::String | const std_msgs::String::ConstPtr& msg |
sensor_msgs::Image | const sensor_msgs::ImageConstPtr& msg |