Pink实战:用FrameTask实现末端跟踪与机械臂控制的2个经典案例
2026/8/23 11:47:37 网站建设 项目流程

Pink实战:用FrameTask实现末端跟踪与机械臂控制的2个经典案例

【免费下载链接】pinkPython inverse kinematics using Pinocchio and QP solvers项目地址: https://gitcode.com/gh_mirrors/pink1/pink

Pink 是一个基于 Pinocchio 与 QP 求解器的 Python 逆运动学(IK)工具箱,核心用法是把"让机械臂末端到达指定位姿"这类需求描述为加权任务,自动构建并求解二次规划问题。本文选取项目中最具代表性的2 个经典案例:UR5 机械臂实时跟踪运动目标,以及 UR10 机械臂迭代求解固定位姿,带你快速掌握FrameTask实现末端跟踪与机械臂控制的完整套路。


FrameTask 是什么:末端跟踪的核心任务

FrameTask是 Pink 中使用频率最高的任务(pink/tasks/frame_task.py),用于控制机器人上某个坐标系(通常是末端法兰或工具座)在世界坐标系中的位姿。它只需 4 个参数:

参数作用直觉理解
frame要控制的坐标系名称"tool0"(UR5 末端)
position_cost位置误差权重[cost]/[m]越大越"在乎"位置
orientation_cost姿态误差权重[cost]/[rad]越大越"在乎"朝向
lm_dampingLevenberg-Marquardt 阻尼提升数值稳定性

它还提供两个便捷方法:

  • set_target(transform):直接指定目标位姿;
  • set_target_from_configuration(configuration):用机器人当前位姿初始化目标,是实时跟踪的常用起手式。

💡 小技巧:position_cost/orientation_cost也可以是 3 维向量,实现对各轴的各向异性加权——比如只关心 x/y 平面位置时写成[1.0, 1.0, 0.0]


逆运动学三步循环:从任务到关节速度

Pink 求解的是微分逆运动学:每步计算一个速度v并积分到下一个构型。核心入口是 pink/solve_ik.py 中的solve_ik,它会自动读取机器人模型中的构型限位与速度限位作为约束:

velocity = solve_ik(configuration, tasks, dt, solver="quadprog") configuration.integrate_inplace(velocity, dt)

整个控制流程就三件事:定义任务 → 更新目标 → 求解并积分。下面的两个案例都是在这个循环上展开的。


案例一:UR5 机械臂实时跟踪正弦运动目标 🎯

完整示例见 examples/arm_ur5.py,效果是 UR5 的末端"tool0"平滑地跟随一个在 Y 轴做正弦运动的目标框。

1. 定义任务

end_effector_task = FrameTask( "tool0", position_cost=1.0, # [cost] / [m] orientation_cost=1.0, # [cost] / [rad] lm_damping=1.0, # 针对该场景调参 ) posture_task = PostureTask(cost=1e-3) # 低权重正则化 tasks = [end_effector_task, posture_task]

2. 用当前构型初始化目标

configuration = pink.Configuration(robot.model, robot.data, q_ref) for task in tasks: task.set_target_from_configuration(configuration)

3. 200 Hz 主循环中更新目标并求解

while True: target = end_effector_task.transform_target_to_world target.translation[1] = 0.5 + 0.1 * np.sin(2.0 * t) # 目标沿 Y 轴往复 target.translation[2] = 0.2 velocity = solve_ik(configuration, tasks, dt, solver=solver) configuration.integrate_inplace(velocity, dt) t += dt

案例要点:

  • 📐目标连续移动 → 无静止解:Pink 会持续以最优方式跟踪每个瞬时目标,这正是实时末端跟踪的原理;
  • ⚖️任务权重冲突自动消解:末端跟踪(权重 1.0)与姿态任务(1e-3)量纲不同,QP 求解器会把它们归一化后权衡,末端优先、姿态只做"找最近构型"的正则化;
  • 🛡️lm_damping=1.0是该场景调出的稳定值,阻尼过大会让跟踪变"迟钝"。

示例通过 MeshCat 可视化目标坐标系与末端坐标系的实时重合效果,可直接用uv run examples/arm_ur5.py体验。


案例二:UR10 迭代收敛求解固定位姿(离线 IK)🔧

完整示例见 examples/inverse_kinematics_ur10.py。与案例一的"实时跟踪"不同,这里演示如何用同一套微分 IK 机制离线求解一次性位姿:给定随机可达的末端位姿,让构型从初始值迭代逼近。

核心思路:迭代到误差足够小

ee_task = FrameTask("ee_frame", [1.0, 1.0, 1.0], [1.0, 1.0, 1.0]) ee_task.set_target(target_pose) while error_norm > 1e-8: dv = pink.solve_ik(configuration, [ee_task], dt=1e-2, damping=1e-8) q_out = pin.integrate(model, configuration.q, dv * dt) error_norm = np.linalg.norm(ee_task.compute_error(configuration))

实际运行输出:

Starting from error_norm = 2.4 Desired precision is error_norm < 1e-08 Terminated after 141 steps with error_norm = 1.1e-09

案例要点:

  • 无需解析逆解:7 自由度及以上机械臂的逆解既繁琐又存在多解,Pink 用"一步速度 + 迭代"的方式 141 步即收敛到 1e-8 精度;
  • compute_error提供收敛判据:误差是一个 6 维量(3 位置 + 3 姿态),其范数就是天然的停止条件;
  • ⚠️微分 IK 是局部方法:Pink 不保证全局最优,可能收敛到局部极小或被构型限位"卡住"(详见 examples/one_dof_configuration_limit.py)。如果初始构型离目标太远或目标不可达,需要自行处理NoSolutionFound异常。

实战调参速查表

症状建议调整
末端抖动调大lm_damping,或降低任务gain做低通滤波
跟踪速度跟不上调高position_cost,检查速度限位是否过紧
多任务互相打架统一用[cost]/[m][cost]/[rad]量纲归一后比较权重
只关心位置不关心朝向orientation_cost=0.0,或姿态分量置 0
求解器报无解确认目标可达、构型在限位内(safety_break=True会快速暴露问题)

延伸阅读

  • 任务源码:pink/tasks/frame_task.py、基类 pink/tasks/task.py
  • 求解器入口:pink/solve_ik.py
  • 交互式调试成本参数(Viser 滑杆):examples/arm_panda.py
  • 含避障屏障(barrier)的 UR5 案例:examples/barriers/arm_ur5.py
  • 更多示例总览:examples/README.md

安装 Pink 只需一行命令(conda 性能最佳,pip 亦可):

conda install -c conda-forge pink pip install pin-pink

两个案例覆盖了"实时跟踪"与"离线求解"两大典型场景——理解了FrameTask+solve_ik的组合方式,双臂、人形、移动底盘等更复杂的机械臂控制(可参考 examples/flying_dual_arm_ur3.py 与 examples/mobile_stretch.py)都只是任务的叠加而已。

【免费下载链接】pinkPython inverse kinematics using Pinocchio and QP solvers项目地址: https://gitcode.com/gh_mirrors/pink1/pink

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询