【ROS2】使用C++实现简单的发布订阅方

1 构建自定义数据类型

1、自定义消息类型Student

1.1 创建base_interfaces_demo包

1.2 创建Student.msg文件

string name
int32 age
float64 height

1.2 在cmakeLists.txt中增加如下语句

#增加自定义消息类型的依赖
find_package(rosidl_default_generators REQUIRED)
# 为接口文件生成源代码
rosidl_generate_interfaces(${PROJECT_NAME}"msg/Student.msg")

2、发布方实现

/*
需求:以固定频率发布文本消息:“hello world!!”,文本后缀编号,每发布一条,编号+1
流程:1. 包含头文件2. 初始化ROS2客户端;3. 自定义节点类;1. 创建发布方;2. 创建定时器;3. 在回调函数中,组织并发布消息,4. 调用spin函数,传入自定义类的对象指针;释放资源;*/#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"
#include "base_interfaces_demo/msg/student.hpp"using namespace std::chrono_literals;
using base_interfaces_demo::msg::Student;class Talker:public rclcpp::Node
{
private:/* data */
public:Talker():rclcpp::Node("talker_node_cpp_stu"),count(0){RCLCPP_INFO(this->get_logger(),"发布节点已创建!");// 创建发布者publisher_=this->create_publisher<Student>("chatter_stu",10);//10为队列长度// 创建定时器timer_ = this->create_wall_timer(0.1min,std::bind(&Talker::on_timer,this));};
private:rclcpp::Publisher<Student>::SharedPtr publisher_;rclcpp::TimerBase::SharedPtr timer_;size_t count;void on_timer(){auto message_= Student();message_.name="Pang Weijian";message_.age=35;message_.height=175.7;RCLCPP_INFO(this->get_logger(),"发布方发布的消息:姓名:%s,年龄:%d, 身高:%f",message_.name.c_str(),message_.age,message_.height);publisher_->publish(message_);}//~Talker():rclcpp::Node();
};int main(int argc, char ** argv)
{//初始化客户端rclcpp::init(argc,argv);//// 调用回旋函数rclcpp::spin(std::make_shared<Talker>());// 释放资源rclcpp::shutdown();//printf("hello world cpp01_topic package\n");return 0;
}

3、订阅方实现

/*
需求:订阅发布方发布的消息并在终端输出
流程:1.包含头文件;2.初始化客户端;3.自定义节点类;1. 创建订阅方;2. 在回调函数中解析并输出数据;4.调用回旋函数,并传入节点对象指针;5.资源释放*/#include "rclcpp/rclcpp.hpp"
//#include "std_msgs/msg/string.hpp"
#include "base_interfaces_demo/msg/student.hpp"using base_interfaces_demo::msg::Student;// 自定义节点类
class Listener:public rclcpp::Node
{
private:/* data */void do_cb(const Student &msg){RCLCPP_INFO(this->get_logger(),"订阅到的消息:姓名:%s,年龄:%d,身高:%f",msg.name.c_str(),msg.age,msg.height);}rclcpp::Subscription<Student>::SharedPtr subscription_;public:Listener();~Listener();
};Listener::Listener():Node("listener_node_cpp")
{RCLCPP_INFO(this->get_logger(),"订阅方创建");subscription_ = this->create_subscription<Student>("chatter_stu",10,std::bind(&Listener::do_cb,this,std::placeholders::_1));}Listener::~Listener()
{
}int main(int argc, char const *argv[]){// 初始化节点rclcpp::init(argc,argv);// 调用回旋函数rclcpp::spin(std::make_shared<Listener>());return 0;
}

4. 运行colcon build 编译所选包,运行结果如下:

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

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

相关文章

C++ namespace高级用法

高级用法 C++中的命名空间(namespace)是一种用于组织代码的机制,它可以帮助避免命名冲突,并使代码更加清晰和易于维护。以下是C++命名空间的一些高级用法: 嵌套命名空间:命名空间可以嵌套在其他命名空间中,形成一个层次结构。嵌套命名空间可以进一步细化命名空间,使其更…

k8s operator从0到1实践

文章目录 环境准备一个k8s集群开发工具包mac安装 实践初始化operator项目核心逻辑编写测试验证验证 部署 参考 环境准备 一个k8s集群 推荐使用docker-desktop&#xff0c;本地单机集群 开发工具包 这里推荐使用脚手架工具kubebuilder 使用脚手架工具&#xff0c;能生成项目…

Java基础-常量,变量,数据类型-笔记

1.关键字分类 用于定义数据类型的关键字&#xff1a;class&#xff0c;interface&#xff0c;enum&#xff0c;byte&#xff0c;short&#xff0c;int&#xff0c;long&#xff0c;float&#xff0c;double&#xff0c;char&#xff0c;boolean,void。 用于定义流程控制的关键字…

「微服务」企业微服务架构

首先&#xff0c;来自Darren的消息是&#xff0c;微服务架构并不是构建大规模企业应用程序的新方式。Netflix和亚马逊等公司已经实施了微服务架构&#xff0c;在过去几年中提供了成功的产品。 但是微服务架构适合您的组织吗&#xff1f;答案不是简单的是或否&#xff0c;但我会…

【Vue样式绑定详细介绍】

Vue样式绑定详细介绍 1. 样式绑定2. 字符串语法3. 对象语法4. 数组语法4. 自动添加前缀5. 多重值 (2.x的.9版本或3.x) 1. 样式绑定 在Vue中&#xff0c;样式绑定是通过 v-bind:style 或简写 :style 来实现的&#xff0c;它允许你将多种样式动态地绑定到元素上&#xff0c;样式…

Atcoder beginner contest 336 -- D -- Pyramid

目录 D -- Pyramid: 题目大意&#xff1a; 思路解析&#xff1a; 代码实现&#xff1a; D -- Pyramid: 题目大意&#xff1a; 给你一个长度为n的数组&#xff0c;你可以对这个数组进行以下操作。 操作1&#xff1a;选择任意一个元素&#xff0c;使其值大小减一。 操作2&…

web前端javaScript笔记——(11)DOM

一、DOM简介 DOM简介 <!DOCTYPE html> <head><meta charset"UTF-8"><title></title><style></style><script type"text/javascript">/*宿主对象&#xff0c;由浏览器&#xff0c;运行环境为我们提供的对…

基于Java SSM框架实现学生成绩管理系统项目【项目源码+论文说明】

基于java的SSM框架实现学生成绩管理系统演示 摘要 学生成绩是高校人才培养计划的重要组成部分&#xff0c;是实现人才培养目标、培养学生科研能力与创新思维、检验学生综合素质与实践能力的重要手段与综合性实践教学环节。而学生所在学院多采用半手工管理学生成绩的方式&#…

FFmpeg技术详解

FFmpeg技术详解 本文概不介绍相关安装配置&#xff0c;详情请入官方或者其他大佬博客&#xff0c;此处做出推荐&#xff1a; https://ffmpeg.org/ FFmpeg官网 https://ffmpeg.github.net.cn/developer.html FFmpeg中文文档 https://blog.csdn.net/m0_47449768/article/details/…

如何安装Docker及对Docker环境进行配置

Linux环境 安装 在线安装 配置yum安装源 wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo yum安装docker yum -y install docker-ce-18.06.1.ce-3.el7 docker --version 离线安装 docker安装包下载&#x…

steam搬砖项目赚钱吗?低门槛副业月入5k真的假的?

steam搬砖项目一开始默默无闻&#xff0c;现在越来越受欢迎&#xff0c;因为大家都看到了该项目的长期稳定性。 steam搬砖项目主要是搬csgo游戏装备和道具&#xff0c;从steam购买&#xff0c;在网易Buff上出售&#xff0c;赚取差价。只需少量投资&#xff0c;即可获得长期稳定…

(框架设计-基础库建设) boost 库

“框架”这个词所有的开发都听过&#xff0c;但是有多少人能理解框架的作用&#xff1f;为什么要花那么大精力去弄一个框架&#xff1f;大家应该都听过各个大厂稍微大点的项目都会有一个“框架组”/“架构组”等。 费这么大人力组建一个组来 做框架/架构 到底值不值呢&#xff…

软件测试|Python requests库的安装和使用指南

简介 requests库是Python中一款流行的HTTP请求库&#xff0c;用于简化HTTP请求的发送和处理&#xff0c;也是我们在使用Python做接口自动化测试时&#xff0c;最常用的第三方库。本文将介绍如何安装和使用requests库&#xff0c;以及一些常见的用例示例。 安装requests库 首…

C++ 类、结构体

C 类、结构体 类可以将变量、数组和函数完美地打包在一起。 类与结构体 类的定义&#xff1a; class Person {private:int age,height;double money;string books[100];public:string name;void say(){cout<<"Im"<<name<<endl;}int get_age(){…

Python Matplotlib 动画教程:提高可视化吸引力的强大工具【第24篇—python:Matplotlib】

文章目录 &#x1f356; 方法一&#xff1a;使用pause()函数&#x1f680; 方法二&#xff1a;使用FuncAnimation()函数&#x1f94b; 线性图动画&#xff1a;&#x1f3bb; Python中的条形图追赶动画&#x1f30c; Python中的散点图动画&#xff1a;&#x1f6f9; 条形图追赶的…

JPA的复杂查询包括一对多多对一和多对多的查询

1. 多表关联查询和排序 假设我们有两个实体类&#xff1a;Customer和Order&#xff0c;它们之间是一对多的关系&#xff0c;即一个客户可以有多个订单。我们想要查询某个客户的所有订单&#xff0c;并按订单金额进行降序排序。 Entity Table(name "customers") pu…

Java Web项目中 JSP 访问问题

一、名词说明&#xff1a; 1、JSP 文件一般有两个存放位置 &#xff08;1&#xff09;webapp 的 WEB-INF目录中 &#xff08;2&#xff09;webapp 目录中 其中 存放在 WEB-INF 被成为 安全目录 安全目录&#xff1a;就是客户端无法访问&#xff0c;只有服务端可以访问的…

day01

文章目录 创建Vue实例插值表达式响应式数据常见标签v-htmlv-show v-ifv-if v-else-if v-elsev-onv-bindv-forv-model 综合案例 创建Vue实例 <!--创建Vue实例&#xff0c;初始化渲染1. 准备容器2. 引包&#xff08;官网&#xff09; — 开发版本/生产版本3. 创建Vue实例 ne…

Maven《一》-- 一文带你快速了解Maven

目录 &#x1f436;1.1 为什么使用Maven 1. Mavan是一个依赖管理工具 ①jar包的规模 ②jar包的来源问题 ③jar包的导入问题 ④jar包之间的依赖 2. Mavan是一个构建工具 ①你没有注意过的构建 ②脱离IDE环境仍需构建 3. 结论 &#x1f436;1.2 什么是Maven &#x…

感知机(二分类模型)

目录 1.感知机计算预测值&#xff1a;2.感知机训练&#xff1a;3.损失函数&#xff1a;4.多层感知机&#xff1a;5.单隐藏层的多层感知机代码实现&#xff1a; 1.感知机计算预测值&#xff1a; 训练结果只有1、-1&#xff0c;故正负相同训练正确&#xff0c;正负相反即训练错误…