ROS文件解读(package .xml--CMakeLists.txt)
ROS Package功能包ROS Package 是 ROS 中最小的可编译 / 可运行单元一个机器人功能比如激光 SLAM、电机控制通常对应一个或多个 Package。每个 Package 必须包含package.xml描述包的元信息和CMakeLists.txt编译构建规则缺少任何一个都不被 ROS 识别为合法 Package。ROS中的依赖和CMake库ROS 里的 “依赖” 本质是你的功能包想要正常编译、运行必须依赖的其他软件 / 代码 / 库资源。就像你做一道菜需要食材你的 ROS 包实现功能也需要 “食材”—— 这些 “食材” 就是依赖。依赖的分类对应 package.xml 里的标签依赖类型通俗解释例子编译时依赖编译代码catkin_make时必须有的 “食材”比如头文件、编译规则roscpp提供 C 的头文件、message_generation生成 msg 代码运行时依赖运行 ROS 节点rosrun时必须有的 “食材”比如动态链接库、可执行程序roscpp提供运行节点的库文件、rviz运行可视化工具测试时依赖运行 ROS 测试rostest时需要的 “食材”rostest、gtest头文件.h/.hpp比如#include ros/ros.h中的ros.h就是roscpp包提供的头文件没有它编译代码会报错 “找不到头文件”。库文件.so/.aLinux 下的动态 / 静态链接库比如roscpp会生成libroscpp.so运行节点时系统需要找到这个库才能启动。可执行程序比如依赖rviz本质是依赖rviz包编译出的rviz可执行文件。msg/srv 定义文件比如依赖std_msgs是依赖它定义的String.msg、Int32.msg等消息格式。举个直观例子你写了一个 C ROS 节点代码第一行是#include ros/ros.h // 用到roscpp的头文件编译时编译器需要找到ros.h这个文件来自roscpp包—— 这是编译时依赖运行时你的节点需要调用roscpp的动态库libroscpp.so—— 这是运行时依赖如果缺少这两个依赖要么编译失败要么运行时提示 “找不到库”。CMake 库不是 ROS 特有的是 CMake 构建系统中的核心概念ROS 基于 CMake 扩展了 catkin所以会用到这个概念。1. 先理解 “库Library” 的基础编程中的 “库” 是提前编译好的、可复用的代码集合对比可执行文件是直接运行的程序库是被程序调用的代码。比如你写的 ROS 节点可执行文件会调用roscpp的库不用自己重新写 “创建节点、发布话题” 的代码。2. CMake 库的具体含义在 CMake 中“CMake 库” 是指CMake 通过特定指令如find_package、target_link_libraries识别、管理、链接的 “库文件”.so/.a或 “库配置”。简单说CMake 库是 CMake 能 “认得到”、能帮你链接到代码里的库资源。3. CMake 库的核心作用ROS 场景下在 ROS 的CMakeLists.txt中你写# 1. 查找roscpp这个CMake库本质是找roscpp的编译配置和库文件 find_package(catkin REQUIRED COMPONENTS roscpp) # 2. 将roscpp的CMake库链接到你的节点 target_link_libraries(my_node ${catkin_LIBRARIES})这两行的核心是find_package(roscpp)CMake 会去系统中找roscpp的 “库配置文件”比如roscppConfig.cmake这个文件告诉 CMakeroscpp的头文件在哪比如/opt/ros/noetic/includeroscpp的库文件在哪比如/opt/ros/noetic/lib/libroscpp.so${catkin_LIBRARIES}是 CMake 变量包含了所有找到的 ROS 库如roscpp、std_msgs的库文件路径target_link_libraries会把这些库 “链接” 到你的可执行文件中让你的节点能调用库的功能。新手入门时不用深究 CMake 库的底层实现只需记住在 CMakeLists.txt 中find_package填你依赖的 ROS 包名target_link_libraries加上${catkin_LIBRARIES}就能正确链接依赖的 CMake 库。package.xml 解读package.xml是包的 “身份证”用于描述包的元信息名称、版本、依赖、作者等ROS 通过它识别包的基本信息和依赖关系。核心结构以 ROS Noetic/Melodic 为例ROS2 格式略有差异?xml version1.0? !-- 声明ROS版本noetic对应格式2kinetic/melodic也常用2 -- package format2 !-- 1. 必选基础信息 -- namemy_package/name !-- 包名唯一小写下划线 -- version1.0.0/version !-- 版本号语义化主版本.次版本.修订号 -- descriptionMy first ROS package/description !-- 功能描述 -- maintainer emailyouremail.comYour Name/maintainer !-- 维护者必填 -- licenseApache-2.0/license !-- 许可证如MIT、BSD、GPL -- !-- 2. 依赖声明核心 -- !-- build_depend编译时依赖比如头文件、CMake库 -- build_dependroscpp/build_depend !-- exec_depend运行时依赖比如ROS节点运行需要的库 -- exec_dependroscpp/exec_depend !-- build_export_depend编译导出依赖其他包依赖本包时需要的编译依赖 -- build_export_dependroscpp/build_export_depend !-- test_depend测试时依赖 -- test_dependrostest/test_depend !-- 3. 可选信息 -- authorYour Name/author !-- 作者 -- url typewebsitehttps://your-url.com/url !-- 文档/代码地址 -- /package标签作用name包的唯一标识命名规则小写字母 下划线如lidar_driverbuild_depend编译本包需要的依赖比如roscpp、std_msgsexec_depend运行本包节点需要的依赖大部分场景和build_depend重复maintainer必须填写否则catkin_make会报错格式姓名 邮箱在 Package 目录下执行catkin_lint . # 检查package.xml语法是否正确 rospkg info my_package # 查看包的元信息验证是否识别以下是一段package.xml读者可以自行解读?xml version1.0? package format2 nameimu_filter/name version0.0.0/version descriptionimu_filter/description maintainer emailaa.coma/maintainer licenseBSD/license buildtool_dependcatkin/buildtool_depend build_dependroscpp/build_depend build_dependsensor_msgs/build_depend build_dependgeometry_msgs/build_depend build_dependtf/build_depend build_dependtf2/build_depend build_dependdynamic_reconfigure/build_depend exec_dependroscpp/exec_depend exec_dependsensor_msgs/exec_depend exec_dependgeometry_msgs/exec_depend exec_dependtf/exec_depend exec_dependtf2/exec_depend exec_dependdynamic_reconfigure/exec_depend /packageCMakeLists.txt 解读CMakeLists.txt是编译规则文件告诉 ROS实际是 catkin 构建系统如何编译代码、链接库、安装文件等。ROS 基于 CMake 扩展了 catkin所以文件里既有 CMake 原生语法也有 catkin 特有语法。# 1. 声明CMake最低版本ROS Noetic对应3.0.2 cmake_minimum_required(VERSION 3.0.2) # 2. 声明包名必须和package.xml的name一致 project(my_package) # 3. 设置编译选项可选解决中文编码、C版本等问题 add_compile_options(-stdc11) # 指定C11标准 # 4. 查找依赖的ROS包核心 find_package(catkin REQUIRED COMPONENTS roscpp std_msgs message_generation # 如果自定义msg/srv需要加这个 ) # 5. 声明catkin包的导出信息固定模板 catkin_package( INCLUDE_DIRS include # 头文件目录 LIBRARIES ${PROJECT_NAME} # 编译生成的库名 CATKIN_DEPENDS roscpp std_msgs # 依赖的ROS包 # DEPENDS system_lib # 如果依赖非ROS库如Eigen加这里 ) # 6. 包含头文件目录让编译器找到头文件 include_directories( include ${catkin_INCLUDE_DIRS} # ROS依赖包的头文件目录 ) # 7. 编译可执行文件核心生成ROS节点 add_executable(my_node src/my_node.cpp) # 源文件→可执行文件 # 链接库必须加否则编译报错 target_link_libraries(my_node ${catkin_LIBRARIES} ) # 8. 安装可选将可执行文件安装到ROS环境 install(TARGETS my_node RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION} ) # 安装头文件可选 install(DIRECTORY include/${PROJECT_NAME}/ DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION} )以下是一段CMakeLists.txt 读者可以自行解读cmake_minimum_required(VERSION 2.8.3) project(imu_filter) # 1. 查找所有依赖顺序固定 find_package(catkin REQUIRED COMPONENTS roscpp sensor_msgs geometry_msgs tf tf2 dynamic_reconfigure ) # 2. 生成动态参数头文件仅针对需要的两个滤波器 generate_dynamic_reconfigure_options( cfg/MyStuff.cfg cfg/MyStuff2.cfg ) # 3. Catkin 包导出配置顺序固定 catkin_package( CATKIN_DEPENDS roscpp sensor_msgs geometry_msgs tf tf2 dynamic_reconfigure ) # 4. 头文件包含路径顺序固定 include_directories( ${catkin_INCLUDE_DIRS} ) # 5. 第一步创建可执行目标严格按「先创建后操作」 add_executable(madgwick_imu_filter src/Madgwick_filter.cpp) add_executable(mahony_imu_filter src/Mahony_filter.cpp) add_executable(bias_calculator src/bias_calculator.cpp) # 6. 第二步添加依赖仅给需要动态参数的两个目标加 add_dependencies(madgwick_imu_filter ${PROJECT_NAME}_gencfg ${catkin_EXPORTED_TARGETS}) add_dependencies(mahony_imu_filter ${PROJECT_NAME}_gencfg ${catkin_EXPORTED_TARGETS}) # bias_calculator 无动态参数无需添加此依赖 # 7. 第三步链接库所有目标都需要顺序在创建和依赖之后 target_link_libraries(madgwick_imu_filter ${catkin_LIBRARIES}) target_link_libraries(mahony_imu_filter ${catkin_LIBRARIES}) target_link_libraries(bias_calculator ${catkin_LIBRARIES})指令作用project(my_package)声明包名必须和package.xml的name完全一致find_package()查找依赖的 ROS 包比如roscppC 接口、rospyPython 接口catkin_package()声明本包的导出信息供其他依赖本包的包使用add_executable()将.cpp源文件编译成可执行文件ROS 节点target_link_libraries()链接依赖库ROS 的核心库都在${catkin_LIBRARIES}里注意add_executable()将.cpp源文件编译成可执行文件ROS 节点常见扩展场景编译多个节点# 编译第一个节点 add_executable(node1 src/node1.cpp) target_link_libraries(node1 ${catkin_LIBRARIES}) # 编译第二个节点 add_executable(node2 src/node2.cpp) target_link_libraries(node2 ${catkin_LIBRARIES})自定义 msg/srv 文件需要在find_package后添加add_message_files(FILES MyMsg.msg) # 自定义msg文件 add_service_files(FILES MySrv.srv) # 自定义srv文件 generate_messages(DEPENDENCIES std_msgs) # 生成msg/srv的代码在 ROS 工作空间catkin_ws根目录执行catkin_make # 编译所有包 # 或指定编译当前包 catkin_make --cmake-args -DCMAKE_BUILD_TYPERelease --pkg my_package两个文件的关联package.xml中声明的依赖如roscpp必须在CMakeLists.txt的find_package中对应包含否则编译会找不到依赖。CMakeLists.txt的project名称必须和package.xml的name完全一致否则 ROS 无法识别包。新增依赖时两个文件都要修改先在package.xml加build_depend/exec_depend再在CMakeLists.txt加find_package。总结package.xml是元信息文件核心作用是声明包名、版本、依赖让 ROS 识别包的基本信息。CMakeLists.txt是编译规则文件核心作用是指定编译源文件、链接依赖库、生成可执行文件ROS 节点。两个文件是 ROS 功能包的 “标配”且依赖声明、包名必须保持一致否则会导致编译 / 运行错误。

