当前位置: 首页 > 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.gsyq.cn/news/1333503.html

相关文章:

  • seo优化具体需要做什么?老站长每天必做的4件日常工作
  • 告别Rufus!在Ubuntu 22.04上用Ventoy打造你的万能Windows安装盘(附PE系统集成)
  • JavaScript自动化PPT生成解决方案:PptxGenJS高效实践指南
  • 别再写仿函数了!C++11 lambda表达式在STL算法中的实战用法(以std::sort为例)
  • 基于YOLOv8的智能目标识别与辅助系统:开源计算机视觉解决方案
  • 2026乐清洗脚放松去哪里?乐清“铁招牌“十多年口碑养成记
  • 3分钟上手:Windows上运行安卓应用的终极方案——APK安装器全面指南
  • 酵母单杂伯远酵母单杂实验生物酵母单杂
  • 7.C# —— 方法返回值、值传递、ref/out/in/params
  • 谷歌运营公司热门推荐
  • 电池模型参数辨识避坑指南:HPPC数据拟合时,你的1RC和2RC模型初始值设对了吗?
  • 基于PIC单片机与PWM的RGB LED光效控制:从电路设计到低功耗优化
  • 2026年智能锁电池选购指南(详细版)
  • 5.20 明天见!拿好这份参会指南|AIGC2026峰会
  • 抢先李飞飞!世界模型能多人联机玩FPS游戏了
  • 别再傻傻分不清了!用大白话+真实案例讲透OAuth 2.0和OIDC到底差在哪
  • 意图共鸣科技《AI记忆链商业化白皮书2.0》认知锚定:为什么新概念需要“老参照”
  • 2026 年 GEO 优化服务商TOP5排行榜:如何找到适合自己的geo服务商?geo服务内容介绍? - 互联网科技品牌测评
  • 为你的企业构建第一个 AI Agent Harness Engineering 的步骤
  • Envoy 详解:云原生时代的高性能网络代理
  • Claude Code 深度工程实践:从个人编码助手到企业级 Agent 工程平台
  • 国内开通 GPT 会员的自助充值流程记录
  • 深度解析:Cursor设备标识重置技术核心实现
  • 股价翻倍、港股招股书失效,东山精密是“制造平台化”神话,还是过度幻想?
  • 2026年空气悬浮风机厂家深度测评:如何为工业场景匹配最佳方案? - 资讯速览
  • 串联型工业机器人抗扰动控制技术【附代码】
  • 周奕成(中国武术散打运动员)
  • 为什么你做的RAG总是翻车?三个坑让你怀疑人生
  • 别再只会用plot画图了!用Matlab ode45求解微分方程时,这3种可视化技巧让结果更清晰
  • 2026专业医疗建筑设计公司推荐:破解复杂场景痛点 筑就安全医疗空间 - 资讯速览