ROS main函數中訂閱器的編寫

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 提供了更爲詳盡的信息。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
相關文章
相關標籤/搜索