相关新闻

俩个信捷XD5E通过交换机以态网通信控制十几个轴,带信捷触摸屏程序,思路清晰,通俗易懂

俩个信捷XD5E通过交换机以态网通信控制十几个轴,带信捷触摸屏程序,思路清晰,通俗易懂

俩个信捷XD5E通过交换机以态网通信控制十几个轴,带信捷触摸屏程序,思路清晰,通俗易懂,是学习以态网通信的上佳范例最近在折腾工业自动化项目,发现用两台信捷XD5E PLC通过交换机控制十几个轴特别有意思。这种方案既经济…

2026/5/17 9:27:18 阅读更多 →
Word文件转PDF、WPS在线打印、js提取Word文件内容、轻松将Word文档转为PDF

Word文件转PDF、WPS在线打印、js提取Word文件内容、轻松将Word文档转为PDF

轻松在线将Word文件转换成PDF、WPS在线打印、js提取Word文件内容、轻松将Word文档转为PDF快速实现。 一、将Word文件转换为PDF文件。 可以将Word文件包括.doc、.wps、.docx类型的word文件转换输出为高质量的PDF文件。 接口参考地址:https://usdoc.cn/office.html 此…

2026/7/4 13:03:37 阅读更多 →
baidu aistudio 新建 项目 有4个项目类型 Notebook(基础开发) 模板任务(快速启动) 在线实例(应用部署 绘画项目(垂直场景)区别

baidu aistudio 新建 项目 有4个项目类型 Notebook(基础开发) 模板任务(快速启动) 在线实例(应用部署 绘画项目(垂直场景)区别

我来帮您梳理百度 AI Studio 这 4 种项目类型的关系和区别: 整体关系图 创建项目 ├── Notebook(基础开发) ├── 模板任务(快速启动) ├── 在线实例(应用部署) └── 绘画项目&#xff0…

2026/7/4 13:56:25 阅读更多 →

最新新闻

DC-DC降压转换器设计与PID控制优化实践

DC-DC降压转换器设计与PID控制优化实践

1. 项目背景与核心器件选型解析在电力电子领域,DC-DC降压转换器(Buck Converter)是最基础也最关键的拓扑结构之一。这次我们要实现的方案采用了171010550电源管理IC与PIC18F97J60微控制器的组合,这个搭配在工业控制领域颇具代表性…

2026/7/5 23:25:05 阅读更多 →
AutoUnipus:U校园全自动答题工具终极指南

AutoUnipus:U校园全自动答题工具终极指南

AutoUnipus:U校园全自动答题工具终极指南 【免费下载链接】AutoUnipus U校园脚本,支持全自动答题,百分百正确 2024最新版 项目地址: https://gitcode.com/gh_mirrors/au/AutoUnipus 面对繁重的在线学习任务,你是否还在为U校园平台的网课作业而烦恼…

2026/7/5 23:23:04 阅读更多 →
XXE漏洞深度解析:从XML外部实体注入原理到实战防御

XXE漏洞深度解析:从XML外部实体注入原理到实战防御

1. 项目概述:为什么XXE漏洞至今仍是“隐形杀手”?在Web安全领域,SQL注入、XSS这些名词大家耳熟能详,但提到XXE(XML External Entity Injection,XML外部实体注入),很多开发者甚至安全…

2026/7/5 23:19:03 阅读更多 →
开源小模型如何重构AI商业逻辑:7B参数的确定性价值

开源小模型如何重构AI商业逻辑:7B参数的确定性价值

1. 一家没做消费级产品的AI公司,凭什么拿到6.4亿美元? 你可能刚刷到这条新闻:“估值64亿美元!Mistral AI官宣6.4亿美元B轮融资”——第一反应是:又一家大模型创业公司爆了?但稍一查就会发现,它既…

2026/7/5 23:17:02 阅读更多 →
CATANet:基于内容感知Token聚合的图像超分辨率技术解析

CATANet:基于内容感知Token聚合的图像超分辨率技术解析

1. 从传统超分辨率到CATANet的技术演进图像超分辨率(Super-Resolution, SR)技术在过去十年经历了三次重大技术迭代。最早期的SRCNN开创了深度学习在超分辨率领域的应用,采用简单的三层卷积网络结构。2017年EDSR和RCAN引入残差学习和通道注意力…

2026/7/5 23:17:02 阅读更多 →
Linux命令-reject(拒绝打印任务)

Linux命令-reject(拒绝打印任务)

Linux命令-reject(拒绝打印任务)命令语法常用选项场景化实例1. 拒绝指定打印机2. 带原因说明拒绝3. 批量拒绝多个打印机4. 打印机故障自动处理5. 恢复打印机接受任务6. 通过 CUPS Web 接口管理7. 配合系统监控脚本查询打印队列状态最佳实践快速参考&…

2026/7/5 23:15:02 阅读更多 →

日新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