一、机器人导航的数学本质是什么?
在 ROS 中,我们常用 move_base
实现导航,调用 /move_base/goal
设置目标,然后机器人就会“自动”开始行动。
但你有没有想过:
🚶 它是如何知道自己在哪里?
🧭 又是如何计算一条可行的路径?
🕹 控制系统如何将路径转化为电机运动指令?
📉 遇到不确定性时,它凭什么做出“合理”的决策?
这些都不是“黑魔法”,背后是一整套严密的数学建模体系在支撑。
1.1 导航不是“功能”,而是“数学模型的组合”
机器人导航的本质,不只是简单的功能调用,它其实是多个数学子系统协同工作的结果:
阶段 | 数学本质 | 对应模块 |
---|---|---|
定位(Where am I?) | 概率估计、贝叶斯滤波 | AMCL、EKF |
建图 / 地图理解 | 栅格映射、代价函数建模 | SLAM、Costmap |
路径规划(Where to go?) | 图搜索、启发式搜索、轨迹采样 | A*、Dijkstra、TEB、RRT |
运动控制 | 微分运动学、最优化控制、反馈环路 | DWA、PID、TEB 控制器 |
传感器建模与反馈 | 数据融合、误差建模 | TF 树、滤波器、IMU/LiDAR |
这些模型不是彼此孤立的,它们之间通过数据流 + 状态反馈 + 控制闭环形成完整的机器人导航逻辑。
1.2 一个导航过程背后发生了什么?
让我们举一个你再熟悉不过的例子:
你在 RViz 中点下了一个目标点,TurtleBot 开始导航。
实际上发生了以下数学链条:
- 你设置的目标点在
/map
坐标系,需要通过坐标变换(齐次矩阵运算)转换为/odom
与/base_link
。 - AMCL 模块使用粒子滤波(PF) 估计当前位置(后验概率分布)。
- Global Planner 使用 A 算法* 在代价地图上进行路径搜索,计算出一条离散的路径。
- Local Planner(如 DWA 或 TEB) 对路径进行局部优化,预测未来轨迹,并实时计算速度指令
/cmd_vel
。 - 底盘控制器使用运动学模型(如差速运动学)将线速度 / 角速度转换为轮子转速。
- 激光雷达数据实时反馈到 Costmap,局部规划器根据障碍变化实时调整路径。
整个过程,每一步都基于“数学模型 + 状态估计 + 控制理论”在运行。
1.3 为什么理解数学模型对开发者至关重要?
如果你只是使用默认的 move_base
配置、调调 YAML 参数、跑跑 Demo,那你就是“导航系统的用户”。
但如果你想做到以下事情:
- 自定义控制器逻辑
- 优化局部路径平滑性
- 替换掉默认的 AMCL
- 分析导航异常原因
- 为不同底盘 / 环境做适配
那你必须深入理解背后的建模思想与数学机制,做到从“调参”转向“建模”。
1.4 本文将带你掌握哪些关键数学模型?
模块 | 你将掌握的核心数学 |
---|---|
🧭 坐标系变换 | 齐次矩阵、四元数、tf2 的数学根基 |
🚗 运动模型 | 差速 / Ackermann / 全向运动学推导 |
📍 定位估计 | 贝叶斯滤波、粒子滤波、AMCL 数学结构 |
🗺 地图建模 | 占据栅格、成本地图、障碍膨胀函数 |
🔍 路径规划 | A* / Dijkstra / RRT 搜索公式与评估函数 |
🕹 控制器建模 | DWA 的轨迹采样、TEB 的优化建模公式 |
你不再是“把系统跑起来的人”,而是“知道系统为什么这么跑的人”。
📌 小结:
导航=感知 + 决策 + 控制的数理协同。
理解它的数学本质,是你成为真正机器人系统设计者的第一步。
二、机器人坐标系与空间变换基础(TF 框架数学解析)
在机器人系统中,“定位”不仅意味着知道自己在哪里,更意味着在不同坐标系之间进行准确变换。
而这些坐标变换的背后,隐藏着一整套精确的数学建模系统。
本章我们将深入解析:
- ROS 中有哪些坐标系?
- 坐标变换用什么数学工具?
- tf2 到底在自动做什么?
- 为什么理解这部分数学对导航稳定性至关重要?
2.1 机器人常见坐标系概览(TF 树中的主角)
在 ROS 中,坐标变换(TF)系统定义了所有坐标之间的关系。常见坐标系如下:
坐标系 | 含义 | 典型用途 |
---|---|---|
/map | 地图坐标系,静态全局参考 | 全局导航目标位置参考 |
/odom | 里程计坐标系,局部参考 | 无漂移短期追踪 |
/base_link | 机器人本体中心坐标 | 控制器 / 传感器参考系 |
/laser 、/camera_link | 传感器坐标 | 感知模块数据解析 |
🔄 坐标变换链(TF 树)常见结构:
/map
└── /odom
└── /base_link
├── /laser
└── /camera_link
2.2 空间变换的数学基础:齐次变换矩阵
✅ 坐标变换问题的数学抽象:
假设有一个点 ( P ) 在坐标系 A 中的位置为:
P A = [ x y 1 ] P^A = \begin{bmatrix} x \\ y \\ 1 \end{bmatrix} PA= xy1
我们希望将其转换为坐标系 B 的表示:
P B = T A B ⋅ P A P^B = T_{AB} \cdot P^A PB=TAB⋅PA
其中,变换矩阵 ( T_{AB} ) 是从 A 到 B 的 齐次变换矩阵:
T A B = [ cos θ − sin θ t x sin θ cos θ t y 0 0 1 ] T_{AB} = \begin{bmatrix} \cos\theta & -\sin\theta & t_x \\ \sin\theta & \cos\theta & t_y \\ 0 & 0 & 1 \end{bmatrix} TAB= cosθsinθ0−sinθcosθ0txty1
它包含两个部分:
- 旋转部分(前 2×2):坐标系朝向差异
- 平移部分(第 3 列):坐标原点的位移关系
2.3 四元数与姿态变换(3D扩展)
在三维空间中,使用欧拉角容易引发 万向节死锁(Gimbal Lock) 问题,
因此 ROS 使用 四元数(Quaternion) 来表示空间旋转。
✅ 四元数数学形式:
q = [ x , y , z , w ] q = [x, y, z, w] q=[x,y,z,w]
并满足单位模长约束:
x 2 + y 2 + z 2 + w 2 = 1 x^2 + y^2 + z^2 + w^2 = 1 x2+y2+z2+w2=1
四元数提供了更加稳定、平滑的空间旋转描述,避免了欧拉角带来的不连续性问题。
2.4 tf2 的工作原理:自动维护空间变换链
tf2 是 ROS 中的空间变换管理系统,本质上是一个 变换缓存服务器,它:
- 监听所有坐标变换广播(由各节点发送 TransformStamped 消息)
- 构建 TF 树并维护时间轴上的历史记录
- 根据需要自动拼接多个坐标系之间的变换链
举例:你请求 /map → /base_link
,tf2 会自动计算:
T map→base_link = T map→odom ⋅ T odom→base_link T_{\text{map→base\_link}} = T_{\text{map→odom}} \cdot T_{\text{odom→base\_link}} Tmap→base_link=Tmap→odom⋅Todom→base_link
这个过程实际就是 多个齐次变换矩阵的连乘计算。
2.5 你需要理解坐标变换的五个关键细节
点 | 解释 |
---|---|
✅ TF 是有方向的 | 广播的是 A → B ,只能正向计算,逆向需显式求逆 |
✅ tf_static 是一次性广播 | 静态坐标变换(如 /base_link → /laser )适合只发布一次 |
❌ TF 树不能成环 | 循环引用会导致解析失败 |
⚠️ 时间戳必须对齐 | tf2.lookup_transform() 常因时间差报错 |
👁 RViz 坐标抖动 = TF 问题 | 视觉错位几乎都是变换/时间轴错误导致 |
2.6 实战建议:如何验证 TF 是否正确
工具 | 用法 |
---|---|
tf_echo | rosrun tf tf_echo /odom /base_link 查看变换实时值 |
rqt_tf_tree | 可视化 TF 树结构,查错必备 |
tf_monitor | 查看各坐标对的广播频率与延迟 |
RViz | 添加 TF 视图,检查坐标朝向、漂移、错位 |
📌 小结:
坐标变换是机器人空间认知的数学基石。
如果你搞不懂odom → base_link
是如何计算的,就永远没法定位导航“走歪”的根源。
三、机器人运动学模型(差速、全向、Ackermann)
机器人之所以能沿着规划路径准确地移动,不只是靠“控制器发了速度指令”,更关键在于:
控制器是在依据一个“运动学模型”来预测与控制机器人的行为。
本章我们将系统讲解三类主流移动底盘的运动模型,以及它们在导航、规划与控制中的数学建模方式。
3.1 为什么必须建运动模型?
机器人控制的核心目标是:
给定当前位置和目标点,计算一组速度 / 控制量,使机器人按照预期轨迹运动。
如果没有运动模型,控制器将无法判断:
- 当前速度能否到达目标点
- 机器人的运动方向是否有限制
- 轨迹是否可行、是否安全
3.2 差速机器人模型(Differential Drive)
最常见的移动机器人类型(如 TurtleBot)就是差速模型:
两个独立驱动轮 + 一个自由万向轮构成。
✅ 坐标系定义:
- 原点位于机器人底盘中心
/base_link
- ( v ):线速度,( \omega ):角速度
- 左右轮速分别为 ( v_L, v_R )
✅ 运动学推导公式:
机器人状态:
x = [ x y θ ] \mathbf{x} = \begin{bmatrix} x \\ y \\ \theta \end{bmatrix} x= xyθ
控制输入:
u = [ v ω ] \mathbf{u} = \begin{bmatrix} v \\ \omega \end{bmatrix} u=[vω]
连续时间下的运动模型为:
x ˙ = v ⋅ cos ( θ ) y ˙ = v ⋅ sin ( θ ) θ ˙ = ω \dot{x} = v \cdot \cos(\theta) \\ \dot{y} = v \cdot \sin(\theta) \\ \dot{\theta} = \omega x˙=v⋅cos(θ)y˙=v⋅sin(θ)θ˙=ω
这个模型假设:机器人沿其朝向前进,同时可原地旋转。
✅ 轮速与速度关系:
假设轮距为 ( L ),轮半径为 ( R ),则:
v = R 2 ( v R + v L ) ω = R L ( v R − v L ) v = \frac{R}{2}(v_R + v_L) \\ \omega = \frac{R}{L}(v_R - v_L) v=2R(vR+vL)ω=LR(vR−vL)
控制器根据此模型推算当前速度影响位置变化。
3.3 Ackermann 模型(汽车式转向)
服务机器人、小车底盘常使用“Ackermann 转向结构”,前轮控制方向,后轮负责驱动。
这种模型具有转向约束,不能原地旋转,属于非完整系统(non-holonomic)。
✅ 控制变量:
- ( v ):前进速度
- ( \delta ):前轮转角
✅ 状态更新方程:
x ˙ = v ⋅ cos ( θ ) y ˙ = v ⋅ sin ( θ ) θ ˙ = v L ⋅ tan ( δ ) \dot{x} = v \cdot \cos(\theta) \\ \dot{y} = v \cdot \sin(\theta) \\ \dot{\theta} = \frac{v}{L} \cdot \tan(\delta) x˙=v⋅cos(θ)y˙=v⋅sin(θ)θ˙=Lv⋅tan(δ)
其中 ( L ) 是前后轮之间的轴距。
这个模型决定了:
- 小车只能沿“曲率轨迹”前进
- 控制器必须考虑“转弯半径限制”
3.4 全向轮模型(Mecanum / Omni)
全向轮机器人可以实现“平移 + 旋转”自由运动,不受差速 / Ackermann 的朝向限制。
✅ 控制变量:
- ( v_x ):x 方向线速度
- ( v_y ):y 方向线速度
- ( \omega ):角速度
✅ 状态更新模型:
x ˙ = v x ⋅ cos ( θ ) − v y ⋅ sin ( θ ) y ˙ = v x ⋅ sin ( θ ) + v y ⋅ cos ( θ ) θ ˙ = ω \dot{x} = v_x \cdot \cos(\theta) - v_y \cdot \sin(\theta) \\ \dot{y} = v_x \cdot \sin(\theta) + v_y \cdot \cos(\theta) \\ \dot{\theta} = \omega x˙=vx⋅cos(θ)−vy⋅sin(θ)y˙=vx⋅sin(θ)+vy⋅cos(θ)θ˙=ω
✅ 应用场景:
- 需要高机动性的服务机器人 / AGV / 仓储物流
- 对路径平滑性 / 空间利用率要求极高
3.5 三种模型对比与控制器适配性
模型类型 | 可否原地转向 | 控制变量 | 运动限制 | 常用控制器 |
---|---|---|---|---|
差速 | ✅ 可原地旋转 | ( v, \omega ) | 不能横移 | DWA、PID、TEB |
Ackermann | ❌ 不能原地转 | ( v, \delta ) | 转向受限 | Pure Pursuit、MPC |
全向 | ✅ 可任意运动 | ( v_x, v_y, \omega ) | 几乎无限制 | MPC、TEB、轨迹跟踪器 |
3.6 为什么理解运动模型对规划器至关重要?
因为:
- 规划器要根据运动模型预测“未来路径可达性”
- 控制器要计算“当前状态到目标状态的最小控制指令”
- 避障器要判断“转弯是否可避开障碍”
📌 例如:
- DWA 控制器使用差速模型采样 ( v, \omega ),生成一组轨迹
- TEB 控制器在轨迹优化中引入“运动约束项”,确保轨迹符合底盘模型
- A* 生成的路径可能不可达,必须靠运动模型进行可行性修正
📌 小结:
运动模型是机器人导航系统中的“物理引擎”,
控制器不是靠拍脑袋输出速度,而是靠“你能动成什么样”的精准数学建模。
四、概率定位数学原理(贝叶斯滤波与 AMCL)
在现实环境中,机器人永远不可能完全准确地知道自己在哪。传感器有噪声,轮子会打滑,地图可能有误差。
因此,定位系统不再是“单点估计”,而是基于概率推理来不断更新自己的位姿认知。
这一章我们将深入讲解:
- 贝叶斯滤波原理
- 粒子滤波(PF)推导
- AMCL 的定位原理与工程实现
- 为什么定位估计本质上是一个“连续的猜谜游戏”
4.1 定位问题的数学建模
定位问题可建模为一个隐变量估计问题:
已知:
- 控制输入(速度 / 动作)
- 观测值(激光 / 图像 / 里程计)
推测:- 当前位姿 ( x_t )(即我现在在哪?)
我们希望估计的是当前位置的后验概率分布:
b e l ( x t ) = p ( x t ∣ z 1 : t , u 1 : t ) bel(x_t) = p(x_t \mid z_{1:t}, u_{1:t}) bel(xt)=p(xt∣z1:t,u1:t)
其中:
- ( x_t ):机器人在时刻 ( t ) 的状态(位置 + 朝向)
- ( z_{1:t} ):到目前为止的所有观测数据
- ( u_{1:t} ):到目前为止的所有控制输入
4.2 贝叶斯滤波公式推导
贝叶斯滤波有两个核心阶段:
✅ 1)预测(Prediction)
根据上一步状态 + 当前控制量,预测新状态:
b e l ‾ ( x t ) = ∫ p ( x t ∣ u t , x t − 1 ) ⋅ b e l ( x t − 1 ) d x t − 1 \overline{bel}(x_t) = \int p(x_t \mid u_t, x_{t-1}) \cdot bel(x_{t-1}) \, dx_{t-1} bel(xt)=∫p(xt∣ut,xt−1)⋅bel(xt−1)dxt−1
其中:
- ( p(x_t \mid u_t, x_{t-1}) ):运动模型(考虑控制误差)
✅ 2)更新(Correction)
用观测数据修正预测分布:
b e l ( x t ) = η ⋅ p ( z t ∣ x t ) ⋅ b e l ‾ ( x t ) bel(x_t) = \eta \cdot p(z_t \mid x_t) \cdot \overline{bel}(x_t) bel(xt)=η⋅p(zt∣xt)⋅bel(xt)
其中:
- ( p(z_t \mid x_t) ):观测模型(激光匹配程度)
- ( \eta ):归一化因子(确保概率和为 1)
4.3 为什么使用粒子滤波(PF)?
由于机器人状态空间是连续的,无法用精确公式表示整张分布曲线。
粒子滤波是贝叶斯滤波的离散采样版本:
- 用 ( N ) 个粒子表示可能的机器人位置
- 每个粒子都有权重,代表其可信度
- 每一帧:采样 → 更新权重 → 重采样 → 逼近真实后验分布
4.4 AMCL:Adaptive Monte Carlo Localization
AMCL(自适应蒙特卡洛定位)是 ROS 中最常用的定位模块,其核心逻辑:
✅ 核心流程:
- 采样粒子(来自运动模型预测)
- 计算权重(基于激光扫描匹配地图)
- 重采样(保留高权重粒子,淘汰低权重粒子)
- 更新估计(根据粒子分布计算最大后验位置)
✅ 状态空间:
每个粒子表示一个二维位姿:
x = [ x , y , θ ] x = [x, y, \theta] x=[x,y,θ]
✅ 权重计算公式:
权重 ( w_i ) 反映当前粒子下观测值的匹配程度:
w i ∝ p ( z t ∣ x t i ) w_i \propto p(z_t \mid x^i_t) wi∝p(zt∣xti)
ROS 中常用的观测模型是 Beam Model 或 Likelihood Field Model(使用 precomputed distance map 快速计算误差)
4.5 重采样机制与粒子退化
重采样过程会导致粒子退化:只有极少数粒子权重较高,其他粒子浪费资源。
✅ AMCL 自适应机制:
AMCL 会根据粒子有效数目 ( N_{eff} ) 自动调整粒子数:
N e f f = 1 ∑ w i 2 N_{eff} = \frac{1}{\sum w_i^2} Neff=∑wi21
- ( N_{eff} ) 小 → 重采样
- 高置信度 → 减少粒子数
- 位置不确定 → 自动增加粒子数量(提高分布覆盖)
4.6 工程实践建议:如何用好 AMCL?
问题表现 | 可能原因 | 调整建议 |
---|---|---|
初始位置严重漂移 | 初始姿态不准 / 粒子发散 | 使用 initialpose 精确设定初始粒子云 |
定位抖动 | 激光匹配不好 | 检查 /scan 是否正确,地图分辨率是否过粗 |
定位卡死 / 不更新 | 权重全趋近于 0 | 增加 laser_z_hit ,调整运动模型误差参数 |
CPU 占用过高 | 粒子数太大 | 限制 max_particles ,使用更好的初始估计减少粒子数量 |
📌 小结:
定位不是“告诉我在哪”,而是“我可能在哪”。
AMCL 使用概率 + 采样 + 匹配的方式,让机器人在不确定的现实世界中,始终拥有“较可靠的位置感知”。
五、地图表示与障碍模型(占据栅格与成本地图)
机器人导航的另一个核心能力是理解环境。只有知道“哪里能走,哪里不能走”,控制器才能规划出安全可达的路径。
这背后依赖两大关键地图结构:
- 占据栅格地图(Occupancy Grid):建图的基础,用于表示静态障碍
- 代价地图(Costmap):导航使用的动态障碍表示,考虑安全距离与风险评估
本章将系统讲清这两类地图的数学建模、作用机制与参数配置要点。
5.1 占据栅格地图(Occupancy Grid Map)
这是机器人最基础的环境建模方式。
✅ 定义:
将二维空间离散为一个个网格,每个栅格存储一个占据概率值 ( p \in [0,1] ):
- ( p = 1 ):确定有障碍
- ( p = 0 ):确定为空
- ( p = 0.5 ):未知 / 未观察到
✅ 数学形式:
地图可表示为一个二维矩阵:
M ( i , j ) = p i , j = p ( occupied ∣ z 1 : t , x 1 : t ) M(i, j) = p_{i,j} = p(\text{occupied} \mid z_{1:t}, x_{1:t}) M(i,j)=pi,j=p(occupied∣z1:t,x1:t)
其中:
- ( (i, j) ):第 ( i ) 行、第 ( j ) 列网格
- ( z_{1:t} ):传感器观测历史
- ( x_{1:t} ):机器人位姿历史
✅ 更新方式(Inverse Sensor Model):
基于激光观测更新概率:
log p i , j 1 − p i , j = log p i , j p r i o r 1 − p i , j p r i o r + log p ( z t ∣ x t ) 1 − p ( z t ∣ x t ) \log \frac{p_{i,j}}{1 - p_{i,j}} = \log \frac{p_{i,j}^{prior}}{1 - p_{i,j}^{prior}} + \log \frac{p(z_{t} \mid x_{t})}{1 - p(z_{t} \mid x_{t})} log1−pi,jpi,j=log1−pi,jpriorpi,jprior+log1−p(zt∣xt)p(zt∣xt)
此为 Log-Odds 更新方式,避免浮点误差。
5.2 代价地图(Costmap)数学建模
在导航中,仅用 0/1 的障碍表示过于粗糙,容易碰撞 / 抖动。
因此引入 代价地图(Costmap),将环境中每个点的“风险程度”数值化,作为控制器的路径优化依据。
✅ Cost 值域定义(ROS 默认):
值 | 含义 |
---|---|
0 | 可自由通行区域 |
1~254 | 障碍附近,代价越高越靠近障碍 |
255 | 确定性障碍物(不可通行) |
✅ 成本计算方式:
最常见的是膨胀函数(Inflation Layer):
C ( d ) = C m a x ⋅ exp ( − d 2 2 σ 2 ) C(d) = C_{max} \cdot \exp\left(-\frac{d^2}{2\sigma^2}\right) C(d)=Cmax⋅exp(−2σ2d2)
其中:
- ( C(d) ):距离障碍 ( d ) 处的代价值
- ( \sigma ):膨胀程度控制因子
- ( C_{max} ):最大代价(靠近障碍边缘)
这个函数构建出“障碍物附近的软边界”,让路径避开障碍时有更自然的过渡。
5.3 Costmap 的多层结构建模
ROS 中的代价地图是通过多个 Layer 组合而成的:
Layer | 作用 |
---|---|
Static Layer | 从建图得到的静态地图加载 |
Obstacle Layer | 从激光雷达 / 深度相机中实时构建障碍 |
Inflation Layer | 将障碍边缘扩展为软边界 |
Voxel Layer | 三维地图支持(深度相机/点云) |
📌 每个 Layer 都可以单独配置、加载、切换,是 ROS Costmap 插件化系统的体现。
5.4 Global Costmap vs Local Costmap
ROS 中的导航系统使用两张 Costmap:
类型 | 区别 | 典型用途 |
---|---|---|
Global Costmap | 大范围、低频更新 | 全局路径规划 |
Local Costmap | 小范围、高频更新 | 局部避障与轨迹控制 |
它们共同工作:
- Global Planner 在 global costmap 上规划整体路径
- Local Planner 在 local costmap 上动态避障、轨迹修正
5.5 工程建议与常见误区
问题表现 | 可能原因 | 调整建议 |
---|---|---|
路径贴近障碍,运动抖动 | 膨胀层配置过小 | 提高 inflation_radius , cost_scaling_factor |
局部地图频繁重新规划 | 局部障碍抖动 | 加入障碍滤波器 / 增大 local map 宽度 |
无法绕开动态人群 | 没启用 Obstacle Layer / 地图延迟 | 检查 sensor source 输入是否正确 |
📌 小结:
地图是机器人眼中的世界,代价函数是它对风险的理解。
精准的环境建模,才能让机器人“既知道能走哪里,也知道最好别走哪里”。
六、路径规划算法的数学基础(A*、Dijkstra、RRT)
机器人已经具备了定位能力,也拥有了障碍地图,下一步就是最关键的一步:
✨ 如何在地图中计算出一条从当前位置到目标点的“最优路径”?
这就进入了路径规划的核心区域。
路径规划算法的本质,是把环境抽象成一个图(Graph)结构,然后通过搜索算法找到一条最优路径。
本章我们将深入分析:
- 栅格地图如何建图
- A*、Dijkstra、RRT 的数学原理
- 启发函数怎么选?
- move_base 是怎么用插件加载这些算法的?
6.1 栅格地图建图:路径规划的输入结构
✅ 路径规划不是在地图上画线,而是在“图”中搜索。
在离散地图中(如 Occupancy Grid),我们将每个栅格看作一个节点:
- 栅格中心 = 节点坐标
- 相邻栅格 = 可行路径(边)
- 每条边都有一个“代价”(移动消耗 + 风险程度)
✅ 代价图建模:
G = ( V , E ) , c ( i , j ) = cost ( i → j ) G = (V, E), \quad c(i, j) = \text{cost}(i \rightarrow j) G=(V,E),c(i,j)=cost(i→j)
其中:
- ( V ):节点集合(地图上的点)
- ( E ):边集合(可走路径)
- ( c(i, j) ):从节点 ( i ) 到 ( j ) 的代价
6.2 Dijkstra 算法:最短路径基础模型
Dijkstra 是图搜索中最基础的“最短路径算法”:
✅ 目标:
找到从起点到终点的最小累计代价路径。
✅ 主要过程:
- 初始化所有点的代价为 ∞,起点为 0
- 每次从未访问的点中选择“当前代价最小”的点扩展
- 更新其相邻节点的代价值
- 直到找到终点或访问完所有节点
✅ 数学公式(路径代价迭代):
d ( v ) = min { d ( u ) + c ( u , v ) ∣ u ∈ Neighbors ( v ) } d(v) = \min \left\{ d(u) + c(u, v) \mid u \in \text{Neighbors}(v) \right\} d(v)=min{d(u)+c(u,v)∣u∈Neighbors(v)}
这个过程最终得到从起点到任意点的最小代价路径。
6.3 A* 算法:加入“目标意识”的启发式搜索
A* 是在 Dijkstra 的基础上引入“估计代价”的搜索算法,提升搜索效率。
✅ A* 的目标:
在保证最优路径的前提下,更快找到目标。
✅ 核心公式(优先队列排序依据):
f ( n ) = g ( n ) + h ( n ) f(n) = g(n) + h(n) f(n)=g(n)+h(n)
- ( g(n) ):从起点到当前节点的实际代价
- ( h(n) ):从当前节点到目标点的启发估计(heuristic)
✅ 启发函数设计:
常见启发函数 ( h(n) ):
-
曼哈顿距离(4/8 方向栅格):
h ( n ) = ∣ x − x goal ∣ + ∣ y − y goal ∣ h(n) = |x - x_{\text{goal}}| + |y - y_{\text{goal}}| h(n)=∣x−xgoal∣+∣y−ygoal∣
-
欧几里得距离(考虑对角线移动):
h ( n ) = ( x − x goal ) 2 + ( y − y goal ) 2 h(n) = \sqrt{(x - x_{\text{goal}})^2 + (y - y_{\text{goal}})^2} h(n)=(x−xgoal)2+(y−ygoal)2
📌 若 ( h(n) ) 是可接受的估计且不超过真实代价,则 A* 保证最优性。
6.4 RRT / RRT*:采样空间中的概率路径探索
在连续空间(如高维 / 动态避障),图搜索会面临维度灾难,此时更适合使用 采样算法。
✅ RRT(Rapidly-exploring Random Tree):
- 随机在空间中采样点
- 找到最近已有点,连接新点形成树
- 重复,直到路径到达目标区域
✅ 数学表达:
- 采样函数: ( x_{rand} \sim \text{Uniform}(\text{free-space}) )
- 最近点查找: ( x_{near} = \arg\min_{x \in \text{Tree}} |x - x_{rand}| )
- 新节点:沿方向连接 ( x_{new} = x_{near} + \epsilon \cdot \hat{v} )
✅ RRT*:
在 RRT 的基础上增加最优连接和路径重接优化,保证最终路径渐进最优。
6.5 move_base 中路径规划插件机制
在 ROS 中,路径规划器是以插件方式接入的。你可以配置 / 替换规划器:
✅ Global Planner:
- 作用:从当前位置到目标点的全局路径计算
- 常见插件:
navfn/NavfnROS
(Dijkstra 实现)global_planner/GlobalPlanner
(支持 A* / Dijkstra 切换)
✅ 配置示例(YAML):
base_global_planner: "global_planner/GlobalPlanner"
GlobalPlanner:
use_dijkstra: false
use_grid_path: true
allow_unknown: true
通过修改这些配置项,你可以轻松切换规划算法。
6.6 工程调参建议
问题表现 | 原因 | 建议 |
---|---|---|
路径贴墙,风险大 | 启发函数不考虑代价 | 配置 costmap_weight,增加代价惩罚 |
路径走直角,转弯不自然 | A* 栅格粒度粗 | 提升分辨率 / 启用路径平滑器 |
路径失败,无法到达目标 | 栅格间断 / 地图未知区域 | 检查 allow_unknown ,扩大起点 buffer |
📌 小结:
路径规划是“从地图到轨迹”的桥梁。
数学模型决定了:你能不能找到路、找到多好、走得多稳。
七、路径跟踪与控制器建模(DWA / TEB 数学核心)
路径已经规划好了,现在机器人要按照这条路径平稳、准确、安全地走过去,这就是控制器要解决的问题。
在 ROS 的导航系统中,最常见的两个控制器分别是:
- DWA(Dynamic Window Approach)
- TEB(Timed Elastic Band)
它们都基于不同的数学模型,对路径进行实时评估与执行。
本章将深入剖析:
- 控制器的输入与输出本质
- DWA 的采样机制与评价函数设计
- TEB 的优化轨迹建模与约束表达
- 哪种控制器适合你的机器人?
7.1 控制问题的数学本质
控制器的目标是解决以下问题:
已知当前状态 ( x_t )、目标轨迹 ( T = [x_1, x_2, …, x_n] ),求一个速度命令 ( u_t ),
使得机器人从当前状态趋近目标,且过程平滑、安全、稳定。
✅ 状态变量:
x t = [ x , y , θ ] x_t = [x, y, \theta] xt=[x,y,θ]
✅ 控制输入:
u t = [ v , ω ] u_t = [v, \omega] ut=[v,ω]
✅ 输出:
速度控制指令:
/cmd_vel
7.2 DWA(动态窗口法):采样 × 模拟 × 评分 × 选择
DWA 是一个搜索型局部规划控制器:
- 对可能的速度进行采样(在动态窗口内)
- 模拟这些速度产生的轨迹
- 计算每条轨迹的“得分”
- 选出得分最高的轨迹并输出对应速度
✅ 1)动态窗口定义:
考虑加速度与当前速度限制,构建允许速度区域:
V d = { ( v , ω ) ∣ v ∈ [ v m i n , v m a x ] , ω ∈ [ ω m i n , ω m a x ] } V_d = \{ (v, \omega) \mid v \in [v_{min}, v_{max}], \omega \in [\omega_{min}, \omega_{max}] \} Vd={(v,ω)∣v∈[vmin,vmax],ω∈[ωmin,ωmax]}
这个窗口表示机器人在当前时刻的“可达速度集”。
✅ 2)轨迹仿真:
对每对 ( (v, \omega) ):
- 使用差速运动模型(见第三章)
- 模拟若干步前进,生成轨迹 ( T_i )
✅ 3)轨迹打分函数:
每条轨迹评估分数:
G ( T i ) = α ⋅ heading ( T i ) + β ⋅ clearance ( T i ) − γ ⋅ velocity_penalty ( T i ) G(T_i) = \alpha \cdot \text{heading}(T_i) + \beta \cdot \text{clearance}(T_i) - \gamma \cdot \text{velocity\_penalty}(T_i) G(Ti)=α⋅heading(Ti)+β⋅clearance(Ti)−γ⋅velocity_penalty(Ti)
常见打分项:
项目 | 含义 |
---|---|
heading | 距离轨迹终点角度差(朝向目标) |
clearance | 离最近障碍物的距离 |
velocity penalty | 越慢越罚分(鼓励速度) |
✅ 4)选择最优轨迹:
最终选择:
u ∗ = arg max ( v , ω ) ∈ V d G ( T i ) u^* = \arg\max_{(v, \omega) \in V_d} G(T_i) u∗=arg(v,ω)∈VdmaxG(Ti)
然后输出这组 ( v, \omega ) 作为当前控制指令。
7.3 TEB(Timed Elastic Band):最优化轨迹控制器
TEB 是一个基于“优化问题求解”的控制器,它不是在轨迹中选,而是在轨迹空间中直接优化。
✅ 基本思想:
将初始路径转换为一组带时间标签的轨迹点:
T = { ( x 0 , Δ t 0 ) , ( x 1 , Δ t 1 ) , . . . , ( x n , Δ t n ) } T = \{ (x_0, \Delta t_0), (x_1, \Delta t_1), ..., (x_n, \Delta t_n) \} T={(x0,Δt0),(x1,Δt1),...,(xn,Δtn)}
然后通过最小化一个目标函数,使整条轨迹满足以下目标:
- 贴近原始路径
- 平滑自然(加速度变化小)
- 避开障碍
- 满足运动学约束
✅ 优化目标函数:
TEB 将控制问题转化为非线性最小二乘问题:
min T ( ∑ w 1 ⋅ PathCost ⏟ 贴路径 + w 2 ⋅ Smoothness ⏟ 速度加速度变化 + w 3 ⋅ ObstacleCost ⏟ 避障 + w 4 ⋅ Feasibility ⏟ 运动模型可行性 ) \min_{T} \left( \sum \underbrace{w_1 \cdot \text{PathCost}}_{\text{贴路径}} + \underbrace{w_2 \cdot \text{Smoothness}}_{\text{速度加速度变化}} + \underbrace{w_3 \cdot \text{ObstacleCost}}_{\text{避障}} + \underbrace{w_4 \cdot \text{Feasibility}}_{\text{运动模型可行性}} \right) Tmin ∑贴路径 w1⋅PathCost+速度加速度变化 w2⋅Smoothness+避障 w3⋅ObstacleCost+运动模型可行性 w4⋅Feasibility
✅ TEB 的优势:
能力 | 描述 |
---|---|
时间弹性建模 | 支持非匀速运动,路径点间时间优化 |
多约束融合 | 加速度、轮速、障碍、动态限制统一建模 |
实时优化 | 采用 g2o 后端,每帧迭代几次即可输出最优速度 |
7.4 两种控制器对比分析
项目 | DWA | TEB |
---|---|---|
控制思路 | 采样搜索 + 打分 | 轨迹最小化优化 |
轨迹形式 | 多条离散轨迹 | 一条连续优化轨迹 |
可调参数 | 多个打分权重 | 优化目标权重、约束项 |
路径质量 | 中等,易跳动 | 高质量,连续自然 |
CPU 占用 | 较低 | 略高 |
适用场景 | 路径简单 / 实时性要求高 | 路径复杂 / 环境拥挤 / 高精度需求 |
7.5 控制器输出与实际执行流程
无论是 DWA 还是 TEB,最后输出的都是:
/cmd_vel
即:
geometry_msgs/Twist
- 包含线速度 ( v )、角速度 ( \omega )
- 被底盘驱动系统翻译为轮子转速(由运动模型计算)
📌 小结:
控制器是机器人导航的“大脑前庭系统”,负责把规划的路线,变成现实世界中“平滑且安全”的移动。
八、小结与进阶建议:从算法用户到系统设计者
我们从机器人导航的本质出发,追踪其每一步决策背后的数学模型。
本章将回顾核心内容,并帮助你迈出从“使用导航”走向“设计导航系统”的关键一步。
8.1 全链路回顾:机器人导航背后的数学模型栈
模块 | 数学模型 | 涉及概念 |
---|---|---|
坐标变换 | 齐次变换矩阵 / 四元数 | TF 树、姿态融合 |
运动模型 | 差速 / Ackermann / 全向模型 | 控制器建模、轮子约束 |
定位系统 | 贝叶斯滤波 / 粒子滤波 | 后验概率分布、AMCL |
地图系统 | 占据栅格 + Costmap + 膨胀模型 | 环境建模、障碍风险函数 |
路径规划 | A* / Dijkstra / RRT | 启发函数、图搜索、采样收敛 |
控制执行 | DWA / TEB 控制器 | 轨迹评估 / 轨迹优化 / 输出速度指令 |
📌 每一个“看起来只是 YAML 参数调一下”的模块,背后都是一套严谨的数理系统支撑它稳定运行。
8.2 从“调参的人”到“系统建模者”:关键认知升级
用户视角 | 建模者视角 |
---|---|
修改参数试运行 | 分析模型核心变量与可调参数作用 |
控制器抖动就调 smoothing | 识别真实抖动原因:采样密度不足 or 控制频率 |
路径不通就设 allow_unknown | 判断地图空洞根源,设计 costmap 填补逻辑 |
AMCL 不准就调粒子数 | 分析运动模型误差、观测模型匹配权重、TF 延迟 |
路径不平滑就加轨迹滤波器 | 直接选择 TEB 控制器,用优化建模替代采样启发式 |
8.3 工程建议:掌控你的导航系统
✅ 建议一:可视化每一步输出
- TF → 用
rqt_tf_tree
、RViz 查看链路、方向 - AMCL → 观测与粒子权重可视化
- Global Plan → 颜色区分轨迹段
- Local Plan → 显示 DWA / TEB 输出的预测轨迹
- Costmap → 各层分开展示(static/obstacle/inflation)
✅ 建议二:从控制器开始定制你的建模
- 用自己的运动学约束设计 Controller plugin
- 替换 Local Planner 为自定义轨迹评估模型
- 在 TEB 中加入你自己的优化项(如耗电、热量、振动惩罚)
✅ 建议三:结合学习方法进行参数自调
- 使用强化学习 / 模拟器生成数据 → 自动调控制参数
- 用轨迹数据训练一个“路径偏离率估计器”,辅助规划器
- 从导航日志中提取异常情况并标注 → 喂给规划优化器
8.4 进阶资源推荐
主题 | 推荐资源 |
---|---|
概率机器人定位 | 《Probabilistic Robotics》by Thrun 等(圣经) |
路径规划算法 | 《Planning Algorithms》by Steven M. LaValle |
控制系统基础 | 《Feedback Systems》by Åström & Murray |
TEB 论文 | “Timed-Elastic-Band for Online Trajectory Optimization” by Rösmann et al. |
📌 总结一句话:
机器人导航不是“黑盒魔法”,
它是多个可解释、可调、可替换的数学系统的组合。
懂原理,就能掌控系统;懂建模,才能定义系统。
你已掌握了整个机器人导航的建模之路,下一步就是:将这些理论运用到实机项目中,打造你自己的智能导航系统。
💬 本文讲解了机器人导航系统中的核心数学模型,涵盖定位、地图、路径规划、控制器等关键模块的建模原理。
如果你觉得这篇文章对你有帮助,欢迎点个 👍 赞 支持一下~
📌 收藏方便后续深入复习
🧠 评论区欢迎讨论你在导航系统调试中遇到的问题或经验
📚 关注专栏,后续将持续更新更多“机器人系统设计 × 数学建模 × 实战应用”的深度内容!
让我们一起从“能跑起来”迈向“理解原理、掌控系统”的进阶之路!