看这一篇就够了!ROS2入门学习:安装、测试、多机通信以及与ROS1的切换、通信 您所在的位置:网站首页 ros1和ros2可以共存吗 看这一篇就够了!ROS2入门学习:安装、测试、多机通信以及与ROS1的切换、通信

看这一篇就够了!ROS2入门学习:安装、测试、多机通信以及与ROS1的切换、通信

2024-01-05 14:15| 来源: 网络整理| 查看: 265

ROS2入门学习:安装、测试、多机通信以及与ros1的切换、通信 为什么要写这篇blog1 ROS2优势2 安装ROS2 Ardent 版本2.1 UTF-8支持2.2 安装依赖2.3 密钥认证2.4 添加分支2.5 安装ros22.6 安装工具2.7 激活ROS2 && 与ROS1共存2.8 测试话题通信 3 ROS2多机通信3.1 环境参考3.2 设置domain_id 4 ROS2与ROS1通信4.1 安装ros1_bridge4.2 测试4.2.1 ROS1运行roscore4.2.2 ROS1运行talker4.2.3 ROS2运行ros1_bridge4.2.4 ROS2运行listener 5 进阶:多机实现ROS1与ROS2的通信5.1 ROS1运行roscore5.2 ROS1运行talker5.3 设定domain_id5.4 第二台机器ROS2下运行ros1_bridge5.5 第二台机器ROS2下运行listener5.6 小结

为什么要写这篇blog

本人研究方向为多移动机器人开发,在样机研制过程中,协同控制系统基于ROS1进行实现。但ROS1的分布式通信设计基于Master的RPC调用和TCP/UDP机制。在主机(Master)宕机时,整体系统就会崩溃,冗余性非常差。

基于DDS和discovery机制的ROS2则实现了去中心化设计,解决了Master冗余问题,并引入更多的特性,完善机器人系统架构。

但是ROS2的开发成本较高,且学习资料以官方英文文档为主。笔者在进行项目的ROS2重构工作时,发现可参考的资料过于繁琐、混乱,且测试案例不全,这对小白来说,入门并测试需要花费较多时间探索。

因此,写下本文记录ROS2的入门记录,供大家学习、借鉴思路,早日解决自己的问题。

环境参考

两台笔记本,环境为Ubuntu16.04,已进行ping测试均已安装ROS1 kinetic 版本,独立运行正常ROS2目标版本:Ardent版 1 ROS2优势

ROS2正式版到来,到底带来哪些变化? 推荐:ROS2官方介绍 在这里插入图片描述 最主要的通信架构改变: 在这里插入图片描述 通信机制:

ROS1 在这里插入图片描述ROS2 在这里插入图片描述 2 安装ROS2 Ardent 版本 2.1 UTF-8支持

首先检测格式支持情况:

echo $LANG

在这里插入图片描述 如果是就可以忽略下面的操作,不是请安心执行:

sudo locale-gen en_US en_US.UTF-8 sudo update-locale LC_ALL=en_US.UTF-8 LANG=en_US.UTF-8 export LANG=en_US.UTF-8 2.2 安装依赖

依赖:

sudo apt update && sudo apt install curl gnupg2 lsb-release 2.3 密钥认证

这一步需要网络畅通,下载不了可以先wget下载ros.asc文件,然后在运行添加key命令

curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add - 2.4 添加分支

到源列表文件里,清华大学得源,速度快

sudo sh -c 'echo "deb http://mirror.tuna.tsinghua.edu.cn/ros2/ubuntu `lsb_release -cs` main" > /etc/apt/sources.list.d/ros2-latest.list' 2.5 安装ros2

在这里插入图片描述 16.04 是xenial ,安装ardent版本

sudo apt-get update && sudo apt-get install ros-ardent-desktop

安装需要一定时间,这个包服务器是美国的,慢慢下载,失败就多试几次

注:可以运行下述代码,下载所有ardent版本软件包:

sudo apt install `apt list ros-ardent-* 2> /dev/null | grep "/" | awk -F/ '{print $1}' | grep -v -e ros-ardent-ros1-bridge -e ros-ardent-turtlebot2- | tr "\n" " "` 2.6 安装工具

激活tab补全

sudo apt install python3-pip sudo pip3 install argcomplete sudo activate-global-python-argcomplet 2.7 激活ROS2 && 与ROS1共存

去bashrc中激活环境,首先打开终端,键入:

sodu gedit .bashrc

在最后输入:

source /opt/ros/ardent/setup.bash

但是,发现ROS1同样也存在source环境:

source /opt/ros/kinetic/setup.bash

这里推荐ROS1与ROS2环境共存,将ROS1与ROS2的source删除,输入以下代码:

