1. 程式人生 > 其它 >建立簡單的釋出者和訂閱者

建立簡單的釋出者和訂閱者

建立釋出者和訂閱者

釋出者

  • 切換到軟體包src目錄,建立一個釋出節點
roscd <package_name>
cd src
touch talker.cpp
  • 釋出節點talker.cpp的內容如下
#include <ros/ros.h> // 匯入ROS系統包含核心公共檔案
#include <std_msgs/String.h> // 匯入std_msgs/String訊息標頭檔案,這個由std_msgs包的string.msg自動生成

#include <sstream>

int main(int argc, char **argv)
{

  ros::init(argc, argv, "talker"); // ROS節點初始化,指定節點名稱為"talker",節點名稱要保持唯一性


  ros::NodeHandle n; // 建立節點控制代碼


  ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000);
  // 建立一個Publisher,釋出名為chatter的topic,訊息型別為std_msgs::String,佇列長度10 

  ros::Rate loop_rate(10); // 指定釋出訊息的頻率

  int count = 0;
  while (ros::ok()) // 檢查節點是否應繼續執行,當接收到SIGINT(Ctrl+C)或者 ros::shutdown() 被呼叫時返回false
  {

    std_msgs::String msg; // 初始化std_msgs::String msg型別的訊息

    std::stringstream ss; // 初始化std::stringstream型別的訊息
    ss << "hello world " << count; // 定義字串流"hello world"並賦給ss
    msg.data = ss.str(); // 最後轉換為字串賦值給 msg.data

    ROS_INFO("%s", msg.data.c_str()); // 輸出除錯資訊


    chatter_pub.publish(msg); // 釋出訊息

    ros::spinOnce(); // 處理傳入訊息的回撥函, 不是必需要的,但是保持增加這個呼叫,是好習慣

    loop_rate.sleep(); // 按照迴圈頻率延時
    ++count;
  }

  return 0;
}

總結

  • 初始化ROS系統

  • 向ROSMaster註冊節點資訊,包括髮布的話題名和話題中的訊息型別

  • 建立訊息資料

  • 按照一定的頻率迴圈釋出訊息

訂閱者

  • 同樣
roscd <package_name>
cd src
touch listener.cpp
  • 訂閱節點listener.cpp的內容如下
#include <ros/ros.h> // 匯入ROS系統包含核心公共標頭檔案
#include <std_msgs/String.h> // 匯入std_msgs/String訊息標頭檔案,這個是由std_msgs包的string.msg檔案自動生成

// 接收到chatter話題的訊息後,回撥函式就會被呼叫並且收到的訊息會作為引數
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節點

  ros::NodeHandle n; // 建立節點控制代碼


  ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);
  // 建立一個Subscriber,訂閱名為chatter的topic,指定回撥函式chatterCallback


  ros::spin(); // 啟動自迴圈,等待回撥函式

  return 0;
}

總結

  • 初始化ROS節點
  • 訂閱需要的話題
  • 迴圈等待話題訊息,接收到資訊後進入回撥函式
  • 在回撥函式中完成訊息處理

修改CMakeList.txt

  • find_package依賴項
# 將message_generation加在括號閉合前
find_package(catkin REQUIRED COMPONENTS
   roscpp
   rospy
   std_msgs
   message_generation
)
  • 呼叫生成的訊息
generate_messages(
  DEPENDENCIES
  std_msgs
)
  • 設定生成可執行檔案和連結庫(新增到CMakeLists.txt檔案的底部)
add_executable(talker src/talker.cpp)
target_link_libraries(talker ${catkin_LIBRARIES})

add_executable(listener src/listener.cpp)
target_link_libraries(listener ${catkin_LIBRARIES})