对于 ROS 构建机器人的结构拆分与看法
在工科的学习中,仅仅通过记忆和重复的零散方法是无法构建一个完整的知识体系的,在笔者看来,一边学一边理解,感性的构建知识点之间的联系与系统的整体架构是相当重要的
所以本文会提供一些笔者的视角,提供感性的理解,用于关联整个机器人的构建模式
ROS2 是如何构建机器人的?
我们对于机器人的简单定义应该是:能够在特定环境中完成特定功能的实体
这里我们按照《设计方法预策略——伏尔夫特设计指南》中提到的对产品的构建思路来通过定义对我们的机器人进行拆分:
- 为了实现定义,我们需要使机器人具有影响环境的能力,所以需要物理层的设计,也就是我们的机械;
- 此外,根据能量守恒定律,单纯的机械时不能恒久运动的,我们通常使用电子设备来进行驱动,同时在驱动的同时提供一定的控制,也就是我们的电控;
- 为了支持我们面对更复杂的电控场景,我们需要相对复杂的电路设计,而又需要保证电路全链条的稳定性,就需要设计电路板和选型,也就出现了硬件;
- 为了让机器人更加智能,我们需要让机器人具有感知环境的能力,通过不同的环境变化来调节自身的运动策略,也就出现了视觉;
以上,我们对一个机器人的功能进行了全链条的拆分,我相信这不会是一个相当完整的拆解,但能够适应大部分场景
接下来,我们着重关注视觉相关的部分,综合机器人上几乎所有的感觉器官来解释我们的视觉在机器人控制中发挥的重要作用
物理层解读
感官
形式化地,我们可以称充当感官的传感器模块的集合为边缘或末端,就像网络中对于边缘的定义一样,我们的末端时直接与外界链接的
这些传感器通过一定的物理化学手段,将现实中的非电信号/模拟信号转化为电信号/数字信号,这些电信号以不同的形式最终转化成为我们的数据,在机器人系统中,数据是信息的主要体现形式
大脑
在机器人系统中,大脑是由我们的单片机、SoC或小电脑来担任的,这里我们的大脑通过各种软件整合传输串口等信号给下位机,就能实现我们的机器人控制和实时反馈
脊髓
在相对大一些的机器人系统后,我们会分出上下位机,上位机控制下位机,下位机控制执行器,执行器通过机械结构对外界环境产生直接影响
软件层解读
这里主要对一些关键词进行解读,当然解读了关键词也就能理解相关的架构
工作空间
工作空间(WorkSpace)是我们的功能包发挥作用的空间,这里可以整合很多的功能包,并且我们的编译运行也都是在工作空间这一层级
功能包
功能包(Package)是只具有一定功能的节点的集合,每个功能包都封装着一部分功能,能够在引用后被调用内部的功能
功能包可以被我们自己编写,当然,ROS2系统已经为我们内置了很多功能包,包括TF、rviz、gazebo等等,熟练使用内置的功能包,可以为我们节省许多成本
节点
节点(Node)在我们这篇文章的描述中需要分出两种类型(这样的分类不是官方的,但是有助于理解):
- 单节点(Single-Node):这是一种一个进程就是一个线程的玩法,一般为了程序的简洁,我们会使用 Python 来书写
- 组件包(Components-Package):不同于单节点,组件包可以在一个进程内自动实现多线程的操作,每个组件(Component)都单开一个线程,我们会使用 C++ 来书写
值得一提的是,组件包是基于我们组件化(Composition)的思路创建的结构,同单节点是统一层级的(进程级别),所以我们在这里把两者相提并论
另外,我们知道,多线程意味着零拷贝共享内存空间,同时 ROS 中的线程管理自动帮我们实现了临界区可能会出现的问题,所以在数据规模较为庞大的情况下,我们更倾向于使用组件化,减小数据传输的开销,更是防止了通信中可能出现的神奇问题,大大减小了通信网络的复杂度(例如可以将 yolo 数据采集的组件和处理转化的组件整合在一个组件包中,这样就可以把本来需要传一整个点云数据的通信开销缩减到传几个特征数据)
而对于那些不需要集成很多功能,只需要进行简单监督或者响应的节点,我们只需要使用单节点即可,这样可以降低代码编写的复杂度与维护难度
当然,为什么不能全部组件化呢?了解线程池管理的同学或许已经猜到了,线程池设计的第一步就是线程调度,而一旦同一进程中的线程复杂度过高,调度出现问题的概率就会指数级上升,可能导致整个进程瘫痪
所以在这里,我们还是需要根据具体的需求设计我们的软件层网络
通信
通信(Communication)是用来连接多个节点实现数据传输与交互的。在我们的 ROS2 中有四种主流通信方式,分别为 Topic、Service、Action、Parameter,这四种通信方式各自都有特点,我在相关的文章中已经阐释了他们具体的特点与使用方法,这里就不多介绍了
通信的底层在 ROS2 中是以 DDS 实现的
智能
智能(Intelligence)是用来保障决策准确性的,单单进行内部数据的传输无法实现高级的控制,我们需要基于机器人更多的思考或者决策的手段,这样的思考和手段通常体现为传统算法(Algorithm)的设计或人工智能(AI)的部署。两种方法各有利弊,简单来说:传统算法设计很难应对复杂环境,但可以保障稳定环境中决策的正确性与行为的可预测性;人工智能部署需要大量数据支持,且有一定概率无法收敛,可以应对复杂情况,但无法保障行为逻辑正确,且行为具有不可预测性
数据
数据(Database)是由通信承载的,最终被送到智能端被解析。这也就意味着理清数据流对于我们的机器人系统设计是相当重要的,当然传统的数据类型并不复杂,复杂的往往是数据结构和处理,这也就回到我们的智能了
以上是我对机器人结构拆分的简单看法,有想法可以来交流

浙公网安备 33010602011771号