控制
补一点 # 轨迹规划 ### (1) 轨迹: 机械手臂(的末端点或者操作点)的位置、速度、加速度对时间的历程;

可进一步定义成{T}相对{G}的状态历程(和手臂种类无关,{G}也可随时间变动,比如传送带)。 ### (2)理想轨迹: 机械手臂(的末端点或者操作点)的位置、速度、加速度对时间的历程; 理想轨迹,必须是Smooth Path(i.e.,continuous with continuous first derivative)。 Smooth Path不仅要求位置上连续,而且要求速度上也必须连续,若速度上不连续,速度曲线会有很多转折点,在转折点上,其加速度有可能突破限制(力学限制),连续速度曲线加速度变化不大,若速度变化不连续,在那一瞬间,执行器需要提供巨大扭力符合加速度要求,不符合真实的情况。
- via point,在轨迹规划过程中,往往还需要到达特定的中间位置,该位置叫做via point;
- initial point , 初始位置、姿态;
- final point,目标位置、姿态; 轨迹规划,常常在两个不同空间下进行处理,第一个是Joint Space,即将规划细化到每一个Joint上进行;另外一个是Cartesian Space上的轨迹规划,即当前知道手臂位置,直接在手臂末端点空间姿态上进行规划。
2. Joint Space下的轨迹规划
(1)步骤
定义{T} 相对于{G}的initial point, via, final point, (包含移动和转动自由度)。
i = 1: initial
i = 2~N-1: via points
i = N+1: final
注意,规划只有6个自由度,但是Trans Matrics有16个参数,故将其以6个参数方式来表达:

上面是移动,下面是转动
旋转矩阵里,9个数字有3个自由度,即6个限制条件,若各自规划9个数字,没有加以限制,有可能形成的矩阵很大几率不符合Rotation Matrix的形式,无法满足6个限制条件。所以我们直接以3个自由度形式进行规划。
- 做Inverse Kinematics: 将手臂末端点状态转换到joint状态:
- 对所有joints规划smooth trajectories
- 做Forward Kinematics:将joint状态转换到手臂末端点状态,检查末端点在Cartesian Space下轨迹的可行性。
(2)示例
- joint space
- Cartesian space

经历了上述步骤,最后一步,进行Trajectory Checking... ,看看手臂在运动时,有没有碰倒障碍物,或者有没有满足其他的一些条件... ...
3. Cartesian-Space下的轨迹规划
(1)步骤
定义{T} 相对于{G}的initial point, via, final point, (包含移动和转动自由度)。
i = 1: initial
i = 2~N-1: via points
i = N+1: final
注意,规划只有6个自由度,但是Trans Matrics有16个参数,故将其以6个参数方式来表达:

在上述需求下,直接对所有手臂末端点规划smooth trajectories。
做Inverse Kinematics: 将规划好手臂末端点状态的轨迹点转换到joint状态:
检查joint状态在Joint-Space下轨迹的可行性(有没有达到执行器的极限位置...blabla)
COMMENTS
Cartersian 方法用的比较多,因为其可以规划更具物理直观意义的轨迹。
缺点: 较高的运算负载(IK),规划完了做IK。
比如已知init point,2个via points,1个final point,Joint Space的方法,只须做4次IK。
若4s空间,先在Cartesian下做规划,在做IK,运算量就大很多,比如规划出1000个路径,做IK,就需要算4000次。
对Real Time下,电脑的计算能力考验比较大。
(2) 示例

