ROS1中的Package
ROS1 Package 文件结构介绍
在 ROS中,Package 是最基本的功能组织单位。无论是节点(Node)、库(Library)、配置文件还是依赖,都被组织在 Package 内。一个典型的 ROS1 Package 的文件结构如下:
my_robot_package/
├── CMakeLists.txt
├── package.xml
├── include/
│ └── my_robot_package/
│ └── *.h
├── src/
│ └── *.cpp
├── scripts/
│ └── *.py
├── launch/
│ └── *.launch
├── msg/
│ └── *.msg
├── srv/
│ └── *.srv
├── action/
│ └── *.action
├── config/
│ └── *.yaml
└── README.md
下面逐一说明各部分的作用。
CMakeLists.txt
使用 CMake 定义编译规则,指定源文件、可执行文件、依赖库以及如何进行install等。
find_package(catkin REQUIRED ...)
add_executable
catkin_install_python
catkin_package
声明 来导入依赖
使用 添加 C++ 节点
使用 安装 Python 脚本
配置 导出依赖和头文件
package.xml
描述 Package 的元信息和依赖关系。主要字段包括:
:包名
:版本号
:维护者信息
:依赖的其他 Package(如 rospy、std_msgs 等)
<buildtool_depend>:构建工具依赖(通常是 catkin)
<package format="2"><name>my_metapackage</name><version>0.0.1</version><description>My custom metapackage</description><maintainer email="me@example.com">Your Name</maintainer><license>BSD</license><buildtool_depend>catkin</buildtool_depend><export></export><!-- 依赖的其他包 --><depend>pkg_a</depend><depend>pkg_b</depend>
</package>
src/
存放 C++ 源文件(.cpp)。
例如:src/my_node.cpp
定义一个 ROS 节点。
include/
存放 头文件(.h 或 .hpp)。
按照 ROS 社区惯例,通常子目录与包名一致,例如 include/my_robot_package/robot_controller.h
。
这样在其他代码中可以通过:
#include "my_robot_package/robot_controller.h"
来引用。
scripts/
存放 Python 节点脚本(.py)。
通常需要在首行加上:
#!/usr/bin/env python
并赋予可执行权限:
chmod +x my_script.py
launch/
存放 启动文件(.launch),用于一次性启动多个节点。
例如:
<launch><node pkg="my_robot_package" type="my_node" name="robot_node" output="screen"/>
</launch>
config/
存放参数配置文件(.yaml),用于 rosparam load。
例如:
robot_speed: 1.5
sensor_topic: “/scan”
msg/
定义自定义消息类型(.msg)。
例如:
float32 x
float32 y
float32 theta
srv/
定义服务类型(.srv)。
服务分为 请求部分 和 响应部分,例如:
int32 a
int32 b
---
int32 sum
ROS 构建系统会根据这些定义自动生成对应的语言接口(C++、Python)。
action/
# 定义目标 (Goal)
int32 target
---
# 定义结果 (Result)
int32 result
---
# 定义反馈 (Feedback)
int32 progress
当定义数据功能包的时候,
add_message_files,add_service_files,add_action_files
的时候会自动在功能包下的msg,srv,action文件夹寻找指定的文件。
其他文件
README.md
项目的说明文件,通常介绍包的用途、依赖和使用方法。
CHANGELOG.rst
官方支持使用这种方式,后续支持打包
1.0.0 (2025-08-24)
------------------
* 初始化功能包
metapackage
Metapackage 本身 不包含源码或可执行节点,它只是一个“集合”,用来把一组功能相关的 package 组织在一起,方便用户一次性安装或依赖。
文件结构
my_metapackage/
├── CMakeLists.txt
└── package.xml
package.xml
<package format="2"><name>my_metapackage</name><version>0.0.1</version><description>My custom metapackage</description><maintainer email="me@example.com">Your Name</maintainer><license>BSD</license><!-- 关键点:声明它是一个 metapackage --><export><metapackage/></export><!-- 依赖的其他包 --><depend>pkg_a</depend><depend>pkg_b</depend>
</package>
CMakeLists.txt
metapackage的CMakeLists.txt是非常简单的,只需要声明是一个catkin_metapackage即可。
cmake_minimum_required(VERSION 2.8.3)
project(my_metapackage)
find_package(catkin REQUIRED)
catkin_metapackage()