【古月居《ros入门21讲》学习笔记】09_订阅者Subscriber的编程实现

目录

说明:

1. 话题模型

图示

说明

2. 实现过程(C++)

创建订阅者代码(C++)

配置发布者代码编译规则

编译并运行

编译

运行

3. 实现过程(Python)

创建订阅者代码(Python)

运行效果


说明:

1. 本系列学习笔记基于B站:古月居《ROS入门21讲》课程,且使用的Ubuntu与ROS系统版本与课程完全一致;

虚拟机版本Linux系统版本ROS系统版本
VMware WorkStation Pro 16Ubuntu18.04Melodic

2. 课程中的所有示例代码均已跑通,且对Pyhon版本的代码也都做了运行验证,并附带验证过程(错误均已修正);

3. 本节是整个笔记的第9节,对应视频课程的第11节,请自行对应学习;

4. 整个系列笔记基本已经完结,但部分章节仍需润色修改 ,后面会陆续发布,请大家持续关注,      创作不易,感谢支持!


1. 话题模型

图示

image-20230524132510712

说明

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)步:复制代码到文件中并保存,

image-20230524141635326

配置发布者代码编译规则

将下面两行代码复制到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文件中的位置如下:

image-20230524142947987

编译并运行

编译
cd ~/catkin_ws
catkin_make

第一步:先把工作路径切换到catkin_ws工作空间目录下;

第二步:在catkin_ws工作空间目录下catkin_make编译代码文件

image-20230524144734029

运行
roscore
rosrun turtlesim turtlesim_node
rosrun learning_topic pose_subscriber

第一步:打开ROS Master,打开一个新终端输入:roscore;

第二步:运行海龟仿真器,再打开一个新终端输入:rosrun turtlesim turtlesim_node;

第三步:运行我们编译好的可执行文件,再打开一个新终端输入:rosrun learning_topic pose_subscriber,

这个程序会不断的发布海龟的当前位置(x,y坐标)。

image-20230524145843653

如果我们让海龟动起来,就可以看到海龟当前位置的变化效果,我们可以通过程序或者海龟的键盘控制节点让海龟动起来,

下面为海龟的键盘控制节点方式,

打开一个新终端输入:rosrun turtlesim turtle_teleop_key

image-20230524150527191

我们上面运行的可执行文件的位置在 home/catkin_ws/devel/lib/learning_topic 目录下

image-20230524150713776

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()
​
​

image-20230524151510193

注意:给pose_subscriber.py文件赋予作为程序文件执行的权限,

点击pose_subscriber.py文件,右键,属性,权限,勾选(允许作为程序文件执行),

python文件不需要编译,直接运行即可。

image-20230524152156390

运行效果

运行pose_subscriber.py文件,流程和上面一样,

roscore
rosrun turtlesim turtlesim_node
rosrun learning_topic pose_subscriber.py

image-20230524153342140

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

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

相关文章

LLM能力与应用全解析

一、简介 经过几年时间的发展&#xff0c;大语言模型&#xff08;LLM&#xff09;已经从新兴技术发展为主流技术。而以大模型为核心技术的产品将迎来全新迭代。大模型除了聊天机器人应用外&#xff0c;能否在其他领域产生应用价值&#xff1f;在回答这个问题前&#xff0c;需要…

产品解读:GreatADM如何快速改造单实例为双主、MGR、读写分离架构?

前言 单机GreatDB/GreatSQL/MySQL将架构调整为多副本复制的好处有哪些&#xff1f;为什么要调整&#xff1f; 性能优化&#xff1a;如果单个GreatDB服务器的处理能力达到瓶颈&#xff0c;可能需要通过主从复制、双主复制或MGR及其他高可用方案来提高整体性能。通过将读请求分发…

STM32 ADC转换器、串口输出

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、ADC是什么&#xff1f;二、STM32的ADC2.1 认识STM32 ADC2.2转换方式2.3 为什么要校准&#xff1f;2.4 采样时间计算2.5 触发方式2.6 多通道采集解决方案2.7…

手把手教你如何实现List——ArrayList

目录 前言&#xff1a; 线性表 顺序表 接口的实现 一. 打印顺序表 二.新增元素,默认在数组最后新增 三.在 pos 位置新增元素 四.判定是否包含某个元素 五. 查找某个元素对应的位置 六.获取 pos 位置的元素 七.给 pos 位置的元素设为 value 八.删除第一次出现的关键字k…

基于SSM的酒店预订管理系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

Matlab R2022b 安装成功小记

Matlab R2022b 安装成功小记 前言一、 下载链接二、 安装过程小记 叮嘟&#xff01;这里是小啊呜的学习课程资料整理。好记性不如烂笔头&#xff0c;今天也是努力进步的一天。一起加油进阶吧&#xff01; 前言 windows 10系统之前安装过Matlab R2010b做基础研究&#xff0c;最…

Anaconda离线下载torch与安装包

一、下载离线安装包 命令&#xff1a; pip download 安装包名 -d 安装到文件夹名 -i https://pypi.tuna.tsinghua.edu.cn/simple执行这样的命令就会把安装包的离线文件下载到指定文件夹中。 操作&#xff1a; 打开cmd命令行&#xff0c;并进入相应的目录中。 如果是tor…

k8s中pod的hostport端口突然无法访问故障处理

