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

为什么要写这篇blog

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

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

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

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

环境参考

  1. 两台笔记本,环境为Ubuntu16.04,已进行ping测试
  2. 均已安装ROS1 kinetic 版本,独立运行正常
  3. 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 环境参考

  1. 两台笔记本,环境为Ubuntu16.04,同一WIFI下已进行ping测试
  2. 均已安装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的通信

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

  1. 两台笔记本进行ROS1的协同通信设置,目的是保证ros1_bridge能够找到MASTER_URI。此处省去设置过程,可自行搜索教程。
  2. 两台笔记本进行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的通信。

  • 11
    点赞
  • 55
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值