记录一下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与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

docker镜像中安装ros_docker

第二个终端: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

docker镜像中安装ros_bash_02

第三个终端: 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

运行后会不断发布helloworld的消息

docker镜像中安装ros_ubuntu_03

第四个终端: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

可以看到已经成功接受到来自ros2转换后消息

docker镜像中安装ros_ubuntu_04


为了每次不用反复的输入环境变量,我们在主机端~/.bashrc目录下加入:

export ROS_HOSTNAME=master_host
export ROS_MASTER_URI=http://master_host:11311

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

export ROS_HOSTNAME=docker_host
export ROS_MASTER_URI=http://master_host:11311

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

三.其他例子

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

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

docker镜像中安装ros_ROS_05

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

docker镜像中安装ros_bash_06

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

docker镜像中安装ros_ROS_07


第四个终端:ros2 turtle_teleop_key

source /opt/ros/eloquent/setup.bash
ros2 run turtlesim turtle_teleop_key