ROS2核心概念之代码示例一

ros2 代码结构及源码解析 一、ros2 软件架构 二、ros2 命令代码解析 1.ros2 action 源码解析 2.ros2 bag 源码解析 3.ros2 run 源码解析 4.ros2 launch 源码解析 三、ros2 相关模块介绍 fastrtsp 源码解析 阅读详情

上一篇主要写了些概念,可以参考之前文章。这一篇主要写下代码的demo,主要参考了古月居的代码。

Node代码

class HelloWorldNode : public rclcpp::Node
{
    public:
        HelloWorldNode()
        : Node("node_helloworld_class")                          // ROS2节点父类初始化
        {
            while(rclcpp::ok())                                  // ROS2系统是否正常运行
            {
                RCLCPP_INFO(this->get_logger(), "Hello World");  // ROS2日志输出
                sleep(1);                                        // 休眠控制循环时间
            }
        }
};

int main(int argc, char * argv[])                               
{

    // ROS2 C++接口初始化
    rclcpp::init(argc, argv);        
    
    // 创建ROS2节点对象并进行初始化                 
    rclcpp::spin(std::make_shared<HelloWorldNode>()); 
    
    // 关闭ROS2 C++接口
    rclcpp::shutdown();                               
    
    return 0;
}

上边代码是一个HelloWorldNode的节点,通过ROS2去创建并运行,一直打印该节点的输出。节点其实是rclcpp中的Node节点。

Topic代码

class PublisherNode : public rclcpp::Node
{
    public:
        PublisherNode()
        : Node("topic_helloworld_pub") // ROS2节点父类初始化
        {
            // 创建发布者对象(消息类型、话题名、队列长度)
            publisher_ = this->create_publisher<std_msgs::msg::String>("chatter", 10); 
            // 创建一个定时器,定时执行回调函数
            timer_ = this->create_wall_timer(
                500ms, std::bind(&PublisherNode::timer_callback, this));            
        }

    private:
        // 创建定时器周期执行的回调函数
        void timer_callback()                                                       
        {
          // 创建一个String类型的消息对象
          auto msg = std_msgs::msg::String();   
          // 填充消息对象中的消息数据                                    
          msg.data = "Hello World";
          // 发布话题消息                                                 
          RCLCPP_INFO(this->get_logger(), "Publishing: '%s'", msg.data.c_str()); 
          // 输出日志信息,提示已经完成话题发布   
          publisher_->publish(msg);                                                
        }
        
        rclcpp::TimerBase::SharedPtr timer_;                             // 定时器指针
        rclcpp::Publisher<std_msgs::msg::String>::SharedPtr publisher_;  // 发布者指针
};

// ROS2节点主入口main函数
int main(int argc, char * argv[])                      
{
    // ROS2 C++接口初始化
    rclcpp::init(argc, argv);                
    
    // 创建ROS2节点对象并进行初始化          
    rclcpp::spin(std::make_shared<PublisherNode>());   
    
    // 关闭ROS2 C++接口
    rclcpp::shutdown();                                

    return 0;
}

这是PublisherNode节点的服务,发布话题;创建一个定时器,10ms执行一次;有发布就有订阅,下面看看订阅者的代码;

class SubscriberNode : public rclcpp::Node
{
    public:
        SubscriberNode()
        : Node("topic_helloworld_sub")        // ROS2节点父类初始化
        {
            subscription_ = this->create_subscription<std_msgs::msg::String>(       
                "chatter", 10, std::bind(&SubscriberNode::topic_callback, this, _1));   // 创建订阅者对象(消息类型、话题名、订阅者回调函数、队列长度)
        }

    private:
        void topic_callback(const std_msgs::msg::String::SharedPtr msg) const                  // 创建回调函数,执行收到话题消息后对数据的处理
        {
            RCLCPP_INFO(this->get_logger(), "I heard: '%s'", msg->data.c_str());       // 输出日志信息,提示订阅收到的话题消息
        }
        
        rclcpp::Subscription<std_msgs::msg::String>::SharedPtr subscription_;         // 订阅者指针
};

// ROS2节点主入口main函数
int main(int argc, char * argv[])                         
{
    // ROS2 C++接口初始化
    rclcpp::init(argc, argv);                 
    
    // 创建ROS2节点对象并进行初始化            
    rclcpp::spin(std::make_shared<SubscriberNode>());     
    
    // 关闭ROS2 C++接口
    rclcpp::shutdown();                                  
    
    return 0;
}

