当前位置: 首页 > article >正文

鱼香ros——编写第一个c++节点

ROS2中的节点了解

在 ROS 2(Robot Operating System 2)中,节点(Node) 是一个独立运行的进程,它可以执行特定的功能,如接收传感器数据、控制机器人执行任务或进行数据处理。

ROS 2 是一个分布式系统,多个节点可以在同一台计算机或多个计算机上运行,并通过话题(Topics)、服务(Services)、动作(Actions)等方式进行通信。

模块化设计:一个机器人系统可以由多个节点组成,例如:

  • 相机节点:负责捕捉图像数据
  • 导航节点:计算路径规划
  • 电机控制节点:控制机器人运动
  • 激光雷达节点:采集环境数据

ROS2中编写第一个c++节点

ros2_node.cpp

#include "rclcpp/rclcpp.hpp"int main(int argc, char** argv)
{rclcpp::init(argc, argv);  // 初始化auto node = std::make_shared<rclcpp::Node>("cpp_node");RCLCPP_INFO(node->get_logger(), "你好C++节点!");rclcpp::spin(node);rclcpp::shutdown();return 0;
}

 代码解释

  • 初始化 ROS 2 系统 (rclcpp::init):ROS 2 环境初始化,系统为节点分配必要的资源。
  • 创建一个节点:创建一个名为 cpp_node 的 ROS 2 节点。该节点作为执行单元,之后你可以向它添加功能(如发布/订阅消息)。
  • 记录日志信息 (RCLCPP_INFO):输出一条日志信息,表示节点启动。
  • 进入事件循环 (rclcpp::spin):进入一个阻塞的事件循环,等待处理节点的各种任务(消息处理、服务请求、定时器等)。
  • 关闭 ROS 2 系统 (rclcpp::shutdown):在节点退出之前,清理所有资源,关闭 ROS 2 系统。

注意:这里我们只需要掌握了解一下这里的流程,详细的代码编写暂时不需要详细看懂。

CMakeLists.txt

cmake_minimum_required(VERSION 3.8)
project(ros2_node)
add_executable(ros2_node ros2_node.cpp)//指定需要的源文件和最后生成的可执行文件名称find_package(rclcpp REQUIRED) # 直接查找到对应的头文件和库文件target_include_directories(ros2_node PUBLIC ${rclcpp_INCLUDE_DIRS}) # 头文件包含
target_link_libraries(ros2_node ${rclcpp_LIBRARIES}) # 库文件链接

在上一篇文章中我们已经讲解了CMakeLists.txt的作用和编写规则,在下面这个文章链接中,但是之前的例子中并没有介绍如果调用非标准库我们应该如何去做,比如ros2_node.cpp中调用了rclcpp这个非标准库文件,我们需要进行手动target链接rclcpp,接下来我将详细说明如何进行链接

GCC, Makefile, make, CMake, CMakeLists.txt-CSDN博客

target_include_directories 指定了 ros2_node 目标需要包含的头文件路径。

target_link_libraries 告诉编译器在链接阶段要链接 rclcpp 相关的库文件。

target_include_directories 作用于编译的预处理阶段(只是为了让预处理时编译器能找到头文件,相当于是预处理代码的时候遇到了文件库引用,让编译器先别慌,告诉它一定能找到这个库,以此来让编译器继续处理其他代码),target_link_libraries 作用于编译阶段和最后的链接阶段(为了在编译阶段解决符号解析问题提供代码执行需要的库文件)

target_include_directories和target_link_libraries中第一个参数,写的是我们在 add_executable() 中定义的目标,即生成的可执行文件的名称——ros2_node 

如果知道待链接库的位置时

完全可以直接使用 target_include_directories和target_link_libraries 进行链接,可以不用find_package进行查找,并且在 CMake 中非常推荐这种做法。通过显式指定库的路径和名称,CMake 会将它们链接到你的目标(比如可执行文件或库)。

如果不知道待链接库的位置时

CMake 提供了 find_package 功能来自动查找并配置库。查找到对应的库之后,find_package会将找到的路径设置到一系列的变量(通常是 CMake 变量)中,供我们在后续的 CMake 配置中使用。这些变量通常包含库文件的完整路径,我们可以将它们传递给 target_link_libraries 或其他 CMake 命令。

例如,CMake 中的一些查找库的宏(如 find_package)可能会定义类似以下变量:

  • LIBRARY_NAME_FOUND:表示库是否被成功找到。
  • LIBRARY_NAME_INCLUDE_DIRS:库的头文件目录。
  • LIBRARY_NAME_LIBRARIES:库文件的路径。

