ROS2中setup.py和CMakeLists.txt 最佳实践

在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.bash

4.节点命名与通信

  • C++和Python节点使用不同名称(如cpp_publisher和py_subscriber)
  • 通过统一话题名(如echo_test_msg)实现跨语言通信
  • 使用ROS2接口定义语言(IDL)确保消息格式一致性

三、常见问题解决

  1. 环境变量未自动注册 确保CMakeLists.txt中包含ament_package(),且package.xml的<build_type>与实际构建系统匹配。
  2. Python模块导入错误 在setup.cfg中添加:
[develop]
script-dir=$base/lib/ros2_demo
[install]
install-scripts=$base/lib/ros2_demo
  1. 混合代码调试
  • C++:使用gdb ./install/ros2_demo/lib/ros2_demo/cpp_node
  • Python:直接通过python3 -m pdb install/ros2_demo/lib/ros2_demo/new_python_node.py
原文链接:,转发请注明来源!