面试的时候被问你ROS2项目怎么组织的怎么编译我说用colcon build。面试官说colcon和catkin有什么区别overlay workspace了解吗我当时的表情大概是这样的啊ROS2的工作空间管理和ROS1的catkin有很大不同。搞清楚这些概念是你从能跑demo到能开发项目的关键一步。工作空间的基本结构ROS2的工作空间workspace就是一个项目目录标准结构是这样的my_robot_ws/ ├── src/ # 源代码放这里 │ ├── my_pkg1/ │ ├── my_pkg2/ │ └── ... ├── build/ # 编译中间产物每个包一个子目录 ├── install/ # 编译输出每个包一个子目录 └── log/ # 编译日志你只需要关心src目录其他三个都是colcon自动生成的。创建工作空间mkdir -p ~/robot_ws/src cd ~/robot_ws然后把你的包放到src下面。一个workspace可以包含多个包每个包独立编译。colconROS2的编译工具ROS1用catkin_make或者catkin buildROS2换成了colcon。colcon不只能编译ROS项目它是一个通用的Python/C项目构建工具ROS2只是它的一个使用场景。最基本的编译命令cd ~/robot_ws colcon build这会编译src下的所有包。编译完成后install目录下会生成每个包的安装文件。要使用这些包需要source环境source install/setup.bash常用的编译选项colcon build --packages-select my_pkg # 只编译指定的包 colcon build --packages-up-to my_pkg # 编译某个包及其所有依赖 colcon build --cmake-args -DCMAKE_BUILD_TYPERelease # 指定编译类型 colcon build --symlink-install # 用符号链接代替拷贝Python开发神器--symlink-install这个选项在开发Python包时特别有用。它让install目录下的Python文件指向src目录的符号链接这样你改了源码不用重新编译直接生效。能省下大量时间。overlay workspace叠加工作空间这是ROS2的一个重要概念也是和ROS1区别最大的地方之一。假设你在做一个项目需要用到社区的navigation包但你想修改其中一部分代码。你不需要fork整个仓库而是可以用overlay的方式/opt/ros/humble/ # 底层workspace系统安装的ROS2 ~/nav_overlay_ws/src/ # 你的叠加workspace └── navigation/ # 只放你要修改的包编译overlay workspace时它会覆盖底层workspace中同名的包。其他没修改的包还是用底层的版本。cd ~/nav_overlay_ws colcon build source install/setup.bash # 这个setup.bash包含了overlay和底层的路径overlay的好处是你只维护自己修改的部分其他依赖都用系统版本。升级ROS2的时候你的修改不会受影响。C包和Python包的区别ROS2支持两种类型的包ament_cmakeC和ament_pythonPython。C包用CMakeLists.txt管理编译适合性能要求高的模块cmake_minimum_required(VERSION 3.8) project(my_cpp_pkg) find_package(ament_cmake REQUIRED) find_package(rclcpp REQUIRED) add_executable(my_node src/my_node.cpp) ament_target_dependencies(my_node rclcpp) install(TARGETS my_node DESTINATION lib/${PROJECT_NAME}) ament_package()Python包用setup.py管理适合快速开发和原型验证from setuptools import setup package_name my_py_pkg setup( namepackage_name, version0.1.0, packages[package_name], install_requires[setuptools], entry_points{ console_scripts: [ my_node my_py_pkg.my_node:main, ], }, )一个项目里可以同时有C包和Python包。colcon会自动识别每个包的类型分别用对应的工具编译。依赖管理ROS2的依赖分两种系统依赖和包依赖。系统依赖用rosdep管理rosdep install --from-paths src --ignore-src -r -y这会根据每个包的package.xml自动安装所需的系统包。包依赖在package.xml里声明dependrclcpp/depend dependstd_msgs/depend buildtool_dependament_cmake/buildtool_dependdepend表示编译和运行都需要build_depend只在编译时需要exec_depend只在运行时需要。面试中怎么聊面试官问工作空间管理你可以说我们用overlay workspace的方式组织项目。底层是系统安装的ROS2上面叠加项目自己的包。这样升级ROS2版本的时候我们的代码不受影响。编译用colcon开发Python包时用--symlink-install加速迭代。CI里用--packages-up-to只编译改动的包及其依赖节省编译时间。常见编译错误排查colcon编译最常遇到的错误有几种。第一种是ament_cmake not found通常是没source ROS2的setup.bash。第二种是找不到头文件检查CMakeLists.txt里的find_package和include_directories是否正确。第三种是链接错误undefined reference说明库没有正确链接检查package.xml的依赖声明和CMakeLists.txt的ament_target_dependencies。一个排查技巧用colcon build --event-handlers console_direct可以看到每个包的详细编译输出比默认的错误信息详细得多。遇到疑难编译问题这个参数能帮你快速定位。colcon构建的进阶技巧colcon除了基本的build命令还有很多实用功能。--packages-select可以只编译指定的包在大型workspace中节省大量时间--cmake-args可以切换编译模式--event-handlers可以实时显示编译输出方便排查错误。另外colcon test和colcon test-result可以运行和查看测试结果是保证代码质量的重要工具。给你的建议一开始不要纠结workspace的组织方式。先建一个简单的workspace放一两个包跑通编译和运行的流程。等项目变复杂了再考虑overlay和分包策略。一定要学会--packages-select。项目大了之后每次全量编译太慢只编译你改的包能省很多时间。还有source install/setup.bash这一步别忘了。很多人编译完了直接跑报package not found就是因为没source环境。建议把这行加到~/.bashrc里省得每次手动source。上一篇第110篇 DDS通信原理——ROS2底层是怎么传数据的下一篇预告第112篇 ROS2 Node节点——机器人系统中的最小执行单元