ROS 包与构建:catkin / colcon 把节点组织成工程(八)
通用基础优先 · 第八篇|ROS 通识系列|Docker 实战
一图读懂本文:工作空间 → 包的两份身份证 → catkin/colcon 差异 → 建包实战 → 数采部署衔接。
前面写的节点都是"散装脚本"。真要做数采平台,得把它们、接口、启动文件、配置组织成"包(package)",再用构建工具编译分发。这一篇讲 ROS 1 的 catkin 与 ROS 2 的 colcon,以及最小包的结构。
一、工作空间(Workspace):你的"工程根目录"
~/ws/ # workspace 根 src/ # 所有源码包放这里(你只动这一层) my_robot_driver/ # 一个包 my_robot_interfaces/ install/ # colcon 构建产物(自动生成) build/ log/ # 中间产物(自动生成)只往src/放代码,构建在 workspace 根目录执行。
colcon build是"安装",source install/setup.bash是"开机激活"。记住一个铁律:每次新开终端,source 之后你的包才"存在"。"明明编译了却 run 不到",十有八九是忘了 source。二、包的两份"身份证"
每个包至少两个文件:
package.xml:包的元数据与依赖(名字、版本、作者、依赖列表);CMakeLists.txt(C++/混合)或setup.py+setup.cfg(纯 Python):告诉构建系统怎么编、装到哪。
# package.xml(关键片段,注意标签要转义为正常尖括号)三、catkin(ROS 1) vs colcon(ROS 2)
| catkin(ROS 1) | colcon(ROS 2) | |
|---|---|---|
| 命令 | catkin_make/catkin build | colcon build |
| 底层 | CMake + catkin 层 | 通用构建工具(插件化) |
| 环境 | devel/setup.bash | install/setup.bash |
四、Docker 实战:从零建包并编译
# 进容器、建工作空间 docker run -it --rm -v ~/ws:/ws ros:jazzy bash cd /ws && mkdir -p src && cd srcros2 pkg create --build-type ament_python my_robot_driver --dependencies rclpy
cd /ws
colcon build # 构建全部包
source install/setup.bash # 让系统找到新包
ros2 run my_robot_driver … # 运行
-v ~/ws:/ws把本机目录挂进容器,构建结果留在本机,容器删了代码也不丢。这是本系列所有 demo 的标准玩法。package.xml里漏<depend>,在别人机器上必挂,用rosdep install --from-paths src --ignore-src -y一次性装齐;②改了接口没重编下游——接口包更新后,依赖它的包要一起重编,colcon build --packages-above my_interfaces;③overlay 隔离——在官方发行版之上叠加自己的 workspace,source 顺序决定谁覆盖谁(后 source 的赢)。另外,往机载 NUC(ARM)部署时有两条路:在 NUC 上直接 colcon build(简单)或 x86 上交叉编译 toolchain(快但配置繁琐),一期建议前者。五、接回数采平台
- 数采的采集节点、格式转换节点、回放节点,都应各自成包,便于在 KUAVO 机载 NUC 与云端分别部署;
- 依赖(
rclpy、rosbag2、tf2)写进package.xml,才能 reproducible 地重建环境; - KUAVO 是 ROS 1,用 catkin;我们新写的工具链用 ROS 2 + colcon,靠
ros1_bridge打通(见第 13 篇)。
六、小结与下篇
- 包 = 节点 + 接口 + 启动 + 配置的最小可分发单元;
- 两份身份证:
package.xml(依赖)、CMakeLists.txt/setup.py(构建); - ROS 1 用 catkin,ROS 2 用 colcon(
colcon build+source install/setup.bash); - 用
-v挂载本机目录,容器可弃、代码不丢; - 下一篇:启动与编排 launch——一条命令拉起"采集 + 录制 + 可视化"整条流水线。