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

news2025/2/8 11:57:06

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

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

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

相关文章

深入浅出:频谱掩码 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 &#…

C++基础(2)

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

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-(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…

代码随想录算法【Day36】

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

如可安装部署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;进…

生成式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…

【C语言】指针详解:概念、类型与解引用

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C语言 文章目录 &#x1f4af;前言&#x1f4af;指针的基本概念1. 什么是指针2. 指针的基本操作 &#x1f4af;指针的类型1. 指针的大小2. 指针类型与所指向的数据类型3. 指针类型与数据访问的关系4. 指针类型的实际意…