Skip to content

工作空间和功能包

什么是工作空间(workspace)

你不能直接打开你linux的根目录终端运行ros2,你的系统盘会爆的

工作空间: 其实就是新建文件夹,终端也在这里打开,所有文件都应该放在这里

典型的ROS2文件结构

  • src:存放代码
  • install:安装空间,编译出的可执行文件等有效产物会放在这里
  • build: 编译空间,存放编译产生的中间文件,这个体积最大
  • log:放日志的

创建一个工作空间

手动创建你的总文件夹,我这里就叫它studyProject,然后进入它,手动创建src 文件夹

src 文件夹里打开终端,由于Ubuntu会阻止你用pip全局安装包,所以我们为了下载国内开发者专用的rosdepc 需要先创建虚拟环境:

bash
python3 -m venv .venv
source .venv/bin/activate
pip install rosdepc

等待rosdepc下载完成

然后运行(不需要sudo!)

bash
rosdepc init
rosdepc update

我们再回到项目根目录:

bash
cd ..

此后只要在项目根目录下运行这个命令:

bash
rosdepc install -i --from-path src --rosdistro humble -y

就会自动安装所有依赖。你可以类比:这个rosdepc就好比npm install从package.json里自动读取要安装的依赖然后自动给你装好

然后是colcon,之后编译都用它:

bash
sudo apt install python3-colcon-ros

以后编译就用

bash
colcon build

就会给你编译了,编译完成就会自动给你生成剩下三个文件夹

功能包

功能包,就是ROS2世界里组织代码的最小单元和**“集装箱”。你可以把它理解成一个专门用来存放某个具体功能(比如控制底盘、处理摄像头图像、做导航规划)所有相关文件的专属文件夹**。

为什么需要功能包

想象一下,如果不区分功能包,把所有代码都堆在一起,当你想要分享其中一个很棒的功能(比如一个激光雷达驱动)时,就得在一大坨代码里费力地剥离出来。别人拿到你的代码,也得面对一锅乱炖。

ROS2社区的数万个功能包都遵循同样的结构,这让你能快速上手别人的代码,也让工具可以自动化地处理它们。

功能包的一般配置

一个文件夹是不是ROS2功能包,看它有没有两个“身份证”

  • package.xml“自我介绍”。包含这个包的名称、版本、作者、描述,最重要的是它依赖哪些别的功能包
  • CMakeLists.txt (C++包) 或 setup.py (Python包):“编译说明书”。告诉编译系统(colcon)这个包该如何处理,生成什么可执行文件。

除了这两个核心文件,一个典型的功能包还常常包含以下文件夹:

  • src/:存放C++源代码(.cpp文件)。
  • <package_name>/:存放Python源代码(.py文件),与包名同名。
  • msg/srv/ :存放自定义的通信接口(消息和服务)。
  • launch/:存放启动文件,可以一键启动这个包需要的多个节点。
  • config/:存放参数配置文件(.yaml文件)。

你可以用命令 ros2 pkg list 列出系统里所有功能包,用 ros2 pkg executables <package_name> 查看某个包里有哪些可执行文件

功能包创建,构建,运行

创建功能包要先cd到src目录

格式为ros2 pkg create --build-type <build-type> <package_name>

其中build-type 是功能包类型,有C++和Python两种,对应ament_cmake ament_python

bash
# 创建一个C++包
ros2 pkg create --build-type ament_cmake my_cpp_pkg

# 创建一个Python包
ros2 pkg create --build-type ament_python my_python_pkg

构建先返回项目根目录

bash
cd ..
colcon build # 编译工作空间里所有的包
colcon build --packages-select my_python_pkg # 只编译指定的包

C++会先编译再构建,python则不需要先编译。

运行:编译成功后,先“激活”工作空间,然后就可以运行包里的程序了:

bash
# 激活工作空间
source install/setup.bash

# 运行包里的可执行文件
ros2 run my_python_pkg my_node