• [ros2实操]2-ros2的消息和ros1的消息转换


    记录一下ros2和ros1消息互传的操作

    !!!需要注意的是,只有ros1订阅了相关ros2的消息时,ros1_bridge节点才会转发相关消息.

    参考链接

    1,docker镜像链接:待定
    2,github教程:Bridge communication between ROS 1 and ROS 2

    一.准备步骤

    为在自己原来的系统ubuntu1804上同时安装了ros1和ros2,但是不知道为什么ros2不能正常使用,所以我就用docker创建了一个ubuntu1804的容器,接下来的操作都是在容器里面做的.在容器里面安装ros1和ros2.

    操作具体见:[ros2实操]1-ros2的安装(ubuntu1804)与运行

    二.ros2与ros1消息互转实例

    这里就用一个例子说明,整个过程需要开启四个终端.并且,ros1运行在我的主机里面,ros2运行在docker容器里面.采用主从通信的方式.

    第一个终端:roscore

    在主机开一个终端,设置ROS环境变量,然后运行roscore.
    docker_host和master_host和对应的ip我们已经提前写到/etc/hosts里面了.

    export ROS_HOSTNAME=master_host
    export ROS_MASTER_URI=http://master_host:11311
    source /opt/ros/melodic/setup.bash
    roscore
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    第二个终端:ros1_bridge

    我们在ros2的容器环境中启动ros1_bridge.
    (容器中ros的host和ip我们也已经在/etc/hosts中配置好了.)
    此时需要同时source ros1和ros2的环境

    export ROS_HOSTNAME=docker_host
    export ROS_MASTER_URI=http://master_host:11311
    source /opt/ros/melodic/setup.bash
    source /opt/ros/eloquent/setup.bash
    ros2 run ros1_bridge dynamic_bridge
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    第三个终端: talker

    在ros2容器环境下运行talker节点

    export ROS_HOSTNAME=docker_host
    export ROS_MASTER_URI=http://master_host:11311
    source /opt/ros/eloquent/setup.bash
    ros2 run demo_nodes_py talker
    
    • 1
    • 2
    • 3
    • 4

    运行后会不断发布helloworld的消息
    在这里插入图片描述

    第四个终端:listener

    在主机ros1环境下,运行listener节点.

    export ROS_HOSTNAME=master_host
    export ROS_MASTER_URI=http://master_host:11311
    source /opt/ros/melodic/setup.bash
    rosrun roscpp_tutorials listener
    
    • 1
    • 2
    • 3
    • 4

    可以看到已经成功接受到来自ros2转换后消息
    在这里插入图片描述
    为了每次不用反复的输入环境变量,我们在主机端~/.bashrc目录下加入:

    export ROS_HOSTNAME=master_host
    export ROS_MASTER_URI=http://master_host:11311
    
    • 1
    • 2

    在容器端~/.bashrc目录下加入:

    export ROS_HOSTNAME=docker_host
    export ROS_MASTER_URI=http://master_host:11311
    
    • 1
    • 2

    这样每次启动终端就自动设置ROS的环境变量了.

    三.其他例子

    我们再搞一个小乌龟的例子.

    • 第一个终端:roscore
      ros1环境下启动roscore
    source /opt/ros/melodic/setup.bash
    roscore
    
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    • 第2个终端:ros1_bridge
      ros2环境下启动ros1_bridge
    source /opt/ros/melodic/setup.bash
    source /opt/ros/eloquent/setup.bash
    ros2 run ros1_bridge dynamic_bridge
    
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    • 第3个终端:ros2 turtlesim_node
      ros2环境下启动乌龟仿真器
    source /opt/ros/eloquent/setup.bash
    ros2 run turtlesim turtlesim_node
    
    
    • 1
    • 2
    • 3

    在这里插入图片描述
    第四个终端:ros2 turtle_teleop_key

    source /opt/ros/eloquent/setup.bash
    ros2 run turtlesim turtle_teleop_key
    
    
    • 1
    • 2
    • 3
  • 相关阅读:
    golang: sarama 链接Kafka
    03-HTML
    鸿蒙 harmonyos 线程 并发 总结 async promise Taskpool woker(二)多线程并发 Taskpool
    LeetCode 1694. 重新格式化电话号码
    基于模糊预测与扩展卡尔曼滤波的野值剔除方法
    持续集成交付CICD:Jenkins通过API触发流水线
    JavaScript-HTML DOM改变HTML
    平衡树相关知识:
    阅读记录【PMLR2023】The Aggregation–Heterogeneity Trade-off in Federated Learning
    CodeTON Round 2 (Div. 1 + Div. 2, Rated, Prizes!)
  • 原文地址:https://blog.csdn.net/condom10010/article/details/127968447