这里面的LIBRARY_NAME这个前缀是我们使用find_package命令时手动设置的,即find_package(rclcpp REQUIRED) 中的rclcpp。使用find_package命令后自动生成的常见宏变量有:

  • rclcpp_INCLUDE_DIRS:头文件路径
  • rclcpp_LIBRARIES:库路径
  • rclcpp_FOUND:是否成功找到该包
  • rclcpp_VERSION:库的版本号

查看ROS2中的节点

查看所有 ROS 2 节点

ros2 node list

该命令会返回所有当前运行的 ROS 2 节点的名称,例如:

/my_ros2_node
/teleop_node
/camera_driver

查看某个节点的详细信息

ros2 node info /my_ros2_node

这个命令可以列出该节点的发布的话题、订阅的话题、服务和参数

查看所有话题

ros2 topic list

查看所有服务

ros2 service list

相关文章:

鱼香ros——编写第一个c++节点

ROS2中的节点了解 在 ROS 2&#xff08;Robot Operating System 2&#xff09;中&#xff0c;节点&#xff08;Node&#xff09; 是一个独立运行的进程&#xff0c;它可以执行特定的功能&#xff0c;如接收传感器数据、控制机器人执行任务或进行数据处理。 ROS 2 是一个分布式…...

深入浅出:频谱掩码 Spectral Masking —— 噪音消除利器

在语音处理领域&#xff0c;噪声是一个常见的敌人。无论是语音通话、语音识别&#xff0c;还是语音合成&#xff0c;噪声都会大大降低语音的质量和可理解性。为了解决这个问题&#xff0c;Spectral Masking&#xff08;频谱掩码&#xff09; 模型应运而生。它通过从带噪信号的频…...

C++ Primer 多维数组

欢迎阅读我的 【CPrimer】专栏 专栏简介&#xff1a;本专栏主要面向C初学者&#xff0c;解释C的一些基本概念和基础语言特性&#xff0c;涉及C标准库的用法&#xff0c;面向对象特性&#xff0c;泛型特性高级用法。通过使用标准库中定义的抽象设施&#xff0c;使你更加适应高级…...

Mac M1 ComfyUI 中 AnyText插件安装问题汇总?

Q1&#xff1a;NameError: name ‘PreTrainedTokenizer’ is not defined ? 该项目最近更新日期为2024年12月&#xff0c;该时间段的transformers 版本由PyPI 上的 transformers 页面 可知为4.47.1. A1: transformers 版本不满足要求&#xff0c;必须降级transformors &#…...

使用Java操作Redis数据类型的详解指南

SEO Meta Description: 详细介绍如何使用Java操作Redis的各种数据类型&#xff0c;包括字符串、哈希、列表、集合和有序集合&#xff0c;提供代码示例和最佳实践。 介绍 Redis是一种开源的内存数据结构存储&#xff0c;用作数据库、缓存和消息代理。它支持多种数据结构&#…...

数据结构(AVL树、B-Tree、B+Tree)

AVL树 AVL树是一种自平衡的二叉搜索树&#xff0c;它的特点是每个节点的左子树和右子树的高度差&#xff08;平衡因子&#xff09;的绝对值不超过1。这种平衡性保证了AVL树在进行查找、插入和删除操作时都能保持较高的效率。 平衡因子 在AVL树中&#xff0c;每个节点都维护一…...

可靠度的HLRF算法

一次可靠度的HLRF算法。随机向量的概率模型采用Nataf分布&#xff0c;考虑变量相关性。验算点搜寻采用U空间的梯度迭代算法。 资源文件列表 HLRF_method/HLRF_method.m , 4248 HLRF_method/Sample.m , 300 HLRF_method/Sample2.m , 335 HLRF_method/说明.txt , 659...

C++基础(2)

目录 1. 引用 1.1 引用的概念和定义 1.2 引用的特性 1.3 引用的使用 2. 常引用 3. 指针和引用的关系 4. 内联函数inline 5. nullptr 1. 引用 1.1 引用的概念和定义 引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名&#xff0c;编译器不会为引用变量开…...

《海丰县蔡氏简介》--海丰县蔡姓宗支源流及始迁祖概述--海丰县各乡镇简介

