ROS2 与 ROS1 的 CMakeLists.txt
文件存在一些区别,主要是由于 ROS2 引入了新的构建工具 colcon 和新的消息传输中间件(RMW)实现等改动。这些区别体现在构建系统、依赖声明以及一些特定功能上。下面是 ROS2 与 ROS1 的 CMakeLists.txt
文件在几个关键点上的差异。
1. 构建系统的变化
- ROS1 使用的是 catkin 构建系统。
- ROS2 使用的是 ament 构建系统。
在 ROS2 中,ament
替代了 catkin,同时引入了构建工具 colcon 来管理多包工作空间。
2. CMakeLists.txt 结构的变化
ROS1 CMakeLists.txt
cmake_minimum_required(VERSION 3.0.2)
project(my_ros1_pkg)
find_package(catkin REQUIRED COMPONENTS roscpp std_msgs )
catkin_package()
include_directories( ${catkin_INCLUDE_DIRS} )
add_executable(${PROJECT_NAME}_node src/my_node.cpp) target_link_libraries(${PROJECT_NAME}_node ${catkin_LIBRARIES} )
ROS2 CMakeLists.txt
cmake_minimum_required(VERSION 3.5)
project(my_ros2_pkg)
find_package(ament_cmake REQUIRED)

find_package(rclcpp REQUIRED)
find_package(std_msgs REQUIRED)
add_executable(my_node src/my_node.cpp)
ament_target_dependencies(my_node rclcpp std_msgs)
install(TARGETS my_node DESTINATION lib/${PROJECT_NAME} )
ament_package()
3. find_package
的区别
- 在 ROS1 中,通常会通过
find_package(catkin REQUIRED COMPONENTS ...)
来查找 catkin 包及其依赖的组件。 - 在 ROS2 中,
find_package
的核心包变为ament_cmake
,并且依赖项会通过ament_target_dependencies
来设置。
ROS1 Example
find_package(catkin REQUIRED COMPONENTS roscpp std_msgs )
ROS2 Example
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)
find_package(std_msgs REQUIRED)
4. catkin_package
vs ament_package
- ROS1 使用
catkin_package()
来定义包依赖和生成目标。 - ROS2 使用
ament_package()
来定义包,并且包的依赖和目标通过ament_target_dependencies()
来链接。
ROS1 Example
catkin_package( CATKIN_DEPENDS roscpp std_msgs )
ROS2 Example
ament_package()
5. target_link_libraries
vs ament_target_dependencies
- 在 ROS1 中,使用
target_link_libraries
来手动链接依赖库。 - 在 ROS2 中,使用
ament_target_dependencies
来自动处理依赖项的链接和传递。
ROS1 Example
target_link_libraries(${PROJECT_NAME}_node ${catkin_LIBRARIES} )
ROS2 Example
ament_target_dependencies(my_node rclcpp std_msgs)
6. 安装规则
在 ROS2 中,安装规则显得更加重要,因为构建工具 colcon 依赖这些规则来创建适当的安装包结构。
ROS2 Installation
install(TARGETS my_node DESTINATION lib/${PROJECT_NAME} )
7. Message and Service Generation
消息和服务的生成在 ROS1 和 ROS2 中也有所不同。
ROS1 Example
add_message_files( FILES MyMessage.msg ) generate_messages( DEPENDENCIES std_msgs )
ROS2 Example
rosidl_generate_interfaces(${PROJECT_NAME} "msg/MyMessage.msg" DEPENDENCIES std_msgs )
8. 编译选项
对于编译选项,ROS2 通常默认使用 C++14 标准,而 ROS1 中可能使用的是 C++11。你可以通过以下命令设置编译标准:
ROS2 C++14
set(CMAKE_CXX_STANDARD 14)
总结
- 构建系统: ROS1 使用
catkin
,而 ROS2 使用ament
。 - 依赖声明: ROS1 使用
find_package(catkin)
,ROS2 使用find_package(ament_cmake)
。 - 包定义: ROS1 使用
catkin_package()
,ROS2 使用ament_package()
。 - 目标链接: ROS1 使用
target_link_libraries
,ROS2 使用ament_target_dependencies
。 - 消息/服务生成: ROS2 中的消息和服务生成采用了新的
rosidl
接口。
这意味着在迁移或编写 ROS2 工程时,你需要调整 CMakeLists.txt 文件的结构和语法以符合 ament 的规范。