ROS学习笔记(二) 话题通信

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、话题通信的理论模型
  • 二、代码实现
    • 1.发布方
    • 2.订阅方实现
  • 3.自定义msg的发布方和订阅方
    • 0.预先:
    • 1.代码部分
    • 2.依赖部分
    • 3.终端及效果(包含计算图)
    • 4.注意事项:
  • 4.一个想要讨论的概念:回调函数和spin()


前言

前言:
本文是新手的学习笔记。如有错误欢迎指正
使用版本:ubuntu20.04
使用语言:c++
参考链接:http://www.autolabor.com.cn/book/ROSTutorials/

https://blog.csdn.net/qq_44339029/article/details/120579608?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168007050016800184160811%2522%252C%2522scm%2522%253A%252220140713.130102334…%2522%257D&request_id=168007050016800184160811&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2alltop_positive~default-1-120579608-null-null.142v77insert_down38,201v4add_ask,239v2insert_chatgpt&utm_term=ubuntu20.04%E5%AE%89%E8%A3%85ros&spm=1018.2226.3001.4187

一、话题通信的理论模型

这里是赵老师的官方学习文档中的模型在这里插入图片描述具体化描述:Talker:提亲者,二狗子
Master:媒婆,婚介网站
Listener:翠花
实现流程:二狗子向媒婆提交个人信息,翠花向媒婆订阅男方个人信息(advertise subscribe)
媒婆把手机号发给翠花,
翠花打电话给狗子,
狗子回应并且加vx(此时二者建立连接,可以通过TCP越过master进行交流)

二、代码实现

1.发布方

(1)总体步骤:

1.包含头文件
2.初始化ros节点
3.创建节点句柄
4.创发布者对象
5.编写发布逻辑并发布数据

