【ROS】—— 机器人导航(仿真)—导航原理(十七)
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
文章目录
前言
📢本系列将依托赵虚左老师的ROS课程写下自己的一些心得与笔记。
📢课程链接:https://www.bilibili.com/video/BV1Ci4y1L7ZZ
📢讲义链接:http://www.autolabor.com.cn/book/ROSTutorials/index.html
📢 文章可能存在疏漏的地方恳请大家指出。
1. 导航模块简介
机器人是如何实现导航的呢?或换言之机器人是如何从 A 点移动到 B 点呢?ROS 官方为了提供了一张导航功能包集的图示,该图中囊括了 ROS 导航的一些关键技术:假定我们已经以特定方式配置机器人导航功能包集将使其可以运动。上图概述了这种配置方式。白色的部分是必须且已实现的组件灰色的部分是可选且已实现的组件蓝色的部分是必须为每一个机器人平台创建的组件。
总结下来涉及的关键技术有如下五点:
- 全局地图
- 自身定位
- 路径规划
- 运动控制
- 环境感知
机器人导航实现与无人驾驶类似关键技术也是由上述五点组成只是无人驾驶是基于室外的而我们当前介绍的机器人导航更多是基于室内的。
1.1 全局地图
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 只是实现地图构建和即时定位。
1.2 自身定位
导航伊始和导航过程中机器人都需要确定当前自身的位置如果在室外那么 GPS 是一个不错的选择而如果室内、隧道、地下或一些特殊的屏蔽 GPS 信号的区域由于 GPS 信号弱化甚至完全不可用那么就必须另辟蹊径了比如前面的 SLAM 就可以实现自身定位除此之外ROS 中还提供了一个用于定位的功能包: amcl
amcl(adaptive Monte Carlo Localization) 自适应的蒙特卡洛定位,是用于2D移动机器人的概率定位系统。它实现了自适应或KLD采样蒙特卡洛定位方法该方法使用粒子过滤器根据已知地图跟踪机器人的姿态。
1.3 路径规划
导航就是机器人从A点运动至B点的过程在这一过程中机器人需要根据目标位置计算全局运动路线并且在运动过程中还需要时时根据出现的一些动态障碍物调整运动路线直至到达目标点该过程就称之为路径规划。在 ROS 中提供了 move_base 包来实现路径规则,该功能包主要由两大规划器组成:
-
全局路径规划(gloable_planner)
根据给定的目标点和全局地图实现总体的路径规划使用 Dijkstra 或 A* 算法进行全局路径规划计算最优路线作为全局路线
-
本地时时规划(local_planner)
在实际导航过程中机器人可能无法按照给定的全局最优路线运行比如:机器人在运行中可能会随时出现一定的障碍物… 本地规划的作用就是使用一定算法(Dynamic Window Approaches) 来实现障碍物的规避并选取当前最优路径以尽量符合全局最优路径
全局路径规划与本地路径规划是相对的全局路径规划侧重于全局、宏观实现而本地路径规划侧重与当前、微观实现。
1.4 运动控制
导航功能包集假定它可以通过话题"cmd_vel"发布 geometry_msgs/Twist
类型的消息这个消息基于机器人的基座坐标系它传递的是运动命令。这意味着必须有一个节点订阅"cmd_vel"话题 将该话题上的速度命令转换为电机命令并发送。
1.5 环境感知
感知周围环境信息比如: 摄像头、激光雷达、编码器…摄像头、激光雷达可以用于感知外界环境的深度信息编码器可以感知电机的转速信息进而可以获取速度信息并生成里程计信息。
在导航功能包集中环境感知也是一重要模块实现它为其他模块提供了支持。其他模块诸如: SLAM、amcl、move_base 都需要依赖于环境感知。
2. 导航之坐标系
定位是导航中的重要实现之一所谓定位就是参考某个坐标系(比如:以机器人的出发点为原点创建坐标系)在该坐标系中标注机器人。定位原理看似简单但是这个这个坐标系不是客观存在的我们也无法以上帝视角确定机器人的位姿定位实现需要依赖于机器人自身机器人需要逆向推导参考系原点并计算坐标系相对关系该过程实现常用方式有两种:
- 通过里程计定位:时时收集机器人的速度信息 计算并发布机器人坐标系与父级参考系的相对关系。
- 通过传感器定位:通过传感器收集外界环境信息通过匹配计算并发布机器人坐标系与父级参考系的相对关系。
两种定位方式都有各自的优缺点。
-
里程计定位:
优点:里程计定位信息是连续的没有离散的跳跃。
缺点:里程计存在累计误差不利于长距离或长期定位。 -
传感器定位:
优点:比里程计定位更精准;
缺点:传感器定位会出现跳变的情况且传感器定位在标志物较少的环境下其定位精度会大打折扣。
两种定位方式优缺点互补应用时一般二者结合使用。
上述两种定位实现中机器人坐标系一般使用机器人模型中的根坐标系(base_link 或 base_footprint)里程计定位时父级坐标系一般称之为 odom如果通过传感器定位父级参考系一般称之为 map。当二者结合使用时map 和 odom 都是机器人模型根坐标系的父级这是不符合坐标变换中"单继承"的原则的所以一般会将转换关系设置为: map -> odom -> base_link 或 base_footprint。