第1章:轨迹表示方法——路径与轨迹的区别

大家好,我是你们这节课的讲师。做机器人运动规划这些年,我踩过最大的坑,就是没搞清楚「路径」和「轨迹」的区别。记得刚入行那会儿,我拿着一条完美的路径给机器人,结果它跑起来一顿一顿的,像得了帕金森。后来才明白——路径只管「走哪条路」,轨迹才管「怎么走」。

1.1 路径 vs 轨迹:本质区别

说白了,路径是一串空间位置的集合。比如从A点到B点,中间经过哪些点,这就是路径。它不关心时间,不关心速度,只关心几何形状。

轨迹呢?轨迹是路径加上时间信息。每个点都绑定了「什么时候到」「速度多少」「加速度多少」。你想想看,同样的路径,用1秒走完和用10秒走完,轨迹完全不同。

维度 路径 轨迹
数学表示 P(s),s为弧长参数 P(t),t为时间参数
包含信息 位置、几何形状 位置、速度、加速度、加加速度
约束类型 避障、曲率限制 动力学、执行器限制、时间最优
典型应用 全局路径规划 局部运动控制
核心要点:路径是「空间曲线」,轨迹是「时间曲线」。做平滑算法时,我们通常先优化路径的几何形状,再分配时间信息生成轨迹。

1.2 离散点路径——最朴素的方式

离散点路径就是一堆坐标点的列表。比如:[(0,0), (1,2), (3,3), (5,1)]。这种方式最简单,传感器直接采集,路径规划器直接输出。

但问题也很明显——点与点之间怎么插值?直线插值会有尖角,曲线插值又需要额外处理。我在项目中遇到过,直接用离散点做控制,机器人每到一个点就急停一下,效率极低。

# 离散点路径示例
waypoints = [
    (0.0, 0.0),
    (1.0, 2.0),
    (3.0, 3.0),
    (5.0, 1.0),
    (6.0, 0.0)
]

# 直线插值——简单但不平滑
def linear_interpolate(p1, p2, t):
    x = p1[0] + t * (p2[0] - p1[0])
    y = p1[1] + t * (p2[1] - p1[1])
    return (x, y)
避坑指南:离散点路径的密度很关键。点太稀疏,插值误差大;点太密,计算量爆炸。我一般建议根据曲率自适应采样——弯道密、直道疏。

1.3 多项式路径——数学之美

多项式路径用多项式函数来描述路径。比如三次多项式:y = ax³ + bx² + cx + d。好处是连续可导,曲率可以解析计算。

但多项式也有脾气。次数太低,拟合能力不够;次数太高,容易振荡(龙格现象)。我个人习惯用三次或五次多项式,既能保证C²连续,又不会太飘。

# 三次多项式路径
import numpy as np

def cubic_poly_path(x, coeffs):
    a, b, c, d = coeffs
    return a * x**3 + b * x**2 + c * x + d

# 计算曲率
def curvature(x, coeffs):
    y = cubic_poly_path(x, coeffs)
    y_prime = 3*coeffs[0]*x**2 + 2*coeffs[1]*x + coeffs[2]
    y_double = 6*coeffs[0]*x + 2*coeffs[1]
    return abs(y_double) / (1 + y_prime**2)**1.5
小技巧:用多项式做路径时,记得把坐标系归一化。否则数值范围差异太大,系数会变得非常敏感。

1.4 样条路径——工业标准

样条路径是分段多项式的组合。最常用的是三次样条——每段是三次多项式,段与段之间保证C²连续。为什么是C²?因为曲率连续,机器人跑起来才不抖。

B样条更灵活,可以局部调整而不影响全局。NURBS(非均匀有理B样条)还能精确表示圆弧和圆锥曲线。嗯,这里要注意,样条路径的节点分布直接影响平滑效果。

# 三次样条插值示例
from scipy.interpolate import CubicSpline
import numpy as np

# 离散点
x = np.array([0, 1, 3, 5, 6])
y = np.array([0, 2, 3, 1, 0])

# 构建三次样条
cs = CubicSpline(x, y, bc_type='natural')

# 在密集点上求值
x_dense = np.linspace(0, 6, 100)
y_dense = cs(x_dense)
为什么选样条?因为它在平滑性和局部控制之间取得了最佳平衡。全局多项式改一个点全盘皆动,样条只影响相邻几段。

1.5 混合路径表示——实战利器

实际项目中,单一表示方法往往不够用。我做过一个AGV项目,全局路径用样条,局部避障用离散点,最终轨迹用多项式拟合。这就是混合路径表示。

混合策略的核心思想:不同场景用不同表示。比如:

  • 全局规划:样条路径,保证整体平滑
  • 局部重规划:离散点+多项式拟合,快速响应障碍物
  • 最终执行:轨迹(路径+时间),考虑动力学约束
我的经验:混合表示的关键是「接口统一」。不管内部用什么表示,对外都提供统一的查询接口——比如给定弧长s,返回位置和曲率。这样上层算法不用关心底层实现。

1.6 知识体系总览

下面这张图是我自己整理的,把本章的核心逻辑串起来了。你看一遍应该就能明白各种表示方法之间的关系。

轨迹表示方法知识体系 运动表示 路径(空间) 轨迹(时间+空间) 离散点路径 多项式路径 样条路径 时间参数化 速度规划 混合路径表示 全局样条 + 局部离散 路径优化 + 轨迹生成 曲率约束 → 平滑算法 → 可执行轨迹

1.7 本章小结

路径和轨迹的区别,说白了就是「地图」和「导航」的区别。地图告诉你路怎么走,导航告诉你什么时候加速、什么时候转弯。

离散点路径简单直接,适合传感器数据;多项式路径数学优雅,适合理论分析;样条路径工业标准,适合实际部署;混合路径灵活强大,适合复杂场景。

我个人建议初学者先从样条路径入手,它最实用。等把样条玩熟了,再回头看其他表示方法,你会发现很多相通之处。

记住一句话:好的轨迹平滑,从选对路径表示开始。表示方法选错了,后面再怎么优化也是事倍功半。

可可精品资料库