ROS学习(5)——话题消息与服务

news2024/10/6 18:28:17

节点之间的消息通信分为几种形式:

  • 话题(topic):单向消息发送/接收方式
  • 服务(service):双向消息请求/响应方式
  • 动作(action):双向消息目标(goal)/结果(result)/反馈(feedback)方式
  • 参数服务器(参数共享模式)

种类区别
话题异步单向连续单向的发送/接收数据的情况
服务同步双向        `需要对请求给出即时相应的情况
动作异步双向   

请求与响应之间需要太长的时间,所以难以使用服务的情况,

或需要中途返回值的情况

节点通信的过程

一、运行主节点

节点之间的消息通信当中,管理连接信息的主节点是使用 ROS 必须首先运行的必需元
素。ROS 主节点使用 roscore 命令来运行,并使用 XMLRPC 运行服务器。

主节点为了节点与节点的连接,会注册节点的名称、话题、消息类型、 URI 地址和端口,
并在有请求时将此信息通知给其他节点。

 二、运行发布者节点

发布者节点使用 rosrun 或 roslaunch 命令来运行。发布者节点向主节点注册发布者节
点名称、话题名称、消息类型、URI 地址和端口。主节点和节点使用 XMLRPC 进行通
信。

  三、运行订阅者节点

订阅者节点使用 rosrun 或 roslaunch 命令来运行。订阅者节点在运行时向主节点注册其订阅者节点名称、话题名称、消息类型、 URI 地址和端口。主节点和节点使用 XMLRPC
进行通信。

四、通知发布者信息

主节点向订阅者节点发送此订阅者希望访问的发布者的名称、话题名称、消息类型、
URI 地址和端口等信息。主节点和节点使用 XMLRPC 进行通信。

 五、订阅者节点的连接请求

订阅者节点根据从主节点接收的发布者信息,向发布者节点请求直接连接。在这种情况下,要发送的信息包括订阅者节点名称、话题名称和消息类型。发布者节点和订阅
者节点使用 XMLRPC 进行通信。

六、发布者节点的连接响应

发布者节点将 TCP 服务器的 URI 地址和端口作为连接响应发送给订阅者节点。发布者
节点和订阅者节点使用 XMLRPC 进行通信。

 七、TCPROS 连接

订阅者节点使用 TCPROS 创建一个与发布者节点对应的客户端,并直接与发布者节点
连接。节点间通信使用一种称为 TCPROS 的 TCP/IP 方式。

  八、发送消息

发布者节点向订阅者节点发送消息。节点间通信使用一种称为 TCPROS 的 TCP/IP
方式。

下面是实现者(Publisher)发布话题和接收者(Subcriber)接收话题的例子

一、发布者

#include "ros/ros.h"
#include "std_msgs/String.h"
#include <sstream>

int main(int argc, char *argv[])
{
    // 1.设置编码
    setlocale(LC_ALL,"");

    //2.初始化 ROS 节点:命名(唯一)
    // 参数 1 和参数 2 后期为节点传值会使用
    // 参数 3 是节点名称,是一个标识符,需要保证运行后,在 ROS 网络拓扑中唯一
    ros::init(argc, argv, "publisher");

    //3.实例化 ROS 句柄
    ros::NodeHandle nh;  //该类封装了 ROS 中的一些常用功能

    //4.实例化 发布者 对象
    //泛型: 发布的消息类型
    //参数 1: 要发布到的话题
    //参数 2: 队列中最大保存的消息数,超出此阈值时,先进的先销毁(时间早的先销毁)
    ros::Publisher pub = nh.advertise<std_msgs::String>("chatter",10);

    //5.组织被发布的数据,并编写逻辑发布数据
    //数据(动态组织)
    std_msgs::String msg;
    std::string msg_front = "Hello,你好啊!";  // 消息前缀
    int count = 0;  //消息计数器

    //逻辑(一秒 10 次)
    ros::Rate r(1);

    //节点不死;
    while(ros::ok())
    {
        //使用 stringstream 拼接字符串与编号
        std::stringstream ss;
        ss<<msg_front<<count;
        msg.data = ss.str();
        //发布消息
        pub.publish(msg);
        //加入调试,打印发送的消息
        ROS_INFO("发送的消息:%s",msg.data.c_str());

        //根据前面制定的发送贫频率自动休眠 休眠时间 = 1/频率;
        r.sleep();
        count++;//循环结束前,让 count 自增
        ros::spinOnce();
    }
    return 0;
}

二、接收者

// 1.包含头文件
#include "ros/ros.h"
#include "std_msgs/String.h"

void doMsg(const std_msgs::String::ConstPtr& msg_p){
    ROS_INFO("我订阅:%s",msg_p->data.c_str());
    // ROS_INFO("我听见:%s",(*msg_p).data.c_str());
}

int main(int argc, char *argv[])
{
    setlocale(LC_ALL,"");
    //2.初始化 ROS 节点:命名(唯一)
    ros::init(argc,argv,"subscriber");
    //3.实例化 ROS 句柄
    ros::NodeHandle nh;
    //4.实例化 订阅者 对象
    ros::Subscriber sub = nh.subscribe<std_msgs::String>("chatter",10,doMsg);
    //5.处理订阅的消息(回调函数)

    //6.设置循环调用回调函数

    ros::spin(); //循环读取接收的数据,并调用回调函数处理
    return 0;
}

三、CMakeLists文件编写(不会的小伙伴可以参考ROS学习(3)——CMakeLists文件的编写)

cmake_minimum_required(VERSION 3.0.2)
project(hello)

## Find catkin macros and libraries
## if COMPONENTS list like find_package(catkin REQUIRED COMPONENTS xyz)
## is used, also find other catkin packages
find_package(catkin REQUIRED COMPONENTS
  roscpp
  rospy
  std_msgs
)

catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES hello
#  CATKIN_DEPENDS roscpp rospy std_msgs
#  DEPENDS system_lib
)

## Declare a C++ executable
## With catkin_make all packages are built within a single CMake context
## The recommended prefix ensures that target names across packages don't collide
add_executable(publish_man src/publish_man.cpp)
add_executable(subscrib_man src/subscrib_man.cpp)

## Specify libraries to link a library or executable target against
target_link_libraries(publish_man
  ${catkin_LIBRARIES}
)
target_link_libraries(subscrib_man
  ${catkin_LIBRARIES}
)

四、编写launch文件(不会的小伙伴可以参考ROS学习(4)——launch文件的编写)

<launch>
    <node pkg="hello" type="publish_man" name="pub" output="screen" />
    <node pkg = "hello" type = "subscrib_man" name = "sub" output = "screen" />
</launch>

 五、在终端运行launch文件:

source ./devel/setup.bash
roslaunch <功能包名> <launch文件名.launch>

得到运行结果如下:

 实现了发布消息和接收消息的过程。

需要注意的几点:

1.main函数自动补齐的格式是

int main(int argc, char const *argv[]){}

我们需要把里面的const给删掉。

2.第一条数据丢失

原因是发送第一条数据时,publisher还没有在roscore注册完毕。

解决方法是,注册后,加入休眠 ros::Duration(3.0).sleep(); 延迟第一条数据的发送。

3.出现错误ros/ros.h No such file or directory

检查CMakeLists里面是否有重复的部分,将其删除。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/552596.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【重生之我是蜘蛛侠】手把手教你用python爬虫,跟着做就好了

&#x1f4af; 博客内容&#xff1a;【LeetCode训练营】用栈来实现队列用队列来实现栈 详解 &#x1f600; 作  者&#xff1a;陈大大陈 &#x1f680; 个人简介&#xff1a;一个正在努力学技术的准前端&#xff0c;专注基础和实战分享 &#xff0c;欢迎私信&#xff01; &am…

高可用架构之异地多活

大家好&#xff0c;我是易安&#xff01; 当谈到架构的高可用时&#xff0c;无论是高可用计算架构&#xff0c;还是高可用存储架构&#xff0c;其本质的设计目的都是为了解决部分服务器故障的场景下&#xff0c;如何保证系统能够继续提供服务。但在一些极端场景下&#xff0c;有…

MySQL高级篇第一天

目录 一、索引 二、索引结构 三、索引分类 四、索引语法 五、索引设计原则 六、视图 七、存储过程与概述 八、触发器 九、总结 一、索引 &#xff08;一&#xff09;索引概述 索引是一种能够帮组Mysql高效的从磁盘上查询数据的一种数据结构&#xff0c;这些数据结构以某…

Life of a Packet in Kubernetes - Calico网络进阶(注解版)

目录 Topics — Part 2 CNI Requirements BIRD (BGP) ConfD Felix Routing Modes IP-in-IP (Default) NoEncapMode VXLAN Demo — IPIP and UnEncapMode Demo — VXLAN Disclaimer References As we discussed in Part 1, CNI plugins play an essential role in …

【面试题】Redis过期删除与内存淘汰

文章目录 Redis过期删除策略&#x1f64e;‍♂️面试官&#xff1a;如何设置key的过期时间&#xff1f;&#x1f64e;‍♂️面试官&#xff1a;什么是Redis过期删除策略&#xff1f;&#x1f64e;‍♂️面试官&#xff1a;过期的key存放到哪里/如何判断key是否过期&#xff1f;…

又到了择业的时候

前言 记得2020年的时候&#xff0c;第一次买房背上贷款&#xff0c;一共一百多万连利息将近两百万&#xff0c;突然就有了危机感&#xff0c;不自觉的会考虑如果我的人生有什么重大变故&#xff0c;我的家人会怎么办&#xff1f;他们承担每个月的房贷月供吗&#xff1f;还是被…

ciscn_2019_es_2

小白垃圾做题笔记&#xff0c;不及建议阅读。 声明&#xff0c;exp来自网络&#xff0c;调试过程自己调试&#xff0c;对于题目的理解仅供参考。由于本人也是小白&#xff0c;且pwn全靠自己摸索&#xff0c;所以有很多理解不到位的地方。如有错误&#xff0c;欢迎指正。 1.做…

新星计划2023【网络应用领域基础】——————Day1

网络应用基础讲解 前言 什么是网络&#xff1f; 什么是网络&#xff0c;网络是什么&#xff1f;能为我们做什么&#xff1f;带着疑问博主一一给你解决 这一章我将带你了解古代人是如何利用“网络”通信的&#xff0c;网络的发展史&#xff0c;osi七层模型&#xff0c;带你了解T…

【2023/05/21】simula

Hello&#xff01;大家好&#xff0c;我是霜淮子&#xff0c;2023倒计时第16天。 本文将讨论一个广泛关注的话题&#xff0c;即在信息安全领域中如何使用Simula工具进行攻击模拟和威胁情报分析。在这篇文章中&#xff0c;我们将介绍Simula的概念、原理和应用&#xff0c;评价其…

RK3568平台开发系列讲解(驱动基础篇)RK平台RTC的使用

🚀返回专栏总目录 文章目录 一、HYM8563模块二、HYM8563模块三、接口使用3.1 sysfs 接口3.2 procfs 接口3.3 ioctl 接口沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将对RK RTC的使用进行学习。 一、HYM8563模块 ROC-RK3568-PC开发板采用HYM8563作为RTC(Rea…

Android Codelabs

Android Codelabs 提供引导式、教程式、实践编码体验。将引导您完成构建小型应用程序或向现有应用程序添加新功能的过程。该项目将持续收集并整理有关 Android Codelabs 相关文章&#xff0c;提供给感兴趣的读者进行阅读。 使用 Kotlin 进行高级 Android 开发 本课程提供了一…

gcc确认编译器默认头文件

文章目录 1. 背景2. gcc 空编译查看3. 总结 gcc确认编译器默认头文件 1. 背景 linux下查看编译时依赖的头文件&#xff0c;可以直接使用 -Iinclude_path进行指定&#xff0c;没有指定的会从默认头文件位置去查找&#xff0c;如果还找不到&#xff0c;就会报错。那么&#xff0c…

【C++进阶】多态详解(下)

文章目录 单继承中的虚函数表多继承中的虚函数表动态绑定与静态绑定问题探究第一步&#xff1a;观察普通调用的汇编代码第二步&#xff1a;观察ptr1的汇编代码&#xff1a;第三步:观察ptr2的汇编代码&#xff1a;总结&#xff1a; 继承和多态常见的面试问题 单继承中的虚函数表…

Linux:shell之编程免交互

Linux&#xff1a;shell之编程免交互 一、Here Document 免交互1.1 Here Document 免交互概述1.2 语法格式1.3 操作 二、Expect 命令2.1 Expect 概述2.2 基本命令2.3 操作 一、Here Document 免交互 1.1 Here Document 免交互概述 使用I/O重定向的方式将命令列表提供给交互式…

ACM 1011 | 最大公约数与最小公倍数

文章目录 0x00 前言 0x01 题目描述 0x02 问题分析 0x03 代码设计 0x04 完整代码 0x05 运行效果 0x06 总结 0x00 前言 C 语言网不仅提供 C 语言&#xff0c;还包括 C 、 java 、算法与数据结构等课程在内的各种入门教程、视频录像、编程经验、编译器教程及软件下载、题解博…

2023上海市大学生网络安全大赛—ssql题解

Part1前言 上海市大学生网络安全大赛的一道 pwn 题目&#xff0c;题目用了双向链表&#xff08;猜到是 Unlink 漏洞&#xff09;。 还算比较简单&#xff0c;主要是分析代码比较复杂。分析完后漏洞限制条件少&#xff0c;题目给了 libc2.31&#xff0c;利用比较灵活。 这题白天…

linux【网络编程】TCP协议通信模拟实现、日志函数模拟、守护进程化、TCP协议通信流程、三次握手与四次挥手

linux【网络编程】TCP协议通信模拟实现、日志函数模拟、守护进程化、TCP协议通信流程 一、TCP通信简单模拟实现1.1 服务端实现1.1.1 接口认识1.1.1.1 listen&#xff1a;监听socket1.1.1.2 accept&#xff1a;获取连接 1.1.2 tcpServer.hpp1.1.3 tcpServer.cc 1.2 客户端实现1.…

软考知识点---08IP地址与域名地址

一、IP地址 &#xff08;一&#xff09;什么是IP地址&#xff1f; 连入互联网的计算机&#xff0c;每台计算机或者路由器都有一个由授权机构分配的号码&#xff0c;IP地址代表这一台计算机在网络中的地址 在同一个网络中IP地址是唯一的 IP&#xff08;IPV4&#xff09;地…

音频的各项指标

对于下面data和linesize的解释(参考下面3.4中的av_samples_alloc_array_and_samples函数说明)&#xff1a; 1&#xff09;data是通道的意思&#xff0c;例如双通道&#xff0c;data[0]代表左声道&#xff0c;data[1]代表右声道。 2&#xff09;linesize为采样个数的最大大小字…

ChatGPT全栈开发实战:从需求分析到数据可视化,一站式指南助你快速构建全面应用

文章目录 序章&#xff1a;PDF版下载第一章&#xff1a;Java后端开发1.需求分析1.1 项目分析1.2 开发计划1.3 风险评估1.4 需求增强1.5 需求转情景 2.生成代码2.1 解析文件2.2 数据结构2.3 算法策略2.4 异步处理 3.Bug修改3.1 逻辑错误3.2 性能问题3.3 资源泄露3.4 死锁问题3.5…