我们在刚刚创建的learning_communication文件下编写文件listener.cpp talker.cpp;其中talker.cpp
1 /** 2 * 该例程将发布chatter话题,消息类型String 3 */ 4 5 #include <sstream> 6 #include "ros/ros.h" 7 #include "std_msgs/String.h" 8 9 int main(int argc, char **argv) 10 { 11 // ROS节点初始化 12 ros::init(argc, argv, "talker"); 13 14 // 创建节点句柄 15 ros::NodeHandle n; 16 17 // 创建一个Publisher,发布名为chatter的topic,消息类型为std_msgs::String 18 ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000); 19 20 // 设置循环的频率 21 ros::Rate loop_rate(10); 22 23 int count = 0; 24 while (ros::ok()) 25 { 26 // 初始化std_msgs::String类型的消息 27 std_msgs::String msg; 28 std::stringstream ss; 29 ss << "hello world " << count; 30 msg.data = ss.str(); 31 32 // 发布消息 33 ROS_INFO("%s", msg.data.c_str()); 34 chatter_pub.publish(msg); 35 36 // 循环等待回调函数 37 ros::spinOnce(); 38 39 // 按照循环频率延时 40 loop_rate.sleep(); 41 ++count; 42 } 43 44 return 0; 45 }
listener.cpp
1 /** 2 * 该例程将订阅chatter话题,消息类型String 3 */ 4 5 #include "ros/ros.h" 6 #include "std_msgs/String.h" 7 8 // 接收到订阅的消息后,会进入消息回调函数 9 void chatterCallback(const std_msgs::String::ConstPtr& msg) 10 { 11 // 将接收到的消息打印出来 12 ROS_INFO("I heard: [%s]", msg->data.c_str()); 13 } 14 15 int main(int argc, char **argv) 16 { 17 // 初始化ROS节点 18 ros::init(argc, argv, "listener"); 19 20 // 创建节点句柄 21 ros::NodeHandle n; 22 23 // 创建一个Subscriber,订阅名为chatter的topic,注册回调函数chatterCallback 24 ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback); 25 26 // 循环等待回调函数 27 ros::spin(); 28 29 return 0; 30 }
1 cd ~/catkin_ws 2 catkin_make
编译成功后。
我们打开三个终端:
1 ## 第一个终端 2 3 roscore 4 5 ## 第二个终端 6 7 source ~/catkin_ws/devel/setup.bash 8 rosrun learning_communication talker 9 10 ## 第三个终端 11 12 source ~/catkin_ws/devel/setup.bash 13 rosrun learning_communication listener
请一定要记得,重新source!!!!!
如图,左边是talker,右边是listener。