【机器人】ROS2 功能包创建与 CMake 编译链路探秘

【机器人】ROS2 功能包创建与 CMake 编译链路探秘
请添加图片描述
在这里插入图片描述
🔥大奇个人主页 :https://blog.ZEEKLOG.net/m0_75192474?type=blog
本文所属专栏:https://blog.ZEEKLOG.net/m0_75192474/category_13131150.html

ros2 pkg create 是 ROS2(Robot Operating System 2)中用于快速初始化功能包的官方核心命令行工具。其核心作用是自动生成功能包所需的完整目录结构、配置文件及可选示例节点,避免手动创建文件和配置的繁琐操作,大幅提升开发效率。

该命令支持两种主流构建类型(C++/Python),可直接指定依赖包、维护者信息、开源协议等关键配置,生成的功能包完全符合 ROS2 官方规范,可直接用于编译、运行及后续开发扩展

⏰ 创建工作空间

首先需要再主目录中新建一个文件夹,带src目录

mkdir-p test_ws/src &&cd test_ws/src 

📸 创建功能包命令参数详解

命令基本格式

基础语法(必填项与可选参数分离,清晰易懂):

ros2 pkg create [可选参数]<功能包名称>

关键说明:

  • <功能包名称>:必填项,自定义功能包名称,需遵循 ROS2 命名规范(小写英文、可搭配下划线,禁止大写、特殊符号及中文)。
  • [可选参数]:用于配置功能包的构建类型、依赖、创建路径、描述信息等,按需选择使用。

基础配置参数

  • --help:显示该命令的所有参数说明及使用方法,快速查阅帮助信息后退出。
  • --package-name :显式指定功能包名称,用于解决“目录名与包名不一致”的场景,优先级高于默认目录名(也可以直接写名字不加该参数)
  • --description:设置功能包的描述信息,描述内容将写入 package.xml<description> 标签,便于他人理解包的用途。
  • --license:指定功能包的开源协议,常用协议:Apache-2.0、MIT、BSD,协议信息写入 package.xml
  • --maintainer:设置功能包维护者的姓名,写入 package.xml<maintainer> 标签,便于后续维护和沟通。

核心构建类型参数(必选)

  • --build-type ament_cmake:构建类型为C++ 包,

默认构建类型,自动生成 CMakeLists.txtsrc 目录(用于存放 C++ 源码),支持 C++ 节点开发、自定义消息编译等

ros2 pkg create my_cpp_pkg --build-type ament_cmake 
  • --build-type ament_python :构建类型为Python 包

自动生成 setup.py、setup.cfg、功能包同名目录(用于存放 Python 源码),支持 Python 节点开发,语法简洁、开发效率高。

依赖配置参数

--dependencies :参数用于指定功能包依赖的其他 ROS2 包,创建包时会自动将依赖写入 package.xmlCMakeLists.txt避免手动配置依赖导致的编译错误,是开发中最常用的参数之一

  • rclcpp:C++ 节点开发核心依赖
  • rclpy:Python 节点开发核心依赖
  • std_msgs:标准消息类型依赖(如 String、Int32)
  • sensor_msgs:传感器消息依赖(如激光雷达、IMU 数据)
  • geometry_msgs:几何消息依赖(如速度、姿态、坐标)
  • rosidl_default_generators:自定义消息(.msg/.srv)编译依赖
ros2 pkg create my_nav_pkg --build-type ament_cmake --dependencies rclcpp std_msgs sensor_msgs 

创建基础 C++ 包

ros2 pkg create my_cpp_node \\ --build-type ament_cmake \\--dependencies rclcpp std_msgs \\ --node-name my_first_node \\--description"ROS2 C++ 基础节点包,用于演示简单消息发布"\\--license MIT \\--maintainer"Zhang San"\\ --maintainer-email "[email protected]"\\ --destination-directory ./src 

创建基础 Python 包

ros2 pkg create my_py_node \\ --build-type ament_python \\--dependencies rclpy \\ --node-name my_py_node \\--description"ROS2 Python 基础节点包"\\--license Apache-2.0 

创建自定义消息接口包

ros2 pkg create my_custom_msgs \\ --build-type ament_cmake \\--dependencies rosidl_default_generators std_msgs \\--description"ROS2 自定义消息包,用于定义专属消息类型"\\--license MIT 

创建导航相关 C++ 包

ros2 pkg create my_navigation \\ --build-type ament_cmake \\--dependencies rclcpp geometry_msgs nav2_msgs sensor_msgs \\--description"ROS2 导航功能包,用于机器人路径规划与控制"\\ --destination-directory ./src 

🌗 CMakeLists.txt 相关语法

