建立簡單的釋出者和訂閱者
阿新 • • 發佈:2021-11-11
建立釋出者和訂閱者
釋出者
- 切換到軟體包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})