记录一下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
第二个终端: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
第三个终端: 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的消息
第四个终端: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转换后消息
为了每次不用反复的输入环境变量,我们在主机端~/.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
- 第2个终端:ros1_bridge
ros2环境下启动ros1_bridge
source /opt/ros/melodic/setup.bash
source /opt/ros/eloquent/setup.bash
ros2 run ros1_bridge dynamic_bridge
- 第3个终端:ros2 turtlesim_node
ros2环境下启动乌龟仿真器
source /opt/ros/eloquent/setup.bash
ros2 run turtlesim turtlesim_node
第四个终端:ros2 turtle_teleop_key
source /opt/ros/eloquent/setup.bash
ros2 run turtlesim turtle_teleop_key