• 【ROS进阶篇】第三讲 ROS文件系统与分布式通信


    【ROS进阶篇】第三讲 ROS文件系统与分布式通信

    在这里插入图片描述

    前言

    我们先前已经了解到,ROS系统是一个很典型的多进程分布式框架,对于一个完整的系统可以分为以下几个层次:

    1. 主机;
    2. 工作空间workspace;
    3. 功能包package;
    4. 节点node;
    5. 话题topic;
    • 主机下的层次框架可以由下图展示:
      在这里插入图片描述
      本文主要研究的问题如下:
    • 元功能包的使用方法(关联功能包)
    • ROS工作空间覆盖及隐患
    • ROS分布式通信(不同主机间的通信)

    一、元功能包

    1. 概念

    在这里插入图片描述

    • 应用场景:在实际的ROS开发过程中,机器人往往需要设计多个功能,就需要调用不同的功能包,但是如果逐一安装则会导致效率低下,浪费时间,此时就需要功能包进行打包;

    • 概念:元功能包(metapackage),ROS中的一个虚包,里面没有实质性的内容,但是依赖了其他的软件包,通过这种方法可以把其他包组合起来

    • 实例:sudo apt install ros-noetic-desktop-full
      在进行ROS安装时,我们就运行了上述指令,类似于一个目录索引,告诉主机一个功能包集合,逐一下载安装;

    2. 实现

    • 新建功能包
    • 修改package.xml:
     <exec_depend>被集成的功能包</exec_depend>
     .....
     <export>
       <metapackage />
     </export>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 修改编译规则CMakeLists.txt:
    cmake_minimum_required(VERSION 3.0.2)
    project(demo)
    find_package(catkin REQUIRED)
    catkin_metapackage()
    
    • 1
    • 2
    • 3
    • 4

    参考地址:ROS Wiki Metapackage

    二、工作空间覆盖

    1. 问题分析

    • 自行实现:
    1. 新建两个工作空间,在两个空间内创建同名功能包wssim
    2. 添加环境变量,修改 ~/.bashrc:
    source /home/用户/路径/工作空间A/devel/setup.bash
    source /home/用户/路径/工作空间B/devel/setup.bash
    
    • 1
    • 2
    1. 加载环境变量:source.bashrc
    2. 查看环境变量:echo $ROS_PACKAGE_PATH
    3. 进入工作空间:roscd wssim
    • 此时会出现一个问题:即这里会直接进入工作空间B,实际的空间嵌套为:

    工作空间B -> 工作空间A -> 系统内置空间

    • 原因:配置顺序与优先级的关系

    在实际的解析过程中,ROS首先会根据bashrc文件,按照其中配置设置工作空间优先级,生成对应功能包ROS_PACKAGE_PATH ROS路径,但是会遵循一个原则:

    ROS_PACKAGE_PATH 中的值,和 .bashrc 的配置顺序相反 -> 先配置的优先级低

    2. 结论与隐患

    • 概念:不同工作空间中存在重名的功能包;
    • 实质:功能包重名时,会按照 ROS_PACKAGE_PATH 查找,配置在前的会优先执行
    • 隐患:由于此时情况调用wssim会首先调用工作空间B中的功能包,可能并不满足我们对于实际操作的需求,会出现调用问题

    BUG说明:
    当在 .bashrc 文件中 source 多个工作空间后,可能出现的情况,在 ROS PACKAGE PATH 中只包含两个工作空间,可以删除自定义工作空间的 build 与 devel 目录,重新 catkin_make,然后重新载入 .bashrc 文件,问题解决。

    三、分布式通信

    1. 需求场景

    在这里插入图片描述

    在实际开发中,ROS系统常常用于完成多机之间的通讯与协同,会分布在不同的计算机上,在运行过程中经常与其他节点实现通信,存在着很多网络配置要求:

    • 所有端口上的所有机器之间必须有完整的双向连接
    • 每台计算机必须通过所有其他计算机都可以解析的名称来公告自己

    2. 实现

    • 基础准备:令不同主机处于同一网络,设置固定IP

    虚拟机:将网络适配器修改为桥接模式

    • 修改配置文件:主要指修改计算机的/etc/hosts的文件,在文件中加入对方的IP地址和计算机名

    网络指令:

    1. IP地址查看:ifconfig
    2. 计算机名称:hostname
    3. 测试网络通信:ping
    • 配置IP地址:

    主机:修改~/.bashrc文件

    export ROS_MASTER_URI=http://主机IP:11311
    export ROS_HOSTNAME=主机IP
    
    • 1
    • 2

    从机:修改~/.bashrc文件

    export ROS_MASTER_URI=http://主机IP:11311
    export ROS_HOSTNAME=从机IP
    
    • 1
    • 2
    • 测试:
    1. 主机启动roscore
    2. 主机启动订阅节点,从机启动发布节点,测试通信
    3. 主机启动发布节点,从机启动订阅节点,反相测试

    总结

    • 声明:本节博客部分参考了CSDN用户赵虚左的ROS教程,下篇博客将会主要聚焦于节点名称、话题名称、参数名称的重名问题上,分别介绍各种重复导致的异常情况。

    在这里插入图片描述

  • 相关阅读:
    YOLOv8-Seg改进:位置信息的轴线压缩增强注意力Sea_Attention| ICLR2023 SeaFormer,轻量级语义分割算法,复旦大学和腾讯
    cpp转matlab程序,并在python中调用
    【Redis】Redis 的学习教程(八)之 BitMap、Geo、HyperLogLog
    实现声明式锁,支持分布式锁自定义锁、SpEL和结合事务
    Vue 跨域的两种解决方式
    Shell脚本经典案例:探测批量主机是否存活
    Vue v-model收集表单数据
    外包干了3个月,技术倒退1年。。。
    JavaWeb 项目 --- 博客系统(前后分离)
    C++STL常用算法合集(上)
  • 原文地址:https://blog.csdn.net/lc1852109/article/details/125477374