move_base 概述
move_base是 ROS 导航栈的核心组件。它负责将机器人的导航目标,如目标位置或路径,转化为具体的运动指令,可根据给定的目标点,控制机器人底盘运动至目标位置。move_base通过整合全局路径规划器、局部路径规划器和代价地图等功能模块,实现从起点到目标点的自主导航。
Laser 与 move_base 的关系
激光雷达(Laser)在move_base中主要影响代价地图(Costmap)。代价地图用于表示环境中障碍物的分布,包括全局代价地图和局部代价地图。激光雷达采集的环境扫描数据可帮助更新代价地图,让机器人了解周围障碍物信息,但它并不直接参与运动控制,运动控制主要由路径规划器根据代价地图等信息来完成。
Smooth 包和 ekf 包
- Smooth 包:通常用于路径平滑相关功能。在 ROS2 Navigation Framework 中,路径平滑功能可由
nav2_smoother模块实现,它采用插件化架构设计。SmootherServer节点提供 Action 服务接口,接收原始路径并返回平滑后的优化路径,可提高机器人运动平稳性、增强安全性和优化能耗表现。 - ekf 包:全称是
robot_pose_ekf,用于估计机器人的 3D 位姿。它基于扩展卡尔曼滤波器(EKF),采用 6D 模型(3D 位置和 3D 方向),将来自轮式里程计、IMU 传感器和视觉里程计等不同来源的位姿测量数据进行融合,以更准确地确定机器人的位姿。
AMCL 与 move_base 的关系
AMCL(Adaptive Monte Carlo Localization,自适应蒙特卡洛定位算法)是 ROS 导航系统中负责定位的核心模块,为move_base提供定位信息。AMCL 是一种基于粒子滤波的定位方法,通过融合里程计数据和激光雷达传感器信息,不断对机器人在地图中的位姿进行修正与优化。它根据雷达和地图的匹配,计算出雷达在地图的坐标,再通过相关计算发布出map->odom的 TF,帮助move_base确定机器人在全局地图中的位置。
Cartographer 与 move_base 的关系
Cartographer 是一个强大的 SLAM(同步定位与建图)算法库,其纯定位模式也可以给move_base提供定位。Cartographer 源码开放了纯定位接口,虽然初学者较难运用,但在实际应用中,可替代 AMCL 为move_base提供定位服务,尤其在一些对定位精度要求较高的场景中有优势。此外,Cartographer 支持使用外部提供的里程计信息,并将其作为优化过程中的约束条件之一,可通过配置.lua文件来选择是否使用里程计。
路径规划相关
- DWA(动态窗口法):属于局部路径规划方法,是 ROS 中主要采用的局部规划算法。其原理是在速度空间(v, w)中采样多组速度,并模拟这些速度在一定时间内的运动轨迹,然后通过一个评价函数对这些轨迹打分,将最优轨迹对应的速度选择出来发送给机器人,以实现局部避障和路径调整。局部 DWA 通过将里程计(odom)数据与目的点进行比较,来判断是否到达目的地。
- 全局与局部路径规划区别:全局路径规划通常是基于地图信息,从起点到目标点规划出一条全局最优或较优路径,可理解为 “动作采样”,常见的全局路径规划算法有基于 Dijkstra 算法的
navfn等。而局部路径规划是在全局路径的基础上,根据实时的传感器数据,如激光雷达数据,对路径进行实时调整,更关注机器人当前局部环境,是 “状态采样”,除了 DWA,还有时间弹性带方法(TEB)等实现方式。
里程计的作用
里程计在 ROS 路径规划中具有重要作用。AMCL 会使用里程计数据,将其与激光雷达数据融合来优化定位结果。Cartographer 可选择使用里程计数据,若使用,会将其作为运动模型的输入之一,参与非线性优化过程,以提升 SLAM 精度,尤其是在动态环境或传感器噪声较大的情况下效果更为明显。
Cartographer 分析轨迹
Cartographer 可以利用map_builder_bridge.cc中的handletrajectoryquery函数来处理轨迹相关操作。通过该函数,可对生成的轨迹进行分析等操作,有助于了解机器人的运动轨迹是否合理,是否存在与障碍物碰撞风险等,为进一步优化路径规划和机器人运动控制提供依据。