1. 程式人生 > >ROS的話題(Topic)

ROS的話題(Topic)

學習以色列一位博士Mr. Roi Yehoshua的ROS教程:
http://u.cs.biu.ac.il/~yehoshr1/89-685/ 裡面有PPT以及原始碼,非常詳細。
ROS程式往往有許多個功能模組組成,這些功能模組成為節點(Node)。
ROS中的話題(Topic),就是Node之間資訊傳輸的方式。
Topic是一對多的傳輸方式。即一個話題的釋出者,可以由多個訂閱者來訂閱。
比如,機器人現在左轉,現在有一個名為”方向”的釋出者,向所有訂閱者釋出“左轉”這條資訊。方向控制器作為一個訂閱者,收到訊息後,就控制系統左轉;雲臺作為一個訂閱者,得知訊息後,也同時控制攝像頭往左轉,觀測前方是否有障礙。

一個簡單的釋出者程式碼如下:

ros::init(argc, argv, "talker"); // 初始化一個名為“talker”的節點
ros::NodeHandle node;
ros::Publisher chatter_pub = node.advertise<std_msgs::String>("chatter", 1000);//釋出一個名為chatter的話題,傳送緩衝區最多有1000個,也就是最多有1000個訊息等待發布
ros::Rate loop_rate(10); //迴圈頻率控制物件,控制while迴圈一秒迴圈10次
int count = 0;
while (ros::ok()) //ros::ok()只有當用戶按下Crtl+C按鍵時,才會返回false,迴圈終止
{ std_msgs::String msg; std::stringstream ss; ss << "hello world " << count; msg.data = ss.str(); ROS_INFO("%s", msg.data.c_str()); chatter_pub.publish(msg); ros::spinOnce(); // 執行這條函式的意義在於,讓主執行緒暫停,處理來自訂閱者的請求 loop_rate.sleep(); // 執行執行緒休眠 count++; }

一個簡單的訂閱者程式碼為:

#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) { // 初始化一個名為"listener"的節點 ros::init(argc, argv, "listener"); ros::NodeHandle node; ros::Subscriber sub = node.subscribe("chatter", 1000, chatterCallback); // 訂閱上面編寫的,名為“chatter”的話題,最多有1000條訊息等待處理 ros::spin();//spin把程式的控制權交給了ROS。 //ROS中沒有thread介面,只提供了這種方法 //在另一個執行緒中監聽message的釋出,當收到訊息時 //便出發回撥函式,執行對應的動作 return 0; }