4. 工作空间与包管理:创建colcon工作空间,使用ros2 pkg create管理多语言包

好,咱们进入第四个实战环节。工作空间和包管理,说白了就是ROS2项目的「工地」和「砖块」。你想想看,没有工地,砖块往哪儿堆?没有砖块,工地就是个空壳子。我刚开始学ROS2时,就在这上面栽过跟头——工作空间建错了,编译时一堆红色报错,查了半天才发现是路径没搞对。

4.1 什么是colcon工作空间?

colcon是ROS2的官方编译工具。它替代了ROS1时代的catkin。我个人习惯把工作空间理解成一个「项目文件夹」,里面按固定结构放代码。

一个标准的colcon工作空间长这样:

ros2_ws/
├── src/          # 放源代码
├── build/        # 编译中间文件(自动生成)
├── install/      # 安装后的文件(自动生成)
└── log/          # 编译日志(自动生成)

嗯,这里要注意:你只需要手动创建src目录,其他三个目录是colcon build时自动生成的。我曾经见过新手把build目录手动创建了,结果编译时冲突,报错报得莫名其妙。

4.2 创建你的第一个colcon工作空间

来,跟我一步步操作。打开终端,敲下面这些命令:

# 创建目录
mkdir -p ~/ros2_ws/src

# 进入工作空间根目录
cd ~/ros2_ws

# 编译(此时src是空的,但colcon会初始化环境)
colcon build

第一次编译会生成build、install、log三个目录。你可能会问:「src是空的,编译个啥?」其实colcon会做一些环境初始化工作,为后续添加包做准备。

我的小习惯:每次新建工作空间后,我都会先跑一次空的colcon build。这样能确保编译环境没问题,避免后面加了代码再排查环境问题。

4.3 使用ros2 pkg create创建包

工作空间有了,接下来就是创建包。ROS2的包支持多种语言:C++、Python、甚至CMake原生项目。ros2 pkg create命令就是干这个的。

4.3.1 创建一个C++包

cd ~/ros2_ws/src
ros2 pkg create my_cpp_pkg \
  --build-type ament_cmake \
  --dependencies rclcpp std_msgs

这条命令会生成:

  • my_cpp_pkg/ 包目录
  • CMakeLists.txt 编译配置文件
  • package.xml 包描述文件
  • src/ 源代码目录
  • include/ 头文件目录

--dependencies参数很重要。它会在package.xml里自动添加依赖项。我刚开始时经常忘了加这个参数,结果编译时找不到头文件,报错说「rclcpp/rclcpp.hpp不存在」。嗯,其实就是没声明依赖。

4.3.2 创建一个Python包

cd ~/ros2_ws/src
ros2 pkg create my_py_pkg \
  --build-type ament_python \
  --dependencies rclpy std_msgs

Python包的结构略有不同:

  • my_py_pkg/ 包目录
  • setup.py 安装配置文件
  • setup.cfg 配置信息
  • package.xml 包描述文件
  • my_py_pkg/ 实际Python代码目录
  • resource/ 资源文件
关键区别:C++包用CMakeLists.txt管理编译,Python包用setup.py管理安装。别搞混了,否则编译时会一脸懵。

4.4 多语言包混合管理

实际项目中,C++和Python包经常混在一起。colcon完全支持这种场景。你可以在同一个src目录下放多个包:

ros2_ws/src/
├── my_cpp_pkg/    # C++包
├── my_py_pkg/     # Python包
└── another_pkg/   # 另一个包

编译时,colcon会自动识别每个包的build-type,用对应的工具链编译。你只需要在根目录执行:

cd ~/ros2_ws
colcon build

它会自动处理所有包。我曾经在一个项目里同时用了5个C++包和3个Python包,colcon处理得干干净净,一个都没落下。

4.5 避坑指南:我踩过的三个坑

做ROS2开发这几年,我在工作空间和包管理上踩过不少坑。挑三个最常见的说说:

  1. 路径问题:我曾经在~/ros2_ws目录下执行ros2 pkg create,结果包创建到了工作空间根目录,而不是src里。后来编译时死活找不到包。记住:创建包前一定要cd到src目录
  2. 依赖缺失:有一次我创建包时忘了加--dependencies,编译时各种报错。后来手动修改package.xml才搞定。建议创建时就加好依赖,省得后面折腾。
  3. 环境变量没source:编译完一定要source install/setup.bash,否则ros2 run找不到你的包。我刚开始时经常忘了这步,还以为包没编译成功。
重要提醒:每次打开新终端,都要重新source工作空间的环境变量。你可以把source命令加到~/.bashrc里,省得每次都手动敲。

4.6 实战练习:创建你的第一个多语言工作空间

来,咱们动手练一下。跟着我做:

  1. 创建并初始化工作空间
  2. 创建一个C++包和一个Python包
  3. 编译整个工作空间
  4. 验证包是否可用

具体命令如下:

# 1. 创建工作空间
mkdir -p ~/ros2_ws/src
cd ~/ros2_ws
colcon build

# 2. 创建C++包
cd ~/ros2_ws/src
ros2 pkg create cpp_demo --build-type ament_cmake --dependencies rclcpp

# 3. 创建Python包
ros2 pkg create py_demo --build-type ament_python --dependencies rclpy

# 4. 编译
cd ~/ros2_ws
colcon build

# 5. 验证
source install/setup.bash
ros2 pkg list | grep demo

如果最后一步能看到cpp_demo和py_demo,说明一切正常。恭喜你,你已经掌握了ROS2工作空间和包管理的核心技能。

嗯,这一章就到这儿。下一章咱们会往包里写真正的代码,让节点跑起来。到时候你会觉得,前面这些准备工作都是值得的。