【ros/ros2】ros1迁移到ros2的修改记录

序言

  • 背景:项目需要,将节点从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:声明编译类型

  • 9
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值