准备工作
创建工作空间
mkdir -p demo02_pub/src/
生成依赖文件
cd demo02_pub/
catkin_make
进入src目录执行
catkin_create_pkg ros_pub_sub/ roscpp rospy std__msgs
发布者实现
消息发布代码编写
cd demo02_pub/src/ros_pub_sub/src
创建代码文件demo01_pub.cc
#include"ros/ros.h"
#include"std_msgs/String.h"int main(int argc,char* argv[]){// 初始化ros节点ros::init(argc,argv,"lidar_node");// 创建节点句柄ros::NodeHandle lidar_node_handle;// 创建发布者对象ros::Publisher lidar_node_pub=lidar_node_handle.advertise<std_msgs::String>("lidar_msg",10);// 封装消息std_msgs::String lidar_msg;while(ros::ok()){lidar_msg.data="hello,this is lidar message!";lidar_node_pub.publish(lidar_msg);}return 0;
}
修改CMakeLists.txt
编译测试
返回工作空间根目录执行
catkin_make
source ./devel/setup.bash
打开一个新的终端,开启ros
roscore
返回工作空间根目录执行
rosrun ros_pub_sub demo01_pub_node
由于我们暂时没有实现订阅者,因此暂时使用ros内置命令模拟消息订阅
在新的终端中执行
rostopic echo lidar_msg
修改发布代码
设置发布者的数据发布频率,修改代码如下
#include"ros/ros.h"
#include"std_msgs/String.h"
#include<sstream>int main(int argc,char* argv[]){// 防止中文乱码setlocale(LC_ALL,"");// 初始化ros节点ros::init(argc,argv,"lidar_node");// 创建节点句柄ros::NodeHandle lidar_node_handle;// 创建发布者对象ros::Publisher lidar_node_pub=lidar_node_handle.advertise<std_msgs::String>("lidar_msg",10);// 设置发布频率,以10hz的频率发布消息ros::Rate rate(10);// 封装消息std_msgs::String lidar_msg;int count=0;while(ros::ok()){count++;std::stringstream ss;ss<<count<<">>>hello,this is lidar message!";lidar_msg.data=ss.str();lidar_node_pub.publish(lidar_msg);ROS_INFO("数据发布成功:%s",ss.str().c_str());rate.sleep();}return 0;
}
重新编译执行
订阅者实现
创建代码文件
内容如下
#include "ros/ros.h"
#include "std_msgs/String.h"void LidarMsgHandle(const std_msgs::String::ConstPtr & msg){ROS_INFO("订阅的数据为%s",msg->data.c_str());
}int main(int argc,char* argv[]){// 防止中文乱码setlocale(LC_ALL,"");// 初始化ros节点ros::init(argc,argv,"lidar_sub_node");// 创建节点句柄ros::NodeHandle lidar_sub_node_handle;// 创建消息订阅对象ros::Subscriber lidar_sub_node_sub=lidar_sub_node_handle.subscribe("lidar_msg",10,LidarMsgHandle);// 消息回调处理ros::spin();return 0;
}
修改cmake文件
编译运行
详细讲解参考
042话题通信(C++)3_订阅方实现_Chapter2-ROS通信机制_哔哩哔哩_bilibili