在/home/catkin_ws/src/learning_comnunication/src 编写源码文件;
其中talker.cpp 与 listener.cpp 是发布者与订阅者实现
talker实现如下
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实现如下:
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 }
在/home/catkin_ws/src/learning_comnunication 中的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})
在/home/catkin_ws下编译、运行
catkin_make
在三个终端分别执行以下命令:
1 roscore 2 rosrun learning_communication talker 3 rosrun learning_communication listener
在新终端执行
root@sry:~# rosrun learning_communication talker
报错:
[rosrun] Couldn't find executable named talker below /root/catkin_ws/src/learning_communication
经过痛苦查找,发现我的功能包名字叫: learning_comnunication
上述的rosrun learning_communication talker 会查找根目录下那个相关文件夹;所以控制台报错
说在XXXXX路径下找不到可执行文件 talker
【将错就错】
rosrun learning_comnunication talker
rosrun learning_comnunication listener
以下是消息定义:
##########3话题消息定义#############
在 /home/catkin_ws/src/learning_communication
mkdir msg
##创建消息文件Person.msg
文件中添加以下内容并保存
1 string name 2 uint8 sex 3 uint8 age 4 5 uint8 unknown = 0 6 uint8 male = 1 7 uint8 female = 2
#在 /home/catkin_ws/src/learning_communication/package.xml添加依赖【注意添加位置,否则无效】
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
#在 /home/catkin_ws/src/learning_communication/CMakeLists.txt 中添加编译选项
find_package( …… message_generation)
catkin_package(CATKIN_DEPENDS geometry_msgs roscpp rospy std_msgs message_runtime)
add_message_files(FILES Person.msg)
generate_messages(DEPENDENCIES std_msgs)
消息定义: