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 的相关文章

  • ROS系统基本功能的使用详解(基本指令/节点/服务/启动文件/动态参数)

    ROS系统基本功能的使用详解 一 创建工作空间 二 创建与编译ROS功能包 三 ROS的基本命令 3 1 节点 3 2 主题 3 3 服务 3 4 参数服务器 四 节点的创建与运行 4 1 创建源文件 4 2 修改CMakeLists tx
  • ros 中ERROR: cannot download default sources list from: https://raw.githubusercontent.com/ros/rosdist

    ros 中ERROR cannot download default sources list from https raw githubusercontent com ros rosdistro master rosdep sources
  • ROS诸多调试工具总结1

    ROS有许多调试工具来为ROS调试你的工具 1 rosnode 参数 用法 作用 list rosnode list 查看当前运行了哪些节点 info rosnode info node name 查看该节点发布 接受哪些话题以及服务 ki
  • rosrun 和 roslaunch 的时候 TAB 的自动补全出现问题

    rosrun 和 roslaunch 的时候 TAB 的自动补全出现问题 rospack Warning error while crawling home sun boost filesystem status Permission de
  • Ubuntu下vscode配置ROS环境

    摘要 最近准备放弃用clion开发ROS使用更主流的vscode 整理一下在ubuntu18 04下的VSCode安装和ROS环境配置流程 安装 方法一 软件商店安装 个人还是推荐使用ubuntu软件下载vscode 简单不容易出错 方法二
  • ROS noetic tf demo错误处理及python版本切换

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

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

    Qt是一个跨平台的应用程序框架 广泛用于开发具有GUI界面的应用软件以及命令行工具 几乎所有操作系统都可以使用Qt 如Windows Mac OS X Android等 用于开发Qt应用程序的主要编程语言是C 但是可以使用诸如Python
  • roslaunch error: ERROR: cannot launch node of type

    今天在因为github上有个之前的包更新了 重新git clone后出现了一个问题 ERROR cannot launch node of type crazyflie demo controller py can t locate nod
  • Facebook 个人资料订阅者数量

    API 中是否有一种方法可以查询新配置文件之一的订阅者数量 我说的是新的个人资料 不是页面 就像泰拉 班克斯的这个 http www facebook com XOXOTYTY 我可以在该页面上看到她有 696k 订阅者 更具体地说 当您搜
  • 我的代码的 Boost 更新问题

    我最近将 boost 更新到 1 59 并安装在 usr local 中 我的系统默认安装在 usr 并且是1 46 我使用的是ubuntu 12 04 我的代码库使用 ROS Hydro 机器人操作系统 我有一个相当大的代码库 在更新之前
  • Caught exception in launch(see debug for traceback)

    Caught exception in launch see debug for traceback Caught exception when trying to load file of format xml Caught except
  • 在 Ubuntu 18.10 上安装 ROS Melodic

    I can t是唯一对 Cosmic 与 Wayland 和 Melodic 的组合感兴趣的人 我会坦白说 我似乎已经在 XPS 13 9370 上成功管理了此操作 或者至少安装脚本 最终 成功完成 然而 有一个非常棘手的解决方法 无论结果
  • ROS安装错误(Ubuntu 16.04中的ROS Kinetic)

    中列出的步骤顺序http wiki ros org kinetic Installat 已被关注 尝试在Ubuntu 16 04中安装ROSkinetic 输入以下命令时出错 sudo apt get install ros kinetic
  • catkin_make 编译报错 Unable to find either executable ‘empy‘ or Python module ‘em‘...

    文章目录 写在前面 一 问题描述 二 解决方法 参考链接 写在前面 自己的测试环境 Ubuntu20 04 一 问题描述 自己安装完 anaconda 后 再次执行 catkin make 遇到如下问题 CMake Error at opt
  • 可以在catkin工作区之外创建ROS节点吗?

    我想在catkin工作区之外创建一个ROS发布者节点 可以创建吗 当然可以 像对待任何其他 cpp 库或 python 包一样对待 ROS 在Python中你必须保留PYTHONPATH环境变量指向ros包 opt ros kinetic
  • 如何使用订阅者选项?

    我现在开始使用 Pubsubhubbub 以及所有关于实时的东西 但我在使用订阅者选项时遇到了问题 我正在尝试用 PHP 开发一个网络应用程序 订阅 RSS 之前发布的 到 Hub http pubsubhubbub appspot com
  • 如何使用 PyQT5 连接和分离外部应用程序或对接外部应用程序?

    我正在使用 ROS 为多机器人系统开发 GUI 但我对界面中最不想做的事情感到困惑 在我的应用程序中嵌入 RVIZ GMAPPING 或其他屏幕 我已经在界面中放置了一个终端 但我无法解决如何向我的应用程序添加外部应用程序窗口的问题 我知道
  • 使用 Swift 组合创建计时器发布器

    我一直在看通过 SwiftUI 的数据流 WWDC 演讲 https developer apple com videos play wwdc2019 226 他们有一张包含示例代码的幻灯片 其中使用连接到 SwiftUI 视图的计时器发布
  • 安装 ROS 时 Cmake 未检测到 boost-python

    我一直在尝试在我的 Mac 上安装 ROS 并根据不同版本的 boost 使用不同的库解决了错误 然而 似乎有一个库甚至没有检测到 boost python 这是我得到的错误 CMake Error at usr local share c