《海丰县蔡氏简介》 三、海丰县蔡姓宗支源流及始迁祖概述 &#xff08;一&#xff09;海丰县各乡镇简介 排名不分先后 蔡惠进主编 海丰附城镇鹿境乡 始迁祖道山公&#xff08;谥肇成&#xff09;&#xff0c;原籍福建箭田县猪菜街&#xff08;御史街&#xff09;八角井&…...

electron typescript运行并设置eslint检测

目录 一、初始化package.json 二、安装依赖 三、项目结构 四、配置启动项 五、补充&#xff1a;ts转js别名问题 已整理好的开源代码&#xff1a;Type-Electron: 用typescript开发的electron项目脚手架&#xff0c;轻量级、支持一键配置网页转PC - Gitee.com 一、初始化pac…...

modbus协议处理

//------------------------0x01-------------------------------- //MDA_usart_send: aa 55 01 00 06 00 02 00 05 //转modbusTCP——Master——send&#xff1a;地址00002&#xff0c;寄存器数量&#xff1a;00005 00 00 00 00 00 06 01 01 00 02 00 05 //ModbusTCP——Slave…...

Java Stream实战_函数式编程的新方式

1. 引言 1.1 Java Stream简介 Stream是什么:Stream是Java 8引入的一个接口,用于处理集合数据。与传统集合的区别:Stream不存储数据,而是通过管道操作(如过滤、映射)来处理数据。主要特点:惰性求值、链式调用、函数式编程风格。1.2 函数式编程基础 什么是函数式编程:一…...

java-(Oracle)-Oracle,plsqldev,Sql语法,Oracle函数

卸载好注册表,然后安装11g 每次在执行orderby的时候相当于是做了全排序,思考全排序的效率 会比较耗费系统的资源,因此选择在业务不太繁忙的时候进行 --给表添加注释 comment on table emp is 雇员表 --给列添加注释; comment on column emp.empno is 雇员工号;select empno,en…...

c++可变参数详解

目录 引言 库的基本功能 va_start 宏: va_arg 宏 va_end 宏 va_copy 宏 使用 处理可变参数代码 C11可变参数模板 基本概念 sizeof... 运算符 包扩展 引言 在C编程中&#xff0c;处理不确定数量的参数是一个常见的需求。为了支持这种需求&#xff0c;C标准库提供了 &…...

linux 函数 sem_init () 信号量、sem_destroy()

&#xff08;1&#xff09; &#xff08;2&#xff09; 代码举例&#xff1a; #include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <semaphore.h> #include <unistd.h>sem_t semaphore;void* thread_function(void* arg) …...

基于python的体育新闻数据可视化及分析

项目 &#xff1a;北京冬奥会体育新闻数据可视化及分析 摘 要 随着社会的不断进步与发展&#xff0c;新时代下的网络媒体获取的信息也更加庞大和繁杂&#xff0c;相比于传统信息来源更加难以分析和辨别&#xff0c;造成了新时代媒体从业者撰写新闻的难度。在此背景下&#xff…...

CSS 基础:层叠、优先级与继承

CSS 基础&#xff1a;层叠、优先级与继承 一、层叠&#xff08;Cascade&#xff09;示例&#xff1a;层叠的顺序 二、优先级&#xff08;Specificity&#xff09;优先级规则示例&#xff1a;优先级的比较 三、继承&#xff08;Inheritance&#xff09;哪些属性会被继承&#xf…...

代码随想录算法【Day36】

Day36 1049. 最后一块石头的重量 II 思路 把石头尽可能分成两堆&#xff0c;这两堆重量如果相似&#xff0c;相撞后所剩的值就是最小值 若石头的总质量为sum&#xff0c;可以将问题转化为0-1背包问题&#xff0c;即给一个容量为sum/2的容器&#xff0c;如何尽量去凑满这个容…...

CNN的各种知识点(四): 非极大值抑制(Non-Maximum Suppression, NMS)

非极大值抑制&#xff08;Non-Maximum Suppression, NMS&#xff09; 1. 非极大值抑制&#xff08;Non-Maximum Suppression, NMS&#xff09;概念&#xff1a;算法步骤&#xff1a;具体例子&#xff1a;PyTorch实现&#xff1a; 总结&#xff1a; 1. 非极大值抑制&#xff08;…...

为什么会有函数调用参数带标签的写法?Swift函数调用的参数传递需要加前缀是否是冗余?函数调用?函数参数?

