4、配置空间(C-Space)入门:从关节空间到配置空间,障碍物映射方法

各位同学,今天我们来聊一个绕不开的核心概念——配置空间,也就是 C-Space。

说实话,我刚入行那会儿,觉得避障嘛,不就是让机械臂别撞到东西吗?直接在工作空间里做碰撞检测不就完了?结果第一次做真机调试,机械臂在笛卡尔空间里规划得好好的,一到奇异点附近就开始抽搐,差点把旁边的示教器给甩飞了。嗯,从那以后我才真正理解了:规划不能在笛卡尔空间里蛮干,得在关节空间里想问题。

4.1 为什么需要配置空间?

先想一个问题:一个六轴机械臂,末端位姿由 (x, y, z, rx, ry, rz) 六个参数描述。但同样的末端位姿,可能对应好几组关节角度——这就是多解。如果你只在笛卡尔空间里做避障,遇到多解时根本不知道选哪一组关节值才不会撞。

更麻烦的是,机械臂的每个关节都有角度限制。比如 J2 关节只能转 -90° 到 +90°,你在笛卡尔空间里规划一条直线路径,中间某个点可能刚好让 J2 超限。这种问题在笛卡尔空间里很难提前发现。

所以,我们换个思路:把机械臂的每个关节角度看作一个维度,所有关节角度组合起来构成一个高维空间。这个空间就叫配置空间,简称 C-Space。

核心思想:在 C-Space 里,一个点就代表机械臂的一个完整姿态。路径规划变成了在这个高维空间里找一条从起点到终点的连续曲线,且曲线上所有点都不在障碍物区域里。

4.2 从关节空间到配置空间

关节空间和配置空间其实是一回事——都是关节角度的张成空间。但配置空间多了一层含义:它把障碍物也映射进来了。

我习惯这样理解:

  • 关节空间:所有可能的关节角度组合,不考虑碰撞。比如一个 6 轴臂,关节空间就是 6 维的,每个维度范围是 [-π, π] 或更小。
  • 配置空间:在关节空间的基础上,把「会导致碰撞的关节组合」标记为障碍区域,剩下的就是自由区域。

举个例子。一个 2 自由度平面臂,两个关节角度分别是 θ₁ 和 θ₂。关节空间就是一个二维矩形:θ₁ ∈ [-180°, 180°],θ₂ ∈ [-180°, 180°]。如果工作空间里有个障碍物,我们通过正运动学算出哪些 (θ₁, θ₂) 组合会让机械臂碰到它,把这些点涂黑——剩下的白色区域就是 C-Space 的自由区。

个人经验:我刚开始做 C-Space 可视化时,总喜欢把 2 自由度臂的 C-Space 画出来看看。虽然实际项目里很少用 2 轴臂,但这个可视化习惯帮我建立了很强的直觉。建议你也试试。

4.3 障碍物映射方法

把工作空间里的障碍物映射到 C-Space,说白了就是回答一个问题:给定一组关节角度,机械臂会不会撞到东西?

常用的映射方法有三种:

方法 原理 适用场景 计算量
解析法 用几何关系直接推导障碍物在 C-Space 中的边界方程 低自由度、简单几何形状 低
采样法 在 C-Space 中随机采样,对每个样本做碰撞检测 高自由度、复杂形状 中
包围盒法 用 AABB 或 OBB 近似机械臂和障碍物,快速检测 实时性要求高的场景 低-中

实际项目中,我几乎只用采样法。为什么?因为解析法只对 2-3 自由度的简单臂有效,到了 6 轴、7 轴,障碍物边界在 C-Space 里是高度非线性的曲面,根本写不出解析式。采样法虽然不精确,但配合概率完备的规划算法(比如 RRT),工程上完全够用。

3.3.1 采样法映射的步骤

采样法映射障碍物的流程,我总结为三步:

  1. 随机采样:在关节空间里随机生成一组关节角度 q = (θ₁, θ₂, ..., θₙ)。
  2. 正运动学计算:用 DH 参数或 URDF 模型,算出这组角度下机械臂每个连杆的空间位姿。
  3. 碰撞检测:检查每个连杆是否与障碍物相交。如果相交,把 q 标记为障碍点;否则标记为自由点。

重复以上步骤几万次,就能得到一个离散的 C-Space 障碍物地图。

避坑指南:我曾经在采样时犯过一个低级错误——采样点分布不均匀。关节空间边界附近的点采得太少,导致 C-Space 边界附近的障碍区域没被标记出来。规划器以为那里是自由空间,结果真机一跑就撞了。后来我改用 Halton 序列或 Sobol 序列做低差异采样,这个问题就解决了。

4.4 C-Space 的可视化

对于 2 自由度臂,C-Space 可以画成二维图。但对于 6 轴臂,C-Space 是 6 维的,没法直接可视化。不过我们可以用切片法:固定其中 4 个关节,只变化 2 个关节,画出二维切片。

下面这张图展示了一个 2 自由度平面臂的 C-Space 结构:

2自由度平面臂 C-Space 示意图 θ₁ (关节1) θ₂ (关节2) 障碍区域 障碍区域 起点 终点 图例说明 障碍区域 规划路径 起点/终点

你看,C-Space 里的障碍区域形状很不规则。这就是为什么解析法很难用——你没法用一个简单的数学公式描述这些区域。

4.5 高维 C-Space 的工程处理

实际项目中,6 轴臂的 C-Space 有 6 个维度。如果每个维度采样 100 个点,总采样数就是 100⁶ = 10¹²——天文数字。所以我们必须用技巧:

  • 增量式构建:不预先构建完整的 C-Space,而是在规划过程中按需采样。RRT 和 PRM 都是这么干的。
  • 降维处理:如果机械臂有冗余自由度(比如 7 轴臂),可以固定其中 1-2 个关节,在低维空间里规划。
  • 距离度量:在 C-Space 里定义距离时,不能用简单的欧氏距离。我习惯用加权欧氏距离,给不同关节分配不同的权重——肩关节的微小变化可能引起末端大位移,权重应该小一些;腕关节影响小,权重可以大一些。

我的习惯:对于 6 轴工业臂,我通常把前三个关节(肩部、大臂、小臂)的权重设为 0.3,后三个关节(腕部)的权重设为 0.7。这样规划出来的路径更平滑,末端抖动也少。

4.6 本章小结

配置空间是机械臂运动规划的基石。记住三个要点:

  • C-Space 把机械臂的每个姿态映射成一个点,把碰撞问题变成点是否在障碍区域的问题。
  • 障碍物映射最实用的方法是采样法 + 碰撞检测,配合低差异采样可以避免漏检。
  • 高维 C-Space 不要试图完整构建,用增量式规划和降维技巧更实际。