Pink: 一个高效易用的机器人逆运动学库

参考: https://stephane-caron.github.io/pink/ 和 https://github.com/stephane-caron/pink?tab=readme-ov-file

在机器人运动规划与控制中,逆运动学(Inverse Kinematics, IK) 是一个核心问题:给定机器人期望的末端位置(比如机械臂要抓取的物体),如何计算出各个关节应该转动的角度?当机器人需要同时满足多个目标(如“伸手拿杯子”的同时还要“保持身体平衡”),并且受到关节限位等约束时,问题就变得更加复杂。

今天,我们来探索一个实测非常好用的 Python 库——Pink。它基于二次规划(Quadratic Programming, QP)来求解带约束的逆运动学问题,并由法国学者 Stéphane Caron 开发维护,兼具扎实的数学基础和优秀的工程实现。

什么是 QP-based IK?

传统的逆运动学方法在处理多个冲突的目标时往往力不从心。QP-based IK 通过“加权任务”的方式优雅地解决了这个问题。

其核心思想是:

  1. 定义任务:每个任务由一个残差函数 e ( q ) e(q) e(q) 定义,目标是将其驱零。例如,将脚移动到目标位置 p f o o t ⋆ p_{foot}^{\star} pfoot⋆​ 的任务可定义为: e ( q ) = p f o o t ⋆ − p f o o t ( q ) e(q) = p_{foot}^{\star} - p_{foot}(q) e(q)=pfoot⋆​−pfoot​(q)
  2. 一阶近似:我们希望找到一个关节速度 v v v,使得任务沿着梯度下降方向优化,即满足 J e ( q ) v = − α e ( q ) J_e(q) v = -\alpha e(q) Je​(q)v=−αe(q)。这里的 J e ( q ) J_e(q) Je​(q) 是任务雅可比矩阵, α \alpha α是任务增益。
  3. 构建优化问题:当有多个任务时,我们无法同时完美满足所有任务。因此,将所有任务的目标统一到一个框架下,并通过加权来解决冲突,最终形成一个”二次规划(QP)“问题:
    min ⁡ v ∑ task  e ∥ J e ( q ) v + α e ( q ) ∥ W e 2 s.t. v min ( q ) ≤ v ≤ v max ( q ) \min_{v} \sum_{\text{task } e} \| J_e(q) v + \alpha e(q) \|^2_{W_e} \quad \text{s.t.} \quad v_{\text{min}}(q) \leq v \leq v_{\text{max}}(q) vmin​task e∑​∥Je​(q)v+αe(q)∥We​2​s.t.vmin​(q)≤v≤vmax​(q)
    这里, W e W_e We​ 就是任务的权重,权重越高,优先级越高。

Pink 库:让复杂的 QP-based IK 变得简单

Pink 正是基于上述理论,并依托强大的机器人动力学库 Pinocchio 构建的。它将复杂的 QP 问题封装在简洁的 API 背后,让用户能专注于机器人本身的任务定义。

Pink 是如何工作的?

Pink 在求解时,会将连续的 QP 问题离散化,将优化变量由速度 v v v 转换为关节空间的增量 Δ q = v Δ t \Delta q = v \Delta t Δq=vΔt。

对于一个单独的任务,其贡献给总优化目标的函数是:
∥ J Δ q + α e ∥ W 2 + μ ∥ Δ q ∥ 2 \| J \Delta q + \alpha e \|^2_W + \mu \|\Delta q\|^2 ∥JΔq+αe∥W2​+μ∥Δq∥2

  • J , e J, e J,e:由具体任务计算出的雅可比矩阵和误差。
  • α \alpha α:任务增益(gain),控制任务收敛的速度。
  • W W W:权重矩阵(cost),定义任务内不同维度(如位置 vs 姿态)的重要性。
  • μ \mu μ:Levenberg-Marquardt 阻尼(lm_damping),用于保证数值求解的稳定性。

