ROS 消息通訊——發布者/訂閱者的來龍去脈


  • 創建工作空間和工作環境
1 mkdir -p ~/learning_ws/src  //工作環境及功能包建立、編譯
2 cd ~/learning_ws/    
3 catkin_make    
4 source devel/setup.bash    //設置環境變量
5 echo $ROS_PACKAGE_PATH    
6 cd ~/learning_ws/src
7 catkin_create_pkg ros_tutorials_topic message_generation std_msgs roscpp //創建功能包和依賴

 

 

  •  修改配置文件package.xml
 1 <?xml version="1.0"?>
 2 <package format="2">
 3   <name>ros_tutorials_topic</name>
 4   <version>0.1.0</version>
 5   <description>The ros_tutorials_topic package</description>
 6   <maintainer email="tianbot@todo.todo">Fuzhuoxin</maintainer> 
7 <license>Apache License 2.0</license>
8 <author email="tianbot@todo.todo">Fuzhuoxin</author>
9 <buildtool_depend>catkin</buildtool_depend>
10 <build_depend>message_generation</build_depend>
11 <build_depend>roscpp</build_depend>
12 <build_depend>std_msgs</build_depend>
13 <build_export_depend>roscpp</build_export_depend>
14 <build_export_depend>std_msgs</build_export_depend>
15 <exec_depend>roscpp</exec_depend>
16 <exec_depend>std_msgs</exec_depend>
17 <export></export>
18 </package>
//注釋解釋內容如下,在工程中不可直接復制,用上面無注釋版
1
<!-- xml版本聲明 --> 2 <?xml version="1.0"?> 3 <!-- 功能包標簽 --> 4 <package format="2"> 5 <!-- 功能包名稱 --> 6 <name>ros_tutorials_topic</name> 7 <!-- 功能包版本 --> 8 <version>0.0.0</version> 9 <!-- 功能包簡要說明 --> 10 <description>The ros_tutorials_topic package</description> 11 <!-- 功能包管理者信息 --> 12 <maintainer email="tianbot@todo.todo">tianbot</maintainer> 13 <!-- 記錄版本許可 --> 14 <license>Apache License 2.0</license> 15 <!-- 功能包說明的詳細地址、網頁、博客等 --> 16 <!-- <url type="website">https://www.cnblogs.com/fuzhuoxin/</url> --> 17 <!-- 開發人員信息 --> 18 <!-- <author email="jane.doe@example.com">Jane Doe</author> --> 19 <!-- 構建系統依賴關系,正在使用catkin構建 --> 20 <buildtool_depend>catkin</buildtool_depend> 21 <!-- 編寫功能包時所依賴的功能包名稱 --> 22 <build_depend>message_generation</build_depend> 23 <build_depend>roscpp</build_depend> 24 <build_depend>std_msgs</build_depend> 25 <build_export_depend>roscpp</build_export_depend> 26 <build_export_depend>std_msgs</build_export_depend> 27 <exec_depend>roscpp</exec_depend> 28 <exec_depend>std_msgs</exec_depend> 29 <export></export> 30 </package>