SubscriberNode 这个就是订阅者,订阅了发布者的话题,发布者发布消息后,订阅了话题的消费者就能收到该话题。

有一点没有说,有个10,这个参数是QoS的默认值,10为历史深度,可以自定义。

好了,结束了,这一篇先聊到这,主要是梳理了ROS2的Node和Topic相关的代码示例,以后我们在程序里看到类似的代码,就很容易理解了。当然,这是用C++写的,如果C++不是特别好,建议看看这里。

ROS2话题模型代码解读 详细解读ROS话题模型的代码,以鱼香ROS的代码为例子 阅读详情

相关推荐

ros1 和 ros2的区别

为什么用ros2.00.概述1.基本概念基本概念:ROS网络(ROS Graph)概念简介:节点(Nodes)客户端程序库发现2. ros2 的目标3. ros2 的架构4. ros1 和ros2的通信模型 0.概述 其实是为了解决ros1中的一些问题 主要是从下面几个文章整过来 古月居的博客https://www.guyuehome.com/805 Why ROS 2? http://desi...

weixin_36628778的博客 2万+

ros2相关代码记录

ROS2(Robot Operating System 2)是一个用于机器人应用程序的开源软件框架。它是ROS(Robot Operating System)的下一代版本,旨在改进和扩展原始ROS的特性,以适应更广泛的机器人应用场景和需求。ROS2的发展重点包括提高系统的实时性能、可靠性、可伸缩性和跨平台可移植性。

weixin_50161877的博客 1350

赵虚左Ros2-核心篇讲义学习-第二三章 ROS2通信机制核心

在ROS2中通信方式虽然有多种,但是不同通信方式的组成要素都是类似的,比如:通信是双方或多方行为、通信时都需要将不同的通信对象关联、都有各自的模型、交互数据时也必然涉及到数据载体等等。本节将会介绍通信中涉及到的一些术语。话题通信是ROS中使用频率最高的一种通信模式,话题通信是基于发布订阅模式的,也即:一个节点发布消息,另一个节点订阅该消息。

迷途 8852

【ROS2】spin_smoe的使用示例代码及踩坑点

本文给出的只是简单的使用示例,但再有了原理性的认知后,读者可以拓展更多的进阶用法,还有一点需要注意的是:用设置while循环为500ms,而节点类里面的回调设置100ms,会发现最后按500ms的周期打印消息为100ms,节点类里面的回调设置500ms,最后也是按500ms的周期打印消息。最后,建议先看踩坑部分,再看正常代码示例。

Vingnir的博客 2102

ros2通信核心之DDS简介

DDS(Data Distribution Service,数据分发服务)是一种用于实时系统的通信中间件,它为分布式应用程序提供可靠、高效的数据传输。ROS 2 使用 DDS 作为其底层通信机制,因此理解 DDS 的基本概念对于 ROS 2 编程至关重要。

elais_h的博客 3327

ROS2 概念以及通信方式

ROS 2(Robot Operating System 2)是一个用于机器人开发的开源平台,它提供了一系列工具和库,用于构建机器人应用程序。相较于前身ROS(ROS 1),ROS 2在设计上考虑了更多的实时性、安全性和可靠性因素,因此适用于更广泛的应用场景和硬件平台。以下是ROS 2的一些关键特点和概念:分布式架构:ROS 2支持分布式架构,允许节点在多个物理机器上运行,通过网络进行通信。这种架构支持更复杂和大规模的机器人系统。实时性:ROS 2引入了实时通信机制,如数据流控制(DDS),以支持严格的实时

qq_50284870的博客 3084

代码ros2