PINK 会将所有任务(Task)、障碍物约束(Barrier)和关节限制(Limit)的目标和约束,统一转换为标准 QP 形式 1 2 Δ q T H Δ q + c T Δ q \frac{1}{2} \Delta q^T H \Delta q + c^T \Delta q 21​ΔqTHΔq+cTΔq 的矩阵 H H H 和向量 c c c,然后调用其自带的 qpsolvers 库(支持 OSQP、DAQP 等多种求解器)进行高效求解。

核心任务详解:FrameTask 与 PostureTask

Pink 预置了多种任务类型,其中最常用的是以下两个:

1. 末端位姿跟踪任务(FrameTask)

目标:驱动机器人的某个“框架”(如夹爪、脚底)到达目标位置和姿态。

这是 IK 中最核心的任务。它的难点在于,机器人的位姿变化是定义在李群上的,而误差和雅可比的求导不能简单地在欧式空间进行。很多 IK 库在这里会出错。

Pink 的作者 Stéphane Caron 在其博客中特别澄清了这一点,并在 Pink 中给出了正确实现。简单来说,它通过在李代数(切空间)上定义误差 e e e 和雅可比 J J J,保证了数学上的精确性,从而让末端运动更加精准稳定。

2. 关节角任务(PostureTask)

目标:让机器人的关节角度趋向于一个给定的“舒适”姿态 q ∗ q^* q∗。
这个任务通常用作正则化项。当主任务(如 FrameTask)因为奇异或不可达而失效时,PostureTask 可以发挥作用,防止关节速度失控发散,驱动机器人回到一个安全的姿态。
PostureTask 的 QP 目标函数为:

H t a s k = J T W J + μ I H_{task}=J^TWJ+μI Htask​=JTWJ+μI
c t a s k = − α e T W J c_{task}= -\alpha e^T W J ctask​=−αeTWJ

它的计算非常简单:

  • 误差: e = q ∗ − q e = q^* - q e=q∗−q
  • 雅可比: J = I J = I J=I(单位阵)
    通过调整其权重 W W W,可以控制关节回正的“力度”。
注意事项
  1. PostureTask 不会影响浮动基座的自由度,只作用于实际的关节角。
  2. 由于其雅可比恒为满秩,PostureTask 常用于正则化,防止主任务奇异时解发散
  3. 任务权重 W W W可以用来调节不同关节的优先级或灵敏度

与Pinocchio+CasADi的区别

  1. Pink: 专用 IK 求解器. 专注于解决多任务、带约束的微分逆运动学问题。它是一个“开箱即用”的工具。
  2. Pinocchio+CasADi: 通用开发框架. Pinocchio 提供高效的运动学和动力学算法 ,CasADi 提供符号计算和数值优化。两者结合,用于构建自定义的、复杂的优化问题,如轨迹优化、MPC等。

Read more

自适应图像变焦与边界框变换用于无人机目标检测

自适应图像变焦与边界框变换用于无人机目标检测

作者: Tao Wang, Chenyu Lin, Chenwei Tang, Jizhe Zhou, Deng Xiong, Jianan Li, Jian Zhao, Jiancheng Lv 亮点 * 自适应空间变换: 对图像进行自适应空间变换可以有效地放大物体细节。 * 框变换: 框变换使得检测器能够在图像变换的空间中进行训练和推理。 * 实验效果: 在多种无人机图像数据集上的实验表明,该方法以较小的代价获得了有效的增益。 * 灵活模块化设计: 灵活的模块化设计使其能够与其他方法和任务场景集成。 https://arxiv.org/pdf/2602.07512 摘要 由于物体尺寸较小,从无人机(UAV)拍摄的图像中检测物体具有挑战性。在这项工作中,我们探索了一种简单高效的自适应变焦框架,用于无人机图像的目标检测。主要动机是,前景物体通常比普通场景图像中的物体更小且更稀疏,这阻碍了有效目标检测器的优化。因此,我们的目标是自适应地放大物体,以便更好地捕捉用于检测任务的物体特征。为了实现这一目标,需要两个核心设计:i)