配置CMake文件:

 1 #版本要求
 2 cmake_minimum_required(VERSION 2.8.3)
 3 #工程名字
 4 project(ros_tutorials_topic)
 5 #添加依賴包message_generation  roscpp  std_msgs
 6 find_package(catkin REQUIRED COMPONENTS
 7   message_generation
 8   roscpp
 9   std_msgs
10 )
11 #聲明msg文件夾下的消息文件MsgTutorial.msg
12 add_message_files(
13    FILES 
14    MsgTutorial.msg
15  )
16 #設置依賴性消息
17 generate_messages(
18    DEPENDENCIES
19    std_msgs
20  )
21 #catkin功能包選項,描述庫、catkin構建依賴項和系統依賴的功能包
22 catkin_package(
23 
24   LIBRARIES ros_tutorials_topic
25   CATKIN_DEPENDS roscpp std_msgs
26 )
27 #設置包含目錄
28 include_directories(
29   ${catkin_INCLUDE_DIRS}
30 )
31 #配置可執行文件、目標鏈接庫和其他依賴性
32 add_executable(topic_publisher src/topic_publisher.cpp)
33 add_dependencies(topic_publisher ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
34 target_link_libraries(topic_publisher ${catkin_LIBRARIES})
35 
36 #配置可執行文件、目標鏈接庫和其他依賴性
37 add_executable(topic_subscriber src/topic_subscriber.cpp)
38 add_dependencies(topic_subscriber ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
39 target_link_libraries(topic_subscriber ${catkin_LIBRARIES})
  • 在CMakeLists.txt中添加了add_message_files( FILES  MsgTutorial.msg)因此要包含MsgTutorial.msg文件

 

 

內容為

1 time stamp
2 int32 data
3 string speak

 

  • 創建發布者節點:對應CMakeLists.txt中添加的add_executable(topic_publisher src/topic_publisher.cpp) 

 

 

 

 內容為:

 1 #include <ros/ros.h>
 2 #include <ros_tutorials_topic/MsgTutorial.h> //MsgTutorial消息頭文件(構建后自動生成)
 3 
 4 
 5 int main(int argc,char **argv)
 6 {
 7 ros::init(argc,argv,"topic_publisher"); //初始化發布者節點名稱
 8 ros::NodeHandle nh;//聲明節點句柄與ROS系統進行通訊
 9 //聲明發布者,創建一個使用ros_tutorials_topic功能包MsgTutorial消息文件的發布者
10 //ros_tutorial_pub,話題名稱是ros_tutorial_msg,消息發布者隊列設置為100
11 ros::Publisher ros_tutorial_pub = nh.advertise<ros_tutorials_topic::MsgTutorial>("ros_tutorial_msg", 100);
12 ros::Rate loop_rate(10);//設定循環周期10HZ,0.1秒
13 ros_tutorials_topic::MsgTutorial msg;//聲明一個消息
14 int count = 0;
15 std::stringstream talk;
16 while(ros::ok())
17 {
18 msg.stamp = ros::Time::now();//給MsgTutorial.msg文件中的消息變量賦值
19 msg.data = count;
20 talk << "How are you"<< count;
21 msg.speak = talk.str();
22 ROS_INFO("send msg = %d",msg.stamp.sec);//顯示消息
23 ROS_INFO("send msg = %d",msg.stamp.nsec);
24 ROS_INFO("send msg = %d",msg.data);
25 ROS_INFO("%s",msg.speak.c_str());
26 ros_tutorial_pub.publish(msg);//發布顯示的消息
27 ros::spinOnce();//循環等待訂閱節點的所有回調函數
28 loop_rate.sleep();    //按設定值循環    
29 ++count;
30 }
31 return 0;
32 }
  • 創建發布者節點:對應CMakeLists.txt中添加的add_executable(topic_publisher src/topic_publisher.cpp)

 

 

 內容為:

 1 #include <ros/ros.h>
 2 #include <ros_tutorials_topic/MsgTutorial.h>
 3 
 4 //回調函數
 5 void msgCallback(const ros_tutorials_topic::MsgTutorial::ConstPtr& msg)
 6 {
 7 ROS_INFO("recieve msg = %d",msg->stamp.sec);
 8 ROS_INFO("recieve msg = %d",msg->stamp.nsec);
 9 ROS_INFO("recieve msg = %d",msg->data);
10 ROS_INFO("I receive you say:[%s]",msg->speak.c_str());
11 }
12 int main(int argc,char **argv)
13 {
14 ros::init(argc,argv,"topic_subscriber");//初始化訂閱者節點
15 ros::NodeHandle nh;
16 //聲明訂閱者,創建一個使用ros_tutorials_topic功能包MsgTutorial消息文件的訂閱者
17 //ros_tutorial_sub,訂閱的話題名稱是ros_tutorial_msg,消息接收者隊列設置為100
18 ros::Subscriber ros_tutorial_sub = nh.subscribe<ros_tutorials_topic::MsgTutorial>("ros_tutorial_msg", 100, msgCallback);
19 ros::spin();//調用后台,等待接收消息
20 return 0; 21 }

運行效果:

 

 命令查看節點關系如圖所示:與程序的對應關系為

ros::init(argc,argv,"topic_publisher"); //初始化發布者節點名稱
話題名稱是ros_tutorial_msg
ros::init(argc,argv,"topic_subscriber");//初始化訂閱者節點

 

命令運行rostopic echo /ros_tutorial_msg,查看話題發布的消息,可以看到消息是連續發布的,只要建立了聯系,不會中斷,一直發布。

 

   用rqt插件同樣可以監控話題的消息內容

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM