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

《ROS 2机器人开发从入门到实践》 2.3 使用功能包组织C++节点

简介:

上一小节我们用功能包组织了python节点,这节我们把C++节点也装进功能包。

参考资料:

参考资料均来自于鱼香ROS社区创始人小鱼,资源如下:

①:【《ROS 2机器人开发从入门到实践》 2.3 使用功能包组织C++节点】 https://www.bilibili.com/video/BV1Pb42177BJ?spm_id_from=333.788.videopod.sections&vd_source=7e745558295b053ab0826d478802cb22

②:全章节源码:https://github.com/fishros/ros2bookcode

③:参考书籍《ROS 2机器人开发:从入门到实践》

2.3.1 在功能包中编写C++节点

打开VScode,进入chapt2目录,输入如代码清单2-21的命令

ros2 pkg create是用于创建功能包的命令,demo_cpp_pkg是功能包的名字......,详见上一小节。

最后创建的功能包文件夹展开如图2-11。

在demo_cpp_pkg下的src添加cpp_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; }

上述代码即为2.1.2节的代码,可直接用。但编写完后还需注册节点与添加依赖,编辑CMakeLists.txt,最终添加的内容及位置如代码清单2-23所示。

代码清单中添加内容的详细作用与参数意义如下表:

代码指令详细作用参数含义详解核心用途 / 场景
find_package(rclcpp REQUIRED)让 CMake 系统自动查找并加载 ROS2 的 rclcpp 核心库,告诉编译器:我需要用到 ROS2 C++ 核心功能

rclcpp:要查找的包名(ROS2 C++ 核心库)

REQUIRED强制要求,找不到 rclcpp 就直接报错停止编译

必须放在最前面,用于引入依赖库,没有这行编译器找不到 ROS2 头文件 / 库
add_executable(cpp_node src/cpp_node.cpp)创建一个可执行文件,把源码编译成可以直接运行的程序

cpp_node生成的可执行文件名(最终运行用的名字)

src/cpp_node.cpp源代码路径,即要编译的 C++ 文件

定义程序入口,一个节点对应一个可执行文件
ament_target_dependencies(cpp_node rclcpp)为可执行文件链接依赖库,让程序能调用 rclcpp 的函数、类、接口

cpp_node:要配置的目标可执行文件(必须和上面名字一致)

rclcpp:要链接的依赖库名称

解决链接错误,没有这行代码能编译,但会报「未定义引用」

简单来讲,find_package和add_executable用于查找依赖和添加可执行文件,ament_cmake提供的ament_target_dependencies用于添加依赖。最后添加的是install指令,该指令把编译好的可执行文件复制到install/demo_cpp_pkg/lib/demo_cpp_pkg目录中,这样用ros2 run才能找到节点。

构建功能包之前还需要添加对rclcpp的依赖声明,完整声明如代码清单2-24所示。

<depend>reclcpp</depend>用于声明当前功能包依赖rclcpp库,完成这些即可用以下命令构建功能包。colcon build功能详见上一节。

运行后在chapt2/install/demo_cpp_pkg/lib/demo_cpp_pkg/目录就可以看到cpp_node可执行文件了。接下来就可以运行该文件,依次输入代码清单2-26中的两条命令。

source指令的作用详见上一节,即让ROS2能够找到demo_cpp_pkg和其下的节点。运行完指令后节点已成功启动,至此我们完成了在C++功能包中编写节点。但colcon build其实也是的调用cmake和make完成对代码的编译的。

2.3.2 功能包结构分析

C++功能包结构如下图。

对目录结构分析如下表。