经历了上述步骤,最后一步,进行Trajectory Checking... ,检测各个Joint运动有没有超出限制... ...
机械臂运动规划中通常涉及几个坐标系。
| 坐标系 | 含义 | 常用记号 |
|---|---|---|
| 基坐标系(Base Frame / {G}) | 机械臂底座固定的参考坐标系 | {G}、{B} |
| 工具坐标系(Tool Frame / {T}) | 定义在末端执行器上的坐标系(TCP) | {T} |
| 关节坐标系(Joint Frames) | 每个关节都有自己的局部坐标系 | {i} |
| 任务坐标系 / 世界坐标系(Task / World Frame) | 有时与基坐标系不同,用于描述外部环境或工件位置 | {W} |
6维表达(3个平移 + 3个旋转)
Joint Space 与 Cartesian Space 后面的笛卡尔坐标系就是末端执行器的6维表达(3个平移 + 3个旋转);joint space可以说是每个电机的角度 它俩通过正/逆运动学可以互相转换,but有个问题:逆运动学会有多解 为什么: 机械臂的构型是冗余的(Redundant Manipulator);有时不同解都能让末端到达同一位置(称为不同的“工作构型”)。 |维度|常见解的命名| |---|---| |肩部|左臂 / 右臂 (lefty/righty)| |肘部|肘上 / 肘下 (elbow up/down)| |腕部|翻转 / 不翻转 (wrist flip/non-flip)| 每个二元选择都可能导致 23=823=8 种不同的解。 还有一个问题奇异点(Singularities)。 - 奇异点就是机械臂处于某种几何姿态时,某些方向的运动会“失效”或变得不稳定;- 奇异点就是机械臂处于某种几何姿态时,某些方向的运动会“失效”或变得不稳定;
在数学上,对应雅可比矩阵 J(q)J(q) 的行列式为 0;
意义:此时关节的小变化不能引起末端的有效变化,系统自由度“退化”。
举例:
手臂完全伸直;
手腕三轴重叠;
→ 都是奇异点。
在奇异点附近:
IK 解可能不连续;
很小的末端运动需要极大的关节运动;
控制器可能出现突跳或震荡。 多解其实还好,主要是奇异点
现在的逆运动学求解能否做到?改善这两个问题?
目前确实有不少逆运动学(IK)求解器(solver)表现不错、速度快、准确率高。下面我列出几个比较推荐的,并附上它们的优缺点(供你在选择时参考)。
✅ 推荐的 IK 求解器
1. IKPy
一个用 Python 写的通用 IK 库。GitHub
特点:支持任意机械臂链、支持 URDF、支持位置和姿态两者求解。GitHub
性能:作者表示“从 ~7 ms 到 ~50 ms”完成一次 IK 求解(取决于模型复杂度)GitHub
适合:快速原型、小型机械臂、教学或研究。
注意:如果用于工业实时控制(硬实时要求、低延迟、高频率)可能还需评估其 Python 实现的延迟与稳定性。
2. pick_ik (适用于 MoveIt 生态)
一个为 ROS/MoveIt 设计的 IK 求解插件。GitHub
特点:结合了局部优化(梯度下降等)+ 全局优化(例如进化算法)以解决冗余、多解、约束问题。index.ros.org
优点:在 ROS 机械臂系统中使用方便,可定制成本函数(例如最小化关节移动、避免关节极限、避免碰撞)GitHub
适合:使用 ROS/MoveIt 框架、需要集成规划器、碰撞检测、约束处理的系统。
3. IK‑Geo
一个更偏“几何解析”方向、C++/Python 混合实现的 IK 库。GitHub
特点:支持“分解子问题”(Paden–Kahan 子问题)等几何方法来求解 6R 或通用串联机械臂的 IK。
优点:对于结构良好的工业机械臂(例如腕部三轴交叉、肩肘结构良好)可能能够得到 解析解 或 接近解析解,速度快、精度高。
适合:你若有控制自己机械臂的几何结构、想要自行整合或实现高性能 IK 的话。
4. IKFast(来自 OpenRAVE)
IKFast 是一个“生成器”(compiler)型工具,可以为给定机械臂生成专用的 C++ IK 求解器。维基百科+1
特点:生成后的求解器为专机型、解析或近解析方法、执行速度极快(有论文中提到几 µs 级别)维基百科
优点:如果你用于工业控制、需要最高性能、且机械臂结构已知固定,那它是一个非常好的选择。
缺点:配置和生成过程较为复杂;每更换机械臂结构或关节数都可能要重新生成。
⚠️ 选择时需要关注的 “因素”
结构匹配性:机械臂结构如果是标准的 “3‐轴腕部” + “肩肘部”结构(如很多工业 6 DoF 机械臂),则解析/几何方法(如 IK-Geo、IKFast)效果最佳。若结构非常不规则或冗余多,则可能需要数值方法。
实时性能:如果规划/控制频率要求很高(如 1 kHz 以上),要优先考虑生成型或 C++ 实现的求解器,而不是纯 Python 的。
约束处理能力:是否要考虑关节限位、碰撞检测、最小路径、避障、冗余优化等。许多“简单”求解器只求一个基本解,不处理这些。
稳定性与收敛性:数值方法可能陷入局部最优、收敛慢、或在奇异点附近表现差。解析方法虽然快,但可能受限于机械结构是否满足可解析条件。
集成便利度:是否与你系统(ROS/MoveIt、工业控制器、自定义控制系统)兼容。
维护和社区支持:库是否活跃、文档是否完善、是否有实际工程案例。