为什么会有函数调用参数带标签的写法? ObjC函数参数形式与众不同&#xff0c;实参前会加前缀&#xff0c;尤其参数很多的情况&#xff0c;可读性很强。例如&#xff1a; [person setAge: 29 setSex:1 setClass: 35]; 这种参数前面加前缀描述也被叫标签(Label). 注意&#xff0…...

如可安装部署haproxy+keeyalived高可用集群

第一步&#xff0c;环境准备 服务 IP 描述 Keepalived vip Haproxy 负载均衡 主服务器 Rip&#xff1a;192..168.244.101 Vip&#xff1a;192.168.244.100 Keepalive主节点 Keepalive作为高可用 Haproxy作为4 或7层负载均衡 Keepalived vip Haproxy 负载均衡 备用服务…...

如何运行Composer安装PHP包 安装JWT库

1. 使用Composer Composer是PHP的依赖管理工具&#xff0c;它允许你轻松地安装和管理PHP包。对于JWT&#xff0c;你可以使用firebase/php-jwt这个库&#xff0c;这是由Firebase提供的官方库。 安装Composer&#xff08;如果你还没有安装的话&#xff09;&#xff1a; 访问Co…...

安全策略配置

1.拓扑信息 2. 实验需求 3.需求分析 1.需要在交换机LSW1配置分配vlan并且为配置通道 2/3/4/5 在web界面或者命令行制定相应的安全策略 由于存在默认的拒绝需求4中生产区在任何时刻访问不了web不允许单独配置&#xff0c;只配置动作为运行的策略 4.配置信息 先配置服务器 …...

使用Chainlit快速构建一个对话式人工智能应用体验DeepSeek-R1

Chainlit是一个开源的 Python 包&#xff0c;用于构建可用于生产的对话式人工智能。 DeepSeek-R1 是一款强化学习&#xff08;RL&#xff09;驱动的推理模型&#xff0c;解决了模型中的重复性和可读性问题。在 RL 之前&#xff0c;DeepSeek-R1 引入了冷启动数据&#xff0c;进…...

Cursor 与多语言开发:全栈开发的利器

引言 全栈开发要求开发者跨越前端、后端、数据库甚至数据科学等多个技术领域&#xff0c;而不同技术栈往往需要切换工具和思维方式。Cursor 作为一款 AI 驱动的智能编程助手&#xff0c;凭借其对 20 编程语言 和主流框架的深度支持&#xff0c;正在成为全栈开发的“瑞士军刀”…...

生成式AI安全最佳实践 - 抵御OWASP Top 10攻击 (下)

今天小李哥将开启全新的技术分享系列&#xff0c;为大家介绍生成式AI的安全解决方案设计方法和最佳实践。近年来生成式 AI 安全市场正迅速发展。据IDC预测&#xff0c;到2025年全球 AI 安全解决方案市场规模将突破200亿美元&#xff0c;年复合增长率超过30%&#xff0c;而Gartn…...

家政预约小程序12服务详情

目录 1 修改数据源2 创建页面3 搭建轮播图4 搭建基本信息5 显示服务规格6 搭建服务描述7 设置过滤条件总结 我们已经在首页、分类页面显示了服务的列表信息&#xff0c;当点击服务的内容时候需要显示服务的详情信息&#xff0c;本篇介绍一下详情页功能的搭建。 1 修改数据源 在…...

知识蒸馏教程 Knowledge Distillation Tutorial

来自于&#xff1a;Knowledge Distillation Tutorial 将大模型蒸馏为小模型&#xff0c;可以节省计算资源&#xff0c;加快推理过程&#xff0c;更高效的运行。 使用CIFAR-10数据集 import torch import torch.nn as nn import torch.optim as optim import torchvision.tran…...

【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】2.29 NumPy+Scikit-learn(sklearn):机器学习基石揭秘

2.29 NumPyScikit-learn&#xff1a;机器学习基石揭秘 目录 #mermaid-svg-46l4lBcsNWrqVkRd {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-46l4lBcsNWrqVkRd .error-icon{fill:#552222;}#mermaid-svg-46l4lBcsNWr…...

DeepSeek-R1:通过强化学习提升大型语言模型推理能力的探索

DeepSeek-R1&#xff1a;通过强化学习提升大型语言模型推理能力的探索 在人工智能领域&#xff0c;大型语言模型&#xff08;LLMs&#xff09;的发展日新月异&#xff0c;其在自然语言处理和生成任务中的表现逐渐接近人类水平。然而&#xff0c;如何进一步提升这些模型的推理能…...