文件 / 文件夹类型详细作用说明
include/demo_cpp_pkg文件夹专门存放 C++ 头文件(.h/.hpp),遵循 ROS2 的包内目录规范,避免头文件路径冲突。
src文件夹存放 C++ 源代码文件(.cpp),比如你的节点实现代码cpp_node.cpp都放在这里,是编译的核心代码目录。
cpp_node.cpp文件C++ 源文件,包含 ROS2 节点的业务逻辑实现,是最终要被编译成可执行程序的代码文件。
CMakeLists.txt文件CMake 构建系统的配置文件,负责定义编译规则:查找依赖库、添加可执行文件、设置链接依赖、配置安装路径等。
LICENSE文件功能包的许可证文件,默认是 Apache-2.0 协议,声明了代码的开源使用权限和约束条款。
package.xml文件ROS2 功能包的清单文件,定义了包名、版本号、依赖关系、作者信息等元数据,是构建和依赖管理的核心文件。
http://www.jsqmd.com/news/854277/

相关文章:

  • 手把手教你免拆机救活魔百盒CM201-2(ZG朝哥代工版),附Hi3798MV300芯片EMMC/NAND通刷固件
  • YOLOv8模型家族全解析:P2、P6、标准版到底该选哪个?一张图帮你搞定选择困难症
  • 你的AI Agent为什么一上线就翻车?8层架构告诉你真相
  • 告别Rufus!在Ubuntu 22.04上用Ventoy打造你的万能Windows安装盘(附PE系统集成)
  • 书评质量断崖式提升的关键一步,Perplexity辅助写作的3层认知跃迁与2个致命误用陷阱
  • JavaScript自动化PPT生成解决方案:PptxGenJS高效实践指南
  • 代码随想录算法训练营第六十天|Bellman_ford 队列优化算法、Bellman_ford之判断负权回路、bellman_ford之单源有限最短路
  • 高光谱数据校正避坑指南:从采集到反射率,新手最容易忽略的5个细节(以SUSE数据为例)
  • 【2026年】伺服电机编码器选择指南:增量式vs绝对式,哪个更适合你的项目?
  • Midjourney企业级订阅落地手册(含GDPR合规配置、团队权限分级与成本分摊公式)
  • 告别单一视角:用Transformer融合骨架与轮廓,实战提升步态识别鲁棒性
  • 为什么顶尖技术博主都在悄悄升级Perplexity写作辅助?揭秘3个未公开的上下文增强策略
  • 3分钟上手:Windows上运行安卓应用的终极方案——APK安装器全面指南
  • 国内开通 GPT 会员的自助充值流程记录
  • 学术论文翻译翻车重灾区!Perplexity翻译查询功能如何通过引用锚点保留+LaTeX公式智能隔离实现零失真输出(仅限Pro+订阅用户可见的隐藏模式)
  • 谷歌运营公司热门推荐
  • 7.C# —— 方法返回值、值传递、ref/out/in/params
  • 别再手动点选了!用C#给NX二次开发控件加过滤器,效率翻倍(附两种方法对比)
  • 《CVPR2025-DEIM创新改进项目实战:从原理到部署的深度学习优化全攻略》007、数据准备——ImageNet/COCO数据集预处理与增强策略
  • 电池模型参数辨识避坑指南:HPPC数据拟合时,你的1RC和2RC模型初始值设对了吗?
  • 将Taotoken接入Node.js后端服务,为应用添加智能对话能力
  • Perplexity读书笔记生成效率提升300%:从零到精通的7步工作流拆解
  • 综合能源系统运行状态分析与仿真计算方法【附代码】
  • 意图共鸣科技《AI记忆链商业化白皮书2.0》认知锚定:为什么新概念需要“老参照”
  • 2026 年 GEO 优化服务商TOP5排行榜:如何找到适合自己的geo服务商?geo服务内容介绍? - 互联网科技品牌测评
  • 破壁端网协同:通感一体化(ISAC)如何重构具身智能的“上帝视角”
  • Envoy 详解:云原生时代的高性能网络代理
  • 当GPT-3成为你的领域专家:无监督概念瓶颈模型在ImageNet上的落地思考
  • 意图共鸣科技《AI记忆链商业化白皮书2.0》优雅降级:停机了,但通讯录还在
  • Claude Code 深度工程实践:从个人编码助手到企业级 Agent 工程平台