int count;int flag=1;--i){} else {if(!flag=2;flag=3;flag=4;flag=5;

qq_55916082的博客 348

ROS2架构介绍

ROS 2 并非简单地对 ROS 1 进行升级,而是一次彻底的重新设计。它通过引入 DDS 作为通信核心,并结合现代软件工程实践,成功解决了 ROS 1 在多机器人系统、实时性、安全性和跨平台支持等方面的诸多痛点。其分层架构、标准化的生命周期管理、丰富的 QoS 策略以及内建的安全机制,使得 ROS 2 能够更好地满足现代复杂机器人应用在可靠性、性能和安全性方面的严苛需求。

weixin_39475026的博客 2519

古月·ROS2入门21讲——学习笔记(一)核心概念部分1-14讲

数量也并不是唯一的。

weixin_45897172的博客 9902

ROS2 - 核心概念

ROS 2是一个基于强类型、匿名发布/订阅机制的中间件,它允许在不同进程之间传递消息。任何ROS 2系统的核心都是ROS图。ROS图是指ROS系统中的节点网络以及它们之间进行通信的连接。这些概念将帮助您开始了解ROS 2的基础知识。

机器人控制与仿真应用 706

【Linux系统】Kdenlive软件多机位同音频视频同步化处理

Kdenlive简介 官网链接:https://kdenlive.org/zh/ 命令行安装: apt-get install kdenlive Kdenlive能够进行多轨道视频编辑,可以使用和调整多条音频、视频轨道。每条轨道可以按需进行单独锁定、静音。 Kdenlive多机位同音频视频同步化处理步骤 1. 新建Kdenlive文件 选择<文件>-<新建>,建立新的kdenlive文件,初始设置为<视频轨:2>,<音频轨:2>。 视.

qq_31550269的博客 1882

ROS 2从入门到精通系列(一):什么是ROS2 - 核心概念和架构

ROS 2是新一代机器人操作系统框架,相比ROS 1在实时性、安全认证和跨平台支持等方面有显著改进。其核心架构包含节点(Node)、话题(Topic)、服务(Service)和动作(Action)四大通信机制,采用DDS中间件实现高效通信。ROS 2提供完整的工具链和算法库,支持LTS长期支持版本,适用于从开发到生产的全流程。系统采用分布式计算模型,通过状态机管理节点生命周期,为机器人软件开发提供了标准化、模块化的解决方案。

weixin_52694742的博客 5283

【Clickhouse从入门到精通】第60篇:ClickHouse生态总结与未来展望

ClickHouse系列收官总结 本文作为《ClickHouse从入门到精通》系列的第60篇收官之作,系统回顾了整个系列的知识体系。文章从基础概念到高级应用,全面梳理了ClickHouse的核心技术: 知识体系:完整回顾了60篇文章的知识图谱,包括列式存储原理、MergeTree引擎家族、分布式架构等核心内容 生态工具:详细盘点了ClickHouse的企业版工具、运维监控、数据集成和可视化方案 版本演进:分析了从21.x到24.x的主要版本特性升级 未来趋势:展望了向量化引擎、湖仓一体、AI集成等发展方向

xyghehehehe的专栏 438

ROS2极简总结-核心概念(一)

参考文献:ROS2 Foundation - An introduction to core concepts 纲要 计算图(Computation Graph) 节点(Node) 节点组成(Node Composition) 主题和消息(Topics and Messages) 执行器(Executor) 服务(Services) 行动(Actions) 参数(Params) 启动文件(Launch files) 1 计算图 计算图(Computation Graph)用于显示ROS

zhangrelay的专栏 3898

量化交易之因子分析大全

在机器学习项目中,特征工程是非常重要的。在量化研究中也是如此。本文将量化研究中常用到的特征,也就是因子进行详细收纳,并给出推导公式和实现代码。

夏之微风的博客 2282

深入解析:使用Python进行T矩阵散射计算的完整指南

在物理学和工程学中,散射是一个至关重要的概念。当波(无论是光波、声波还是其他类型的波)遇到一个障碍物时,它会在多个方向上散开。为了理解和预测这种行为,我们需要进行数学建模和计算。其中,T矩阵方法是一种非常有效的工具。在开始计算之前,我们需要定义一些基础函数。"""计算T矩阵的一个元素。参数:- wave_vector: 波矢- scatterer_position: 散射体的位置- scatterer_properties: 散射体的性质(如大小、形状等)返回:- T矩阵的一个元素。

qq_38334677的博客 1051

ROS2核心概念之代码示例二

上一节主要写了Node,Topic的代码示例,这一节继续写未写完的。

yajunjiao的专栏 871

开关电源和线性电源Multisim电路仿真实验汇总——硬件工程师笔记

本文系统介绍了稳压电源的基础知识与应用实验。首先阐述了稳压电源的定义与类型,包括线性稳压电源(如LM7805/7905)和开关稳压电源(降压/升压/升降压式)的工作原理、参数特点及优劣势。随后详细讲解了各类稳压电源的实验设计,如线性稳压电源的电路实现、开关稳压电源的PWM控制方法等。最后汇总了硬件工程师相关的笔试面试资源,涵盖器件知识、电路仿真、企业真题等内容。全文结合理论分析与Multisim仿真,为电子工程学习者提供了稳压电源的实用技术参考。

XU157303764的博客 1638

ROS 2 核心概念详解与区分指南

摘要:ROS 2核心概念包含节点(独立执行单元)、功能包(软件容器)、接口(通信协议规范)、话题(单向数据流)、服务(同步请求/响应)和动作(异步长时任务)。节点类比餐厅服务员,功能包如工具集,接口定义通信格式。话题适用于持续数据流,服务处理即时命令,动作管理带反馈的长任务。通过ros2命令行工具可查看各组件,实际应用如机器人导航系统使用这些机制协同工作。理解这些概念的关系(见图表)是构建ROS 2系统的基础,建议结合turtlesim等示例实践掌握。

m0_55260921的博客 1180

Linux ARM平台开发系列讲解(摄像头V4L2子系统) 2.12.5 V4L2 control的原理和实现

既然涉及到视频输入,就会有很多与 相关的效果,比如对比度、饱和度、色温、白平衡等等,这些都是通用的、必须的控制项,并且大多数仅需要设置一个整数值即可。 内核中已经为我们提供了这个控制类型的,我们只需要明确自己需要添加什么控制类型,然后将其添加进内核中即可。该部分摄像头代码一半厂家会提供驱动或者相对应的参数,否则没有图像处理知识很难开发出来。 返回总目录...

DSMGUOGUO的博客 1435

麒麟系统无法进入单用户模式该怎么办?

🏆本文收录于《全栈Bug调优(实战版)》专栏,主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!! 备注:部分问题/疑难杂症搜集于互联网。

**My Coding Family** 1820

ROS2核心概念之服务

话题通信可以实现多个ROS节点之间数据的单向传输,使用这种异步通信机制,发布者无法准确知道订阅者是否收到消息,本节我们将一起学习ROS另外一种常用的通信方法——服务,可以实现类似你问我答的同步通信效果。

Graceful_scenery的博客 1028

STM32入门教程:无人机控制

我们将会一步一步引导您完成无人机的控制代码,包括无人机的姿态控制、飞行控制和通信控制等。第三步:配置无人机姿态控制 无人机的姿态控制是指控制无人机在空中的倾斜和转向。为了实现姿态控制,我们需要使用加速度计和陀螺仪传感器来获取无人机的姿态信息,并使用PID控制算法来控制无人机的姿态。在这一步骤中,您需要根据您使用的具体传感器和控制算法的要求进行更详细的配置和编码。在通信控制中,您需要考虑到通信的稳定性和可靠性。第五步:通信控制 无人机的通信控制是指与地面站或其他设备进行通信,传输飞行数据和接收飞行指令。

m0_75244442的博客 747

【ROS2】核心概念4——话题(node)

ROS2的Topic,节点间异步传递数据的“桥梁”,基于发布/订阅模型(如传感器数据流)。

进一寸有一寸的欢喜 1371

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

ROS2核心概念之通信接口

接口的概念在各个领域随处可见,无论是硬件结构还是软件开发,都有广泛的应用。所以什么是接口,它是一种相互关系,只有彼此匹配,才能建立连接。回到ROS的通信系统,它的主要目的就是传输数据,那就得让大家高效的建立连接,并且准确包装和解析传输的数据内容,话题、服务等机制也就诞生了,他们传输的数据,都要符合通信接口的标准定义;比如摄像头驱动发布的图像话题,由每个像素点的RGB三原色值组成;控制机器人运动的速度指令,由线速度和角速度组成;进行机器人配置的服务,有配置的参数和反馈的结果组成等等;

Graceful_scenery的博客 992

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

【ROS2】ROS2简介及学习资源汇总

但最初的ROS是面向科研领域的,有一些局限性,如今机器人商业需求日趋突显,最初的ROS也因丰富功能的集成使得原始建构和设计的不足愈发明显,所以ROS的研发团队重新设计了更加优秀的ROS2。:ROS2不仅支持Linux和MacOS,还增加了对Windows和RTOS(实时操作系统)的支持,使得ROS2能够在更广泛的平台上运行,提高了开发的灵活性和适用范围。:ROS2使用Python编写的launch文件,相比ROS1中的XML格式,提供了更多的功能性和灵活性,使得启动和配置更加直观和便捷。

淋曦的进击手记 6604

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

上一篇: ROS2入门之基础概念
下一篇: ROS2核心概念之代码示例二
1随便写写1
博客等级 码龄16年 2261粉丝 161原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值