在 ROS 2 Humble 工作空间中,你顺利执行了 colcon build,一切看起来都很正常:
1 | Starting >>> system_status_interfaces |
可当你满怀期待地运行节点时,却迎面撞上异常:
1 | ros2 run status_publisher monitor |
错误堆栈如下(关键部分):
1 | ModuleNotFoundError: No module named 'system_status_interfaces.system_status_interfaces_s__rosidl_typesupport_c' |
ROS 2 的接口包(system_status_interfaces)在编译时会为 C++ 和 Python 分别生成类型支持(type support)库。Python 的类型支持库是一个动态链接库(.so 文件),它的命名中包含 Python 的版本号,例如 cpython-36m 表示是为 Python 3.6 编译的。
当我们查看 install/system_status_interfaces/local/lib/python3.10/dist-packages/system_status_interfaces/ 目录时,发现:
1 | system_status_interfaces_s__rosidl_typesupport_c.cpython-36m-x86_64-linux-gnu.so |
而当前 Ubuntu 22.04 默认的 Python 是 3.10。Python 3.10 的解释器无法加载为 Python 3.6 编译的扩展模块,因此 import_type_support 失败,抛出 UnsupportedTypeSupport。
同时,构建时还出现了符号链接创建失败的问题:
1 | failed to create symbolic link ... because existing path cannot be removed: Is a directory |
这说明工作空间有残留的构建文件,需要彻底清理。
1 | cd ~/sms |
这一步可以清除所有旧的构建产物,避免符号链接冲突和版本残留。
错误产生的根本原因是 CMake 在构建时错误地找到了 Python 3.6(可能因为环境变量或历史配置)。我们需要强制 CMake 使用系统当前的 Python 3.10。
在构建前,设置环境变量:
1 | export Python3_EXECUTABLE=/usr/bin/python3 |
或者,如果你希望一劳永逸,可以将这两行添加到 ~/.bashrc 中。
更推荐的做法:在接口包的 CMakeLists.txt 中加入以下内容,明确查找 Python 3:
1 | # 在 find_package(ament_cmake REQUIRED) 之后添加 |
这样 CMake 就会自动使用系统找到的 Python 3.10,而不是随意猜测。
CMakeLists.txt 和 package.xml如果你的 CMakeLists.txt 中没有正确依赖 rosidl_default_generators,也会导致类型支持生成不完整。确保包含:
1 | find_package(rosidl_default_generators REQUIRED) |
package.xml 中也需有:
1 | <build_depend>rosidl_default_generators</build_depend> |
1 | cd ~/sms |
此时你应该能看到节点顺利启动,不再报错。
.so 文件带错版本标签。install 目录中的文件没有被完全覆盖,导致版本混乱。--symlink-install 与普通安装混合:符号链接安装有时会遗留目录结构,导致后续构建无法覆盖,需要手动清理。--symlink-install 并定期清理:在开发阶段,建议每次重大改动后执行 rm -rf build install log 再重新构建。CMakeLists.txt 中固定 Python 版本,避免依赖系统默认。.so 文件名:如果再次遇到类似错误,可以先检查 install 下生成的 .so 文件名是否与当前 Python 版本匹配(python3 -c "import sys; print(sys.version)" 查看版本号)。UnsupportedTypeSupport 错误在 ROS 2 开发中并不少见,其本质是类型支持库与 Python 解释器版本不兼容。通过以下三个关键动作:
— 2026年8月4日