CMakeLists.txt 是 ROS2 C++ 功能包(ament_cmake 类型)的核心构建配置文件,负责定义编译规则、依赖管理、目标安装等,

  • find_package(<依赖包> REQUIRED)

查找当前功能包依赖的 ROS2 包或第三方库,REQUIRED 表示该依赖是必需的,找不到会直接报错;若依赖多个包,可分多行书写。

find_package(ament_cmake REQUIRED)find_package(rclcpp REQUIRED)find_package(std_msgs REQUIRED)
  • ament_package()

ROS2 专属核心指令,标记当前包为 ament 包,用于生成 package.xml 关联配置、注册包到 ament 索引,必须放在 CMakeLists.txt 的最后一行,且每个包只能调用一次。

  • add_executable(<节点名> <源码路径>)

将指定的 C++ 源码文件编译为可执行节点,<节点名> 是编译后生成的可执行文件名称,<源码路径> 是 .cpp 文件的相对路径(通常在 src 目录下),这是最后可以ros2 run的依据

add_executable(talker src/talker.cpp)
  • ament_target_dependencies(<节点名> <依赖包>...)

为可执行节点或库绑定依赖包,自动处理依赖包的头文件路径和编译宏,替代传统的 target_include_directories 指令,简化配置,必须在 add_executable 之后调用。

ament_target_dependencies(talker rclcpp std_msgs)
  • target_link_libraries(<节点名> <库文件>...)

将指定的库文件(如自定义消息类型支持库、第三方库)链接到可执行节点,常用于链接自定义消息的类型支持库

  • rosidl_generate_interfaces(<包名> <消息文件> [DEPENDENCIES <依赖包>])

ROS2 自定义消息(.msg/.srv/.action)编译核心指令,用于解析消息文件、生成对应的 C++/Python 代码和头文件,若消息依赖其他包(如 std_msgs),需通过 DEPENDENCIES 声明。

rosidl_generate_interfaces(${PROJECT_NAME} msg/MyMsg.msg DEPENDENCIES std_msgs)
  • rosidl_get_typesupport_target(<变量名> <包名> "rosidl_typesupport_cpp")

查找当前包生成的自定义消息 C++ 类型支持库,将其赋值给指定变量,便于后续通过 target_link_libraries 链接到节点,是 ROS2 Humble 及以后的推荐写法。

  • install(TARGETS <节点名/库名> DESTINATION <路径>)

该命令式将生成的可执行节点安装在指定路径,这是后续ros2 run xxx的关键,ROS2 规范路径为 lib/${PROJECT_NAME}(节点/库)、include/${PROJECT_NAME}(头文件)

◀️ package.xml 相关语法

package.xml 是 ROS2 功能包的元数据配置文件,用于声明包的基本信息、依赖关系、维护者信息等,ROS2 编译工具(colcon)通过该文件识别包的类型、依赖和构建规则,

基础信息标签

标签说明
name声明功能包名称,必须与 CMakeLists.txt 中 project() 指令的包名一致,遵循 ROS2 命名规范(小写、英文、下划线)。
version声明包的版本号,遵循语义化版本规范(主版本号.次版本号.修订号,如 1.0.0),用于版本管理和迭代。
description简要描述功能包的用途和功能,便于他人理解包的作用,支持简单的文本描述。
maintainer声明包的维护者信息,必须包含 email 属性(邮箱地址),标签内容为维护者姓名,可多个维护者。
license声明包的开源协议,常用协议:Apache-2.0、MIT、BSD,需填写标准协议名称,可多个协议标签。

依赖关系标签

  • <buildtool_depend>

构建工具依赖,声明构建该包所需的工具包,C++ 包默认依赖 ament_cmake,Python 包默认依赖 ament_python,是必需依赖。

<buildtool_depend>ament_cmake</buildtool_depend>
  • <build_depend>

构建依赖,声明编译该包时所需的依赖包(如头文件、编译宏),仅在构建阶段生效,运行时无需依赖。

<build_depend>rclcpp</build_depend>
  • <exec_depend>

执行依赖,声明运行该包时所需的依赖包(如库文件、节点),仅在运行阶段生效,构建时无需依赖。

<exec_depend>std_msgs</exec_depend>
  • <depend>

通用依赖,等价于同时声明 build_depend、exec_depend 和 test_depend,适用于“构建、运行、测试都需要”的依赖,简化配置。

<depend>rclcpp</depend>
  • <test_depend>

测试依赖,声明运行包的测试用例时所需的依赖包(如 gtest、ament_lint_auto),仅在测试阶段生效。

<test_depend>ament_lint_auto</test_depend><test_depend>ament_lint_common</test_depend>
  • <member_of_group>

将包归类到指定组,ROS2 自定义消息包必须添加该标签,值为 rosidl_interface_packages,告诉编译系统该包是接口包

