数学预备知识(上):曲线参数化表示、弧长参数、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. 知识体系总览

为了让大家更直观地理解这些概念之间的关系,我画了一张图:

曲线数学预备知识体系 曲线 参数化表示 r(t) = (x(t), y(t), z(t)) 弧长参数 s(t) = ∫||r'(τ)|| dτ Frenet-Serret 坐标系:T(s), N(s), B(s) 曲率 κ(s) = ||T'(s)|| 挠率 τ(s) = -B'(s)·N(s)

这张图清晰地展示了从曲线到曲率、挠率的推导路径。每一步都是下一步的基础,缺一不可。

6. 小结与个人体会

这一章的内容,说白了就是给曲线「做体检」的工具箱:

  • 参数化表示让我们能描述任意曲线
  • 弧长参数让几何量计算变得干净利落
  • Frenet-Serret 坐标系给了我们一个随曲线移动的「参考系」
  • 曲率和挠率则是曲线的「体检指标」

我记得刚入行时,总觉得这些数学概念太抽象,不知道有什么用。直到有一次做 AGV 的路径跟踪,车辆在弯道处总是偏离轨迹,我才意识到——原来是没有考虑曲率约束,路径的曲率超过了车辆的最小转弯半径。

从那以后,我每次做轨迹规划,第一件事就是检查曲线的曲率分布。

给新手的建议:别急着写代码。先拿一支笔,在纸上画一条曲线,标出切向量、法向量,算一算曲率。手算一遍,比看十遍公式都管用。

下一章,我们会把这些数学工具用到实际中,看看怎么计算曲线的曲率,以及如何用曲率约束来生成平滑轨迹。

可可精品资料库