system: [SYSTEM]

user: 3. 系统设计 3.1. ROS平台 2007年，美国斯坦福大学的人工智能实验室与Willow Garage公司合作开发了ROS (Robot Operating System)系统。ROS是一个开放源代码，一个后台操作系统，或者可以说是一个辅助机器人性质的操作系统。它不仅能提供类似于操作系统的功能，包括抽象描述硬件、管理底层驱动程序、执行公共功能、传递程序间消息、管理程序发布包，它还能提供一些可以被取得的工具和库，这是构建、编写和运行多处理器集成过程的主要方式 [ 13 ] [ 14 ]。总之，ROS采用一种名为Node的分布式的处理框架，而这一设计大大提高了机器人开发领域代码的重用性，因为它在运行时不仅可以单独操作要执行的文件，还可以对文件进行分层次耦合，这些过程都可以封装在数据包或者堆栈中，以便于分发或者共享。除此之外，ROS还能够实现基于联合系统代码库的方式。在这种方式下，可将文件系统级别提升至社区级，然后共同协作以便能够对问题作出独立的决定。以上所有功能都可以通过ROS的基本工具来实现。 ROS系统的主要特点可以概括为：点对点设计、多语言支持、精简与集成、工具包丰富、免费并且开源 [ 15 ]。 ROS的主要功能模块如下：1) 节点(Node)：一个节点表示ROS可执行文件中的一个运行程序，且节点具有唯一性。例如，在创建地图的过程中，节点负责激励激光雷达与执行合成地图的节点一起工作，并且单个节点提供整个系统。2) 软件包(Package)：是ROS中，一种基本的组织软件形式，涉及各种各样的文件，包括配置文件、依赖库、编译工具及其各种形式的文档(例如Node)。3) 节点管理器(Master)：顾名思义，节点管理器就是管理所有Node，是ROS的中心节点。在此基础上，它还可以完成每个节点的订阅主题通信。节点管理器在程序运行之前将不运行。其他计算的名称注册和查找功也由节点管理器提供。节点管理器是节点间找到彼此、交换信息、调用服务功能的保障。4) 消息(Message)：节点之间需要通过消息进行通信。其中包含由一个节点发送到其他节点的数据信息。除此之外，消息还具有不同的类型和数据结构。消息充当单个节点的角色，在各节点之间发布不同类型的订阅数据。5) 主题(Topic)：一种在节点之间相互传输数据的总线。节点首先向相应的主题发送信号来发送不同的消息。标识和区分消息内容就是通过不同名称的主题。如果每个节点在工作中需要某种类型的数据，那么订阅该主题即可。每个节点可以发布和订阅多个主题，也即一个主题可以对应于多个节点，发布者和主题订阅者只有开始通信才知道对方的存在。订阅者只有当发布者在全局工作区发布信息时才会发现和订阅信息，也就是说，可以接收消息。6) 服务(Service)：经常在分布式系统中运用于请求和应答交互的方式。作为ROS中与上述功能模块不同的其他通信方式，但发布和订阅模型不适合请求和应答交互。因此，在一个系统中，请求和应答是通过定义为一对消息组合结构的服务来实现的：其中一个用于请求，另外一个用于应答。所有节点都可以在ROS客户端写入代码来与提供节点通信，并使用它提供的服务。这种交互操作模式类似于对远程助手的调用。7) 发射(Launch)：当机器人运行一个包含多个相互连接且包含多个参数的节点的程序时可以先使用roslaunch执行其中一个脚本，该脚本不仅可以一次启动多个节点，而且roslaunch文件能够被重复使用。 3.2. 软件部分 论文所用移动机器人平台框架如图3所示，采用成本较低的国产RPLIDAR激光传感器，主要通过调用RPLIDAR雷达扫描数据，处理数据，完成实时地图的生成，并采用一种计算难度较小但精度最优的SLAM算法即Hector_SLAM算法，该算法将SLAM简单划分为计算距离和更新地图两个步骤。第一步是在传感器每一次扫描得到的数据点集中获取直线特征；第二步是在更新步骤中将扫描线添加到地图中，即在扫描障碍物时将周围的点绘制成点集，而不是一个个单独的点。 图3. 移动机器人平台系统框架 图4. 激光处理过程 激光处理的过程如图4所示，通常包括：数据预处理(preprocessing)–滤波(filtering)–聚类(clustering)–拟合(fitting)–匹配(matching)。激光获得测出的距离后，进行预处理，滤掉无关紧要的点，分割处理区域内的数据，对同一环境特征区域进行按类分类，接着拟合参数，根据环境特征与激光传感器的几何关系，分析激光传感器的数据规律，分析特征点质心的位置及其环境特性 [ 5 ]。最后，将扫描数据与现有数据相关联，以确定机器人的相对位置。 本文采用的提取环境特征的方法是RPLIDAR扫描数据点的区域分割方法。RPLIDAR得到扫描数据后，首先分割扫描数据点集。划分数据主要有两个过程，一是先把较小的特征分辨出来，二是从整合的信息中提取出目标特征信息。这样做的目的是使所有子集中都包含特征信息。假设一个扫描周期结束后，RPLIDAR扫描数据中的离散信息点数为n，相邻两点之间的距离为d，则根据自适应阈值的规则，将离散数据点分割划分为彼此相互独立的区域m。临界值的选择要具体情况具体分析。当扫描特征点靠近RPLIDAR时，临界值不宜太大，相反，当扫描点远离RPLIDAR时，应适当地提高临界值。临界值D的设置要根据RPLIDAR的最大测量距离和角度分辨率而定，之后比较临界值D和相邻两点间距离d之间的大小关系。当D小于d时，则把该点作为区域m的一个分界点，将区域m划分为两个区域：区域m 1 和区域m 2 ，根据上述方法，最终将区域m划分为N个区域即 m 1 ， m 2 ， m 3 ⋯ m N ，这些区域相互独立。在区域分割完成后，分别统计各个区域内的数据点数量，当出现区域中仅有小于或者等于三个数据点的情况时，就将该区域中的所有数据点均视为噪声，因此要把该区域中的数据点集中排除，不参与地图构建 [ 16 ]。 通过仔细分析RPLIDAR的工作原理，就会得出RPLIDAR扫描特征点的距离与地图中所反映的点集间连续点间距成正比关系的结论。因此，划分区域时，有必要选择一种有根据的方法，防止把正确的数据错误地当作噪声数据。如果发生这样的误判，就会给后续点集的特征提取带来误差，影响合成和定位的准确性。 在扫描的数据点中，采用聚类方法，提取直线特征后，需要拟合多条线段成直线。为了完成最终地图的构建，本文采用最小二乘法进行拟合。 全局地图的更新需要外部传感器扫描周围环境得到信息，然后将这些信息与实际特征进行匹配，最后利用Kalman滤波器进行机器人姿势和状态的估计。前面进行完之后才能进入下一个周期，采集前一阶段的数据，根据前一周期的位置和方向以及本周期的前段数据，对数据进行采集和匹配，并再次使用前一个周期的全局地图和当前周期的数据，匹配估计当前机器人的姿态，然后更新全局地图，随之进入下一个周期。 本文采用的环境表示方法是栅格地图，推测RPLIDAR扫描后占据网格的几率和点集在地图中的位置。因为其所占用网格是割裂的，所以直接插值和求取梯度(离散度问题)的方法不适用，因此，本文采用双精度插值方法，在连续概率分布下，把所占栅格地图的值当作采样。 将RPLIDAR扫描得到的数据与所获得的地图数据相匹配，匹配是从前面搜索的位置作为起点进行的，利用RPLIDAR的高频扫描，会使匹配更加准确。采用高斯牛顿法求解激光扫描匹配问题，将RPLIDAR扫描得到的点集映射到现有的地图上，非线性方程的二阶泰勒展开可以实现此映射过程，这种方法虽然比直接快速收敛快，但初始点要求很高。这张地图采用多分辨率的形式。 图5. Rplidar数据 如图5所示，从激光雷达获得的PC打印数据，S为扫描起始标志位，theta为扫描点相对于RPLIDA的夹角(角度表示，[0˚至360˚])，Dist为测距点相对于RPLIDAR的距离(mm)，Q为采样点信号的质量。与RPLIDAR的通讯需要单个节点完成激光数据采集，通过运行Rplidar Node这个节点，Rplidar的运行程序就会启动，等到Rplidar进入稳定状态才会开始扫描数据，扫描到的数据从串口实时输出，ROS获取该数据后，再把消息发送到主题/Scan。