概述
ROS2入门学习:安装、测试、多机通信以及与ros1的切换、通信
- 为什么要写这篇blog
- 1 ROS2优势
- 2 安装ROS2 Ardent 版本
- 2.1 UTF-8支持
- 2.2 安装依赖
- 2.3 密钥认证
- 2.4 添加分支
- 2.5 安装ros2
- 2.6 安装工具
- 2.7 激活ROS2 && 与ROS1共存
- 2.8 测试话题通信
- 3 ROS2多机通信
- 3.1 环境参考
- 3.2 设置domain_id
- 4 ROS2与ROS1通信
- 4.1 安装ros1_bridge
- 4.2 测试
- 4.2.1 ROS1运行roscore
- 4.2.2 ROS1运行talker
- 4.2.3 ROS2运行ros1_bridge
- 4.2.4 ROS2运行listener
- 5 进阶:多机实现ROS1与ROS2的通信
- 5.1 ROS1运行roscore
- 5.2 ROS1运行talker
- 5.3 设定domain_id
- 5.4 第二台机器ROS2下运行ros1_bridge
- 5.5 第二台机器ROS2下运行listener
- 5.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的通信。
最后
以上就是阔达糖豆为你收集整理的看这一篇就够了!ROS2入门学习:安装、测试、多机通信以及与ROS1的切换、通信为什么要写这篇blog1 ROS2优势2 安装ROS2 Ardent 版本3 ROS2多机通信4 ROS2与ROS1通信5 进阶:多机实现ROS1与ROS2的通信的全部内容,希望文章能够帮你解决看这一篇就够了!ROS2入门学习:安装、测试、多机通信以及与ROS1的切换、通信为什么要写这篇blog1 ROS2优势2 安装ROS2 Ardent 版本3 ROS2多机通信4 ROS2与ROS1通信5 进阶:多机实现ROS1与ROS2的通信所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复