文章目录
序言
- 背景:项目需要,将节点从ros迁移到ros2
- 环境:ubuntu18.04 ros2 dashing / ubuntu20.04 ros2 humble
1. 要改哪些内容
- CMakeLists.txt
- package.xml
- launch文件
- 代码修改:头文件
- 代码修改:subscriber/publisher
- 代码修改:主程序
- 代码修改:类的使用
- 代码修改:生命周期节点
2. 详细对比修改
2.1 CMakeLists.txt
-
cmake版本:ros2依赖于3.5或更高版本的cmake
cmake_minimum_required(VERSION 3.5)
-
c++版本:ros2依赖于c++14标准
// 适用于所有平台的写法 if(NOT CMAKE_CXX_STANDARD) set(CMAKE_CXX_STANDARD 14) endif() if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") add_compile_options(-Wall -Wextra -Wpedantic) endif()
-
find_package添加package依赖:ros1使用catkin构建系统和catkin_make构建工具,ros2使用catkin演化后的ament构建系统和colcon构建工具。使用ament_cmake,首先找到ament_cmake,然后独立添加各个package
find_package(ament_cmake REQUIRED) find_package(rclcpp REQUIRED) find_package(std_msgs REQUIRED)
// 添加系统依赖项 find_package(Boost REQUIRED COMPONENTS system filesystem thread)
-
catkin_packge和ament_package:ros1在指定要编译的目标之前,使用catkin_package来生成cmake配置文件供其他packge使用,ros2在编译目标后使用ament_packge
// At the bottom of the file: ament_package()
-
包含头文件和库文件:使用target_include_directories来包含特定target包含的头文件路径,使用target_link_libraries来包含非ament packge的包,使用ament_target_dependencies来包含ament packge的包。举例如下
target_include_directories(target PUBLIC include ${ Boost_INCLUDE_DIRS}) target_link_libraries(target ${ Boost_LIBRARIES}) ament_target_dependencies(talker rclcpp std_msgs)
-
安装头文件/库文件/可执行文件等:这个都是用install命令,指定对应的include目录、lib目录和bin目录
-
综上,ros2 CMakeLists.txt示例
cmake_minimum_required(VERSION 3.5) project(talker) if(NOT CMAKE_CXX_STANDARD) set(CMAKE_CXX_STANDARD 14) endif() if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang") add_compile_options(-Wall -Wextra -Wpedantic) endif() find_package(ament_cmake REQUIRED) find_package(rclcpp REQUIRED) find_package(std_msgs REQUIRED) #catkin_package() #include_directories(${ catkin_INCLUDE_DIRS}) include_directories(include) add_executable(talker talker.cpp) #target_link_libraries(talker ${ catkin_LIBRARIES}) ament_target_dependencies(talker rclcpp std_msgs) #install(TARGETS talker RUNTIME DESTINATION ${ CATKIN_PACKAGE_BIN_DESTINATION}) install(TARGETS talker DESTINATION lib/${ PROJECT_NAME}) install(DIRECTORY include/ DESTINATION include) ament_export_include_directories(include) ament_export_dependencies(std_msgs) ament_package()
2.2 packge.xml
-
format version:ros2支持2及更高的format version
<!-- <package> --> <package format="2">
-
buildtool_depend:使用ament_cmake替换catkin
<!-- <buildtool_depend>catkin</buildtool_depend> --> <buildtool_depend>ament_cmake</buildtool_depend>
-
build_depend:使用rclcpp替换roscpp
<!-- <run_depend>roscpp</run_depend> --> <exec_depend>rclcpp</exec_depend> <!-- <run_depend>std_msgs</run_depend> --> <exec_depend>std_msgs</exec_depend>
也可以使用depend来指定编译和运行时依赖
<depend>rclcpp</depend> <depend>std_msgs</depend>
-
build_type:声明编译类型