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

news2024/11/28 1:39:25

目录

说明:

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,注册回调函数poseCallback
    ros::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,注册回调函数poseCallback
    rospy.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.coloradmin.cn/o/1266870.html

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

相关文章

【SpringBoot篇】登录校验 — JWT令牌

文章目录 &#x1f339;简述JWT令牌⭐JWT特点 &#x1f33a;JWT使用流程&#x1f6f8;JWT令牌代码实现&#x1f354;JWT应用 &#x1f339;简述JWT令牌 JWT全称为JSON Web Token&#xff0c;是一种用于身份验证的开放标准。它是一个基于JSON格式的安全令牌&#xff0c;主要用于…

SUDS代码复现

复现SUDS代码&#xff0c;主要进行环境配置&#xff0c;数据预处理&#xff0c;训练&#xff0c;查看PSNR渲染指标 1、环境配置 根据SUDS提供的environment.yml文件创建环境&#xff0c;由于安装总是出现环境问题&#xff0c;或者某些包无法下载的问题&#xff0c;如图&#…

单个A100生成3D图像只需30秒,这是Adobe让文本、图像都动起来的新方法

2D 扩散模型极大地简化了图像内容的创作流程&#xff0c;2D 设计行业也因此发生了变革。近来&#xff0c;扩散模型已扩展到 3D 创作领域&#xff0c;减少了应用程序&#xff08;如 VR、AR、机器人技术和游戏等&#xff09;中的人工成本。有许多研究已经对使用预训练的 2D 扩散模…

线性回归及案例实操

线性回归 回归处理的问题为预测&#xff1a; 预测房价销售额的预测设定贷款额度总结&#xff1a;上述案例中&#xff0c;可以根据事物的相关特征预测出对应的结果值 什么是回归 那么&#xff0c;这个回归究竟是什么意思呢&#xff1f;其实回归算法是相对分类算法而言的&…

uniapp上架app store详细攻略

​ 目录 uniapp上架app store详细攻略 前言 一、登录苹果开发者网站 二、创建好APP 前言 uniapp开发多端应用&#xff0c;打包ios应用后&#xff0c;会生成一个ipa后缀的文件。这个文件无法直接安装在iphone上&#xff0c;需要将这个ipa文件上架app store后&#xff0c;才…

linux下实现Qt程序开机自启动

要想实现开机自启动&#xff0c;首先&#xff0c;QT是没有这种实现的&#xff0c;最好是靠电脑开机的启动目录启动软件&#xff0c;下面这个目录 /etc/xdg/autostart 这是操作系统中用于配置启动项的目录&#xff0c;该目录下存放着开机自启动的启动器(.desktop)文件&#xf…

VMD-Attention-LSTM 价格预测实战

VMD-Attention-LSTM时间序列价格预测实战 完整数据代码可直接运行_哔哩哔哩_bilibili 数据展示:数据有几万条 足够的 主要模型代码: import tensorflow as tfdef attention_3d_block(inputs,TIME_STEPS,SINGLE_ATTENTION_VECTOR):# inputs.shape = (batch_size, time_steps,…

水离子水壁炉的科技创新与时尚家居潮流

近年来&#xff0c;水离子水壁炉作为家居装饰的新宠儿&#xff0c;正在以其独特的科技创新和时尚设计引领家居潮流。这一新型壁炉不仅注重外观美感&#xff0c;更借助先进科技实现了温馨的火焰效果&#xff0c;成为现代家居中的独特亮点。 水离子水壁炉的科技创新主要体现在其采…

人工智能在内容相关性Content Relevance方面的应用

许多公司在向客户和潜在客户提供内容服务时犯了一个错误&#xff0c;即定制性不足&#xff0c;内容过于通用&#xff0c;可能与每位目标客户都不相关。谈及内容相关性时&#xff0c;人们希望获得有用的信息和问题解决方法&#xff0c;或具有娱乐性和参与性的内容。 为客户提供…

Ubuntu20.04部署TVM流程及编译优化模型示例

前言&#xff1a;记录自己安装TVM的流程&#xff0c;以及一个简单的利用TVM编译模型并执行的示例。 1&#xff0c;官网下载TVM源码 git clone --recursive https://github.com/apache/tvmgit submodule init git submodule update顺便完成准备工作&#xff0c;比如升级cmake版本…

