鱼香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(Robot Operating System 2)中,节点(Node) 是一个独立运行的进程,它可以执行特定的功能,如接收传感器数据、控制机器人执行任务或进行数据处理。 ROS 2 是一个分布式…...
深入浅出:频谱掩码 Spectral Masking —— 噪音消除利器
在语音处理领域,噪声是一个常见的敌人。无论是语音通话、语音识别,还是语音合成,噪声都会大大降低语音的质量和可理解性。为了解决这个问题,Spectral Masking(频谱掩码) 模型应运而生。它通过从带噪信号的频…...
C++ Primer 多维数组
欢迎阅读我的 【CPrimer】专栏 专栏简介:本专栏主要面向C初学者,解释C的一些基本概念和基础语言特性,涉及C标准库的用法,面向对象特性,泛型特性高级用法。通过使用标准库中定义的抽象设施,使你更加适应高级…...
Mac M1 ComfyUI 中 AnyText插件安装问题汇总?
Q1:NameError: name ‘PreTrainedTokenizer’ is not defined ? 该项目最近更新日期为2024年12月,该时间段的transformers 版本由PyPI 上的 transformers 页面 可知为4.47.1. A1: transformers 版本不满足要求,必须降级transformors &#…...
使用Java操作Redis数据类型的详解指南
SEO Meta Description: 详细介绍如何使用Java操作Redis的各种数据类型,包括字符串、哈希、列表、集合和有序集合,提供代码示例和最佳实践。 介绍 Redis是一种开源的内存数据结构存储,用作数据库、缓存和消息代理。它支持多种数据结构&#…...
数据结构(AVL树、B-Tree、B+Tree)
AVL树 AVL树是一种自平衡的二叉搜索树,它的特点是每个节点的左子树和右子树的高度差(平衡因子)的绝对值不超过1。这种平衡性保证了AVL树在进行查找、插入和删除操作时都能保持较高的效率。 平衡因子 在AVL树中,每个节点都维护一…...
可靠度的HLRF算法
一次可靠度的HLRF算法。随机向量的概率模型采用Nataf分布,考虑变量相关性。验算点搜寻采用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 引用的概念和定义 引用不是新定义一个变量,而是给已存在变量取了一个别名,编译器不会为引用变量开…...
《海丰县蔡氏简介》--海丰县蔡姓宗支源流及始迁祖概述--海丰县各乡镇简介
《海丰县蔡氏简介》 三、海丰县蔡姓宗支源流及始迁祖概述 (一)海丰县各乡镇简介 排名不分先后 蔡惠进主编 海丰附城镇鹿境乡 始迁祖道山公(谥肇成),原籍福建箭田县猪菜街(御史街)八角井&…...
electron typescript运行并设置eslint检测
目录 一、初始化package.json 二、安装依赖 三、项目结构 四、配置启动项 五、补充:ts转js别名问题 已整理好的开源代码:Type-Electron: 用typescript开发的electron项目脚手架,轻量级、支持一键配置网页转PC - Gitee.com 一、初始化pac…...
modbus协议处理
//------------------------0x01-------------------------------- //MDA_usart_send: aa 55 01 00 06 00 02 00 05 //转modbusTCP——Master——send:地址00002,寄存器数量: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编程中,处理不确定数量的参数是一个常见的需求。为了支持这种需求,C标准库提供了 &…...
linux 函数 sem_init () 信号量、sem_destroy()
(1) (2) 代码举例: #include <stdio.h> #include <stdlib.h> #include <pthread.h> #include <semaphore.h> #include <unistd.h>sem_t semaphore;void* thread_function(void* arg) …...
基于python的体育新闻数据可视化及分析
项目 :北京冬奥会体育新闻数据可视化及分析 摘 要 随着社会的不断进步与发展,新时代下的网络媒体获取的信息也更加庞大和繁杂,相比于传统信息来源更加难以分析和辨别,造成了新时代媒体从业者撰写新闻的难度。在此背景下ÿ…...
CSS 基础:层叠、优先级与继承
CSS 基础:层叠、优先级与继承 一、层叠(Cascade)示例:层叠的顺序 二、优先级(Specificity)优先级规则示例:优先级的比较 三、继承(Inheritance)哪些属性会被继承…...
代码随想录算法【Day36】
Day36 1049. 最后一块石头的重量 II 思路 把石头尽可能分成两堆,这两堆重量如果相似,相撞后所剩的值就是最小值 若石头的总质量为sum,可以将问题转化为0-1背包问题,即给一个容量为sum/2的容器,如何尽量去凑满这个容…...
CNN的各种知识点(四): 非极大值抑制(Non-Maximum Suppression, NMS)
非极大值抑制(Non-Maximum Suppression, NMS) 1. 非极大值抑制(Non-Maximum Suppression, NMS)概念:算法步骤:具体例子:PyTorch实现: 总结: 1. 非极大值抑制(…...
为什么会有函数调用参数带标签的写法?Swift函数调用的参数传递需要加前缀是否是冗余?函数调用?函数参数?
为什么会有函数调用参数带标签的写法? ObjC函数参数形式与众不同,实参前会加前缀,尤其参数很多的情况,可读性很强。例如: [person setAge: 29 setSex:1 setClass: 35]; 这种参数前面加前缀描述也被叫标签(Label). 注意࿰…...
如可安装部署haproxy+keeyalived高可用集群
第一步,环境准备 服务 IP 描述 Keepalived vip Haproxy 负载均衡 主服务器 Rip:192..168.244.101 Vip:192.168.244.100 Keepalive主节点 Keepalive作为高可用 Haproxy作为4 或7层负载均衡 Keepalived vip Haproxy 负载均衡 备用服务…...
如何运行Composer安装PHP包 安装JWT库
1. 使用Composer Composer是PHP的依赖管理工具,它允许你轻松地安装和管理PHP包。对于JWT,你可以使用firebase/php-jwt这个库,这是由Firebase提供的官方库。 安装Composer(如果你还没有安装的话): 访问Co…...
安全策略配置
1.拓扑信息 2. 实验需求 3.需求分析 1.需要在交换机LSW1配置分配vlan并且为配置通道 2/3/4/5 在web界面或者命令行制定相应的安全策略 由于存在默认的拒绝需求4中生产区在任何时刻访问不了web不允许单独配置,只配置动作为运行的策略 4.配置信息 先配置服务器 …...
使用Chainlit快速构建一个对话式人工智能应用体验DeepSeek-R1
Chainlit是一个开源的 Python 包,用于构建可用于生产的对话式人工智能。 DeepSeek-R1 是一款强化学习(RL)驱动的推理模型,解决了模型中的重复性和可读性问题。在 RL 之前,DeepSeek-R1 引入了冷启动数据,进…...
Cursor 与多语言开发:全栈开发的利器
引言 全栈开发要求开发者跨越前端、后端、数据库甚至数据科学等多个技术领域,而不同技术栈往往需要切换工具和思维方式。Cursor 作为一款 AI 驱动的智能编程助手,凭借其对 20 编程语言 和主流框架的深度支持,正在成为全栈开发的“瑞士军刀”…...
生成式AI安全最佳实践 - 抵御OWASP Top 10攻击 (下)
今天小李哥将开启全新的技术分享系列,为大家介绍生成式AI的安全解决方案设计方法和最佳实践。近年来生成式 AI 安全市场正迅速发展。据IDC预测,到2025年全球 AI 安全解决方案市场规模将突破200亿美元,年复合增长率超过30%,而Gartn…...
家政预约小程序12服务详情
目录 1 修改数据源2 创建页面3 搭建轮播图4 搭建基本信息5 显示服务规格6 搭建服务描述7 设置过滤条件总结 我们已经在首页、分类页面显示了服务的列表信息,当点击服务的内容时候需要显示服务的详情信息,本篇介绍一下详情页功能的搭建。 1 修改数据源 在…...
知识蒸馏教程 Knowledge Distillation Tutorial
来自于:Knowledge Distillation Tutorial 将大模型蒸馏为小模型,可以节省计算资源,加快推理过程,更高效的运行。 使用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:机器学习基石揭秘 目录 #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:通过强化学习提升大型语言模型推理能力的探索 在人工智能领域,大型语言模型(LLMs)的发展日新月异,其在自然语言处理和生成任务中的表现逐渐接近人类水平。然而,如何进一步提升这些模型的推理能…...
