ROS学习第五节——话题通信之发布

news2024/12/23 5:02:17

首先补充一个命令ROS计算图

rosrun rqt_graph rqt_graph

1.原理讲解

话题通信实现模型是比较复杂的,该模型如下图所示,该模型中涉及到三个角色:

  • ROS Master (管理者)
  • Talker (发布者)
  • Listener (订阅者)

ROS Master 负责保管 Talker 和 Listener 注册的信息,并匹配话题相同的 Talker 与 Listener,帮助 Talker 与 Listener 建立连接,连接建立后,Talker 可以发布消息,且发布的消息会被 Listener 订阅。

整个流程由以下步骤实现:

0.Talker注册

Talker启动后,会通过RPC在 ROS Master 中注册自身信息,其中包含所发布消息的话题名称。ROS Master 会将节点的注册信息加入到注册表中。

1.Listener注册

Listener启动后,也会通过RPC在 ROS Master 中注册自身信息,包含需要订阅消息的话题名。ROS Master 会将节点的注册信息加入到注册表中。

2.ROS Master实现信息匹配

ROS Master 会根据注册表中的信息匹配Talker 和 Listener,并通过 RPC 向 Listener 发送 Talker 的 RPC 地址信息。

3.Listener向Talker发送请求

Listener 根据接收到的 RPC 地址,通过 RPC 向 Talker 发送连接请求,传输订阅的话题名称、消息类型以及通信协议(TCP/UDP)。

4.Talker确认请求

Talker 接收到 Listener 的请求后,也是通过 RPC 向 Listener 确认连接信息,并发送自身的 TCP 地址信息。

5.Listener与Talker件里连接

Listener 根据步骤4 返回的消息使用 TCP 与 Talker 建立网络连接。

6.Talker向Listener发送消息

连接建立后,Talker 开始向 Listener 发布消息。

注意1:上述实现流程中,前五步使用的 RPC协议,最后两步使用的是 TCP 协议

注意2: Talker 与 Listener 的启动无先后顺序要求

注意3: Talker 与 Listener 都可以有多个

注意4: Talker 与 Listener 连接建立后,不再需要 ROS Master。也即,即便关闭ROS Master,Talker 与 Listern 照常通信。

2.操作实现

2.1发布方代码实现

右键工作空间中的src文件夹,点击Create Catkin Package

输入功能包名称,Pbu_Sub,并且输入依赖

 

 在Pbu_Sub功能包里面的src文件夹内添加demo01_pub.c

编写代码

// 1.包含头文件 
#include "ros/ros.h"
#include "std_msgs/String.h" //普通文本类型的消息
#include <sstream>

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

    //2.初始化 ROS 节点:命名(唯一)
    // 参数1和参数2 后期为节点传值会使用
    // 参数3 是节点名称,是一个标识符,需要保证运行后,在 ROS 网络拓扑中唯一
    ros::init(argc,argv,"talker");
    //3.实例化 ROS 句柄
    ros::NodeHandle nh;//该类封装了 ROS 中的一些常用功能

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

    //5.组织被发布的数据,并编写逻辑发布数据
    //数据(动态组织)
    std_msgs::String msg;

    //节点不死
    while (ros::ok())
    {

        msg.data ="hello";
        //发布消息
        pub.publish(msg);
    }


    return 0;
}

配置CMakeLists.txt

add_executable(demo01_pub src/demo01_pub.cpp)

 

target_link_libraries(demo01_pub
  ${catkin_LIBRARIES}
)

 接下来开始运行

还是先开启roscore

运行

source ./devel/setup.bash
rosrun pub_sub demo01_pub

此时无法观看到显示效果,需要借助其他工具查看

新打开一个终端

输入就可以看到效果

rostopic echo chatter

 https://download.csdn.net/download/qq_45685327/87695056

增加代码功能,有一定频率输出,并通过日志输出结果

/*
    需求: 实现基本的话题通信,一方发布数据,一方接收数据,
         实现的关键点:
         1.发送方
         2.接收方
         3.数据(此处为普通文本)

         PS: 二者需要设置相同的话题


    消息发布方:
        循环发布信息:HelloWorld 后缀数字编号

    实现流程:
        1.包含头文件 
        2.初始化 ROS 节点:命名(唯一)
        3.实例化 ROS 句柄
        4.实例化 发布者 对象
        5.组织被发布的数据,并编写逻辑发布数据

*/
// 1.包含头文件 
#include "ros/ros.h"
#include "std_msgs/String.h" //普通文本类型的消息
#include <sstream>

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

    //2.初始化 ROS 节点:命名(唯一)
    // 参数1和参数2 后期为节点传值会使用
    // 参数3 是节点名称,是一个标识符,需要保证运行后,在 ROS 网络拓扑中唯一
    ros::init(argc,argv,"talker");
    //3.实例化 ROS 句柄
    ros::NodeHandle nh;//该类封装了 ROS 中的一些常用功能

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

    //5.组织被发布的数据,并编写逻辑发布数据
    //数据(动态组织)
    std_msgs::String msg;
    // msg.data = "你好啊!!!";
    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;
}

