ROS通信机制~话题通信(Publisher&Subscriber)·笔记2

2023-05-16

系列文章目录:

ROS开发(ubuntu)笔记·1_嘻·嘻的博客-CSDN博客

ROS通信机制~服务通信(server&client)·笔记3_嘻·嘻的博客-CSDN博客

话题通信·理论模型:(图源:2.1.1 话题通信理论模型 · Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程                                                 

基本操作:

首先,写发布者Talker要发布的信息的代码:

1. 在右击src创建新的功能包

2.然后导入依赖包

3.写代码(第6步有详细代码) 

写完后Ctrl+Shift+B,正常的话,不会出现ERROR,最后有100%

 对于advertise函数,源码如下图:

topic就是要发布的信息的话题,红色横线处是队列的长度(发布信息的条数),这里直接用queue(队列)的概念去理解,即我设置是10,当我们输入了12条信息时,他会输出后面10条信息。

4.配置一下CMakeLists 

修改完编译一下,没有问题就不会有Error输出,并且输出100%

5.检查此时发布者Talker要发布的消息能否正常运行                                具体步骤:

                           1.终端中输入roscore(执行ros的命令都要进行此操作)     

2.打开新的终端,输入 cd 当前工作空间

3.source一下环境,然后输入rosrun 功能包 映射名称(正常会没有东西输出)

4.输入rostopic echo 话题名称 (我写的是"fang")结果就是一直打印hello hello

最后输入 Ctrl+C 就停止该程序运行

6. 在原来的代码上添加发布逻辑

#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::NodeHandle nh;

     //4.创建发布者对象;
     //泛型: 发布的消息类型
    //参数1: 要发布到的话题
     ros::Publisher pub =nh.advertise<std_msgs::String>("fang",10);//就是队列的长度,例如有12条信息的话就输出后面10条

     //5.编写发布逻辑并发布数据
     //要求以10HZ的频率发布数据,并且文本后添加编号
     //先创建被发布的消息
     std_msgs::String msg;

     //发布频率
     ros::Rate rate(10);
     //设置编号
     int count =0;
     //编写循环,循环中发布数据
     ros::Duration(3.0).sleep(); //休眠函数,延迟第一条数据的发送
                          //原因:发送第一条数据时,publisher 还未在 roscore 注册完毕
                         //若没有,就算先启动订阅者代码,也可能导致前几条信息丢失
     while(ros::ok())//ok()指只要该节点还活着,就循环
     {   count++;
         //实现字符串拼接数字
         std::stringstream ss;
         ss<<"hello --->"<<count;
         //msg.data ="hello hello";
         msg.data =ss.str();
         pub.publish(msg);

         //添加日志
         ROS_INFO("发布的数据是:%s",ss.str().c_str());
         rate.sleep();//睡0.1秒,相当于10HZ
         ros::spinOnce();//在有回调函数时才有用,在此函数无用(官方建议添加)
     }
    return 0;
}

   ros::Duration(3.0).sleep(); //休眠函数,延迟第一条数据的发送
   原因:发送第一条数据时,publisher 还未在 roscore 注册完毕
  若没有,就算先启动订阅者代码,也可能导致前几条信息丢失

 运行结果如图:

接下来是订阅者listener的代码:

#include"ros/ros.h"
#include"std_msgs/String.h"
/* 订阅方实现:
      1.包含头文件
       ROS中文本类型--->std_msgs/String.h
       2.初始化ROS节点
       3.创建节点句柄;
       4。创建订阅者对象;
       5.处理订阅到的数量;
       6.spin()函数
*/
void doMsg(const std_msgs::String::ConstPtr &msg)
{
    //通过msg获取并操作订阅到的消息
    ROS_INFO("listener订阅的数据:%s",msg->data.c_str());
}
int main(int argc,char *argv[])
{
    setlocale(LC_ALL,"");
    //2.初始化ROS节点
    // 参数1和参数2 后期为节点传值会使用
    // 参数3 是节点名称,是一个标识符,需要保证运行后,在 ROS 网络拓扑中唯一
    ros::init(argc,argv,"listener");
    //3.创建节点句柄
    ros::NodeHandle nh;//该类封装了 ROS 中的一些常用功能
    //4.创建订阅者对象;
    ros::Subscriber sub =nh.subscribe("fang",10,doMsg);
    //5.处理订阅到的数量
    ros::spin();//循环读取接收的数据,并调用回调函数(doMsg)处理
    return 0;

}

在第4点创建订阅者对象中,分析一下代码

ros::Subscriber sub=nh.subscribe("fang",10,doMsg);

首先是调用ros库中的订阅器Subscriber (类型)创建了一个sub,后面调用句柄nh的subscribe函数(创建订阅者对象)

括号中,"fang"是订阅者的话题,10是消息队列长度(最多缓存10条信息),当发布者发布了该话题时,就会调用doMsg函数(回调函数)

关于回调函数:一般函数是当程序进行到该函数处时,它就立刻实现,可以说是受我们自己控制的 而回调函数,当程序进行到该处时,它不会立刻执行,需要外界给予它一个信号才能运行,就像一个地雷,只有别人踩了才会爆,这就不受我们自己控制,而是受外界控制了。

我们传入的消息是 std_msgs::String类型的,而参数的类型是常量指针的引用,即ConstPtr &msg

ros::spin() 重复执行回调函数,即循环接收发布者发布的信息(与回调函数相对应)

还有一步:(记得修改CMakeLists.txt)与之前步骤相似 

 之后的操作也类似,先ctrl+shift+B看看有没有出问题,再打开终端,rosrun发布者和订阅者            运行如图:

在发布者的终端上输入Ctrl+C就可以停止发布,此时订阅者也停止接受信息了。