<member_of_group>rosidl_interface_packages</member_of_group>

Read more

如何降低AIGC总体疑似度?7个实用技巧+专业工具真实案例分享

如何降低AIGC总体疑似度?7个实用技巧+专业工具真实案例分享

为什么你的论文总是被标为AIGC疑似? 近年来,随着AI写作工具的普及,一个让无数研究者头疼的问题出现了——AIGC总体疑似度过高。根据各大高校的最新规定,如果论文的AIGC率超过30%,很可能被判定为AI代写,直接取消答辩资格! 根据高校规定,AIGC率超过30%可能被判定为学术不端,面临取消答辩资格的风险。 许多同学反映:"我只是用AI辅助写作,怎么就被判定为学术不端了?" 这背后的原因是AI生成内容具有特定的规律性特征,如固定句式、高频词汇组合等,这些"数字指纹"很容易被检测系统识别。 7个实用降重技巧,亲测有效! 1. 变换表达,重构句式 避免使用AI常见的短句结构,如"首先,"、"综上,"等。将这些碎片化表达整合成完整句子。 示例对比: * 改前:综上所述,研究者们普遍认为企业偿债能力是一个多维度的概念。 * 改后:总之研究人员普遍认同企业偿债能力这一多维度概念。 2. 引入具体数据和案例 通过添加真实的研究数据、

2026新手小白AI创业变现指南(二)- AI写作辅助平台

2026新手小白AI创业变现指南(二)- AI写作辅助平台

刚刚更新了2026新手小白AI创业变现指南l列表,新增加了测试过的炼字工坊、蛙蛙写作、笔杆平台(学术论文平台,非通用写作平台)。想简单介绍下,详情请点击2026新手小白AI创业变现指南(一)中平台列表中平台名称看详细介绍。 一、炼字工坊 平台基础信息 项目内容平台名称炼字工坊官方网址https://lianzigongfang.com平台介绍专为网文/剧本/漫剧作者设计的AI创作平台,帮你把精力花在“故事和表达”上,把重复、耗时、卡壳的部分交给AI。相比通用AI,炼字工坊在长篇稳定性上有明显优势。它用「问答+抽卡」帮你定题材卖点,用「设定库」自动归档世界观和角色,用「分层大纲」把控剧情节奏,用「续写润色」解决卡文问题。最重要的是:你的作品不会用于AI训练,版权完全归你。核心定位长篇创作的全流程辅助,从灵感、设定到续写、润色,让你专注创作本身。 🎯 它和通用AI(如DeepSeek、千问)

【论文阅读】ColorFlow: Retrieval-Augmented Image Sequence Colorization

【论文阅读】ColorFlow: Retrieval-Augmented Image Sequence Colorization

基于检索增强的漫画/图片序列上色任务。 intro 现有问题:不是把一张黑白图随便上色,而是要在同一角色跨多张分镜/多帧时,尽量保持发色、衣服配色等“身份颜色(ID color)”一致,而且还要让操作流程“像工具”一样好用:不需要为每个角色单独 finetune,也不强行抽取显式的 ID embedding。论文把整个方案拆成三个阶段:RAP(检索增强)、ICP(in-context 扩散上色)、GSRP(引导式超分复原)。 任务设定:Reference-based Image Sequence Colorization * 输入:一张待上色的黑白图(来自漫画/分镜序列中的某一帧)+ 一个“参考图池”(同章节或同序列里若干张已经有颜色的图)。 * 输出:一张彩色结果,要求在序列层面尽量保持角色/物体的颜色身份一致(例如同一角色的头发颜色在多帧一致)。 * 关键难点:参考池里信息多、分镜构图变化大、同角色会变形/

OpenClaw之Memory配置成本地模式,Ubuntu+CUDA+cuDNN+llama.cpp

文章目录 * 背景:Memory不生效的问题 * OpenClaw的Memory配置 * Ubuntu24.04安装CUDA和cuDNN * 编译llama.cpp * 验证方案1: * 验证方案2:下载并运行Llama-2 7B模型 * 安装node-llama-cpp * 验证Memory * sqlite-vec unavailable * 踩过的坑 * 安装node-llama-cpp的一些提示 * 安装node-llama-cpp的前置条件 * Using `node-llama-cpp` With Vulkan 承接上文:Windows11基于WSL2首次运行Openclaw,并对接飞书应用,我已经在电脑上安装了OpenClaw,接下来解决Memory问题。走了很多弯路,下面主要讲我总结的正确的安装过程。 总结来说:针对Memory不生效的问题,又不想用OpenAI或Gemini,或者只想单纯的节省token,可以按照如下的方式,设置为local模式: * 修改openclaw.json配置 * 安装CUDA和cu