尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

如何在Pink中开发自定义运动学任务:从Task基类到QP目标函数的完整流程

如何在Pink中开发自定义运动学任务:从Task基类到QP目标函数的完整流程 如何在Pink中开发自定义运动学任务从Task基类到QP目标函数的完整流程【免费下载链接】pinkPython inverse kinematics using Pinocchio and QP solvers项目地址: https://gitcode.com/gh_mirrors/pink1/pinkPink是基于 Pinocchio 和 QP 求解器的 Python 逆运动学库所有运动学任务都构建在Task抽象基类之上。本文带你一步步完成Pink 自定义运动学任务开发理解任务残差与雅可比矩阵、实现Task基类并看清任务如何被自动组装进 QP 目标函数。先搞懂原理Pink 如何求解逆运动学Pink 采用加权任务式微分逆运动学每个任务定义一个残差函数 e(q)目标驱动为零的量再求解一阶微分方程J(q) · Δq -α · e(q)e(q)任务误差例如末端位置偏差、关节角度偏差J(q)任务雅可比矩阵是误差对构型 q 的一阶导数α (gain)任务增益取值 [0, 1]越小收敛越平滑Δq逆运动学输出的构型位移多个任务同时存在时可能冲突Pink 通过成本cost归一化统一量纲并把配置限制、速度限制等约束一起打包成二次规划QP问题交由 QP 求解器求解。这套 QP 的构建逻辑在 pink/solve_ik.py 的build_ik()中完成。Task 基类自定义任务的三要素Pink 中所有运动学任务都继承自 pink/tasks/task.py 中的Task抽象基类。开发自定义任务只需关注三件事要素说明典型用法compute_error()必须实现。返回任务误差向量 e(q)目标位置 − 当前位置compute_jacobian()必须实现。返回 J(q)形状为 k×n_v误差对构型的导数cost/gain/lm_damping基类已提供的三个调参属性权重、收敛速度、LM 阻尼三个调参属性值得理解cost把不同单位米、弧度的误差归一到同一成本单位。比如 1 厘米的位置误差与 10 厘米的误差在加权后的代价关系由 cost 决定它是多任务冲突仲裁的核心。gain默认 1.0 为死拍控制最快收敛调低相当于低通滤波任务更平滑但更慢。lm_dampingLevenberg-Marquardt 阻尼仅在大误差时生效。目标不可达时任务会抖动适当增大它能稳住运动但过大会拖慢任务。QP 目标函数基类帮你自动完成的部分你不需要手写 QP基类的compute_qp_objective()已把误差和雅可比转换为 QP 目标函数中的一项½ ‖ J·Δq α·e ‖²_W ½ ΔqᵀHΔq cᵀΔq它返回(H, c)矩阵-向量对其中权重矩阵 W 由cost构造标量或向量LM 阻尼项 μ·I 加到 Hessian 上μ 与误差平方成正比pink/solve_ik.py中的__compute_qp_objective()会把所有任务的 (H, c)逐项累加再加上 Tikhonov 阻尼项得到最终 QP也就是说你只要正确实现误差和雅可比QP 组装完全自动化。分步流程从 0 到 1 写一个自定义任务推荐按以下 5 步走以库内现成任务为参照都在pink/tasks/目录下第 1 步选一个相近的内置任务当模板Pink 已内置 13 种任务源码是最好的教材pink/tasks/posture_task.py最简单的任务误差 目标姿态 − 当前姿态雅可比是单位阵pink/tasks/frame_task.py含 SO(3) 对数映射的非线性误差展示如何用pin.log()处理流形上的误差pink/tasks/joint_velocity_task.py误差与构型无关直接是参考速度的特例第 2 步继承 Task 并实现两个抽象方法from pink.tasks import Task class MyTask(Task): def __init__(self, cost, gain1.0, lm_damping0.0): super().__init__(costcost, gaingain, lm_dampinglm_damping) self.target None def set_target(self, target): self.target target.copy() def compute_error(self, configuration) - np.ndarray: # 返回 e(q)维度 k ... def compute_jacobian(self, configuration) - np.ndarray: # 返回 J(q)形状 (k, nv) ...第 3 步正确处理流形误差与单位位置类误差可直接相减姿态类误差要用pin.log()或对偶算子参考FrameTask.compute_error()关节角度差用pin.difference()参考PostureTask未设置目标时抛出TargetNotSet来自pink/exceptions.py这是库内统一规范第 4 步实现__repr__按项目规范见 doc/developer-notes.rst__repr__放在文件末尾只报告有效果的参数父类属性排在后面。它会让你的任务在调试日志和异常信息中可读。第 5 步接入求解并验证from pink import solve_ik tasks [my_task, posture_task] v solve_ik(configuration, tasks, dt, solversolver) configuration.integrate_inplace(v, dt)用法示例可参考 examples/arm_ur5.py构造任务 →set_target_from_configuration()→ 循环中solve_ik() 积分。测试与调参技巧✅写个单元测试库内tests/目录下每个任务都有对应测试如test_posture_task.py、test_frame_task.py断言误差维度、雅可比形状和数值即可照抄模式。任务抖动增大lm_damping任务收敛慢调大gain上限 1.0任务被其他任务压制增大它的cost。⚠️求解失败若 QP 无解solve_ik()会抛出NoSolutionFound——先检查目标是否超出关节限位再考虑放松约束。相关文件速查文件作用pink/tasks/task.pyTask抽象基类与 QP 目标函数推导pink/solve_ik.pyQP 组装与求解入口solve_ik()pink/configuration.pyConfiguration提供雅可比、变换等运动学查询pink/exceptions.pyTargetNotSet等统一异常pink/tasks/13 种内置任务实现最佳学习模板掌握实现误差 实现雅可比这两个核心方法Pink 就会自动帮你完成从任务到 QP 目标函数的全部工作——这正是 Pink 逆运动库设计的精髓所在。【免费下载链接】pinkPython inverse kinematics using Pinocchio and QP solvers项目地址: https://gitcode.com/gh_mirrors/pink1/pink创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表