随机推荐

  • 解决Maven配置本地仓库路径不生效问题多个方法详解。(已成功解决自己遇到的问题)

    首先我尝试了很多种方法 xff0c 就是这个方法让我成功 xff0c 和大家分享一下 xff01 xff08 我用方法二成功的 xff01 xff09 maven本地仓库默认值 xff1a 用户家目录 m2 repository 由于本地仓
  • Servlet快速学习和Tomcat快速部署(web)

    Servlet快速学习和Tomcat快速部署 xff08 web xff09 一 快速入门二 执行流程三 生命周期四 Servlet体系结构五 Servlet urlPattern配置六 XML配置方式编写Servlet七 Tomcat快速
  • 蓝桥杯必备模板(python)

    蓝桥杯必备算法模板 xff08 python xff09 xff1a 前缀和模板差分模板二分双指针位运算最大公约数和最小公倍数模板判断质数和埃氏筛法模板唯一分解定理和质因数分解关系和模板快速幂并查集区间合并回溯算法模板 xff1a DFS
  • 蓝桥杯必备模块及常用操作(python)

    蓝桥杯必会模块 xff08 python xff09 xff1a 字符类型模块日期函数模块 常用 优先级队列itertools模块collections模块Bisect模块List 集合set 集合Math模块 字符类型模块 先看点常用但比
  • string的几个常见库函数

    文章目录 前言一 strlen直接求字符串长度二 strcpy用来赋值三 strcat追加字符串四 strcmp用于比较两个字符串五 strstr子串查找六 strtok应用七 加长度限制八 strerror 九 其他操作1 iscntrl
  • vector详解

    在开始学习C 43 43 的STL之后 xff0c 相信大家都学会通过查文档来了解一些库函数 xff0c 今天我来给大家介绍vector xff0c 从基本的使用到vector背后的源码实现 xff0c 迭代器等展开讲 xff0c 仔细阅读
  • 如何利用开源思想开发一个SEO友好型网站

    当你对一个网站进行 SEO 优化的时候 xff0c 不要期望你的努力能立即得到回报 耐心等待并更正内容营销策略 xff0c 最终会发现你的网站很受用户欢迎 下面就教你如何利用开源思维开发一个SEO友好型网站 xff01 首先 xff0c 你
  • 【STM32】串口通讯USART串口中断配置

    目录 STM32 USART 简介 程序编写 硬件接线 实际波形 STM32 USART 简介 STM32的USART通用同步异步收发器是一个串行通信设备 xff0c 可以灵活的与外部设备进行全双工数据交换 有别于USART xff0c 还
  • openmv第三天之标记跟踪

    AprilTag是一个视觉基准系统 感觉就是一个可以定位 校准帮助openmv来找到 定位的东西 官方解释的用处 xff1a 简单来说 xff0c 只要把这个tag贴到目标上 xff0c 就可以在OpenMV上识别出这个标签的3D位置 xf
  • 【A_star三维路径规划】A_star算法无人机三维路径规划【含Matlab源码 1387期】

    一 A star算法简介 0 引言 随着现代技术的发展 飞行器种类不断变多 应用也日趋专一化 完善化 如专门用作植保的大疆PS X625无人机 用作街景拍摄与监控巡察的宝鸡行翼航空科技的X8无人机 以及用作水下救援的白鲨MIX水下无人机等
  • 【路径规划】A_star算法机器人动态避障路径规划【含Matlab源码 1033期】

    一 A star算法简介 1 A Star算法及其应用现状 进行搜索任务时提取的有助于简化搜索过程的信息被称为启发信息 启发信息经过文字提炼和公式化后转变为启发函数 启发函数可以表示自起始顶点至目标顶点间的估算距离 也可以表示自起始顶点至目
  • C语言打印输出字符串的几种方法

    思路分析 知识点补充 1 xff0c 在C语言中 xff0c 一维数组的数组名实际上就是指向数组首项元素的指针 2 xff0c 如果指针p已经指向一个字符串 xff0c 判断字符串是否结束 xff0c 一般采用while p 61 39 0
  • 对‘fmt::v9::detail::throw_format_error(char const*)’未定义的引用

    在学习视觉SLAM十四讲第十二章的过程中 xff0c 尝试跑了一下单目稠密地图构建的代码 xff0c 在编译源代码的过程中遇到该问题 xff0c 编译结果中显示长篇的 CMakeFiles dense mapping dir dense m
  • [STM32F103C8T6] 串口

    1 非中断串口发送数据 串口发送 接收函数 xff1a HAL UART Transmit 串口发送数据 xff0c 使用超时管理机制 HAL UART Receive 串口接收数据 xff0c 使用超时管理机制 HAL UART Tran
  • 【C语言】strcat函数_字符串追加/连接

    前言 xff1a 在C C 43 43 的学习过程当中一定一定要多刷题 xff0c 牛客网作为国内内容超级丰富的IT题库 xff0c 尤其是它的C C 43 43 xff0c 有从入门到大厂真题 xff0c 而且大部分的考试题目也是从中抽取
  • SWUST OJ448: 字符串查找

    题目描述 在一段句子中找出给定字符串出现在句子中第一个字母出现的位置 句子中字符个数小于4500 字符串字符个数小于120 输入 两行 第一行是给定字符串 第二行是句子 输出 整数 xff0c 字符串出现的位置 样例输入 abcde thi
  • C语言十进制转十六进制

    输入 xff1a 123 输出 xff1a 7B include lt stdio h gt int main int n scanf 34 d 34 amp n int a 100 int count int i 61 0 while 1
  • CentOS软件那么老为什么大家还要用它?

    作为一个专业的服务器系统 xff0c RHEL 系统理论上每一个软件包都有 RedHat 内部的人员负责维护 xff0c 这个维护包括长期 xff08 和系统生命周期一样长 xff09 的开发 更新 测试 运维等 也就是说你能从 RHEL
  • vscode配置C/C++调试环境

    转自作者知乎的原创文章 vscode配置C 43 43 调试环境 在环境变量path中添加mingw中bin后 在vscode界面侧边栏点击调试界面 xff0c 创建launch json文件 添加配置后保存就行 下为我的添加配置后自动生成
  • ROS通信机制~话题通信(Publisher&Subscriber)·笔记2

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