ROS学习——通信机制(话题通信①—发布方实现)

news2024/11/23 21:10:22

 2.1 话题通信 · Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程

040话题通信(C++)1_发布方框架_Chapter2-ROS通信机制_哔哩哔哩_bilibili

一、ROS 中的基本通信机制主要有如下三种实现策略

  • 话题通信(发布订阅模式
  • 服务通信(请求响应模式)
  • 参数服务器(参数共享模式)

 二、发布方框架

1.创建ROS工作空间

mkdir -p xxx_ws/src(必须得有 src。xxx是文件名)
cd xxx_ws
catkin_make

2.启动vscode

cd xxx_ws
code .

3.

①新建功能包

 新建功能包名称————plumbing_pub_sub

 ②导入依赖的包

 ③新建文件(demo01_pub.cpp),搭建框架

注意删除const修饰符

 ④包含头文件

 修改.vscode/tasks.json 文件,否则ros.h头文件会报错

 内容修改为以下内容:

{
// 有关 tasks.json 格式的文档,请参见
    // https://go.microsoft.com/fwlink/?LinkId=733558
    "version": "2.0.0",
    "tasks": [
        {
            "label": "catkin_make:debug", //代表提示的描述性信息
            "type": "shell",  //可以选择shell或者process,如果是shell代码是在shell里面运行一个命令,如果是process代表作为一个进程来运行
            "command": "catkin_make",//这个是我们需要运行的命令
            "args": [],//如果需要在命令后面加一些后缀,可以写在这里,比如-DCATKIN_WHITELIST_PACKAGES=“pac1;pac2”
            "group": {"kind":"build","isDefault":true},
            "presentation": {
                "reveal": "always"//可选always或者silence,代表是否输出信息
            },
            "problemMatcher": "$msCompile"
        }
    ]
}

 ⑤发布方

解释:

(1)头文件

#include "std_msgs/String.h"

 std_msgs功能包文件里的String,创建的是string文本类型

(2)初始化节点

erGouZi是节点名称

(3)实例化句柄

  ros::NodeHandle nh;//该类封装了 ROS 中的一些常用功能

调用ros命名空间下的NodeHandle ,nh是句柄名称

(4)创建发布者对象

调用ros命名空间下的Publisher,pub是发布者对象名称,调用句柄nh的advertise函数( 创建发布者对象),该函数有多个重载,这里选用第二种重载函数

 返回值类型ros::Publisher,函数名叫advertise,M指泛型类型,指一会要发布的数据类型,泛型可以自动推导不用写;const std::string&topic指参数1是字符串类型,topic是话题(自定义),unit32_t queue_size是一个长度,在发布数据时,网络阻塞部分数据发不出去,假设发布12个数据,由于网络阻塞都没发出去,因此依次放在队列里面,这里如果设置长度为10,那么前两个数据被抛弃,相当于缓冲区;

std_msgs::String 消息类型;

fang——话题名称;

10——话题长度,最多缓存长度;

(5)编写发布逻辑并发布数据

先创建被发布消息,msg是发布对象名称;

  std_msgs::String msg;

编写循环,循环中发布数据

 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();
    }

ros::ok——循环条件,指如果节点还存在

pub.publish(msg)——pub中的publish发布函数;

⑥配置cmakelists

 执行的源文件名称

 参数1是给这个文件节点映射的名称,一般源文件名称是什么,这里名称就设置成什么 

 放开注释,把参数1改成映射的名称

 ⑦编译 ctrl+shift+B

⑧运行

先打开终端roscore,启动ros核心

 再重开终端

 plumbing_pub_sub功能包名

⑨检验,再开终端

 fang——话题名

三、发布方逻辑

 要求:以10HZ的频率发布数据,并且文本后添加编号

1.发布频率

创建rate对象

2. 调用rate对象里的sleep函数

 3.设置编号

添加头文件

 

 4.添加日志

 因为有中文输出,为避免乱码需要添加该行:

5.编译、运行

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

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

相关文章

引领618首波爆发!实在RPA数字员工与海尔等品牌共赢全域增量