#include "ros/ros.h"
#include "std_msgs/String.h"
#include <sstream>
/*
发布方实现1.包含头文件2.初始化ros节点3.创建节点句柄4.创发布者对象5.编写发布逻辑并发布数据
*/
int main(int argc,char *argv[]){setlocale(LC_ALL,"");//初始化ros节点ros::init(argc,argv,"Hutao");//创建节点句柄ros::NodeHandle nh;//创建发布者对象ros::Publisher pub = nh.advertise<std_msgs::String>("fang",10);//编写发布逻辑和发布数据//*添加要求 10HZ 并且在文本后添加编号//先发布被创建的信息std_msgs::String msg;//发布;频率ros::Rate rate(10);//编号int count = 0 ;//编写循环,循环中发布数据while(ros::ok()){count++;//实现字符串拼接数字;stringstream类:https://blog.csdn.net/Sakuya__/article/details/122751238std::stringstream  ss;ss<<"hello ---"<<count;//msg.data="hello";msg.data=ss.str();pub.publish(msg);//添加日志ROS_INFO("发布的数据是:%s",ss.str().c_str());rate.sleep();ros::spinOnce();//官方建议添加。处理回调函数}}

(3)调整cmake

add_executable(demo01_pub src/demo01_pub.cpp)
target_link_libraries(demo01_pub${catkin_LIBRARIES}
)

(4)终端代码及效果

cd 工作空间
source ./devel/setup.bash
source rosrun 文件夹 cpp文件名(无后缀)

在这里插入图片描述

(5)可能出现的问题
中文乱码问题:???????
解决方法:setlocale(LC_ALL,"");

2.订阅方实现

1.步骤

1.包含头文件ros中文本类型--->std_msgs/String.h
2.初始化ros节点
3.创建节点句柄
4.创建订阅者对象
5.处理订阅到的数据
6.spin()函数

2.代码实现

# include "ros/ros.h"
#include "std_msgs/String.h"void doMsg(const std_msgs::String::ConstPtr &msg_p){//通过msg获取并且操作订阅到的数据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,"");ros::init(argc,argv,"listener");ros::NodeHandle nh;//实例化 订阅者对象ros::Subscriber sub= nh.subscribe("fang",10,doMsg);//fang就是主题//处理订阅的消息(回调函数)ros::spin();//如果没有很可能订阅不到,这里是堵住的意思,等待话题进来回调*/}

3.终端及代码实现/终端输入:与上面发布方同理
效果:在这里插入图片描述

3.自定义msg的发布方和订阅方

0.预先:

(1)在功能包(src)下定义msg目录,添加文件person.msg

string name
int32 age
float32 height

(2)在package.xml中添加依赖

  <build_depend>message_generation</build_depend><exec_depend>message_runtime</exec_depend>

(3)在cmakeList中编译相关
这几个解除注释,**部分为标注,请自行添加

find_package(catkin REQUIRED COMPONENTSroscpprospystd_msgs***message_generation***
)
# 生成消息时依赖于 std_msgs
generate_messages(DEPENDENCIESstd_msgs
)
#执行时依赖
catkin_package(
#  INCLUDE_DIRS include
#  LIBRARIES demo02_talker_listenerCATKIN_DEPENDS roscpp rospy std_msgs ***message_runtime***
#  DEPENDS system_lib
)# 需要加入 message_generation,必须有 std_msgs

(4)c_cpp_properties.json配置
head文件路径:邮件继承目录打开,pwd并且去掉include后面部分

zzl@zzl-lenovo:~/talker_c/devel/include/plumbing_pubsub$ pwd
/home/zzl/talker_c/devel/include/plumbing_pubsub
{"configurations": [{"browse": {"databaseFilename": "","limitSymbolsToIncludedHeaders": true},"includePath": ["/opt/ros/noetic/include/**","/usr/include/**","/xxx/yyy工作空间/devel/include/**" //配置 head 文件的路径 ],"name": "ROS","intelliSenseMode": "gcc-x64","compilerPath": "/usr/bin/gcc","cStandard": "c11","cppStandard": "c++17"}],"version": 4
}

1.代码部分

/*需求: 循环发布人的信息*/#include "ros/ros.h"
#include "plumbing_pubsub/Person.h"int main(int argc, char *argv[])
{setlocale(LC_ALL,"");ROS_INFO("这是消息发布方:");//1.初始化 ROS 节点ros::init(argc,argv,"talker_person");//2.创建 ROS 句柄ros::NodeHandle nh;//3.创建发布者对象ros::Publisher pub = nh.advertise<plumbing_pubsub::Person>("information",10);//4.组织被发布的消息,编写发布逻辑并发布消息plumbing_pubsub::Person person;person.name = "张三";person.age = 1;person.height = 1.73;ros::Rate rate(1);while (ros::ok()){pub.publish(person);person.age += 1;ROS_INFO("我叫:%s,今年%d岁,高%.2f米", person.name.c_str(), person.age, person.height);rate.sleep();ros::spinOnce();}return 0;
}
--------------------------------------------
/*
订阅方1.包含头文件2.初始化ros节点3.创建节点句柄4.处理订阅者对象5.处理订阅的数据6.调用spin()函数
*/
#include "ros/ros.h"
#include "plumbing_pubsub/Person.h"void doPerson(const plumbing_pubsub::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_INFO("订阅方:");//1.初始化 ROS 节点ros::init(argc,argv,"listen_people");//2.创建 ROS 句柄ros::NodeHandle nh;//3.创建发布者对象ros::Subscriber sub = nh.subscribe("information",10,doPerson);ros::spin();return 0;
}

2.依赖部分

add_executable(demo03_pubmsg src/demo03_pubmsg.cpp)
add_executable(demo04_submsg src/demo04_submsg.cpp)
add_dependencies(demo03_pubmsg ${PROJECT_NAME}_generate_messages_cpp)
add_dependencies(demo04_submsg ${PROJECT_NAME}_generate_messages_cpp)
target_link_libraries(demo03_pubmsg${catkin_LIBRARIES}
)
target_link_libraries(demo04_submsg${catkin_LIBRARIES}
)

3.终端及效果(包含计算图)

roscorezzl@zzl-lenovo:~$ cd talker_c
zzl@zzl-lenovo:~/talker_c$ source ./devel/setup.bashzzl@zzl-lenovo:~/talker_c$ rosrun plumbing_pubsub demo03_pubmsg
zzl@zzl-lenovo:~/talker_c$ rosrun plumbing_pubsub demo04_submsg

在这里插入图片描述rqt_graph
在这里插入图片描述

4.注意事项:

(1)不要提前写依赖,可能在编译时出现这个情况
在这里插入图片描述这里我提前写了订阅方的依赖导致的

4.一个想要讨论的概念:回调函数和spin()

一个讲的比较好的视频链接:https://www.bilibili.com/video/BV1vL411t78b/?spm_id_from=333.337.search-card.all.click&vd_source=d8532aebb8bb1bfb5088a1a3cef25521

尽管如此,我仍旧不能清楚认知回调函数和spin(),以下为为的个人理解。希望有大佬可以指正
回调函数:即把函数名(函数指针)作为参数调用

关于上面subscribe调用domsg函数,我的理解是:subscribe和发布者的消息连接,当有新消息传来时候,subscribe就调用domsg函数作为回调函数,但是如果没有spin(),就不会执行,相当于开辟一个子流程,类似异步通信?中断驱动?spin()就是停下来不断检测有无回调函数

关于我对这个函数的回调和spin()粗俗理解:
翠花订阅二狗子后,一旦二狗子在房有新消息,就给翠花发消息,翠花就把不断看微信消息这件事放在代办里(回调函数),spin是一直反复检查代办。如果不检查则不会看代办

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

作为唯一安全技术入选IEEE,机密计算为什么如此重要?

作者 | 蓝晏翔 邵乐希 出品 | IDEA研究院 大规模AI计算中的数据和模型安全 人工智能技术&#xff08;AI&#xff09;作为这个时代最具影响力的技术&#xff0c;渗透到了我们生活的方方面面。特别是2022年底&#xff0c;OpenAI发布的ChatGPT表现出了惊人的信息分析、整合、决策和…

国产AIGC大模型汇总

“ 随着ChatGPT和GPT-4的出现&#xff0c;直接引爆了全球的AIGC大模型市场&#xff01;为了赶上这一波热潮&#xff0c;国内的大厂和创业公司也纷纷内卷起来&#xff0c;相继发布了自己的大模型。但是到目前为止&#xff0c;没有一个大模型能与ChatGPT相提并论&#xff0c;更比…

chatgpt赋能python:利用Python进行SEO

利用Python进行SEO 随着互联网的发展&#xff0c;SEO&#xff08;搜索引擎优化&#xff09;变得越来越重要。每个拥有网站的人都希望在搜索引擎结果中排名靠前。Python作为一种强大而流行的编程语言&#xff0c;可以帮助我们进行SEO优化。 Python与SEO的结合 Python可以用于…

chatgpt赋能python:Python人机对话程序:打造智能交互的未来

Python人机对话程序&#xff1a;打造智能交互的未来 随着人工智能技术的不断发展&#xff0c;人机对话程序&#xff08;Dialogue System&#xff09;也逐渐成为了研发人员关注和探索的重点。Python作为一门高效、简洁、易学易用的编程语言&#xff0c;成为了众多人机对话程序工…

ChatGPT是如何运行起来的?(下)

本文我们介绍ChatGPT是如何工作的&#xff0c;以及为什么它能够产生连贯和多样化的对话。分上中下篇为读者们呈现。 微信搜索关注《Java学研大本营》 9 嵌入 神经网络--至少在目前的设置中--从根本上说是基于数字的。因此&#xff0c;如果我们要用神经网络来处理像文本这样的东…

自动生成原创文案软件v.1.2.3

各大科技公司纷纷布局大模型领域&#xff0c;微软将向OpenAI进行价值数十亿美元的投资加速其在人工智能领域的技术突破。此外Buzzfeed和亚马逊亦在探索ChatGPT应用场景&#xff0c;正在逐步落地。国内方面&#xff0c;以华为、阿里、百度为代表的科技公司纷纷展开了AI大模型的研…

巴比特 | 元宇宙每日必读:4个月内签下1亿美元的生成式人工智能项目,埃森哲称Gen AI是很大的机会,现在还是早期...

摘要&#xff1a;据 LiveMint 6 月 25 日报道&#xff0c;埃森哲表示&#xff0c;在过去四个月中&#xff0c;该公司在生成式人工智能领域签下了价值 1 亿美元的项目。埃森哲主席兼首席执行官 Julie Sweet 表示&#xff0c;“Gen AI 是一个很大的机会&#xff0c;但现在还是早期…

零基础DIY四轴飞行器超级详细保姆级教程(STM32F407ZGT6主控、WIFI图传、陀螺仪平衡、气压计/超声波定高、手机蓝牙控制等功能)

前言 大四毕业后暑假没事做就花了一点DIY了一个四轴飞行器&#xff0c;是比较大的那种F450机架&#xff0c;不是那种PCB板做机架的小四轴&#xff0c;因为我也是从零基础开始做的四轴&#xff0c;现在就想把自己的过程写成博客分享在网上。下面我会从机械结构、主控和各传感器…

高性能流媒体硬解码

目录 高性能流媒体硬解码前言1. What、Why and How1.1 What1.2 Why&#xff1f;1.3 How&#xff1f; 2. 离散傅里叶变换(DFT)2.1 JPEG编码2.2 哈夫曼编码(Huffman Coding) 3. 视频流媒体前置知识3.1 视频文件的构成3.2 视频的编码与封装3.3 H264编码的分层3.4 RTSP之RTP(Real-t…

《云计算好用工具清单(2023版)》.pdf

其实&#xff0c;自工信部在2018年印发《推动企业上云实施指南&#xff08;2018-2020年&#xff09;》以来&#xff0c;国家政策就已经显示出不断支持与引导着我国云计算行业的发展的态势。 根据美国软件公司Flexera《2021年云计算市场发展状态报告》数据显示&#xff0c;36%的…

基于TCP交互的安卓chatGLM客户端

基于TCP交互的安卓chatGLM客户端 基本原理 随着chatGPT的火爆发展&#xff0c;如何将其快速实现部署和访问成为了急需解决的问题&#xff0c;为此&#xff0c;开发了一个基于TCP交互的安卓chatGLM客户端系统。 其中 后端在开源的 chatGLM-6B 的基础上&#xff0c;使用socket…

aardio + Python 可视化快速开发桌面程序,一键生成独立 EXE

&#x1f680; 优质资源分享 &#x1f680; 学习路线指引&#xff08;点击解锁&#xff09;知识定位人群定位&#x1f9e1; Python实战微信订餐小程序 &#x1f9e1;进阶级本课程是python flask微信小程序的完美结合&#xff0c;从项目搭建到腾讯云部署上线&#xff0c;打造一…

chatgpt赋能python:Python手游:如何用Python技术构建一个优秀的手游?

Python手游&#xff1a;如何用Python技术构建一个优秀的手游&#xff1f; 在当今的数字时代&#xff0c;游戏已经成为一种最流行的娱乐方式之一。尤其是手游&#xff0c;在移动设备上已经占据了巨大市场份额。通过Python编程语言&#xff0c;我们可以使用其强大的功能来构建出…

chatgpt赋能python:Python拦截发包实现网络安全

Python拦截发包实现网络安全 网络安全是当前社会中一个非常重要的话题&#xff0c;无论是企业还是个人都需要采取有效措施保护自身隐私和数据安全。在网络安全中&#xff0c;拦截发包是一个非常有用的技术手段。本文将介绍如何利用Python实现拦截发包&#xff0c;从而实现网络…

AutoCV:Python基础总结

目录 Python基础总结前言Python基础课程总结第一课&#xff1a;开发环境和基本数据类型第二课&#xff1a;控制流程和函数第三课&#xff1a;闭包和根号2的求解第四课&#xff1a;类和三大神器第五课&#xff1a;文件IO和pickle、json第六课&#xff1a;作用域、模块和包、Data…

AutoCV第一课:Python基础

目录 Python基础注意事项一、2023/3/24更新一、2023/3/25更新前言1.开发环境1.1 作业 2.变量和基本数据类型2.1 python常见数据类型2.2 作业2.3 拓展-Python格式化输出 3.算数运算和变量解包3.1 zip函数3.2 拓展-后处理代码详解 4.字符串基本使用4.1 拼接4.2 重复4.3 提取单个字…

Wireshark的抓包和分析,看这篇就够了!

点击上方蓝字 关注【程序IT圈】 WireShark是一个网络封包分析软件。网络封包分析软件的功能是撷取网络封包&#xff0c;并尽可能显示出最为详细的网络封包资料。Wireshark使用WinPCAP作为接口&#xff0c;直接与网卡进行数据报文交换。在网络封包和流量分析领域有着十分强大功能…

全网超详细的Linux iptables命令详解以及详解iptables-save和iptables-restore命令

文章目录 1. 文章引言2. iptables的四表五链2.1 何为四表2.2 何为五链 3. iptables语法格式4. 规则的查看与清除5. 防火墙的备份与还原5.1 iptables-save命令5.2 iptables-restore命令 1. 文章引言 最近在学习Linux iptables&#xff0c;从而知道&#xff0c;它是Linux防火墙系…

chatgpt赋能python:Python拦截游戏封包:打造自己的游戏辅助工具

Python拦截游戏封包&#xff1a;打造自己的游戏辅助工具 随着游戏领域的不断发展&#xff0c;越来越多的玩家开始使用游戏辅助工具提高自己的游戏水平。而Python拦截游戏封包技术的出现&#xff0c;让玩家们能够更加自由地打造适合自己的游戏辅助工具&#xff0c;实现更高效的…

chatgpt赋能python:如何用Python炒股赚钱?

如何用Python 炒股赚钱&#xff1f; 在过去的几年里&#xff0c;随着互联网技术的飞速发展&#xff0c;许多人开始关注股票市场。许多股票交易者也利用数据分析和机器学习技术来辅助他们做出更好的交易决策。Python&#xff0c;作为一种快捷&#xff0c;高效&#xff0c;易于学…