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 |