作为全面放开之后的首个现象级电商大促&#xff0c;今年618的重要性不言而喻。如何在“毛遂自荐”的大促秀场中&#xff0c;满足甚至超过消费者购物需求&#xff0c;成为每个品牌商家的必修课。 疫情的催化和直播间强互动属性&#xff0c;越来越多消费者倾向直播购物&#xff0…

在通讯方面对讲机比微信更有优势吗?

对讲机和微信属于不同的通信工具&#xff0c;它们在某些方面都有着各自的优势。那么在通讯方面对讲机比微信更有优势吗&#xff1f;下面河南宝蓝小编为大家详细介绍下。 一、即时与实时通信&#xff1a; 对讲机作为一种即时通信工具&#xff0c;能够立即与其他用户进行实时语…

vue项目中el-upload 组件添加token的方法

在使用el-upload的时候&#xff0c;上传文件到服务器&#xff0c;有时候后台要求上传token&#xff0c;怎么处理呢&#xff1f;以下是一个示例。 效果图 template中片段 <el-dialog :modal-append-to-body"false" title"上传文件" :visible.sync"…

轻巧舒适的挂耳式耳机,更轻更好听,塞那Z30S Pro Max上手

入耳式的蓝牙耳机戴久了&#xff0c;总感觉很不舒服&#xff0c;现在市面上又有了很多设计新颖的耳机类型&#xff0c;像是我上周新换的这款sanag塞那Z30S Pro Max&#xff0c;就是一种不入耳的开放式耳机&#xff0c;做得还十分轻巧&#xff0c;带来了更加舒适的佩戴体验&…

调试记录-USB异常断开调试

问题描述 平台&#xff1a;rk3228 android7.1 问题&#xff1a;板子上有一个USB 4G模块&#xff0c;模块不是用标准的USB接口&#xff0c;而是M2接口。接着4G模组开机是可以正常工作的&#xff0c;但是只要点开任意一个app&#xff0c;就会出现设备断开&#xff0c;之后再重新…

怎么登录远程轻量云服务器?

​  轻量云服务器是一种基于云计算技术的服务器&#xff0c;具有价格低廉、配置灵活、易于管理等优点。但是&#xff0c;由于轻量云服务器通常是在云端运行&#xff0c;需要通过远程连接才能进行管理和操作。那么&#xff0c;怎么登录远程轻量云服务器呢? 要远程连接轻量云服…

Linux--ServerProgramming--(7)IPC

1.管道 2.信号量 2.1 概念 信号量 是一个计数器&#xff0c;用于实现进程间互斥和同步。 信号量的取值可以是任何自然数。 最简单的信号量是只能取 0 和 1 的变量&#xff0c;这也是信号量最常见的一种形式&#xff0c;叫做二进制信号量&#xff08;Binary Semaphore&#…

Docker Cgroups资源控制操作

资源控制 Docker 通过 Cgroup 来控制容器使用的资源配额&#xff0c;包括 CPU、内存、磁盘三大方面&#xff0c; 基本覆盖了常见的资源配额和使用量控制。 Cgroup 是 ControlGroups 的缩写&#xff0c;是 Linux 内核提供的一种可以限制、记录、隔离进程组所使用的物理资源(如…

vm安装,虚拟环境搭建win+linux+mac,及本机连接虚拟环境数据库、windows服务器搭建、内网穿透

教程中的软件、镜像、工具可去阿里云盘提取&#xff1a; 阿里云盘&#xff1a;https://www.aliyundrive.com/s/CLdTjFtnYbr 提取码&#xff1a;s1a8 一、安装虚拟机 下载链接&#xff1a;https://www.vmware.com/products/workstation-pro.html 下载的过程中可能需要注册登录…

经典的设计模式5——建造者模式

文章目录 建造者模式 建造者模式 截止到今天&#xff0c;创建者模式这一类别的模式已经全整理完了&#xff0c;一共包含5个&#xff0c;工厂方法模式&#xff0c;抽象工厂模式&#xff0c;单例模式&#xff0c;原型模式和建造者模式。还是太看的太慢&#xff0c;得加快进度了。…

黑客零基础入门方法有哪些?如何自学黑客技术?