数据库的重要你了解多少?如何保障数据库的安全?

随着信息技术的快速发展&#xff0c;数据库已经成为企业、组织以及个人日常生活中不可或缺的一部分。然而&#xff0c;随着数据库的广泛应用&#xff0c;其安全性问题也日益凸显。数据库的安全性主要包括数据的完整性、保密性和可用性。本文将探讨数据库安全性的重要性、以及如…

户外低功耗太阳能板供电无线RTU数据采集支持定时采集各类485接口传感器数据推送数据到第三方平台远程监测系统搭建方案

户外低功耗太阳能板供电无线RTU数据采集&#xff0c;下行支持定时采集各种485接口传感器&#xff0c;对外输出5V/12V电压&#xff0c;上行支持各物联网云平台接入。

销售手里的找客户神器:天眼销

那些曾经战斗在B端&#xff08;企业&#xff09;销售战线的朋友们&#xff0c;都应该深知其中的苦涩。尤其是那如同大海捞针般的客户搜寻&#xff0c;批量客户的挖掘&#xff0c;更不用说批量精准客户的寻找了。在互联网的海洋里探索线索&#xff0c;既耗时又耗力&#xff0c;还…

去水印软件有哪些?亲测四款好用去水印神器

去水印软件有哪些&#xff1f;随着图片的普及和应用范围不断扩大&#xff0c;我们有时需要对图片进行编辑或修改。然而&#xff0c;有些图片可能会带有水印&#xff0c;这会降低图片的美观度和应用效果。作为一名自媒体打工人&#xff0c;经过多番对比&#xff0c;整理了四款好…

硬核实力,闪耀羊城!第23届广州车展完美收官,大运乘用车尽显品牌魅力

11月26日&#xff0c;第23届广州国际车展在广州圆满闭幕。作为各大车展的老朋友&#xff0c;本届广交会大运乘用车携旗下潮玩纯电越野小钢炮悦虎及大7座智能豪华纯电MPV远志M1两大明星车型闪耀全场&#xff0c;再次揽收空前关注。 当下以85、90、00后为主的年轻群体看中新能源汽…

基于SpringBoot+微信小程序汽车服务系统的设计与实现

早晨四点起来&#xff0c;开发个基于SpringBoot微信小程序汽车服务系统。 困死我了。 送完孩子&#xff0c;然后去上班。 昨天有个读者朋友问小孟&#xff1a;程序员之间的差距为何如此之大。 有时候甚至在同一所大学&#xff0c;同一个专业&#xff0c;有的学生大四毕业可…

Linux中的Rust支持步入成熟,得到业界巨头的大力支持

导读Rust在Linux中的支持正在逐步走向成熟&#xff0c;并且得到了思科、三星和Canonical等业界巨头的积极支持。尽管Rust不可能完全取代C语言在Linux内核中的地位&#xff0c;但其必将成为Linux开发的重要语言。 Rust语言的安全性和性能优势为其在Linux开发中的应用打开了大门…

Jupyter Markdown 插入图片

首先截图 注意 这一步是关键的&#xff01;&#xff01; 它需要使用电脑自带的截图&#xff0c;用qq啊vx啊美图秀秀那些都不行哦。 截图之后复制&#xff1a; 然后快捷键粘贴到jupyter里面&#xff0c;它会生成一段代码&#xff08;没有代码就是说截图形式不对&#xff09;&a…

如何在数字营销中增强客户体验和参与度

不久前&#xff0c;许多人还把身临其境技术与科幻小说联系在一起&#xff0c;而最近&#xff0c;这种技术又与游戏联系在了一起。如今&#xff0c;许多组织都认识到了采用增强现实和虚拟现实技术改善运营的优势。增强现实&#xff08;AR&#xff09;和虚拟现实&#xff08;VR&a…

MySQL系列 - 数据类型

MySQL是一种常用的关系型数据库管理系统&#xff0c;它支持多种数据类型&#xff0c;包括整数、浮点数、字符串、日期和时间等。在本文中&#xff0c;我们将介绍MySQL中常用的数据类型及其用法。 MySQL数据类型介绍&#xff1a; 1、整数类型&#xff1a; MySQL提供了多种整数…