数学预备知识(上):曲线参数化表示、弧长参数、Frenet-Serret 坐标系、曲率与挠率的数学定义
各位同学,欢迎来到《曲率约束轨迹平滑算法实战》的第一章。
做机器人运动规划这些年,我踩过最大的坑是什么?就是「数学基础没打牢,直接上手调算法」。你想想看,轨迹平滑的核心就是处理曲线,如果连曲线怎么描述、曲率怎么算都搞不清楚,后面那些优化算法根本跑不起来。
所以这一章,咱们老老实实把数学底子夯实。我会用我自己的理解方式,把曲线参数化、弧长参数、Frenet-Serret 坐标系、曲率和挠率这几个概念串起来讲。放心,不会堆公式,我会告诉你每个概念「到底有什么用」。
1. 曲线参数化表示
先问个问题:怎么描述一条曲线?
最直观的方式,就是给一个函数 y = f(x)。但这种方式有个致命缺陷——它只能描述「函数」曲线,不能描述「任意」曲线。比如一个圆圈,你没法用一个单值函数 y = f(x) 完整表达。
所以我们需要参数化表示。
核心思想:引入一个独立参数 t,把曲线上的每个点表示为 (x(t), y(t)) 或 (x(t), y(t), z(t))。
举个例子,一个半径为 R 的圆:
x(t) = R * cos(t)
y(t) = R * sin(t)
t ∈ [0, 2π)
这里 t 就是参数。你可以把 t 想象成「时间」,随着时间变化,点就在曲线上移动。
我个人习惯用 t 表示参数,但很多文献里也用 s。别纠结符号,理解本质就行。
我的经验:在项目中,我一般用归一化参数 u ∈ [0, 1] 来表示整条曲线。这样处理插值和分段曲线时特别方便,不用操心参数范围的问题。
2. 弧长参数
普通参数 t 有个问题——它和曲线的几何长度没有直接关系。t 变化快慢,不代表曲线走得快慢。
举个例子:同样是 t 从 0 到 1,有的曲线段可能走了 10 米,有的只走了 1 米。这在计算曲率、速度时非常不方便。
所以就有了弧长参数 s。
弧长参数的定义:从曲线起点到当前点的曲线长度。
s(t) = ∫₀ᵗ ||r'(τ)|| dτ
其中 r(t) 是曲线的位置向量,r'(t) 是速度向量。
用弧长参数表示曲线,有一个极其重要的性质:
关键性质:||r'(s)|| = 1,即速度向量的模恒为 1。
这意味着什么?意味着参数 s 每增加 1,曲线就精确地走过了 1 个单位的长度。说白了,就是用「路程」当参数。
避坑指南:我曾经在项目中直接用等间距的 t 参数采样,结果在曲率大的地方采样点稀疏,导致轨迹精度不够。后来改用弧长参数重采样,问题就解决了。记住:弧长参数是几何处理的基础。
3. Frenet-Serret 坐标系
好了,现在我们有了曲线,也有了弧长参数。接下来要解决一个问题:怎么描述曲线在每一点的「姿态」?
Frenet-Serret 坐标系就是干这个的。它给曲线上的每个点都建立了一个局部坐标系,由三个互相垂直的单位向量组成:
- 切向量 T(s):指向曲线前进方向,T(s) = r'(s)
- 法向量 N(s):指向曲线弯曲方向,N(s) = T'(s) / ||T'(s)||
- 副法向量 B(s):垂直于 T 和 N 构成的平面,B(s) = T(s) × N(s)
这三个向量构成了一个右手坐标系,随着曲线移动而旋转。
你想想看,有了这个坐标系,我们就能知道机器人或者车辆在曲线上的「朝向」和「侧倾」情况。这在路径跟踪控制中至关重要。
我的习惯:在写代码时,我会把 Frenet-Serret 框架封装成一个类,每次传入曲线参数 s,就能直接拿到 T、N、B 三个向量。这样后面做轨迹跟踪、碰撞检测都方便很多。
4. 曲率与挠率的数学定义
曲率和挠率,是描述曲线几何特性的两个核心量。
4.1 曲率 κ
曲率描述曲线弯曲的程度。数学定义是:
κ(s) = ||T'(s)|| = ||r''(s)||
直观理解:曲率越大,曲线弯得越厉害。直线段的曲率为 0,圆的曲率为 1/R。
对于二维曲线,曲率还有正负之分:
κ = (x'y'' - y'x'') / (x'² + y'²)^(3/2)
正曲率表示左转,负曲率表示右转。
实际意义:在机器人运动规划中,曲率直接对应转向角。曲率太大,机器人可能转不过弯来。所以曲率约束就是限制最大转向角。
4.2 挠率 τ
挠率描述曲线偏离平面的程度。数学定义是:
τ(s) = -B'(s) · N(s)
说白了,挠率衡量曲线「拧」的程度。平面曲线的挠率恒为 0。
对于三维曲线,挠率的计算公式:
τ = (r' × r'') · r''' / ||r' × r''||²
避坑指南:我曾经在三维空间做无人机轨迹规划时,忽略了挠率的影响。结果生成的轨迹虽然曲率满足约束,但无人机在转弯时出现了剧烈的「拧麻花」动作。后来加上挠率约束,轨迹才变得平滑自然。
5. 知识体系总览
为了让大家更直观地理解这些概念之间的关系,我画了一张图:
这张图清晰地展示了从曲线到曲率、挠率的推导路径。每一步都是下一步的基础,缺一不可。
6. 小结与个人体会
这一章的内容,说白了就是给曲线「做体检」的工具箱:
- 参数化表示让我们能描述任意曲线
- 弧长参数让几何量计算变得干净利落
- Frenet-Serret 坐标系给了我们一个随曲线移动的「参考系」
- 曲率和挠率则是曲线的「体检指标」
我记得刚入行时,总觉得这些数学概念太抽象,不知道有什么用。直到有一次做 AGV 的路径跟踪,车辆在弯道处总是偏离轨迹,我才意识到——原来是没有考虑曲率约束,路径的曲率超过了车辆的最小转弯半径。
从那以后,我每次做轨迹规划,第一件事就是检查曲线的曲率分布。
给新手的建议:别急着写代码。先拿一支笔,在纸上画一条曲线,标出切向量、法向量,算一算曲率。手算一遍,比看十遍公式都管用。
下一章,我们会把这些数学工具用到实际中,看看怎么计算曲线的曲率,以及如何用曲率约束来生成平滑轨迹。