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会做一些环境初始化工作,为后续添加包做准备。
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/资源文件
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开发这几年,我在工作空间和包管理上踩过不少坑。挑三个最常见的说说:
- 路径问题:我曾经在~/ros2_ws目录下执行ros2 pkg create,结果包创建到了工作空间根目录,而不是src里。后来编译时死活找不到包。记住:创建包前一定要cd到src目录。
- 依赖缺失:有一次我创建包时忘了加--dependencies,编译时各种报错。后来手动修改package.xml才搞定。建议创建时就加好依赖,省得后面折腾。
- 环境变量没source:编译完一定要source install/setup.bash,否则ros2 run找不到你的包。我刚开始时经常忘了这步,还以为包没编译成功。
4.6 实战练习:创建你的第一个多语言工作空间
来,咱们动手练一下。跟着我做:
- 创建并初始化工作空间
- 创建一个C++包和一个Python包
- 编译整个工作空间
- 验证包是否可用
具体命令如下:
# 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工作空间和包管理的核心技能。
嗯,这一章就到这儿。下一章咱们会往包里写真正的代码,让节点跑起来。到时候你会觉得,前面这些准备工作都是值得的。