ROS回顾与整理《三、SLAM相关工具箱》

在/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)

消息定义:

原文地址:https://www.cnblogs.com/winslam/p/10118484.html