对于具备同一方向不同行程俯仰的关节,以机械臂在末端有两个同向俯仰关节(J5:大行程,J6:小行程)为例,这创造了一个非常有价值的运动学冗余。合理分配和利用这个冗余,是提升贴合柔顺性、提高效率的关键,下面介绍运动学分配原则、Pinocchio 配置方法、以及清洁场景的最佳实践

两个同方向俯仰轴可以合成一个总俯仰角 θtotal=θ5+θ6,但它们的物理特性完全不同,因此必须按功能分工:
J5(大行程俯仰) | J6(小行程俯仰) | |
|---|---|---|
惯量 | 大(驱动大臂/连杆) | 小(仅驱动末端工具) |
带宽 | 低(响应较慢) | 高(响应快,适合高频微调) |
行程 | 大(可做大范围姿态调整) | 小(用于精细补偿) |
角色 | 宏动粗调:负责跟随曲面大致的法向方向,承担大角度变化 | 微动精调:负责高频柔顺修正,吸收动态力误差,保持在行程中心 |
分配原则:

),同时满足末端姿态约束。

Pinocchio 基于 URDF 或直接构建模型,支持这种串联冗余关节。
按实际机械结构顺序定义关节和连杆:
<!-- 前面 SCARA 的 J1~J4 ... -->
<joint name="joint5" type="revolute">
<axis xyz="0 1 0"/> <!-- 俯仰轴方向,与J6一致 -->
<parent link="link4"/>
<child link="link5"/>
<limit lower="-1.5" upper="1.5" effort="..." velocity="..."/>
</joint>
<joint name="joint6" type="revolute">
<axis xyz="0 1 0"/> <!-- 与J5同向 -->
<parent link="link5"/>
<child link="link6"/>
<limit lower="-0.3" upper="0.3" /> <!-- 小行程 -->
</joint>
<!-- 末端工具固连在 link6 之后 -->这样 Pinocchio 的正运动学自动包含两个俯仰角的总和效果。
Pinocchio 没有内置的带零空间优化的 IK 求解器,但可以基于它提供的雅可比矩阵实现,基本实现逻辑(数值迭代法):
pinocchio.computeFrameJacobian 或全模型雅可比选取相关行)。
其中零空间速度 q˙0 用于实现次任务。

,梯度只在 J6 维度非零。
具体到 Pinocchio 实现:
pinocchio.computeJointJacobians(model, data, q) 获得全雅可比。np.linalg.pinv 或自己实现 DLS 求解。这样,就在 Pinocchio 上构建了既能满足主任务(末端姿态对齐法向),又能利用 J6 居中优化冗余的 IK。
当清洁头从座垫(平坦)过渡到内壁(大倾角)时,仅靠 J6 可能不够。
在需要工具 Z 轴严格对齐法向的任务中,总俯仰角是刚性约束,但有时为了提高清洁覆盖,可能需牺牲一点法向对齐来换取可达性(如内壁拐角)。此时可放松姿态约束(例如用加权矩阵),允许小范围姿态误差,此时 J5、J6 可共同分担总角度,通过零空间优化找到既不违反限位又能保证接触的配置。
这样,双俯仰机构就不再是简单的串联,而是一套高带宽宏微结合的柔顺贴合系统,完美适配曲面清洁的需求。