大家经常问我一个问题&#xff0c;黑客零基础入门方法有哪些&#xff1f;以及如何自学黑客技术&#xff1f;首先要说的是世界上大部分的网络黑客都是自学成才的&#xff0c;这与黑客这门技术有很大的原因&#xff0c;黑客是一个靠兴趣驱动的技术&#xff0c;大部分成为黑客的人…

字节面试归来,黑暗3小时......

背景 杭州某中厂的软件测试开发&#xff0c;本科毕业5年&#xff0c;最近面试了PDD、小红书、字节等多个大厂。几乎都拿到了Offer&#xff0c;最终选择了字节2-2。以下是他的一些分享和总结。 从准备看机会开始&#xff0c;一直到拿到offer&#xff0c;经历了2个月的时间&…

探索未来,畅享奇迹——3DVR智慧景区引领旅游革命

导语&#xff1a; 在快速发展的科技时代&#xff0c;我们正逐渐进入一个全新的旅游体验时代。3DVR智慧景区作为旅游业的革命性创新&#xff0c;为游客带来了前所未有的沉浸式体验&#xff0c;同时也为景区管理者带来了无限的营销机遇。 通过穿戴VR设备&#xff0c;游客能够在虚…

vue项目中el-tree 添加右键菜单的方法

vue项目中&#xff0c;如何在el-tree 中显示右键菜单呢&#xff1f;这里的核心用到了 node-contextmenu“rightClick” &#xff0c;具体的操作方法如下&#xff1a; 核心分析 node-contextmenu是el-tree一重要的属性&#xff0c; 当某一节点被鼠标右键点击时会触发该事件。共…

Sui Builder House日本京都站开启报名

下一站Sui Builder House将于6月29-30日在日本京都举行&#xff0c;为世界各地的开发者提供身临其境地学习和交流的机会。 春日的樱花已经绽放&#xff0c;黄金周也已经过去&#xff0c;现在是时候来京都参加Sui Builder House一起庆祝夏天的来临了。来自日本和周边地区的开发…

Java 常量池:静态常量池 动态常量池 字符串池

Java 常量池相关内容 Java 常量池概念分类&#xff1a;静态常量池、动态常量池、字符串常量池&#xff08;由于jdk1.7之后字符串常量池从运行时常量池分离到堆中&#xff09; 静态常量池 class 文件中CLass文件中除了有类的版本、字段、方法、接口等描述信息外&#xff0c;还有…

【C++】C++的类型转换

文章目录 1、C语言中的类型转换2、为什么C需要四种类型转换3、C强制类型转换&#xff08;重点&#xff09;3-1、static_cast3-2、reinterpret_cast3-3、const_cast3-4、dynamic_cast 4、RTTI&#xff08;了解&#xff09;5、常见面试题6、总结 1、C语言中的类型转换 在C语言中&…

选择合适的数据库引擎:InnoDB vs. MyISAM - 你的终极指南!

大家好&#xff0c;我是小米&#xff0c;一个热衷于技术分享的29岁程序员。今天&#xff0c;我将带大家一起探讨一下MySQL中两种常见的存储引擎&#xff1a;InnoDB和MyISAM。它们之间有许多差异&#xff0c;了解这些差异对于我们在选择合适的存储引擎时至关重要。废话不多说&am…

想做好接口测试,先把这些概念搞清楚了

接口一般来说有两种&#xff0c;一种是程序内部的接口&#xff0c;一种是系统对外的接口。 系统对外的接口 比如你要从别的网站或服务器上获取资源或信息&#xff0c;别人肯定不会把数据库共享给你&#xff0c;他只能给你提供一个他们写好的方法来获取数据&#xff0c;你引用…

Springboot配置Log4j日志系统,并将日志存入数据库

Log4j是apache公司开发的一款日志管理系统&#xff0c;可以高效的管理系统中出现的BUG或者各种信息&#xff0c;并且可以已文本的方式或者数据库存入的方式来记录数据 第一步&#xff1a;导入依赖 在pom.xml中导入Log4j依赖 <!-- https://mvnrepository.com/artifact/log…