gazebo与SLAM结合做仿真导航概述

概念

导航对机器人来说实际上就是从A点到B点的过程
秉着"不重复发明轮子"的原则,ROS 中导航相关的功能包集为机器人导航提供了一套通用的实现,开发者不再需要关注于导航算法、硬件交互... 等偏复杂、偏底层的实现,这些实现都由更专业的研发人员管理、迭代和维护,开发者可以更专注于上层功能,而对于导航功能的调用,只需要根据自身机器人相关参数合理设置各模块的配置文件即可,当然,如果有必要,也可以基于现有的功能包二次开发实现一些定制化需求,这样可以大大提高研发效率,缩短产品落地时间。总而言之,对于一般开发者而言,ROS 的导航功能包集优势如下:

  • 安全: 由专业团队开发和维护
  • 功能: 功能更稳定且全面
  • 高效: 解放开发者,让开发者更专注于上层功能实现

导航模块

导航模块
按官方的五张图来说,导航包含了以下5项技术

  • 全局地图
  • 自身定位
  • 路径规划
  • 运动控制
  • 环境感知

全局地图

对于机器人导航而言,地图是一个重要的组成元素,当然如果要使用地图,首先需要绘制地图。地图建模技术中SLAM应用很广泛:
SLAM(simultaneous localization and mapping),也称为CML (Concurrent Mapping and Localization), 即时定位与地图构建,或并发建图与定位。
SLAM问题可以描述为: 机器人在未知环境中从一个未知位置开始移动,在移动过程中根据位置估计和地图进行自身定位,同时在自身定位的基础上建造增量式地图,以绘制出外部环境的完全地图。
在 ROS 中,较为常用的 SLAM 实现也比较多,比如: gmapping、hector_slam、cartographer、rgbdslam、ORB_SLAM ....
如果要完成 SLAM ,机器人必须要具备感知外界环境的能力,尤其是要具备获取周围环境深度信息的能力。感知的实现需要依赖于传感器,比如: 激光雷达、摄像头、RGB-D摄像头...
SLAM 可以用于地图生成,而生成的地图还需要被保存以待后续使用,在 ROS 中保存地图的功能包是 map_server
另外注意: SLAM 虽然是机器人导航的重要技术之一,但是 二者并不等价,确切的讲,SLAM 只是实现地图构建和即时定位。

自身定位

导航伊始和导航过程中,机器人都需要确定当前自身的位置,如果在室外,那么 GPS 是一个不错的选择,而如果室内、隧道、地下或一些特殊的屏蔽 GPS 信号的区域,由于 GPS 信号弱化甚至完全不可用,那么就必须另辟蹊径了,比如前面的 SLAM 就可以实现自身定位,除此之外,ROS 中还提供了一个用于定位的功能包: amcl
amcl(adaptiveMonteCarloLocalization)自适应的蒙特卡洛定位,是用于2D移动机器人的概率定位系统。它实现了自适应(或KLD采样)蒙特卡洛定位方法,该方法使用粒子过滤器根据已知地图跟踪机器人的姿态。

路径规划

导航就是机器人从A点运动至B点的过程,在这一过程中,机器人需要根据目标位置计算全局运动路线,并且在运动过程中,还需要时时根据出现的一些动态障碍物调整运动路线,直至到达目标点,该过程就称之为路径规划。在 ROS 中提供了 move_base 包来实现路径规则,该功能包主要由两大规划器组成:

全局路径规划(gloable_planner)

根据给定的目标点和全局地图实现总体的路径规划,使用 DijkstraA* 算法进行全局路径规划,计算最优路线,作为全局路线

本地实时规划(local_planner)

在实际导航过程中,机器人可能无法按照给定的全局最优路线运行,比如:机器人在运行中,可能会随时出现一定的障碍物... 本地规划的作用就是使用一定算法(Dynamic Window Approaches) 来实现障碍物的规避,并选取当前最优路径以尽量符合全局最优路径
全局路径规划与本地路径规划是相对的,全局路径规划侧重于全局、宏观实现,而本地路径规划侧重与当前、微观实现。

运动控制

导航功能包集假定它可以通过话题"cmd_vel"发布geometry_msgs/Twist类型的消息,这个消息基于机器人的基座坐标系,它传递的是运动命令。这意味着必须有一个节点订阅"cmd_vel"话题, 将该话题上的速度命令转换为电机命令并发送。

环境感知

感知周围环境信息,比如: 摄像头、激光雷达、编码器...,摄像头、激光雷达可以用于感知外界环境的深度信息,编码器可以感知电机的转速信息,进而可以获取速度信息并生成里程计信息。
在导航功能包集中,环境感知也是一重要模块实现,它为其他模块提供了支持。其他模块诸如: SLAM、amcl、move_base 都需要依赖于环境感知。

坐标系

定位是导航中的重要实现之一,所谓定位,就是参考某个坐标系(比如:以机器人的出发点为原点创建坐标系)在该坐标系中标注机器人。定位原理看似简单,但是这个这个坐标系不是客观存在的,我们也无法以上帝视角确定机器人的位姿,定位实现需要依赖于机器人自身,机器人需要逆向推导参考系原点并计算坐标系相对关系,该过程实现常用方式有两种:
通过里程计定位:时时收集机器人的速度信息计算并发布机器人坐标系与父级参考系的相对关系。
通过传感器定位:通过传感器收集外界环境信息通过匹配计算并发布机器人坐标系与父级参考系的相对关系。
两种方式在导航中都会经常使用。

两种定位方式

两种定位方式都有各自的优缺点。

里程计定位:

  • 优点:里程计定位信息是连续的,没有离散的跳跃。
  • 缺点:里程计存在累计误差,不利于长距离或长期定位。

传感器定位:

  • 优点:比里程计定位更精准;
  • 缺点:传感器定位会出现跳变的情况,且传感器定位在标志物较少的环境下,其定位精度会大打折扣。
    两种定位方式优缺点互补,应用时一般二者结合使用。

坐标系变换

上述两种定位实现中,机器人坐标系一般使用机器人模型中的根坐标系(base_linkbase_footprint),里程计定位时,父级坐标系一般称之为 odom,如果通过传感器定位,父级参考系一般称之为 map。当二者结合使用时,mapodom 都是机器人模型根坐标系的父级,这是不符合坐标变换中"单继承"的原则的,所以,一般会将转换关系设置为: map -> doom -> base_linkbase_footprint

posted @ 2023-11-05 17:13  不想要名字  阅读(185)  评论(0编辑  收藏  举报