2. 构型空间(C-Space):从笛卡尔空间到构型空间的映射、障碍物在C-Space中的表示、自由空间与障碍空间

好,咱们进入第二章。上一章我们把机械臂的位姿描述清楚了,但有个问题一直悬着——怎么规划一条不撞墙的路径?

你想想看,在笛卡尔空间里,机械臂末端走一条直线,看着挺简单。但关节怎么转?中间会不会碰到自己?会不会撞到旁边的设备?这些问题在笛卡尔空间里很难直接回答。

所以,我们要换个思路——从笛卡尔空间跳到构型空间。这是我个人觉得整个运动规划里最巧妙的一个概念。

2.1 什么是构型空间?

先问个问题:一个6轴机械臂,它的“状态”到底由什么决定?

不是末端位置,而是6个关节角度。每个角度就是一个维度,6个维度撑起来的空间,就是构型空间(Configuration Space,简称C-Space)。

核心定义:

  • 构型(Configuration):一组关节变量的取值,唯一确定机械臂的完整状态
  • 构型空间(C-Space):所有可能构型的集合
  • 维度:等于机械臂的自由度数

举个例子。一个2轴平面机械臂,关节1范围0~360°,关节2范围0~360°。它的C-Space就是一个二维平面,横轴是θ₁,纵轴是θ₂,每个点对应一个唯一的臂形。

我在项目里遇到过不少新手,上来就在笛卡尔空间里规划路径,结果算出来的轨迹关节限位都超了。嗯,这就是没理解C-Space的好处。

2.2 从笛卡尔空间到C-Space的映射

这两个空间怎么转换?靠的是正逆运动学。

映射方向 数学关系 特点
笛卡尔 → C-Space 逆运动学:q = IK(x) 多解、可能无解
C-Space → 笛卡尔 正运动学:x = FK(q) 唯一、计算快

说白了,你在笛卡尔空间里看到一个目标点,得先算逆解,找到对应的关节角度。但逆解可能有8个、16个,甚至无解。这就是为什么规划要在C-Space里做——你直接操作关节,不用反复算逆解。

我的习惯:做路径规划时,先把所有障碍物映射到C-Space,然后在C-Space里找路径。最后只做一次正运动学,把路径转回笛卡尔空间给控制器用。这样效率高得多。

2.3 障碍物在C-Space中的表示

这才是重点。笛卡尔空间里的障碍物,到了C-Space里会长什么样?

答案是:所有会导致碰撞的构型集合。

怎么算?我一般用碰撞检测的方法:

  1. 把C-Space离散化成网格(比如每1°一个点)
  2. 对每个网格点,计算正运动学,得到机械臂在笛卡尔空间里的形状
  3. 检测这个形状是否与障碍物相交
  4. 如果相交,标记这个网格点为“障碍”

听起来简单,但计算量巨大。一个6轴机械臂,每轴按1°分辨率,就有360⁶个点——天文数字。所以实际中我们不会暴力遍历,而是用采样法或近似法。

我曾经踩过的坑:有一次做7轴冗余机械臂的避障规划,我试图精确计算C-Space障碍物边界。结果算了三天三夜没算完。后来改用随机采样+碰撞检测,几分钟就搞定了。记住:C-Space障碍物不需要精确边界,只需要知道哪些点能去、哪些不能去。

2.4 自由空间与障碍空间

有了C-Space障碍物的概念,整个空间就分成了两半:

  • 自由空间(Free Space):所有不发生碰撞的构型集合
  • 障碍空间(Obstacle Space):所有发生碰撞的构型集合

路径规划的任务,就是在自由空间里找一条从起点到终点的连续路径。

这里有个关键性质:自由空间不一定是连通的。如果障碍物把自由空间切成了几块,起点和终点在不同块里,那就无解。

判断可规划性的简单方法:

  • 起点和终点都在自由空间里 → 可能可规划
  • 起点或终点在障碍空间里 → 不可规划(先调整位姿)
  • 起点和终点在自由空间的不同连通分量里 → 不可规划(需要重新布置环境)

2.5 知识结构图

下面这张图把本章的核心逻辑串起来了。我建议你多看几遍,理解每个概念之间的关系。

构型空间(C-Space)知识体系 笛卡尔空间(Cartesian Space) 末端位置 (x, y, z, roll, pitch, yaw) 构型空间(C-Space) 关节角度 (θ₁, θ₂, ..., θₙ) 正运动学 FK(q) 逆运动学 IK(x) 障碍物映射:碰撞检测 → C-Space障碍物 对每个构型q,计算正运动学 → 检测是否与环境障碍物相交 障碍空间(Obstacle Space) 所有发生碰撞的构型 自由空间(Free Space) 所有不发生碰撞的构型 路径规划:在自由空间中寻找连续路径 起点q_start ∈ Free Space → 终点q_goal ∈ Free Space → 路径 ⊆ Free Space 关键:自由空间可能不连通 → 起点和终点必须在同一连通分量内才能规划成功 C-Space维度 = 机械臂自由度;高维C-Space需用采样法而非暴力遍历

2.6 实际应用中的注意事项

讲完理论,说点实际的。我在做产线机器人调试时,总结了几条经验:

实用技巧:

  • 先降维:如果机械臂有对称性(比如SCARA),可以先在低维C-Space里规划,再映射回高维
  • 用近似障碍物:把复杂障碍物包成球体或长方体,碰撞检测快很多
  • 预留安全边界:在C-Space障碍物周围膨胀一圈,给控制误差留余量

常见误区:

  • 以为C-Space里的直线路径对应笛卡尔空间的直线——不对!C-Space直线路径在笛卡尔空间里是曲线
  • 忽略自碰撞——机械臂自身部件之间也可能碰撞,这些也要映射到C-Space障碍物里
  • 认为C-Space障碍物是静态的——如果环境变化,需要重新映射

好了,这一章的核心就这些。记住一句话:在C-Space里规划,在笛卡尔空间里执行。这是整个运动规划的底层逻辑。