看这一篇就够了!ROS2入门学习:安装、测试、多机通信以及与ROS1的切换、通信 | 您所在的位置:网站首页 › ros1和ros2可以共存吗 › 看这一篇就够了!ROS2入门学习:安装、测试、多机通信以及与ROS1的切换、通信 |
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官方介绍 ![]() ![]() 首先检测格式支持情况: echo $LANG
依赖: 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
安装需要一定时间,这个包服务器是美国的,慢慢下载,失败就多试几次 注:可以运行下述代码,下载所有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测试结果:
在网络畅通的情况下,分别在ROS2终端中,设置: export ROS_DOMAIN_ID=1此时,两台笔记本在当前终端中分别运行talker与listener 第一台笔记本: 第二台笔记本: 通过bridge实现,实现原理1 通过bridge实现,实现原理2 分别在两台笔记本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 第一台笔记本运行talker,最简单的/chatter话题,ROS1例程 第一台笔记本运行 ros2 run ros1_bridge dynamic_bridge第一台笔记本ROS2终端运行: ros2 run demo_nodes_cpp listener
下面会测试ros1与ros2的多机通信,较为复杂,故推荐: 在需要ros1与ros2通信时,尽量在一台机器人上实现数据通信,在多机之间采用ros2实现通信即可。尽量避免多机进行ros1与ros2的通信。 5 进阶:多机实现ROS1与ROS2的通信与之前的步骤类似,但要同时进行多机协同设定: 准备工作: 两台笔记本进行ROS1的协同通信设置,目的是保证ros1_bridge能够找到MASTER_URI。此处省去设置过程,可自行搜索教程。两台笔记本进行ROS2的协同通信设置,目的是保证两台机器的通信 5.1 ROS1运行roscore第一台笔记本运行 第一台笔记本运行 第一台笔记本ROS2环境下设定: 此时,第二台机器运行ros1_bridge(没有设定ros1协同通信的话,会找不到master)。 (运行时是没有显示话题数据流向的,在5.4运行之后,会显示出流向信息) 第二台机器运行listener,此时bridge也会显示出话题数据流向 相对于同一台机器而言,ROS1与ROS2的多机协同通信完成初步测试,但非常复杂。需要进行ROS1与ROS2的协同通信。(后期在测试时发现,在多机过程中,可以不进行ROS2的协同通信domain设定) 但目前的ROS机器人开发生态而言,应首先完成ros1开发工作,然后进行ros2的迁移重构工作。 最主要的是,在需要ros1与ros2通信时,尽量在一台机器人上实现数据通信,在多机之间采用ros2实现通信即可。尽量避免多机进行ros1与ros2的通信。 |
CopyRight 2018-2019 实验室设备网 版权所有 |