话题通信(实时不断传输信息)
1.编写发布方
2.编写订阅方
3.配置文件并执行
建一个文档
1.编写发布方
1.包含头文件
2.初始化节点
3.创建句柄
4.创建发布者
5.编辑发布的数据
//1.包含头文件
#include "ros/ros.h"
#include "std_msgs/String.h"
int main(int argc, char **argv[])
{
//2.初始化节点
ros::init(argc, argv, "talker");
/、3.创建句柄
ros::NodeHandle nh;
//4.创建发布者对象ros::Publisher pub = nh.advertise<功能包名称::泛型>("话题名");
ros::Publisher chatter_pub = n.advertise<std_msgs::String>("xinXi", 10);
//编辑发布数据
std_msgs::String msg;
//当ros节点存活时就发送
while(ros::ok)
{
msg.data = "hello";
pub.publish(msg);
}
return 0;
}
再建一个文档
2.编写订阅方
1.包含头文件
2.初始化节点
3.创建句柄
4.创建订阅者
5.处理订阅信息
// 1.包含头文件
#include "ros/ros.h"
#include "std_msgs/String.h"
void doMsg(const std_msgs::String::ConstPtr &msg)
{
ROS_INFO("收到数据为:%s",msg_p->data.c_str());
}
int main(int argc, char *argv[])
{
//不加这一行输出的汉字会变成乱码
setlocale(LC_ALL,"");
//2.初始化 ROS 节点:命名
ros::init(argc,argv,"listener");
//3.实例化 ROS 句柄
ros::NodeHandle nh;
//4.实例化 订阅者 对象
ros::Subscriber sub = nh.subscribe<std_msgs::String>("话题名",10,doMsg);
//5.处理订阅的消息(回调函数 doMsg)
ros::spin();
return 0;
}
配置CMakeLists文件
# add_executable(${PROJECT_NAME}_node src/test01_pub_node.cpp)
改为:
add_executable(发布者功能文件名 src/发布者功能文件名.cpp)
add_executable(订阅者功能文件名 src/订阅者功能文件名.cpp)
target_link_libraries(${PROJECT_NAME}
# ${catkin_LIBRARIES}
)
改为:
target_link_libraries(发布者功能文件名
${catkin_LIBRARIES}
)
target_link_libraries(订阅者功能文件名
${catkin_LIBRARIES}
)
最后在工作空间下进行编译就可以执行了