快过年了,写个游戏玩玩,放松下,解析俄罗斯方块游戏(可直接复制代码使用,玩游戏)。罗斯方块游戏技术解析:从前端实现到工程化思考

快过年了,写个游戏玩玩,放松下,解析俄罗斯方块游戏(可直接复制代码使用,玩游戏)。罗斯方块游戏技术解析:从前端实现到工程化思考

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎点赞 + 收藏 + 关注哦 💕 快过年了,写个游戏玩玩,放松下,解析俄罗斯方块游戏(可直接复制代码,玩游戏)。罗斯方块游戏技术解析:从前端实现到工程化思考 📚 本文简介 本文解析了一个基于HTML5+CSS3+JavaScript的俄罗斯方块网页游戏实现。项目采用模块化设计,包含index.html、style.css和script.js三个核心文件,遵循前端开发最佳实践。HTML结构采用语义化布局,使用Canvas双画布分别渲染主游戏区和预览区。CSS运用Flexbox布局、毛玻璃效果、过渡动画等现代特性,实现响应式设计。JavaScript处理游戏逻辑,包括方块旋转、碰撞检测等核心算法。项目兼顾性能与用户体验,是前端游戏开发的经典案例。全文从架构设计到实现细节进行了深度技术解析。 目录 * 快过年了,写个游戏玩玩,放松下,解析俄罗斯方块游戏(可直接复制代码,玩游戏)。罗斯方块游戏技术解析:

Nanbeige4.1-3B快速上手:用curl命令直连WebUI API完成批量推理任务

Nanbeige4.1-3B快速上手:用curl命令直连WebUI API完成批量推理任务 1. 引言:为什么需要绕过WebUI直接调用API? 如果你已经通过WebUI体验过Nanbeige4.1-3B的强大能力,可能会遇到这样的场景:需要一次性处理几十甚至上百个文本任务,比如批量生成产品描述、分析大量用户反馈,或者为数据集中的每条记录生成摘要。这时候,如果还在WebUI里一条条手动输入、点击生成,效率就太低了。 有没有更高效的方法?当然有。Nanbeige4.1-3B的WebUI背后,其实是一个标准的HTTP API服务。这意味着,我们可以直接用命令行工具(比如curl)或者写个简单的脚本,直接和这个API“对话”,实现自动化、批量化的文本生成。这就像是从手动拧螺丝升级到了电动螺丝刀,效率提升不是一点半点。 这篇文章,我就带你绕过漂亮的WebUI界面,直连背后的API引擎,用最朴素的curl命令,解锁Nanbeige4.1-3B的批量推理能力。你会发现,原来命令行操作大模型,可以如此简单直接。 2. 准备工作:确认你的WebUI服务正在运行 在开始“飙车”之前,得先

gpt-oss-20b-WEBUI功能全测评,Ollama集成太方便了

gpt-oss-20b-WEBUI功能全测评,Ollama集成太方便了 你有没有试过这样的场景:刚下载完一个大模型镜像,打开网页界面却卡在加载页;调了半小时参数,生成结果还是断句生硬、逻辑跳脱;想换模型又得重装环境,显存爆红、报错满屏……别急,这次我们实测的 gpt-oss-20b-WEBUI 镜像,把“开箱即用”四个字真正落到了实处——双卡4090D上一键启动,vLLM加速跑满吞吐,网页界面清爽无干扰,最关键的是,它和Ollama的集成不是“能连”,而是“连得毫无负担”。 这不是一个需要你查文档、改配置、编译依赖的实验性项目。它是一套已经调优完毕、开网页就能聊、敲命令就能跑、导出API就能集成的完整本地推理方案。本文将带你从零开始,真实走一遍它的全部能力:界面交互是否顺滑?响应速度到底多快?支持哪些实用功能?Ollama集成究竟有多省事?以及——它到底适不适合你手头那个还没上线的AI小项目? 1. 镜像初体验:三步启动,五秒进对话页 很多WEBUI镜像的“快速启动”,往往藏在一堆前置条件里。而gpt-oss-20b-WEBUI的启动路径异常干净,我们全程在ZEEKLOG星图