首先在~/demo01_ws/src/learning_communication/src中创立订阅者的cpp文件。
vim listener.cpp
----------------------------------
#include"ros/ros.h"
#include<sstream>
#include "std_msgs/String.h"
void chatterCallback(const std_msgs::String::ConstPtr &msg){
ROS_INFO("I heard: [%s]",msg->data.c_str());
}
int main(int argc, char* argv[]){
ros::init(argc,argv,"listener");
ros::NodeHandle n;
ros::Subscriber sub=n.subscribe("chatter",1000,&chatterCallback);
//cout<<111;
//while(ros::ok()){
//loop_rate.sleep();
ros::spin();
//}
return 0;
}
此时同样修改CMakeList.txt(与发布时同一个)
add_executable(listener src/listener.cpp)
target_link_libraries(listener
${catkin_LIBRARIES}
)
add_dependencies(listener ${PROJECT_NAME}_generate_messages_cpp ${catkin_EXPORTED_TARGETS})
之后先进行catkin_make进行编译;对发布和订阅前都要进行source ./devel/setup.bash,之后再进行rosrun learning_communication talker 和rosrun learning_communication listener,注意要先运行发布再运行订阅,同时注意,两者要同时运行
这样基本就能实现发布和订阅了
---------------------------------------------------
补充:因为订阅者在发布者处注册需要时间,所以可能一开始的数据无法接受到,此时我们可以在发布者的cpp文档中的while循环前加上ros::Duration(1).sleep(); 使订阅者有时间注册而不错过数据
该篇博客介绍了如何在ROS环境中创建一个订阅者节点,通过编辑listener.cpp文件并实现回调函数来接收消息。同时,更新CMakeList.txt以编译项目,并强调了运行时先启动发布者后启动订阅者的重要性,以确保数据的正确传递。此外,还提到为了防止订阅者错过数据,可以在发布者循环前添加延迟。
3581

被折叠的 条评论
为什么被折叠?