此时,我们可以通过计算图来看看两个节点之间的关系(新开一个终端输入rqt_graph

进阶(自定义message):发送的信息可以包含各种数据类型

比如:int8, int16, int32, int64 (或者无符号类型: uint*),float32, float64,string,time,duration,

variable-length array[] and fixed-length array[C] ......

【1】定义msg文件(在功能包下创建msg目录,再创建一个后缀为msg的文件)

【2】配置编辑文件

1.在package.xml中添加 编译 依赖 与 执行 依赖

2.在CMakeLists.txt编辑 msg 相关配置

下面这步配置msg源文件

修改完后,一定要编译一下ctrl+shift+B,没出现ERROR后,就会在devel目录下的include文件夹下出现一个Person.h (Person 就是之前创建的Person.msg中的Person)

下一步:为了方便代码提示以及避免误抛异常,需要先配置 vscode

1.将前面生成的 head 文件路径(在下图红色框中右击生成终端,输入pwd,复制路径)

2.配置进 c_cpp_properties.json 的 includepath属性(粘贴路径,可将后面具体功能包名改为**):

**意味着直接include目录下的所有内容

下面的操作就是实现了(代码与之前类似,注意头文件"plumbing_pub_sub/Person.h") 这里插一步,如果之前创建Person.msg时没有编译,而此时头文件已经用到了Person.h,则会发生逻辑上的错误,为了避免这种错误,需要在CMakeLists进行一步修改操作

 

(orag03_pub 和orag02_sub 是下面修改CMakeLists时,我设的映射名称 )

【发布者】

#include "ros/ros.h"
#include"plumbing_pub_sub/Person.h"

int main(int argc,char *argv[])
{   
    setlocale(LC_ALL,"");
    ROS_INFO("这是消息发布方");
    ros::init(argc,argv,"talker_person");
    ros::NodeHandle nh;
    ros::Publisher pub =nh.advertise<plumbing_pub_sub::Person>("chatter_person",10);
    //创建被发布的数据
    plumbing_pub_sub::Person person;
    person.name ="张三";
    person.age=1;
    person.height=1.73;

    ros::Rate rate(1);
    ros::Duration(3).sleep();
    while(ros::ok())
    {  
    // 修改数据
       person.age += 1;
       //数据发布     
       pub.publish(person);
       ROS_INFO("发布的消息:%s,%d,%.2f", person.name.c_str(), person.age, person.height);
       //休眠
       rate.sleep();

       ros::spinOnce();

    }
}

【订阅者】

#include"ros/ros.h"
#include"plumbing_pub_sub/Person.h"
void doPerson(const plumbing_pub_sub::Person::ConstPtr &person)
{
    ROS_INFO("订阅的人的消息:%s,%d,%.2f",person->name.c_str(),person->age,person->height);
}

int main(int argc,char*argv[])
{
    setlocale(LC_ALL,"");
    ros::init(argc,argv,"listener_person");
    ros::NodeHandle nh;
    ros::Subscriber sub=nh.subscribe("chatter_person",10,doPerson);
    ros::spin();
    return 0;
}

【修改CMakeLists】

 运行如图:

 可得到计算图:

这次笔记好长QAQ,能全部看完的真的很牛逼了^-^

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ROS通信机制~话题通信(Publisher&Subscriber)·笔记2 的相关文章

  • 思岚RPLIDAR A2 在ubuntu 16.04上的测试

    1 下载雷达ROS包 首先在github上下载rplidar的ros包 下载指令为 默认安装了git git clone https github com Slamtec rplidar ros git 在ubuntu上创建工作空间 并将该
  • ROS与navigation教程——ACML参数配置

  • SLAM-hector_slam 简介与使用

    hector slam功能包使用高斯牛顿方法 不需要里程计数据 只根据激光信息便可构建地图 所以他的总体框架如下 hector slam功能包 hector slam的核心节点是hector mapping 它订阅 scan 话题以获取SL
  • ROS诸多调试工具总结1

    ROS有许多调试工具来为ROS调试你的工具 1 rosnode 参数 用法 作用 list rosnode list 查看当前运行了哪些节点 info rosnode info node name 查看该节点发布 接受哪些话题以及服务 ki
  • ModuleNotFoundError: No module named ‘rosbag‘

    1 ModuleNotFoundError No module named rosbag File opt ros kinetic lib python2 7 dist packages roslib launcher py line 42
  • ROS noetic tf demo错误处理及python版本切换

    文章目录 报错描述及解决 ubuntu20 04下python版本切换 报错描述及解决 ubuntu版本 20 04 ROS版本 noetic roslaunch turtle tf turtle tf demo launch 报错信息 t
  • 清华大学开源软件镜像站网址

    清华大学 TUNA 协会原名清华大学学生网管会 注册名清华大学学生网络与开源软件协会 是由清华大学网络技术和开源软件爱好者 技术宅组成的团体 现阶段向校内外提供开源软件镜像等服务 清华大学 TUNA 协会清华大学 TUNA 协会原名清华大学
  • rosprofiler 安装和使用

    rosprofiler wiki 页面 http wiki ros org rosprofiler rosprofiler package 下载rosprofiler和ros statistics msgs 放到工程目录下编译 https
  • 局域网下ROS多机通信的网络连接配置

    1 在路由器设置中固定各机器IP地址 在浏览器中输入路由器的IP地址 例如TP LINK路由器的IP为 192 168 1 1 进入登录页面后 输入用户名和密码登录 用户名一般为admin 密码为自定义 在 基本设置 gt LAN设置 gt
  • 【ROS】usb_cam相机标定

    1 唠叨两句 当我们要用相机做测量用途时 就需要做相机标定了 不然得到的计算结果会有很大误差 标定的内容包括三部分 内参 外参还有畸变参数 所以标定的过程就是要求得上面这些参数 以前弄这个事估计挺麻烦 需要做实验和计算才能得到 现在通过ro
  • ubuntu18.04命令安装ros2

    ROS2官方文档 本教程为apt get命令安装方式 官网教程有点问题 借鉴一下大佬的安装方式 文章目录 1 安装ROS2 1 1 安装秘钥相关指令 1 2 授权秘钥 1 3 添加ROS2软件源 1 4 安装 2 设置环境 可选但是推荐 2
  • 在 CLion 中设置 ROS 包

    我正在使用 CLion C IDE 来编辑 ROS 包 我可以通过打开CMakeLists txt文件 但是 我收到一个错误 FATAL ERROR find package catkin 失败 在工作区和 CMAKE PREFIX PAT
  • 可视化点云

    我在找到的视差图像上有来自 gpu reprojectImageTo3D 的 3D 点 我现在想显示这个点云 如何将找到的点云转换为OpenCV to sensor msgs PointCloud2 我不需要发布点云 这仅用于调试可视化 是
  • 错误状态:平台不允许不安全的 HTTP:http://0.0.0.0:9090

    我正在尝试从我的 flutter 应用程序连接到 ws local host 9090 使用 rosbridge 运行 的 Ros WebSocket 服务 但我在 Flutter 中收到以下错误 错误状态 平台不允许不安全的 HTTP h
  • 我的代码的 Boost 更新问题

    我最近将 boost 更新到 1 59 并安装在 usr local 中 我的系统默认安装在 usr 并且是1 46 我使用的是ubuntu 12 04 我的代码库使用 ROS Hydro 机器人操作系统 我有一个相当大的代码库 在更新之前
  • 为什么 Android 上的 RxJava with Retrofit doOnError() 不起作用,而 Subscriber onError 却起作用

    有人可以解释一下为什么这样的代码 networApi getList subscribeOn Schedulers newThread observeOn AndroidSchedulers mainThread doOnError thr
  • ROS 问题:libQt5Core.so.5:无法打开共享对象文件:没有这样的文件或目录

    当我跑步时 rosrun turtlesim turtlesim node 在 Ubuntu 上 我收到以下消息 opt ros noetic lib turtlesim turtlesim node 加载共享库时出错 libQt5Core
  • 无法在 Ubuntu 20.04 上安装 ROS Melodic

    我正在尝试使用这些命令在 Ubuntu 20 04 上安装 ROS Melodic sudo sh c echo deb http packages ros org ros ubuntu lsb release sc main gt etc
  • ROS中spin和rate.sleep的区别

    我是 ROS 新手 正在尝试了解这个强大的工具 我很困惑spin and rate sleep功能 谁能帮助我了解这两个功能之间的区别以及何时使用每个功能 ros spin and ros spinOnce 负责处理通信事件 例如到达的消息
  • 如何在Windows上安装机器人操作系统ROSJava?

    ROS 的文档很糟糕 一个很大的讽刺是 ROS 的 Groovy 和 ROSJava 版本的创建是为了让 Windows 等平台上的开发人员能够利用出色的机器人 SDK 而所有安装说明仍然面向 Linux ubuntu 用户 The ROS

随机推荐

  • 无人机组装调试教程

    无人机 北郊强哥笔记 多轴飞行器如何称得上无人机 xff1f 关键在飞控 xff1a 飞控包括低端飞控 xff08 如kk xff0c QQ xff0c cc3D xff09 和智能化飞控 xff08 如APNM NAZA PIXHAWK
  • 51和STM32的Keil环境搭建

    前言 笔者由于竞赛需要 xff0c 最近开始学习STM32H7系列芯片 xff0c 由于之前并没有学习过32 xff0c 且51也是较早时期学习 xff0c 对于一些概念一知半解 xff0c 没有得到很好的吸收 xff0c 所以在基础较差的
  • 【STM32】滴答时钟24位递减计数器系统时钟【SystTick】

    SysTick定时器 xff0c 也叫滴答定时器或者系统定时器 SysTick 系统定时器是属于CM3内核中的一个外设 xff0c 内嵌在NVIC中 系统定时器是一个24位的向下递减的计数器 xff0c 计数器每计数一次的时间为1 SYSC
  • Opencv通道

    Opencv通道 1 拆分通道 1 拆分一个BGR图像 使用split b g r 61 cv2 split bgr image b B通道图像 g G通道图像 r R通道图像 注意 xff1a 顺序不能变 xff01 xff01 xff0
  • STM32入门100步

    目录 1 C8T6引脚图 2 电路基础 1 IO口静态特性 xff1a 2 上下拉电阻 3 STM32官网 xff1a 4 内核与存储器 5 时钟 复位和电源管理 6 低功耗和ADC 7 DMA和IO端口 8 调试模式和定时器 9 看门狗和
  • 【语音去噪】谱减法+维纳滤波+卡尔曼滤波语音去噪【含Matlab源码 1881期】

    一 谱减法 维纳滤波 卡尔曼滤波语音去噪简介 1 维纳滤波算法 在传统的去噪算法中 维纳滤波因其操作简单 去噪效果好 被公认为一种经典的去噪算法 语音信号在时域的表示为 yi t si t ni t 其中si t ni t 和yi t 分别
  • 【VRP】节约里程算法求解车辆路径规划问题【含Matlab源码 1166期】

    一 VRP简介 1 VRP基本原理 车辆路径规划问题 Vehicle Routing Problem VRP 是运筹学里重要的研究问题之一 VRP关注有一个供货商与K个销售点的路径规划的情况 可以简述为 对一系列发货点和收货点 组织调用一定
  • 【滤波跟踪】扩展卡尔曼滤波器IMU和GPS数据计算无人机的姿态【含Matlab源码 2531期】

    一 简介 针对室内定位中的非视距 Non Line of Sight NLOS 现象 提出一个新型算法进行识别 同时有效缓解其影响 主要通过超宽带 Ultra Wideband UWB 定位系统与惯性导航系统 Inertial Naviga
  • 从烧录系统开始Jetson Nano无人车开发记录

    从烧录系统开始Jetson Nano无人车开发记录 xff08 一 xff09 本章介绍硬件选型与系统烧录环境配置 前言 搭建一个四轮麦克纳姆移动机器人平台 xff0c 用于团队日常学习 xff0c 算法复现和开发 将在下文详细介绍从系统烧
  • 把当前ubuntu18.0.4系统做成镜像

    先下载remastersys wget ftp ftp gwdg de pub linux easyvdr mirror remastersys ubuntu remastersys remastersys 3 0 4 2 all deb
  • 批量修改YOLO数据集镜面后的labels和解决Python中bug

    在Python3 8环境下用OpenMV对yolo数据集进行数据增强 镜面转换时 xff0c 打算直接批量修改镜像前txt里的某值作为镜像后的labels 但发现有bug的风险 xff0c 于是把代码移植到Python控制台 上图看出将字符
  • python中的模块与包详解

    目录 一 什么是模块 二 模块的导入 1 import 模块名 2 from 模块名 import 功能名 3 from 模块名 import 4 as定义别名 模块导入总结 三 自定义模块 制作自定义模块 用pycharm演示 测试模块
  • 【C语言】冒泡排序算法和冒泡排序的时间复杂度

    提示 xff1a 冒泡排序算法是非常重要的算法 xff0c 一定要熟练掌握 思路可以参考一位大佬博主的博客 xff1a 帅地 介绍的十分详细 xff0c 理解了之后 xff0c 可以参考我的代码 xff0c 是入门级别的 xff0c 比较好
  • Vbox遇到“Destination host unreachable“问题的解决之法

    在上一篇 虚拟机的网络配置与连接 中 xff0c 有讲述到Vmware遇到Destination host unreachable 问题的解决之法 xff0c 而这一篇文章我将说到Vbox的遇到 34 Destination host un
  • 以太网链路聚合与VRRP

    文章目录 一 以太网链路聚合1 1 链路聚合的含义以及作用1 2 链路聚合的配置 二 VRRP2 1 VRRP概述2 2VRRP术语2 3 VRRP工作原理2 4 VRRP的基本配置2 5VRRP总结 三 总结 一 以太网链路聚合 1 1
  • Ubuntu 20.04 系统迁移

    一 前言 现实工作中需要在Intel NUC上装一个Ubuntu 20 04系统 xff0c 并运行ROS以及相关的很多功能包 xff0c 但如果直接安装新新系统 xff0c 之前的大量环境变量要重新去配置 xff0c 所以考虑说将原先的U
  • 电大计算机考试答案

    中央电大计算机基础考试题库大全 基础知识 单选题 1 自计算机问世至今已经经历了四个时代 xff0c 划分时代的主要依据是计算机的 A 规模 B 性能 C 功能 D 构成元件答案 D 2 当前的计算机一般被认为是第四代计算机 xff0c 它
  • 用opencv识别颜色并输出坐标

    1首先安装opencv pip install opencv python 参考https blog csdn net qq 42114833 article details 128648458 spm 61 1001 2014 3001
  • ROS开发(ubuntu)笔记·1

    学习网址 xff1a Introduction GitBook autolabor com cn b站 xff1a 奥特学园 ROS机器人入门课程 ROS理论与实践 零基础教程 哔哩哔哩 bilibili 创建一个ROS Workspace
  • ROS通信机制~话题通信(Publisher&Subscriber)·笔记2

    系列文章目录 xff1a ROS开发 xff08 ubuntu xff09 笔记 1 嘻 嘻的博客 CSDN博客 ROS通信机制 服务通信 server amp client 笔记3 嘻 嘻的博客 CSDN博客 话题通信 理论模型 xff1