echo "Would you like to run ros kinetic(1) or ros2 ardent(2)?" read edition if [ "$edition" -eq "1" ];then source /opt/ros/kinetic/setup.bash else source /opt/ros/ardent/setup.bash fi

每次运行终端,可自行进行选择ROS版本,在相应终端中进行工作。

注:但选择ROS2时可能会显示与ROS1参数有冲突风险,但不影响使用。在选择ROS2后,可进入配置文件,将显示内容全部注释。

sudo gedit /opt/ros/ardent/share/ros_environment/environment/1.ros_distro.sh

全部注释:

# generated from ros_environment/env-hooks/1.ros_distro.sh.in #if [ -n "$ROS_DISTRO" -a "$ROS_DISTRO" != "ardent" ]; then # echo "ROS_DISTRO was set to '$ROS_DISTRO' before. Please make sure that the environment does not mix paths from different distributions." #fi #export ROS_DISTRO=ardent

退出保存即可。

2.8 测试话题通信

运行两个ROS2终端,分别测试:

ros2 run demo_nodes_cpp talker ros2 run demo_nodes_cpp listener

测试结果:

在这里插入图片描述 在这里插入图片描述 至此,完成安装与测试工作。

3 ROS2多机通信 3.1 环境参考 两台笔记本,环境为Ubuntu16.04,同一WIFI下已进行ping测试均已安装ROS1 kinetic 版本、ROS2Ardent版本,且运行正常 3.2 设置domain_id

在网络畅通的情况下,分别在ROS2终端中,设置:

export ROS_DOMAIN_ID=1

此时,两台笔记本在当前终端中分别运行talker与listener

第一台笔记本: 在这里插入图片描述

第二台笔记本:在这里插入图片描述 完成ROS2的多机通信

4 ROS2与ROS1通信

通过bridge实现,实现原理1 通过bridge实现,实现原理2 在这里插入图片描述

4.1 安装ros1_bridge

分别在两台笔记本ROS2终端中安装:

sudo apt install ros-ardent-ros1-bridge

在进行ROS1与ROS2通信时,ROS2的终端中运行即可:

ros2 run ros1_bridge dynamic_bridge 4.2 测试 4.2.1 ROS1运行roscore

第一台笔记本运行roscore 在这里插入图片描述

4.2.2 ROS1运行talker

第一台笔记本运行talker,最简单的/chatter话题,ROS1例程 在这里插入图片描述

4.2.3 ROS2运行ros1_bridge

第一台笔记本运行

ros2 run ros1_bridge dynamic_bridge

在这里插入图片描述

4.2.4 ROS2运行listener

第一台笔记本ROS2终端运行:

ros2 run demo_nodes_cpp listener

在这里插入图片描述 至此,完成ROS1与ROS2在同一台机器的通信测试。

下面会测试ros1与ros2的多机通信,较为复杂,故推荐:

在需要ros1与ros2通信时,尽量在一台机器人上实现数据通信,在多机之间采用ros2实现通信即可。尽量避免多机进行ros1与ros2的通信。

5 进阶:多机实现ROS1与ROS2的通信

与之前的步骤类似,但要同时进行多机协同设定: 准备工作:

两台笔记本进行ROS1的协同通信设置,目的是保证ros1_bridge能够找到MASTER_URI。此处省去设置过程,可自行搜索教程。两台笔记本进行ROS2的协同通信设置,目的是保证两台机器的通信 5.1 ROS1运行roscore

第一台笔记本运行 在这里插入图片描述

5.2 ROS1运行talker

第一台笔记本运行 在这里插入图片描述

5.3 设定domain_id

第一台笔记本ROS2环境下设定: 在这里插入图片描述 第二台笔记本运行2个ROS2终端,并分别如上设定

5.4 第二台机器ROS2下运行ros1_bridge

此时,第二台机器运行ros1_bridge(没有设定ros1协同通信的话,会找不到master)。 (运行时是没有显示话题数据流向的,在5.4运行之后,会显示出流向信息) 在这里插入图片描述

5.5 第二台机器ROS2下运行listener

第二台机器运行listener,此时bridge也会显示出话题数据流向 在这里插入图片描述

5.6 小结

相对于同一台机器而言,ROS1与ROS2的多机协同通信完成初步测试,但非常复杂。需要进行ROS1与ROS2的协同通信。(后期在测试时发现,在多机过程中,可以不进行ROS2的协同通信domain设定) 但目前的ROS机器人开发生态而言,应首先完成ros1开发工作,然后进行ros2的迁移重构工作。

最主要的是,在需要ros1与ros2通信时,尽量在一台机器人上实现数据通信,在多机之间采用ros2实现通信即可。尽量避免多机进行ros1与ros2的通信。



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有