ROS1与ROS2的bag包互换(包含自定义消息)

举报
Hermit_Rabbit 发表于 2022/09/21 20:32:17 2022/09/21
【摘要】 0. 前言目前是ROS1到ROS2的过度阶段,由于ROS2内部的机制大幅变动,导致我们ROS1录制的bag包和ROS2的bag包并不能通用。网上基本上均是如何将ros2录制的bag包转换为ros1格式的bag包的方案,这里做出归纳,并给出全套的解决方案。测试环境:ubuntu 20.04ROS 1 noeticROS 2 foxy两个版本的ROS 均需要按照官网教程进行安装,这里可以参照作...

0. 前言

目前是ROS1到ROS2的过度阶段,由于ROS2内部的机制大幅变动,导致我们ROS1录制的bag包和ROS2的bag包并不能通用。网上基本上均是如何将ros2录制的bag包转换为ros1格式的bag包的方案,这里做出归纳,并给出全套的解决方案。
测试环境:
ubuntu 20.04
ROS 1 noetic
ROS 2 foxy
两个版本的ROS 均需要按照官网教程进行安装,这里可以参照作者之前写的文章来安装。

1.ROS2和ROS1录制的文件格式

ros2录制的bag包文件,录制完后会生成一个目录,在目录下会生成多个文件,如下:
在这里插入图片描述
ros1 录制的bag文件,只有一个文件:例如 2021-05-19-19-10-18.bag

2. ROS2转ROS1的bag包

为了将录制的ROS2的bag包转换ROS1格式的bag包,大致流程需要以下步骤:

1.播放ros2的包
2.ros1监听到ros2播放的topic,然后再录制topic即可

  1. 当不需要使用自定义消息类型进行两个ROS 通信的时候,没有必要通过源码编译安装ros1_bridge

  2. 我们可以直接安装ros-eloquent-ros1-bridge,这个库包主要是用于ros2和ros1之间的通信

    sudo apt update
    sudo apt install ros-foxy-ros1-bridge
    
  3. 启动 一个新的终端

    source /opt/ros/noetic/setup.bash
    roscore
    
  4. 再启动一个新的终端

    source /opt/ros/noetic/setup.bash
    source /opt/ros/foxy/setup.bash
    ros2 run ros1_bridge dynamic_bridge  // --bridge-all-topics
    
  5. 再启动一个新的终端

    source /opt/ros/foxy/setup.bash
    ros2 bag play rosbag2_2021_05_19-11_28_34/
    
  6. 再启动一个新的终端

    source /opt/ros/noetic/setup.bash
    rosbag record /image /scan
    
  7. 等待录制完成即可尝试播放

     rosbag play rosbag2_2021_05_19-11_28_34.bag
    

3. ROS1转ROS2的bag包

这里一定要注意顺序。因为我们原有的rosbag是ros1格式,用的是ros2里面的bag工具,所以要先source ROS1,再source ROS2,否则可能出现问题。

source /opt/ros/noetic/setup.bash
source /opt/ros/foxy/setup.bash
ros2 bag play -s rosbag_v2 src/localization/localization/bag/data_example.bag

在这里插入图片描述

4. 自定义类型msg的bag包转换

这里与上述的区别就在于自定义的类型ROS1_bridge必须用源代码重新编译。

  1. 创建ros1_bridge工作区。我们在一个单独的工作区中构建ROS1_bridge,因为它需要在其环境中同时使用ROS1和ROS2包。

    mkdir -p ~/ros1_bridge_ws/src
    cd ~/ros1_bridge_ws/src
    
  2. 从github上拉下代码

    git clone -b dashing https://github.com/ros2/ros1_bridge.git
    
  3. 编译过程会find_ros1_packagefind_ros1_interface_packages。例如ros1的代码路径在~/catkin_ws/src/custommsg 里面使用自定义的msg。这里可以参考链接来完成自定义msg的编译.这里就不详细说来.ROS2这里需要建立另一哥单独一个文件夹定义~/colcon_ws/src/custommsg来保存ROS2内部的转换后的msg信息**(ROS1资料很多了,这里只写出ROS2中关键点)**

    cmake_minimum_required(VERSION 3.5)
    project(customsrv)
    
    # Default to 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(ament_cmake REQUIRED)
    find_package(builtin_interfaces REQUIRED)
    find_package(rosidl_default_generators REQUIRED)
    
    rosidl_generate_interfaces(custommsg
      "msg/SetString.msg"
      DEPENDENCIES builtin_interfaces
    )
    install(
      FILES my_mapping_rules.yaml
      DESTINATION share/${PROJECT_NAME})
    
    ament_package()
    

    注意的地方是 my_mapping_rules.yaml

      ros1_package_name: 'custommsg'
      ros1_service_name: 'SetString'
      ros2_package_name: 'custommsg'
      ros2_service_name: 'SetString'
    

    package.xml

    <?xml version="1.0"?>
    <?xml-model href="http://download.ros.org/schema/package_format2.xsd" schematypens="http://www.w3.org/2001/XMLSchema"?>
    <package format="3">
      <name>custommsg</name>
      <version>0.0.0</version>
      <description>TODO: Package description</description>
      <license>TODO: License declaration</license>
    
      <buildtool_depend>ament_cmake</buildtool_depend>
      <buildtool_depend>rosidl_default_generators</buildtool_depend>
      <member_of_group>rosidl_interface_packages</member_of_group>'
      <test_depend>ament_lint_auto</test_depend>
      <test_depend>ament_lint_common</test_depend>
      <export>
        <build_type>ament_cmake</build_type>
        <ros1_bridge mapping_rules="my_mapping_rules.yaml"/>
      </export>
    </package>
    

    需要注意的是 <ros1_bridge mapping_rules=“my_mapping_rules.yaml”/>

    msg文件夹是SetString.msg

    bool b
    string message
    

…详情请参照古月居

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。