【古月居《ros入门21讲》学习笔记】09_订阅者Subscriber的编程实现
目录
说明:
1. 话题模型
图示
说明
2. 实现过程(C++)
创建订阅者代码(C++)
配置发布者代码编译规则
编译并运行
编译
运行
3. 实现过程(Python)
创建订阅者代码(Python)
运行效果
说明:
1. 本系列学习笔记基于B站:古月居《ROS入门21讲》课程,且使用的Ubuntu与ROS系统版本与课程完全一致;
虚拟机版本 | Linux系统版本 | ROS系统版本 |
---|---|---|
VMware WorkStation Pro 16 | Ubuntu18.04 | Melodic |
2. 课程中的所有示例代码均已跑通,且对Pyhon版本的代码也都做了运行验证,并附带验证过程(错误均已修正);
3. 本节是整个笔记的第9节,对应视频课程的第11节,请自行对应学习;
4. 整个系列笔记基本已经完结,但部分章节仍需润色修改 ,后面会陆续发布,请大家持续关注, 创作不易,感谢支持!
1. 话题模型
图示
说明
ROS Master:管理所有节点
主要节点:
Publisher(turtlesim): 消息的发布者,后面会通过程序(c++,py)实现发布者发布一个位置消息数据;
Message(turtlesim::Pose): 发布者发布的消息数据,Pose为位置消息数据;
Topic(/turtle1/pose): 消息传输管道,将发布者发布的消息数据传输给订阅者,
让Subscriber(Pose Listener)订阅者得到这个消息数据;
Subscriber(Pose Listener): 消息的订阅者,Subscriber(Pose Listener)接收到通过
Topic(/turtle1/pose)传输来的消息数据Message(turtlesim::Pose)。
2. 实现过程(C++)
创建订阅者代码(C++)
cd ~/catkin_ws/src/learning_topic/src touch pose_subscriber.cpp
初始化ROS节点;
订阅需要的话题;
循环等待话题消息,接收到消息后进入回调函数;
在回调函数中完成消息处理。
/*** 该例程将订阅/turtle1/pose话题,消息类型turtlesim::Pose*/#include <ros/ros.h>
#include "turtlesim/Pose.h"
// 接收到订阅的消息后,会进入消息回调函数
void poseCallback(const turtlesim::Pose::ConstPtr& msg)
{// 将接收到的消息打印出来ROS_INFO("Turtle pose: x:%0.6f, y:%0.6f", msg->x, msg->y);
}
int main(int argc, char **argv)
{// 初始化ROS节点ros::init(argc, argv, "pose_subscriber");
// 创建节点句柄ros::NodeHandle n;
// 定义一个名为turtle_vel_pub的Subscriber,订阅名为/turtle1/pose的topic,注册回调函数poseCallbackros::Subscriber pose_sub = n.subscribe("/turtle1/pose", 10, poseCallback);
// 循环等待回调函数ros::spin();
return 0;
}
第(1)步:切换工作路径到~/catkin_ws/srclearning_topic/src目录下
第(2)步:创建代码文件pose_subscriber.cpp;
第(3)步:复制代码到文件中并保存,
配置发布者代码编译规则
将下面两行代码复制到CMakeLists.txt文件中,
add_executable(pose_subscriber src/pose_subscriber.cpp) target_link_libraries(pose_subscriber ${catkin_LIBRARIES})
上面两行代码的作用:
add_executable:将pose_subscriber.cpp代码文件编译成(pose_subscriber可执行文件;
target_link_libraries:把编译生成的可执行文件pose_subscriber跟ROS相关的一些库做连接的,比如调用的C++的接口。
复制到CMakeLists.txt文件中的位置如下:
编译并运行
编译
cd ~/catkin_ws catkin_make
第一步:先把工作路径切换到catkin_ws工作空间目录下;
第二步:在catkin_ws工作空间目录下catkin_make编译代码文件
运行
roscore rosrun turtlesim turtlesim_node rosrun learning_topic pose_subscriber
第一步:打开ROS Master,打开一个新终端输入:roscore;
第二步:运行海龟仿真器,再打开一个新终端输入:rosrun turtlesim turtlesim_node;
第三步:运行我们编译好的可执行文件,再打开一个新终端输入:rosrun learning_topic pose_subscriber,
这个程序会不断的发布海龟的当前位置(x,y坐标)。
如果我们让海龟动起来,就可以看到海龟当前位置的变化效果,我们可以通过程序或者海龟的键盘控制节点让海龟动起来,
下面为海龟的键盘控制节点方式,
打开一个新终端输入:rosrun turtlesim turtle_teleop_key
我们上面运行的可执行文件的位置在 home/catkin_ws/devel/lib/learning_topic 目录下
3. 实现过程(Python)
创建订阅者代码(Python)
cd ~/catkin_ws/src/learning_topic/scripts touch pose_subscriber.py
第一步:先把工作路径切换到~/catkin_ws/src/learning_topic/scripts目录下;
第二步:在scripts文件夹下创建pose_subscriber.py文件;
第三步:双击打开pose_subscriber.py文件,复制代码到里面并保存
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# 该例程将订阅/turtle1/pose话题,消息类型turtlesim::Pose
import rospy
from turtlesim.msg import Pose
def poseCallback(msg):rospy.loginfo("Turtle pose: x:%0.6f, y:%0.6f", msg.x, msg.y)
def pose_subscriber():# ROS节点初始化rospy.init_node('pose_subscriber', anonymous=True)
# 创建一个Subscriber,订阅名为/turtle1/pose的topic,注册回调函数poseCallbackrospy.Subscriber("/turtle1/pose", Pose, poseCallback)
# 循环等待回调函数rospy.spin()
if __name__ == '__main__':pose_subscriber()
注意:给pose_subscriber.py文件赋予作为程序文件执行的权限,
点击pose_subscriber.py文件,右键,属性,权限,勾选(允许作为程序文件执行),
python文件不需要编译,直接运行即可。
运行效果
运行pose_subscriber.py文件,流程和上面一样,
roscore rosrun turtlesim turtlesim_node rosrun learning_topic pose_subscriber.py
相关文章:

【古月居《ros入门21讲》学习笔记】09_订阅者Subscriber的编程实现
目录 说明: 1. 话题模型 图示 说明 2. 实现过程(C) 创建订阅者代码(C) 配置发布者代码编译规则 编译并运行 编译 运行 3. 实现过程(Python) 创建订阅者代码(Python&…...

Java全栈基础篇--集合
集合 集合:集合是java中提供的一种容器,可以用来存储多个数据。 特点: 长度不固定,还可以存储不同的数据(但是一般都用同一类型) 集合和数组既然都是容器,它们有啥区别呢? 数组的长…...

Facebook公共主页受限、被封?一文教你排雷解决
一、Facebook公共主页是什么? 现在人们的生活已经离不开各种社交媒体,只要有智能手机,或多或少会使用一些社交平台,而Facebook是一个拥有大量用户的社交平台。这对于各种企业而言,也是一个十分优秀的营销平台…...

Day04:每日一题:2661. 找出叠涂元素
2661. 找出叠涂元素 给你一个下标从 0 开始的整数数组 arr 和一个 m x n 的整数 矩阵 mat 。 arr 和 mat 都包含范围 [1,m * n] 内的 所有 整数。从下标 0 开始遍历 arr 中的每个下标 i ,并将包含整数 arr[i] 的 mat 单元格涂色。请你找出 arr 中在 mat…...

SpringBoot 整合Redis
在Spring Boot中,你可以使用以下注解来实现Redis的整合: EnableCaching: 在启动类上添加该注解,开启Spring的缓存支持。 Cacheable: 标记方法的返回值可被缓存。当缓存中存在相同 key 的数据时,直接从缓存中获取数据,否则执行方法…...

tensorflow-gpu1.15 + win11 + RTX 4050环境配置
组了一套,不知道行不行 windows11GPURTX 4050python3.7.12tensorflow-gpu1.15.0cudatoolkit10.0.130cudnn7.6.5Keras2.3.1...

jmeter资料
1.jmeter介绍 Apache JMeter是Apache组织开发的基于Java的压力测试工具。用于对软件做压力测试,它最初被设计用于Web应用测试,但后来扩展到其他测试领域。 它可以用于测试静态和动态资源,例如静态文件、Java 小服务程序、CGI 脚本、Java 对象…...

代码随想录算法训练营第三十六天| 435 无重叠区间 763 划分字母区间 56 合并区间
目录 435 无重叠区间 763 划分字母区间 56 合并区间 435 无重叠区间 将intervals数组按照左端点进行升序排序。 设置变量len标志此时新加入端点后所有区间的位置,将其赋初值为第一对区间的右端点,因为该点是一定可达的。设置变量res来存储需要移除空间…...

2023-12-01 事业-代号s-引流技巧和营销思路
摘要: 2023-12-01 事业-代号s-引流技巧和营销思路 引流技巧和营销思路 独立站流量渠道主要有以下几种:1、CPC付费广告:搜索引擎、社交平台、广告联盟平台。2、网红营销:youtube、INS、博客论文、TT直播。适合比较时尚品类3、Affiliate促销网站:优惠券折扣网站发布产品优惠…...

反转链表的Java实现
1. 题目 反转链表,例如,原链表1-2-3-4-5,反转后为5-4-3-2-1。 2. 迭代法实现 private ListNode reverseList(ListNode head) {if(head null || head.next null){return head;}ListNode cur head.next;head.next null;while(cur ! null…...

2022年1月14日 Go生态洞察:Go 1.18 新教程探索
🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…...

国内某知名半导体公司:实现虚拟化环境下的文件跨网安全交换
立足特定应用领域的创新型企业 上海某半导体公司是中国10大集成电路设计公司之一的子公司。该半导体公司是一家特色工艺集成电路芯片制造企业,专注模拟电路、功率器件所需的特色生产工艺研发与制造,。 该半导体公司不断追求创新,提高自身产…...

14.Tomcat和HTTP协议-[一篇通]
文章目录 1.HTTP 协议1.1HTTP 是什么1.2理解 "应用层协议"1.3理解 HTTP 协议的工作过程1.4HTTP 协议格式1.4.1抓包工具的使用(Fiddler)1.4.2抓包工具的原理1.4.3抓包结果1.4.4协议格式总结 1.5HTTP 请求 (Request)1.5.1认识 URL1.5.1.1URL 基本格式1.5.1.2关于 URL e…...

在线陪诊系统: 医疗科技的崭新前沿
在医学科技的快速发展中,在线陪诊系统正成为医疗服务领域的创新力量。通过结合互联网和先进的远程技术,这一系统为患者和医生提供了更为便捷、高效的医疗体验。本文将深入探讨在线陪诊系统的技术背后的核心代码和实现原理。 技术背后的关键代码 在线陪…...

MySQL的基础知识
目录 关系型数据库 SQL通用语法 数据类型 数值类型 字符串类型 日期类型 SQL分类 DDL 数据库操作 表操作 DML 添加数据 修改数据 删除数据 DQL 基本查询 条件查询 聚合函数 分组查询 排序查询 分页查询 执行顺序 DCL 管理用户 权限控制 函数 字符串…...

【EI会议征稿】第七届大数据与应用统计国际学术研讨会(ISBDAS 2024)
第七届大数据与应用统计国际学术研讨会(ISBDAS 2024) 2024 7th International Symposium on Big Data and Applied Statistics 第七届大数据与应用统计国际学术研讨会(ISBDAS 2024)定于2024年3月8-10日在中国上海举行。会议旨在…...

最轻量级最完整的屏幕适配完全适配各个手机方案
当你看到这篇博客的时候,说明你已经迈出了惊人的一步,已经慢慢进入高级资深开发工程师行列了,这是开发之路必备技能。 当你接到一个任务时,每天按照需求原型、设计师UI图立刻积极的开发完成后,满满的兴高采烈去打包提测,板凳还没做安稳,测试人员就提了一个又一个的BUG,…...

IDEA安装python插件并配置
目录 一、Mac1. 安装插件2. 新建项目3. 下载第三方库4. 配置镜像源 一、Mac 1. 安装插件 在plugins中搜索python 2. 新建项目 使用本项目独享的虚拟环境,选择解释器 如果需要修改解释器可以进入project structure,在SDKs中点击,选择add py…...

简单的Python烟花代码,跨年了
运行效果 这一份烟花代码还是很有水分的,运行效果也是抽象 源代码 import turtle import random# 设置窗口大小 turtle.setup(400, 500)# 设置画笔 t turtle.Turtle() t.speed(0) t.color("red")# 画烟花 for i in range(50):t.penup()t.goto(random.r…...

社区医院儿童疫苗接种管理系统设计与开发
社区医院儿童疫苗接种管理系统设计与开发 摘要 自建国以来我国一直注重于卫生健康的建设,而儿童的生命健康更得到重视。疫苗接种作为有效防御疾病的手段之一,一直被广泛应用在世界各地。目前,有相当一部分社区准备使用信息管理系统来进行优…...

Docker下安装Redis
如果我们在Docker上直接拉取redis并运行镜像,当容器删除之后,redis容器里的数据不会被保存,所以我们在运行容器的时候,需要使用数据卷进行挂载,按照如下操作即可。 安装步骤 新建目录/opt/redis [rootlocalhost data…...

【python笔记】与网络编程相关的知识总结
前言 菜某的笔记总结 内网IP与公网IP 首先,我们知道全球电脑数量众多,但是IP有限,所以我们无法每人分配一个IP。 应对这种情况,我们就出现了内网IP和外网IP。 首先我的公司为路由器注册了一个公网IP,那么外界对我…...

【libGDX】Mesh立方体贴图(6张图)
1 前言 本文通过一个立方体贴图的例子,讲解三维纹理贴图的应用,案例中使用 6 张不同的图片给立方体贴图,图片如下。 读者如果对 libGDX 不太熟悉,请回顾以下内容。 使用Mesh绘制三角形使用Mesh绘制矩形使用Mesh绘制圆形使用Mesh绘…...

数据爬取+数据可视化实战_哪里只得我共你(Dear Jane)_词云展示----网易云
一、前言 歌词上做文本分析,数据存储在网页上,需要爬取数据下来,词云展示在工作中也变得日益重要,接下来将数据爬虫与可视化结合起来,做个词云展示案例。 二、操作步骤 代码如下: # -*- coding:utf-8 -*-…...

spring事务管理快速入门(以转账为例)
spring事务管理(以转账为例) 概述 Spring事务管理提供了一种在应用程序中管理事务的机制,它抽象了底层的事务管理细节,使得开发者可以更加专注于业务逻辑的实现,而不必过多关心事务的处理。以下是Spring事务管理的一…...

如何在VS2022上的MFC项目中操作Excel(VS2010、VS2012、VS2015、VS2017、VS2019使用方法一样)
先决条件 本机安装office2003、2007、2010、2016及以后版本,总之必须安装office导入Excel库文件,导入方式可参考: 如何在vs2017及以前版本(vs2010、vs2015)上添加 添加类型库中的MFC类如何在vs2019及以后版本(如vs2022)上添加 添加ActiveX控…...

【Java8系列06】Java8数据计算
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

Andrioid T 实现充电动画(2)
Andrioid T 实现充电动画(2) 以MTK平台为例,实现充电动画 效果图 资源包 修改文件清单 system/vendor/mediatek/proprietary/packages/apps/SystemUI/res/layout/prize_charge_layout.xmlsystem/vendor/mediatek/proprietary/packages/ap…...

静态方法和属性的经典使用-单例设计模式
单例设计模式 一、设计模式二、单例模式1、饿汉式2、懒汉式3、区别 单例设计模式是静态方法和属性的经典使用。 一、设计模式 设计模式是在大量的实践中总结和理论化之后优选的代码结构、编程风格、以及解决问题的思考方式。设计模式就像是经典的棋谱,不同的棋局&…...

TCP七层协议
物理层 中间的物理链接可以是光缆、电缆、双绞线、无线电波。中间传的是电信号,即010101...这些二进制位。 比特(bit)是二进制(Binary Digit)的简称,电脑所有的信息都是二进制的,就是0和1组成的。 数据链路层 早期…...