故障背景&#xff1a; 租户告知生产环境的sftp突然无法访问了&#xff0c;登录环境查看sftp服务运行都是正常的&#xff0c;访问sftp的hostport端口确实不通。 故障处理过程 既然访问不通那就先给服务做个全面检查&#xff0c;看看哪里出了问题&#xff0c;看下sftp日志&#…

Docker基本操作---镜像与容器操作

Docker基本操作---镜像与容器操作 1. 操作镜像1.1 查看镜像1.2 删除镜像1.2.1 删除镜像1.2.2 强制删除镜像1.2.3 删除所有镜像 1.3 启动镜像1.4 常见错误1.4.1 image is being used by stopped container e3b9df6dc6ae 2 操作容器2.1 新建启动容器2.2 查看正在运行的容器2.3 退…

Unity学习笔记11

一、视频播放功能 1.如何让视频在游戏场景中播放&#xff1f; 在Assets目录下添加一个渲染器纹理&#xff0c;步骤&#xff1a;新建→渲染器纹理 首先在创建一个平面&#xff0c;想让视频在平面上显示。在平面上添加一个组件 Video Player 然后将视频文件拖拽到视频剪辑位置上…

黄金比例设计软件Goldie App mac中文版介绍

Goldie App mac是一款测量可视化黄金比例的工具。专门为设计师打造&#xff0c;可以帮助他们在Mac上测量和可视化黄金比例&#xff0c;从而轻松创建出完美、平衡的设计。 Goldie App mac体积小巧&#xff0c;可以驻留在系统的菜单栏之上&#xff0c;随时提供给用户调用。 拥有独…

如何控制Spring工厂创建对象的次数?详解Spring对象的声明周期!

&#x1f609;&#x1f609; 学习交流群&#xff1a; ✅✅1&#xff1a;这是孙哥suns给大家的福利&#xff01; ✨✨2&#xff1a;我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料 &#x1f96d;&#x1f96d;3&#xff1a;QQ群&#xff1a;583783…

Dijkstra算法(贪心),Floyd-Warshall算法(动态规划), Bellman-Ford算法——用Python实现

图论中最短路径三剑客 前言一、Dijkstra算法&#xff08;贪心&#xff09;1.1 Dijkstra在生活中的应用举例1.2 设计思路1.3 算法应用实例1.3.1 以交通规划为例1.3.2 Dijkstra算法执行步骤1.3.3 python代码 1.4 时空复杂度 二、Floyd-Warshall算法&#xff08;动态规划&#xff…

fiddler设置过滤你就这样做,一做一个不只声!

fiddler设置过滤 基本的过滤操作流程以百度为例 步骤&#xff1a; 1、右侧高级工具栏点击Filters》勾选Use Filters》选择Show only Internet Hosts和Show only the following Hosts》在文本框中输入host地址 2、点击Changes not yet saved》再点击Actions》Run Filterset …

如何获取高质量的静态住宅IP代理?常见误区与注意事项

静态住宅IP代理在今天的网络营销领域扮演着至关重要的角色&#xff0c;静态住宅IP代理以其稳定性和高匿名性&#xff0c;为互联网业务提供了一个安全的执行环境。通过模拟真实用户的网络行为&#xff0c;这些IP代理降低了企业在网络营销活动中被识别和封禁的风险。它保护了企业…

echarts修改tooltip默认的圆点图标为其他样式

业务需求&#xff0c;默认是圆点&#xff0c;需要把线的由圆点改为线 红色线是理论&#xff0c;点是历史理论&#xff0c;绿色线是实际&#xff0c; 点是历史实际&#xff0c;在series里的顺序也是这样排的。 打印出来的params里的marker就是圆点&#xff0c;改这段代码就可以了…

使用STM32 HAL库驱动光电传感器的设计和优化

光电传感器在许多应用中起着重要的作用&#xff0c;例如自动计数、距离测量等。STM32微控制器和HAL库提供了丰富的功能和易于使用的接口&#xff0c;使得光电传感器的设计和优化变得更加便捷。本文将介绍如何使用STM32 HAL库驱动光电传感器的设计和优化&#xff0c;包括硬件设计…

OpenCV | 傅里叶变换——低通滤波器与高通滤波器

import cv2 #opencv 读取的格式是BGR import numpy as np import matplotlib.pyplot as plt #Matplotlib是RGB %matplotlib inline def cv_show(img,name):cv2.imshow(name,img)cv2.waitKey()cv2.destroyAllWindows() 傅里叶变换 傅里叶变换的作用 高频&#xff1a;变化剧烈…

JAVA文件IO, File类, 字符流,字节流

文章目录 文件IO1. File2. IO流2.1 字符流2.1.1 Reader2.1.2 Writer 2.2 字节流2.2.1 InputStream2.2.2 FileInputStream2.2.3 利用Scanner进行字符读取2.2.4 OutputStream 文件IO I: Input, 从硬盘往内存读数据 O: Output, 从内存往硬盘输出数据 1. File Java 中通过 java…

解析d3dcompiler_47.dll缺失怎么修复,4种方法修复d3dcompiler_47.dll文件

d3dcompiler_47.dll缺失怎么修复&#xff1f;其实在我们使用计算机操作的过程中&#xff0c;有时会遇到一些由dll文件错误导致的问题&#xff0c;其中d3dcompiler_47.dll丢失就是这样一种。那么究竟d3dcompiler_47.dll缺失是什么意思&#xff0c;为何它会发生丢失&#xff0c;以…