在 ROS 中,机器人导航(Navigation)是由多个功能包组合而成的系统,统称为导航功能包集(navigation stack)。它提供了一个全面的框架,使得移动机器人能够自主导航到指定目标点,同时避开环境中的障碍物。
导航功能包集:该导航系统基于多个核心功能包,包括地图构建、定位、路径规划和运动控制等模块。这些功能包通过整合,协同处理机器人感知的环境数据和导航任务需求,从而实现自主导航。
二维导航堆栈:ROS 的二维导航堆栈(2D Navigation Stack)是该功能集的核心组件之一。它接收以下主要信息:
- 里程计数据:提供机器人自身的位置和运动状态信息。
- 传感器数据流:包括来自激光雷达(LiDAR)、深度摄像头、Kinect 或其他传感器的数据,帮助机器人感知周围的环境并检测障碍物。
- 目标姿态:用户通过 RViz 或其他接口为机器人设置的目标位置和方向(2D平面上的目标点)。
基于这些输入,导航堆栈的路径规划模块会计算从当前位置到目标点的最优路径,并结合局部路径规划,在导航过程中避开障碍物。
1.1 导航模块简介
(1)全局地图(定位 + 路径规划)
在现实生活中,当我们进行导航时,通常会首先参考一张全局地图,依据这张地图确定自己和目标的位置,并据此规划出一条合理的路线。同样地,对于机器人导航,地图也是其核心组成部分之一。机器人通过地图确定其在环境中的位置,并根据目标位置规划路径。为此,首先需要对环境进行建图。在机器人导航领域,随着技术的不断发展,出现了许多先进的地图建模方法,其中SLAM 技术尤其引人瞩目。
SLAM(Simultaneous Localization and Mapping,即同步定位与地图构建),也被称为 CML(Concurrent Mapping and Localization, 并发建图与定位),它是一种能够让机器人在未知环境中从未知位置开始导航的技术。SLAM 的问题可以描述为:机器人在未知环境中,通过自身运动,根据传感器数据估计自己的位置,并同时构建环境的地图。在这一过程中,SLAM 通过不断迭代,逐步完善机器人的位置估计和环境地图,最终绘制出整个环境的完整地图。
SLAM 的核心工作:
- 定位(Localization):机器人需要根据传感器数据和已知的地图或部分地图确定自身的具体位置。随着机器人在环境中移动,定位模块持续更新位姿信息。
- 建图(Mapping):机器人基于传感器数据同时构建环境的地图,通常是增量式的。在机器人更新自己位置的同时,它会在当前已知位置上逐步更新环境的地图信息。
ROS 中的 SLAM 实现: 在 ROS 中,已有多种实现 SLAM 的功能包,常用的包括:
- gmapping:基于粒子滤波的 2D SLAM 实现,适合激光雷达等传感器的应用。
- hector_slam:无需里程计数据,通过激光雷达构建高精度 2D 地图。
- cartographer:Google 开源的 2D/3D SLAM 框架,支持多传感器融合,效果稳定。
- rgbdslam:利用 RGB-D 摄像头(如 Kinect)进行 3D 地图构建。
- ORB-SLAM:基于视觉的 SLAM 系统,适合使用摄像头或立体相机。
无论使用哪种 SLAM 实现,机器人必须具备对周围环境的感知能力,尤其是获取深度信息的能力。实现感知通常依赖于以下传感器:
- 激光雷达(LiDAR):可以高精度扫描周围环境,生成二维或三维的深度数据。
- RGB-D 摄像头:如 Kinect,能够同时获取彩色图像和深度信息。
- 普通摄像头:用于视觉 SLAM,通过图像特征匹配来定位和建图。
SLAM 的地图生成与保存: SLAM 技术用于动态生成环境地图,而生成的地图需要保存以供后续使用。在 ROS 中,map_server 是常用的功能包,用于保存和加载地图数据。它可以将 SLAM 生成的地图保存为图片格式(如 .pgm
文件),并通过 .yaml
文件提供地图的元数据(如分辨率、原点等)。保存后的地图可以用于后续的导航或路径规划任务。
注意事项: 虽然 SLAM 是机器人导航的重要组成部分,但它与导航并不完全等同。SLAM 的作用主要是为机器人提供地图构建和即时定位功能,而导航系统则包括更多内容,如全局路径规划、局部避障等。SLAM 提供了机器人进行导航所需的地图和定位信息,但导航系统还需要综合其他模块来实现机器人从起点到目标点的自主运动。
(2)自身定位
在导航的起始阶段以及导航过程中的每一时刻,机器人都需要准确确定自身在环境中的位置。定位是导航的核心环节之一。如果机器人处于室外,使用 GPS 是一种便捷且有效的选择。然而,在室内、隧道、地下空间或其他屏蔽 GPS 信号的区域,GPS 信号变得微弱甚至完全不可用,因此需要使用其他技术进行定位。在这些环境中,SLAM(同步定位与地图构建)可以用于实现机器人自身的定位和地图构建。
此外,ROS 中提供了一个专门用于定位的功能包:amcl。
amcl(Adaptive Monte Carlo Localization)——自适应蒙特卡洛定位,是一种基于概率的方法,专门用于 2D 移动机器人的定位。它通过已知的地图和传感器数据来跟踪和估计机器人在地图中的位姿。amcl 使用粒子滤波器对机器人进行姿态跟踪,自适应采样(KLD 采样)机制动态调整粒子的数量,以提高计算效率和精度。amcl 的优点是能够在存在噪声的传感器数据下稳健地实现机器人定位。
(3)路径规划(全局 + 本地路径规划)
路径规划是导航中的关键步骤之一,它涉及如何让机器人从 A 点顺利到达 B 点。在此过程中,机器人需要根据全局地图规划出从起点到目标点的全局路线。同时,在导航过程中,还需要实时根据传感器反馈的环境变化(如出现的动态障碍物)调整当前的路线,避免碰撞并确保机器人到达目标位置。
在 ROS 中,路径规划功能主要由 move_base 包实现。它包含两个重要的规划器:
-
全局路径规划(global planner): 全局路径规划器根据机器人所在的位置、目标位置以及全局地图,计算一条从起点到目标点的最优路径。这通常使用 Dijkstra 或 A* 算法,它们通过对全局地图的遍历和权重计算来找到通往目标的最短路径。全局规划器生成的是一个宏观的全局路线,用于引导机器人朝目标移动。
-
本地路径规划(local planner): 在实际导航过程中,机器人可能会遇到未预见的障碍物,或者由于环境的变化无法沿全局最优路线前行。这时,本地路径规划器发挥作用。它基于机器人当前的位姿和周围环境,实时调整行进路线,通常使用动态窗口法(DWA,Dynamic Window Approaches)等算法进行局部避障,并在确保安全的前提下尽量保持与全局规划路线一致。
全局路径规划侧重于宏观的路线设计,而本地路径规划则侧重于微观的实时调整,两者结合能确保机器人既能朝着目标前进,又能灵活应对动态环境中的变化。
(4)运动控制(速度 + 方向)
在导航系统中,最终的输出是运动指令,这些指令告诉机器人以什么样的速度和方向运动。ROS 导航功能包集假定控制系统可以通过一个名为 /cmd_vel
的话题发布速度指令。
- cmd_vel 是 ROS 中标准的话题,发布的消息类型为
geometry_msgs/Twist
,该消息包含两个部分:- 线速度(linear velocity):表示机器人沿各轴(通常是 x 轴)方向的移动速度。
- 角速度(angular velocity):表示机器人绕 z 轴的旋转速度。
这些速度指令是基于机器人自身的基座坐标系(base_link)生成的,机器人需要通过订阅 /cmd_vel
话题,将发布的速度命令转化为实际电机的控制指令,并执行相应的移动或旋转。这部分通常由机器人的底盘控制器来完成。
(5)环境感知(传感器)
机器人导航离不开对环境的感知。环境感知系统通过多种传感器获取周围环境的实时数据,包括深度信息、速度信息等。这些信息为机器人定位、路径规划和避障提供了基础数据支持。
常用的传感器包括:
- 激光雷达(LiDAR):用于精确扫描周围环境的深度信息,生成点云数据,帮助机器人感知障碍物和空间的形状。
- 摄像头:用于获取环境的视觉信息,通常结合图像处理算法,用于 SLAM 或目标识别。
- RGB-D 摄像头:如 Kinect,既能获取彩色图像,又能提供深度信息,广泛应用于 3D SLAM。
- 编码器:用于测量电机的转速和机器人轮子的转动情况,生成**里程计(odometry)**信息。这对于定位和运动控制至关重要。
在导航功能包集中,环境感知模块是整个系统的基础模块之一。它为 SLAM、AMCL、move_base 等模块提供必要的环境数据,支持定位、建图和路径规划功能。不同传感器的数据在导航过程中通过传感器融合技术整合,提升机器人对复杂环境的感知能力,从而实现更加精准的导航。
1.2 导航之坐标系
(1)简介
定位是导航中的核心环节之一,其目的是确定机器人在某个参考坐标系中的位置和姿态。所谓定位,指的是在特定的参考坐标系中标定机器人的位置。比如,可以通过在机器人启动时设置一个参考点(如出发点),并以此为原点建立坐标系,然后通过该坐标系标注机器人的位置和姿态。
虽然定位的原理看似简单,但该参考坐标系并不是客观存在的。我们无法通过外部的上帝视角直接确定机器人的位姿,而是需要机器人通过自身感知,推导出参考系的原点并计算坐标系间的相对关系。实现这一过程常用的两种方式是:
-
里程计定位:通过实时收集机器人的速度信息来计算位置。基于速度信息和时间推导出机器人相对于父级参考系的位姿(位置和方向),并发布机器人在该参考系下的位置关系。
-
传感器定位:通过传感器(如激光雷达或摄像头)收集环境信息,通过匹配外部环境与已知地图来计算机器人相对于父级参考系的位置,并发布其坐标关系。
(2)特点
-
里程计定位:
- 优点:里程计定位基于速度信息推导位置,因此位置信息是连续的,没有离散的跳跃,数据平滑且稳定。
- 缺点:由于每一次的位置估计都基于前一时刻的位置,里程计定位会产生累计误差(随着时间推移误差会逐渐增加),不适合长时间或长距离的定位任务。
-
传感器定位:
- 优点:传感器定位通过直接匹配环境特征进行定位,通常比里程计定位更加精准,可以有效避免累计误差。
- 缺点:传感器定位会受到环境条件的影响,可能出现跳变(位置突然跳动)的情况。此外,在标志物较少或环境特征不明显的场景下,传感器定位的精度会大幅下降,可能导致误差增大或无法进行有效定位。
结合使用:由于两种定位方式各有优缺点,常见的做法是将里程计定位与传感器定位结合使用。通过里程计定位实现连续的位置估计,而传感器定位则用于修正里程计误差,确保长时间和复杂环境中的精确定位。
(3)坐标系变换
在导航系统中,机器人使用多个坐标系来描述位置和运动。一般来说,机器人自身的坐标系为根坐标系,通常称为 base_link
或 base_footprint
,这是机器人运动控制和感知的参考坐标系。
-
里程计定位:基于速度推导位置,父级坐标系通常称为
odom
。odom
坐标系描述了机器人相对于起始点(通常为机器人启动时的位置)的相对位移和旋转。 -
传感器定位:基于传感器的环境信息匹配,父级坐标系通常为
map
。map
坐标系用于描述机器人在已知地图中的绝对位置。
当里程计定位和传感器定位结合使用时,通常会同时使用 map
和 odom
两个父级坐标系。为了遵循坐标系变换的“单继承”原则,即每个坐标系只能有一个直接父级,ROS 导航中采用了以下坐标系转换结构:
map -> odom -> base_link 或 map -> odom -> base_footprint
这种层级结构表明:
map -> odom
:传感器定位修正了里程计定位中的误差,提供了机器人在全局地图中的位姿信息。
odom -> base_link
:里程计定位提供机器人在局部的精确位姿,通过时间推导出机器人相对于初始位置的变化。
这种转换关系确保了导航过程中,机器人能够通过 odom
实现局部定位和连续运动控制,同时通过 map
修正全局误差,提升整体定位精度。
1.3 导航条件说明
(1)硬件条件(三个主要的硬件限制)
-
差速驱动的轮式机器人:ROS 导航功能包集是为差速驱动的轮式机器人设计的。它假设机器人的底盘能够精确执行理想的运动命令,并能够实现预期的运动结果。具体的命令格式包括:
- x 轴速度分量(向前或向后移动)
- y 轴速度分量(通常在差速驱动下为零,因为机器人不具备侧向移动能力)
- 角速度(theta)分量(绕 z 轴的旋转速度)
在导航过程中,这些运动命令通过 /cmd_vel
话题发布,机器人需要能够根据这些命令控制自身的运动,执行路径规划和避障任务。
-
激光雷达(LiDAR):导航系统要求机器人装备一个单线激光雷达,通常安装在底盘上。激光雷达负责扫描周围环境,生成二维的点云数据。这些数据用于环境感知,帮助机器人实时构建地图(如在 SLAM 中)以及在定位过程中确定其在地图中的位置。激光雷达数据也是机器人避障和路径调整的关键信息来源。
-
机器人底盘形状和尺寸:ROS 的导航功能包集最初是为方形机器人设计的,因此方形或圆形的机器人可以获得最佳的导航性能。这是因为这些形状的机器人在移动和旋转时能够更好地适应导航中的几何计算。虽然导航系统可以兼容任意形状和大小的机器人,但对于较大的机器人,尤其是那些形状复杂或体积较大的机器人,它们可能会在狭窄空间中难以移动,导致导航性能下降。因此,机器人在设计时需要考虑其形状和尺寸,确保其在目标环境中能够高效导航。
(2)软件条件
-
安装 ROS:要使用 ROS 导航功能包集,首先需要在机器人或仿真环境中安装 ROS 以及相关的软件包。导航系统依赖于多个核心软件包(如
move_base
、amcl
和map_server
),这些软件包必须在系统中正确配置和运行。 -
基于仿真环境的测试:当前导航系统可以在仿真环境中测试,如使用 Gazebo 等仿真平台。在仿真环境中,机器人能够正常接收和处理
/cmd_vel
(运动控制命令)消息,并可以发布以下关键信息:- 里程计(Odometry)消息:由机器人的运动系统(如轮子编码器)生成,提供机器人相对位移和速度信息。通过里程计数据,导航系统能够跟踪机器人位置并计算运动轨迹。
- 传感器消息:激光雷达、摄像头或其他传感器的数据被实时发布,用于构建环境地图、识别障碍物,并提供避障和路径规划支持。
在仿真环境下,导航功能中的运动控制和环境感知模块已经可以成功运行。这意味着机器人可以通过接收速度命令调整运动路径,并利用传感器数据感知周围环境,完成定位、地图构建和路径规划等任务。