开启roscore

另起一个终端

source ./devel/setup.bash
rosrun pub_sub demo01_pub

 另起一个终端

rostopic echo chatter

 以上的代码出现了乱码问题,以下作出优化

https://download.csdn.net/download/qq_45685327/87695056

// 1.包含头文件 
#include "ros/ros.h"
#include "std_msgs/String.h" //普通文本类型的消息
#include <sstream>

int main(int argc, char  *argv[])
{   
    setlocale(LC_ALL,"");
    //2.初始化 ROS 节点:命名(唯一)
    // 参数1和参数2 后期为节点传值会使用
    // 参数3 是节点名称,是一个标识符,需要保证运行后,在 ROS 网络拓扑中唯一
    ros::init(argc,argv,"talker");
    //3.实例化 ROS 句柄
    ros::NodeHandle nh;//该类封装了 ROS 中的一些常用功能

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

    //5.组织被发布的数据,并编写逻辑发布数据
    //数据(动态组织)
    std_msgs::String msg;

    //发布频率
    ros::Rate rate(1) ;
    //设置编号
    int count = 0;

    //节点不死
    while (ros::ok())
    {

        count ++;
       

        //实现字符串的拼接
        std::stringstream ss;
        ss<<"hello--->"<<count;
         msg.data =ss.str();

        //发布消息
        pub.publish(msg);
        //添加日志
        ROS_INFO("发布的数据是:%s",ss.str().c_str());

        rate.sleep();
    }


    return 0;
}

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

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

相关文章

数字孪生(1)

目前接触的客户群体是做大屏展示&#xff0c;闲鱼上5元包邮的那种科技感前端&#xff08;不好意思我买了&#xff09;各路模型大整合 实景GISiOT&#xff0c;如果再来点动画就好&#xff0c;然满屏动起来&#xff0c;火灾烧起来&#xff0c;水面荡漾起来&#xff0c;工程车开起…

关于GeoServer发布的wfs服务的精度问题

本周基于arcgis/core组件&#xff0c;利用arcgis api for js 4.22版本加载GeoServer发布的同一数据源的wms和wfs服务&#xff0c;出现了偏移的问题。 分析&#xff1a;同一数据源不同的访问方式&#xff0c;出现了偏移&#xff0c;这是很严重的问题。初步判断为js api加载方式的…

2023年4月北京/江苏/深圳CDGA/CDGP数据治理专家认证考试报名

DAMA认证为数据管理专业人士提供职业目标晋升规划&#xff0c;彰显了职业发展里程碑及发展阶梯定义&#xff0c;帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力&#xff0c;促进开展工作实践应用及实际问题解决&#xff0c;形成企业所需的新数字经济下的核心职业…

【社区图书馆】Go语言程序设计感想

随着 Go 语言的越来越流行&#xff0c;越来越多的人对其设计和语法进行了评价。以下是一些关于 Go 技术的感想&#xff1a; Go语言的特色&#xff1a; 没有继承多态的面向对象强一致类型interface不需要显式声明(Duck Typing)没有异常处理(Error is value)基于首字母的可访问…

大学计划《数字化转型赋能教育创新发展高峰论坛》成功举办

2023年4月8日&#xff0c;由航天科技控股集团股份有限公司&#xff08;简称“航天科技”&#xff09;主办&#xff0c;CFF上海与上海电子信息职业技术学院承办、智慧树网支持的《数字化转型赋能教育创新发展高峰论坛》线上会议顺利召开。此次会议邀请到了众多教育界专家、教学名…

Linux 文件描述符

Linux 文件描述符 Linux 中一切皆文件&#xff0c;比如 C 源文件、视频文件、Shell脚本、可执行文件等&#xff0c;就连键盘、显示器、鼠标等硬件设备也都是文件。 一个 Linux 进程可以打开成百上千个文件&#xff0c;为了表示和区分已经打开的文件&#xff0c;Linux 会给每个…

基于AT89C51单片机的电子万年历系统

点击链接获取Keil源码与Project Backups仿真图&#xff1a; https://download.csdn.net/download/qq_64505944/87708258 源码获取 主要内容&#xff1a; 电子万年历系统以实时时钟芯片DS1302和AT89C52单片机为主要研究对象&#xff0c;着重进行51单片机控制系统的设计研究和如…

天梯赛 L3-025 那就别担心了

