-
写发布器
在src文件夹中创建talker.cpp,并写入以下代码:
1 #include "ros/ros.h" 2 #include "std_msgs/String.h" 3 4 #include <sstream> 5 6 /** 7 * This tutorial demonstrates simple sending of messages over the ROS system. 8 */ 9 int main(int argc, char **argv) 10 { 11 /** 12 * The ros::init() function needs to see argc and argv so that it can perform 13 * any ROS arguments and name remapping that were provided at the command line. 14 * For programmatic remappings you can use a different version of init() which takes 15 * remappings directly, but for most command-line programs, passing argc and argv is 16 * the easiest way to do it. The third argument to init() is the name of the node. 17 * 18 * You must call one of the versions of ros::init() before using any other 19 * part of the ROS system. 20 */ 21 ros::init(argc, argv, "talker"); 22 23 /** 24 * NodeHandle is the main access point to communications with the ROS system. 25 * The first NodeHandle constructed will fully initialize this node, and the last 26 * NodeHandle destructed will close down the node. 27 */ 28 ros::NodeHandle n; 29 30 /** 31 * The advertise() function is how you tell ROS that you want to 32 * publish on a given topic name. This invokes a call to the ROS 33 * master node, which keeps a registry of who is publishing and who 34 * is subscribing. After this advertise() call is made, the master 35 * node will notify anyone who is trying to subscribe to this topic name, 36 * and they will in turn negotiate a peer-to-peer connection with this 37 * node. advertise() returns a Publisher object which allows you to 38 * publish messages on that topic through a call to publish(). Once 39 * all copies of the returned Publisher object are destroyed, the topic 40 * will be automatically unadvertised. 41 * 42 * The second parameter to advertise() is the size of the message queue 43 * used for publishing messages. If messages are published more quickly 44 * than we can send them, the number here specifies how many messages to 45 * buffer up before throwing some away. 46 */ 47 ros::Publisher chatter_pub = n.advertise<std_msgs::String>("chatter", 1000); 48 49 ros::Rate loop_rate(10); 50 51 /** 52 * A count of how many messages we have sent. This is used to create 53 * a unique string for each message. 54 */ 55 int count = 0; 56 while (ros::ok()) 57 { 58 /** 59 * This is a message object. You stuff it with data, and then publish it. 60 */ 61 std_msgs::String msg; 62 63 std::stringstream ss; 64 ss << "hello world " << count; 65 msg.data = ss.str(); 66 67 ROS_INFO("%s", msg.data.c_str()); 68 69 /** 70 * The publish() function is how you send messages. The parameter 71 * is the message object. The type of this object must agree with the type 72 * given as a template parameter to the advertise<>() call, as was done 73 * in the constructor above. 74 */ 75 chatter_pub.publish(msg); 76 77 ros::spinOnce(); 78 79 loop_rate.sleep(); 80 ++count; 81 } 82 83 84 return 0; 85 }
代码解释:暂空
-
写订阅器
同上,写入listener.cpp
#include "ros/ros.h" #include "std_msgs/String.h" /** * This tutorial demonstrates simple receipt of messages over the ROS system. */ void chatterCallback(const std_msgs::String::ConstPtr& msg) { ROS_INFO("I heard: [%s]", msg->data.c_str()); } int main(int argc, char **argv) { /** * The ros::init() function needs to see argc and argv so that it can perform * any ROS arguments and name remapping that were provided at the command line. * For programmatic remappings you can use a different version of init() which takes * remappings directly, but for most command-line programs, passing argc and argv is * the easiest way to do it. The third argument to init() is the name of the node. * * You must call one of the versions of ros::init() before using any other * part of the ROS system. */ ros::init(argc, argv, "listener"); /** * NodeHandle is the main access point to communications with the ROS system. * The first NodeHandle constructed will fully initialize this node, and the last * NodeHandle destructed will close down the node. */ ros::NodeHandle n; /** * The subscribe() call is how you tell ROS that you want to receive messages * on a given topic. This invokes a call to the ROS * master node, which keeps a registry of who is publishing and who * is subscribing. Messages are passed to a callback function, here * called chatterCallback. subscribe() returns a Subscriber object that you * must hold on to until you want to unsubscribe. When all copies of the Subscriber * object go out of scope, this callback will automatically be unsubscribed from * this topic. * * The second parameter to the subscribe() function is the size of the message * queue. If messages are arriving faster than they are being processed, this * is the number of messages that will be buffered up before beginning to throw * away the oldest ones. */ ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback); /** * ros::spin() will enter a loop, pumping callbacks. With this version, all * callbacks will be called from within this thread (the main one). ros::spin() * will exit when Ctrl-C is pressed, or the node is shutdown by the master. */ ros::spin(); return 0; }
-
生成发布器和订阅器
编辑CMakeList如下:
find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs message_generation ) catkin_package( # INCLUDE_DIRS include # LIBRARIES beginner_tutorials CATKIN_DEPENDS roscpp rospy std_msgs message_runtime # DEPENDS system_lib ) include_directories( include ${catkin_INCLUDE_DIRS} ) add_executable(talker src/talker.cpp) target_link_libraries(talker ${catkin_LIBRARIES}) add_dependencies(talker beginner_tutorials_generate_messages_cpp) add_executable(listener src/listener.cpp) target_link_libraries(listener ${catkin_LIBRARIES}) add_dependencies(listener beginner_tutorials_generate_messages_cpp) add_dependencies(talker beginner_tutorials_generate_messages_cpp) add_message_files( FILES Num.msg ) add_service_files( FILES AddTwoInts.srv ) generate_messages( DEPENDENCIES std_msgs )
在工作空间中编辑通过即可。
Done!
参考链接:http://wiki.ros.org/ROS/Tutorials/WritingPublisherSubscriber%28c%2B%2B%29
浙公网安备 33010602011771号