在ROS2中可以同时使用setup.py和CMakeLists.txt,但需遵循特定的集成规范。对于包含Python和C++混合代码的项目,最佳实践如下:
一、混合构建的实现方式
1.以CMake为主体构建系统(推荐)
通过ament_cmake_python扩展在CMake中集成Python模块,不单独使用setup.py。示例CMakeLists.txt配置:
cmake_minimum_required(VERSION 3.5)
project(ros2_demo)
# C++节点编译
add_executable(cpp_node src/cpp_node.cpp)
ament_target_dependencies(cpp_node rclcpp)
install(TARGETS cpp_node DESTINATION lib/${PROJECT_NAME})
# Python模块集成
find_package(ament_cmake_python REQUIRED)
ament_python_install_package(${PROJECT_NAME} SCRIPTS_DESTINATION lib/${PROJECT_NAME})
# Python节点安装
install(PROGRAMS
ros2_demo/new_python_node.py
DESTINATION lib/${PROJECT_NAME}
)
ament_package()2.共存但需手动规避冲突
若必须保留setup.py,需在package.xml中明确指定构建类型:
<export>
<build_type>ament_cmake</build_type> <!-- 或 ament_python -->
</export>注意:ROS2不推荐同时使用两种构建系统,可能导致环境变量注册异常(如之前需手动source包内local_setup.bash的问题)。
二、混合代码项目的最佳实践
1.目录结构规范
ros2_demo/
├── include/ros2_demo/ # C++头文件
├── src/ # C++源文件
│ └── cpp_node.cpp
├── ros2_demo/ # Python包目录
│ ├── __init__.py
│ └── new_python_node.py
├── CMakeLists.txt # 主构建脚本
├── package.xml # 依赖声明
└── setup.cfg # Python安装配置(若需)2.依赖管理
- 在package.xml中统一声明所有依赖:
<depend>rclcpp</depend> <!-- C++依赖 -->
<depend>rclpy</depend> <!-- Python依赖 -->- CMake中通过ament_target_dependencies链接C++依赖
- Python依赖通过setup.cfg或requirements.txt管理
3.编译与安装
# 单一命令编译所有代码
colcon build --packages-select ros2_demo
# 自动生成统一环境变量
source install/local_setup.bash4.节点命名与通信
- C++和Python节点使用不同名称(如cpp_publisher和py_subscriber)
- 通过统一话题名(如echo_test_msg)实现跨语言通信
- 使用ROS2接口定义语言(IDL)确保消息格式一致性
三、常见问题解决
- 环境变量未自动注册 确保CMakeLists.txt中包含ament_package(),且package.xml的<build_type>与实际构建系统匹配。
- Python模块导入错误 在setup.cfg中添加:
[develop]
script-dir=$base/lib/ros2_demo
[install]
install-scripts=$base/lib/ros2_demo- 混合代码调试
- C++:使用gdb ./install/ros2_demo/lib/ros2_demo/cpp_node
- Python:直接通过python3 -m pdb install/ros2_demo/lib/ros2_demo/new_python_node.py