原题链接&#xff1a; PTA | 程序设计类实验辅助教学平台 题目描述&#xff1a; 下图转自“英式没品笑话百科”的新浪微博 —— 所以无论有没有遇到难题&#xff0c;其实都不用担心。 博主将这种逻辑推演称为“逻辑自洽”&#xff0c;即从某个命题出发的所有推理路径都会将结…

DHCP的原理和配置

DHCP在一个广播域里动态修改IP地址 背景 DHCP (Dynamic Host Configuration Protocol&#xff0c;动态主机配置协议)由Internet工作任务小组设计开发专门用于为TCP/IP网络中的计算机自动分配TCP/IP参数的协议 使用DHCP的好处 减少管理员的工作量避免输入错误的可能避免IP地…

Java每日一练(20230421)

目录 1. 整数排列 &#x1f31f; 2. 数组排序 &#x1f31f; 3. 单词搜索 &#x1f31f;&#x1f31f; &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 整数排列 十位数的所有排列…

jmeter的界面介绍

前言 jmeter是一款进行接口自动化&#xff0c;性能测试的开源的工具 界面 jmeter菜单里面有个文件--模板&#xff0c;这个主要是一些请求不知道怎么设置时可以选择预制的一些模板 选择对应的模板点击创建&#xff0c;就可以生成一个对应的记录&#xff0c;我们选择jdbc&…

2021遥感应用组二等奖:基于机器学习回归算法的鄱阳湖水质遥感定量反演及时序变化监测研究

作品介绍 一、作品背景 鄱阳湖是中国第一大淡水湖&#xff0c;也是中国第二大湖&#xff0c;它在调节长江水位、涵养水源、改善当地气候等方面起着重大的作用。但近年来受围垦、环境污染等人类活动影响&#xff0c;鄱阳湖湿地退化严重&#xff0c;同时使鄱阳湖的容量减少&…

C语言中static的作用

在 C语言 中&#xff0c;static 通常用来修饰变量和函数。 static 修饰变量 变量按照作用域不同&#xff0c;分为全局变量和局部变量。 当static修饰全局变量时&#xff0c;该变量仍然可以在该文件的全局区域内引用&#xff0c;并且在编译阶段时为该变量分配内存&#xff0c;…

Ubuntu 安装 Samba 服务器

1. Ubuntu 安装 Samba 服务器 确认安装: dpkg -l | grep samba 安装&#xff1a; sudo apt-get install samba samba-common 卸载&#xff1a; sudo apt-get autoremove samba2. Samba 服务器配置 sudo vi /etc/samba/smb.conf在文件最后添加 [Share] commentThis is samba …

Leetcode-day3【215】数组中的第K个最大元素

文章目录 215. 数组中的第K个最大元素题目解题思路解题思路【学习】基于快速排序的选择方法 215. 数组中的第K个最大元素 题目 给定整数数组 nums 和整数 k&#xff0c;请返回数组中第 k 个最大的元素。 请注意&#xff0c;你需要找的是数组排序后的第 k 个最大的元素&#…

osg实现地球并在指定经纬度放置一个飞机模型(非osgEarth方式)

代码如下&#xff1a; #include<osgViewer/Viewer> #include<osgGA/TrackBallManipulator> #include<osg/Shape> #include<osg/ShapeDrawable> #include<osg/Texture2D> #include<osgDB/readFile> #include<osg/MatrixTransform> #…

Linux环境对Nginx开源版源码下载、编译、安装、开机自启

一、准备内容Centos8安装yum源https://blog.csdn.net/xiaochenXIHUA/article/details/127251704?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168197299116800211534092%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%

网络安全与攻防-同源策略

目录 同源策略&#xff08;浏览器控制&#xff09; 定义 思考&#xff1a; 跨域的N种方法 Jsonp 跨域资源共用&#xff08;CORS&#xff09; 预检&#xff08;OPTIONS请求&#xff09; 代理服务&#xff08;优先考虑&#xff09; 实战CORS&#xff08;Fetchnode.js&…

利用校正板对无人机影像辐射校正

无人机影像上获取到的数据是反映传感器对光响应的数值特征&#xff08;即DN值&#xff09;&#xff0c;但DN值与环境光强及相机参数有关&#xff0c;只有将其转换为反射率才能较好的反映地物的特征。一般的转换方法是使用二向反射率已知的校正板进行「单点比值」&#xff08;只…

WINNER电比例插装阀放大器

WINNER插装阀分类&#xff1a;双向流量控制阀、提动轴型单向止回常闭比例流量阀、双向流量控制常开比例压力补偿、导压级比例泄压阀、直动型降压比例泄压阀&#xff1b; 比例控制阀是一种按输入的电信号连续、按比例地控制液压系统的流量、压力和 方向的控制阀&#xff0c;其输…