ROS2 与 ROS1 的 CMakeLists.txt 文件区别

ROS2ROS1CMakeLists.txt 文件存在一些区别,主要是由于 ROS2 引入了新的构建工具 colcon 和新的消息传输中间件(RMW)实现等改动。这些区别体现在构建系统、依赖声明以及一些特定功能上。下面是 ROS2ROS1CMakeLists.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)

扫描二维码关注公众号,回复: 17460115 查看本文章

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

消息和服务的生成在 ROS1ROS2 中也有所不同。

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 的规范。

猜你喜欢

转载自blog.csdn.net/qqk808/article/details/142882247