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里会长什么样?
答案是:所有会导致碰撞的构型集合。
怎么算?我一般用碰撞检测的方法:
- 把C-Space离散化成网格(比如每1°一个点)
- 对每个网格点,计算正运动学,得到机械臂在笛卡尔空间里的形状
- 检测这个形状是否与障碍物相交
- 如果相交,标记这个网格点为“障碍”
听起来简单,但计算量巨大。一个6轴机械臂,每轴按1°分辨率,就有360⁶个点——天文数字。所以实际中我们不会暴力遍历,而是用采样法或近似法。
我曾经踩过的坑:有一次做7轴冗余机械臂的避障规划,我试图精确计算C-Space障碍物边界。结果算了三天三夜没算完。后来改用随机采样+碰撞检测,几分钟就搞定了。记住:C-Space障碍物不需要精确边界,只需要知道哪些点能去、哪些不能去。
2.4 自由空间与障碍空间
有了C-Space障碍物的概念,整个空间就分成了两半:
- 自由空间(Free Space):所有不发生碰撞的构型集合
- 障碍空间(Obstacle Space):所有发生碰撞的构型集合
路径规划的任务,就是在自由空间里找一条从起点到终点的连续路径。
这里有个关键性质:自由空间不一定是连通的。如果障碍物把自由空间切成了几块,起点和终点在不同块里,那就无解。
判断可规划性的简单方法:
- 起点和终点都在自由空间里 → 可能可规划
- 起点或终点在障碍空间里 → 不可规划(先调整位姿)
- 起点和终点在自由空间的不同连通分量里 → 不可规划(需要重新布置环境)
2.5 知识结构图
下面这张图把本章的核心逻辑串起来了。我建议你多看几遍,理解每个概念之间的关系。
2.6 实际应用中的注意事项
讲完理论,说点实际的。我在做产线机器人调试时,总结了几条经验:
实用技巧:
- 先降维:如果机械臂有对称性(比如SCARA),可以先在低维C-Space里规划,再映射回高维
- 用近似障碍物:把复杂障碍物包成球体或长方体,碰撞检测快很多
- 预留安全边界:在C-Space障碍物周围膨胀一圈,给控制误差留余量
常见误区:
- 以为C-Space里的直线路径对应笛卡尔空间的直线——不对!C-Space直线路径在笛卡尔空间里是曲线
- 忽略自碰撞——机械臂自身部件之间也可能碰撞,这些也要映射到C-Space障碍物里
- 认为C-Space障碍物是静态的——如果环境变化,需要重新映射
好了,这一章的核心就这些。记住一句话:在C-Space里规划,在笛卡尔空间里执行。这是整个运动规划的底层逻辑。