平面三轴机器人的阻尼最小二乘法(DLS)逆运动学求解

平面三轴机器人的阻尼最小二乘法(DLS)逆运动学求解

1. 问题定义

对于平面三轴机器人,我们有:

  • 三个连杆,长度分别为 l1l_1l1​, l2l_2l2​, l3l_3l3​
  • 三个关节角 θ1\theta_1θ1​, θ2\theta_2θ2​, θ3\theta_3θ3​
  • 末端执行器的目标位置 ptarget=[xtarget,ytarget]T\mathbf{p}_{target} = [x_{target}, y_{target}]^Tptarget​=[xtarget​,ytarget​]T

逆运动学问题就是:给定目标位置 ptarget\mathbf{p}_{target}ptarget​,求解关节角度 q=[θ1,θ2,θ3]T\mathbf{q} = [\theta_1, \theta_2, \theta_3]^Tq=[θ1​,θ2​,θ3​]T,使末端执行器位置 p(q)\mathbf{p}(\mathbf{q})p(q) 尽可能接近目标位置。

2. 前向运动学

首先,让我们定义机器人的前向运动学。基座位于原点 (0,0)(0,0)(0,0),各关节和末端执行器的位置计算如下:

关节1的位置:
p1=[l1cos⁡(θ1)l1sin⁡(θ1)]\mathbf{p}_1 = \begin{bmatrix} l_1\cos(\theta_1) \\ l_1\sin(\theta_1) \end{bmatrix}p1​=[l1​cos(θ1​)l1​sin(θ1​)​]

关节2的位置:
p2=p1+[l2cos⁡(θ1+θ2)l2sin⁡(θ1+θ2)]\mathbf{p}_2 = \mathbf{p}_1 + \begin{bmatrix} l_2\cos(\theta_1 + \theta_2) \\ l_2\sin(\theta_1 + \theta_2) \end{bmatrix}p2​=p1​+[l2​cos(θ1​+θ2​)l2​sin(θ1​+θ2​)​]

末端执行器的位置:
p(q)=p2+[l3cos⁡(θ1+θ2+θ3)l3sin⁡(θ1+θ2+θ3)]\mathbf{p}(\mathbf{q}) = \mathbf{p}_2 + \begin{bmatrix} l_3\cos(\theta_1 + \theta_2 + \theta_3) \\ l_3\sin(\theta_1 + \theta_2 + \theta_3) \end{bmatrix}p(q)=p2​+[l3​cos(θ1​+θ2​+θ3​)l3​sin(θ1​+θ2​+θ3​)​]

3. 雅可比矩阵

雅可比矩阵 J(q)\mathbf{J}(\mathbf{q})J(q) 表示末端执行器位置对关节角的偏导数:

J(q)=∂p∂q=[∂x∂θ1∂x∂θ2∂x∂θ3∂y∂θ1∂y∂θ2∂y∂θ3]\mathbf{J}(\mathbf{q}) = \frac{\partial \mathbf{p}}{\partial \mathbf{q}} = \begin{bmatrix} \frac{\partial x}{\partial \theta_1} & \frac{\partial x}{\partial \theta_2} & \frac{\partial x}{\partial \theta_3} \\ \frac{\partial y}{\partial \theta_1} & \frac{\partial y}{\partial \theta_2} & \frac{\partial y}{\partial \theta_3} \end{bmatrix}J(q)=∂q∂p​=[∂θ1​∂x​∂θ1​∂y​​∂θ2​∂x​∂θ2​∂y​​∂θ3​∂x​∂θ3​∂y​​]

对于平面三轴机器人,计算各偏导数:

设 θ12=θ1+θ2\theta_{12} = \theta_1 + \theta_2θ12​=θ1​+θ2​ 和 θ123=θ1+θ2+θ3\theta_{123} = \theta_1 + \theta_2 + \theta_3θ123​=θ1​+θ2​+θ3​

对 θ1\theta_1θ1​ 的偏导数:
∂x∂θ1=−l1sin⁡(θ1)−l2sin⁡(θ12)−l3sin⁡(θ123)\frac{\partial x}{\partial \theta_1} = -l_1\sin(\theta_1) - l_2\sin(\theta_{12}) - l_3\sin(\theta_{123})∂θ1​∂x​=−l1​sin(θ1​)−l2​sin(θ12​)−l3​sin(θ123​)
∂y∂θ1=l1cos⁡(θ1)+l2cos⁡(θ12)+l3cos⁡(θ123)\frac{\partial y}{\partial \theta_1} = l_1\cos(\theta_1) + l_2\cos(\theta_{12}) + l_3\cos(\theta_{123})∂θ1​∂y​=l1​cos(θ1​)+l2​cos(θ12​)+l3​cos(θ123​)

对 θ2\theta_2θ2​ 的偏导数:
∂x∂θ2=−l2sin⁡(θ12)−l3sin⁡(θ123)\frac{\partial x}{\partial \theta_2} = -l_2\sin(\theta_{12}) - l_3\sin(\theta_{123})∂θ2​∂x​=−l2​sin(θ12​)−l3​sin(θ123​)
∂y∂θ2=l2cos⁡(θ12)+l3cos⁡(θ123)\frac{\partial y}{\partial \theta_2} = l_2\cos(\theta_{12}) + l_3\cos(\theta_{123})∂θ2​∂y​=l2​cos(θ12​)+l3​cos(θ123​)

对 θ3\theta_3θ3​ 的偏导数:
∂x∂θ3=−l3sin⁡(θ123)\frac{\partial x}{\partial \theta_3} = -l_3\sin(\theta_{123})∂θ3​∂x​=−l3​sin(θ123​)
∂y∂θ3=l3cos⁡(θ123)\frac{\partial y}{\partial \theta_3} = l_3\cos(\theta_{123})∂θ3​∂y​=l3​cos(θ123​)

因此雅可比矩阵为:

J(q)=[−l1sin⁡(θ1)−l2sin⁡(θ12)−l3sin⁡(θ123)−l2sin⁡(θ12)−l3sin⁡(θ123)−l3sin⁡(θ123)l1cos⁡(θ1)+l2cos⁡(θ12)+l3cos⁡(θ123)l2cos⁡(θ12)+l3cos⁡(θ123)l3cos⁡(θ123)]\mathbf{J}(\mathbf{q}) = \begin{bmatrix} -l_1\sin(\theta_1) - l_2\sin(\theta_{12}) - l_3\sin(\theta_{123}) & -l_2\sin(\theta_{12}) - l_3\sin(\theta_{123}) & -l_3\sin(\theta_{123}) \\ l_1\cos(\theta_1) + l_2\cos(\theta_{12}) + l_3\cos(\theta_{123}) & l_2\cos(\theta_{12}) + l_3\cos(\theta_{123}) & l_3\cos(\theta_{123}) \end{bmatrix}J(q)=[−l1​sin(θ1​)−l2​sin(θ12​)−l3​sin(θ123​)l1​cos(θ1​)+l2​cos(θ12​)+l3​cos(θ123​)​−l2​sin(θ12​)−l3​sin(θ123​)l2​cos(θ12​)+l3​cos(θ123​)​−l3​sin(θ123​)l3​cos(θ123​)​]

4. 阻尼最小二乘法(DLS)推导

4.1 基本思路

逆运动学问题可以表示为:给定当前关节角 q\mathbf{q}q 和目标位置 ptarget\mathbf{p}_{target}ptarget​,找到关节角的微小变化 Δq\Delta \mathbf{q}Δq,使末端执行器位置更接近目标位置。

根据微小变化的线性近似:
p(q+Δq)≈p(q)+J(q)Δq\mathbf{p}(\mathbf{q} + \Delta \mathbf{q}) \approx \mathbf{p}(\mathbf{q}) + \mathbf{J}(\mathbf{q}) \Delta \mathbf{q}p(q+Δq)≈p(q)+J(q)Δq

因此我们希望解决:
J(q)Δq=e\mathbf{J}(\mathbf{q}) \Delta \mathbf{q} = \mathbf{e}J(q)Δq=e

其中 e=ptarget−p(q)\mathbf{e} = \mathbf{p}_{target} - \mathbf{p}(\mathbf{q})e=ptarget​−p(q) 是当前位置误差。

4.2 最小二乘解法

对于上述方程,标准最小二乘解为:
Δq=J+e\Delta \mathbf{q} = \mathbf{J}^+ \mathbf{e}Δq=J+e

其中 J+\mathbf{J}^+J+ 是雅可比矩阵的伪逆(Moore-Penrose逆):
J+=(JTJ)−1JT\mathbf{J}^+ = (\mathbf{J}^T \mathbf{J})^{-1} \mathbf{J}^TJ+=(JTJ)−1JT

然而,当机器人接近奇异构型时,JTJ\mathbf{J}^T \mathbf{J}JTJ 接近奇异,导致数值不稳定。

4.3 阻尼最小二乘法

阻尼最小二乘法通过在目标函数中引入正则化项来解决这个问题:

min⁡Δq∥JΔq−e∥2+λ2∥Δq∥2\min_{\Delta \mathbf{q}} \|\mathbf{J} \Delta \mathbf{q} - \mathbf{e}\|^2 + \lambda^2 \|\Delta \mathbf{q}\|^2Δqmin​∥JΔq−e∥2+λ2∥Δq∥2

其中 λ\lambdaλ 是阻尼因子,用于平衡位置精度和关节移动幅度。

对上述式子求导并令其等于零:

JT(JΔq−e)+λ2Δq=0\mathbf{J}^T (\mathbf{J} \Delta \mathbf{q} - \mathbf{e}) + \lambda^2 \Delta \mathbf{q} = \mathbf{0}JT(JΔq−e)+λ2Δq=0

JTJΔq−JTe+λ2Δq=0\mathbf{J}^T \mathbf{J} \Delta \mathbf{q} - \mathbf{J}^T \mathbf{e} + \lambda^2 \Delta \mathbf{q} = \mathbf{0}JTJΔq−JTe+λ2Δq=0

(JTJ+λ2I)Δq=JTe(\mathbf{J}^T \mathbf{J} + \lambda^2 \mathbf{I}) \Delta \mathbf{q} = \mathbf{J}^T \mathbf{e}(JTJ+λ2I)Δq=JTe

因此,DLS的解为:

Δq=(JTJ+λ2I)−1JTe\Delta \mathbf{q} = (\mathbf{J}^T \mathbf{J} + \lambda^2 \mathbf{I})^{-1} \mathbf{J}^T \mathbf{e}Δq=(JTJ+λ2I)−1JTe

这可以重写为:

Δq=JT(JJT+λ2I)−1e\Delta \mathbf{q} = \mathbf{J}^T (\mathbf{J} \mathbf{J}^T + \lambda^2 \mathbf{I})^{-1} \mathbf{e}Δq=JT(JJT+λ2I)−1e

后一种形式在我们的问题中更有效,因为雅可比矩阵 J\mathbf{J}J 是 2×32 \times 32×3 的,所以 JJT\mathbf{J} \mathbf{J}^TJJT 是 2×22 \times 22×2 的,计算逆矩阵更高效。

4.4 阻尼因子的选择

阻尼因子 λ\lambdaλ 的选择很关键:

  • 较大的 λ\lambdaλ 会导致稳定但缓慢的收敛
  • 较小的 λ\lambdaλ 会导致快速但可能不稳定的收敛

常见的选择包括:

  1. 固定值(如我们的实现)
  2. 基于奇异值的自适应选择
  3. 基于误差大小的自适应选择

5. 迭代算法

阻尼最小二乘法的迭代过程如下:

  1. 初始化关节角 q\mathbf{q}q
  2. 重复以下步骤,直到收敛或达到最大迭代次数:
    a. 计算当前末端执行器位置 p(q)\mathbf{p}(\mathbf{q})p(q)
    b. 计算位置误差 e=ptarget−p(q)\mathbf{e} = \mathbf{p}_{target} - \mathbf{p}(\mathbf{q})e=ptarget​−p(q)
    c. 如果 ∥e∥<ϵ\|\mathbf{e}\| < \epsilon∥e∥<ϵ(预设阈值),则收敛,退出
    d. 计算雅可比矩阵 J(q)\mathbf{J}(\mathbf{q})J(q)
    e. 计算DLS逆 JDLS+=JT(JJT+λ2I)−1\mathbf{J}_{DLS}^+ = \mathbf{J}^T (\mathbf{J} \mathbf{J}^T + \lambda^2 \mathbf{I})^{-1}JDLS+​=JT(JJT+λ2I)−1
    f. 计算关节角增量 Δq=JDLS+e\Delta \mathbf{q} = \mathbf{J}_{DLS}^+ \mathbf{e}Δq=JDLS+​e
    g. 更新关节角 q←q+Δq\mathbf{q} \leftarrow \mathbf{q} + \Delta \mathbf{q}q←q+Δq
    h. 将关节角归一化到合理范围(例如 [−π,π][-\pi, \pi][−π,π])

6. 具体算例迭代过程

假设我们有以下参数:

  • 连杆长度:l1=1.0l_1 = 1.0l1​=1.0, l2=0.8l_2 = 0.8l2​=0.8, l3=0.6l_3 = 0.6l3​=0.6
  • 初始关节角:θ1=π/6\theta_1 = \pi/6θ1​=π/6, θ2=π/4\theta_2 = \pi/4θ2​=π/4, θ3=π/3\theta_3 = \pi/3θ3​=π/3
  • 目标位置:ptarget=[1.5,1.0]T\mathbf{p}_{target} = [1.5, 1.0]^Tptarget​=[1.5,1.0]T
  • 阻尼因子:λ=0.1\lambda = 0.1λ=0.1
  • 收敛阈值:ϵ=10−4\epsilon = 10^{-4}ϵ=10−4

第1次迭代

  1. 计算初始位置
    p(q0)=[1.830,0.897]T\mathbf{p}(\mathbf{q}_0) = [1.830, 0.897]^Tp(q0​)=[1.830,0.897]T
  2. 计算位置误差
    e0=ptarget−p(q0)=[1.5,1.0]T−[1.830,0.897]T=[−0.330,0.103]T\mathbf{e}_0 = \mathbf{p}_{target} - \mathbf{p}(\mathbf{q}_0) = [1.5, 1.0]^T - [1.830, 0.897]^T = [-0.330, 0.103]^Te0​=ptarget​−p(q0​)=[1.5,1.0]T−[1.830,0.897]T=[−0.330,0.103]T
    ∥e0∥=0.345\|\mathbf{e}_0\| = 0.345∥e0​∥=0.345
  3. 计算雅可比矩阵 J(q0)\mathbf{J}(\mathbf{q}_0)J(q0​)
    (略,根据前面的公式计算)
  4. 计算DLS逆
    JDLS+=JT(JJT+λ2I)−1\mathbf{J}_{DLS}^+ = \mathbf{J}^T (\mathbf{J} \mathbf{J}^T + \lambda^2 \mathbf{I})^{-1}JDLS+​=JT(JJT+λ2I)−1
  5. 计算关节角增量
    Δq0=JDLS+e0\Delta \mathbf{q}_0 = \mathbf{J}_{DLS}^+ \mathbf{e}_0Δq0​=JDLS+​e0​
    (具体数值计算略)
  6. 更新关节角
    q1=q0+Δq0\mathbf{q}_1 = \mathbf{q}_0 + \Delta \mathbf{q}_0q1​=q0​+Δq0​

第2次迭代

  1. 计算更新后的位置
    p(q1)\mathbf{p}(\mathbf{q}_1)p(q1​)
  2. 计算新的位置误差
    e1=ptarget−p(q1)\mathbf{e}_1 = \mathbf{p}_{target} - \mathbf{p}(\mathbf{q}_1)e1​=ptarget​−p(q1​)
    ∥e1∥\|\mathbf{e}_1\|∥e1​∥

继续迭代直到 ∥ek∥<ϵ\|\mathbf{e}_k\| < \epsilon∥ek​∥<ϵ 或达到最大迭代次数。

典型的迭代过程中,误差会呈现指数衰减的趋势,但具体收敛速度取决于:

  1. 初始关节角与目标位置的距离
  2. 阻尼因子 λ\lambdaλ 的大小
  3. 目标位置是否在工作空间内
  4. 是否接近奇异构型

在实际应用中,可能需要尝试不同的初始值和阻尼因子以获得最佳结果。

Read more

从零开始“养龙虾”:OpenClaw 本地极简部署与 QQ 机器人接入全保姆级教程

从零开始“养龙虾”:OpenClaw 本地极简部署与 QQ 机器人接入全保姆级教程

文章目录 * 引言 * 什么是 OpenClaw? * 为什么选择 OpenClaw? * 一、基础环境准备 * 1. 安装 Node.js (v22及以上) * 2.安装 Git * 3. 解决 npm 被拦截(没报错跳过) * 二、一键部署与唤醒“龙虾” * 1.全自动拉取与组装 * 2.醒龙虾与配置“大脑” * 三、接入官方 QQ 机器人(可选) * 1. 领取官方机器人的“身份证” * 2. 本地安装专属通信插件 * 3. 结果展示 * 总结 引言 什么是 OpenClaw? 最近开源界有一只“红皮小龙虾”非常火,它就是 OpenClaw。

【全网最全・保姆级】Stable Diffusion WebUI Windows 部署 + 全套报错终极解决方案

大家好,我是在部署 SD WebUI 过程中把几乎所有坑都踩了一遍的选手,从 Git 报错、模块缺失、依赖冲突到虚拟环境异常,全部踩完。今天把完整安装流程 + 我遇到的所有真实错误 + 一行一解全部整理出来,写成一篇能直接发 ZEEKLOG 的完整文章。 一、前言 Stable Diffusion WebUI 是目前 AI 绘画最主流的本地部署工具,但 Windows 环境下因为 Python 版本、虚拟环境、Git 仓库、依赖包、CLIP 编译 等问题,90% 的新手都会启动失败。本文包含: * 标准 Windows 一键部署流程 * 我真实遇到的 10+ 种报错 * 每一种报错的 原因 + 直接复制可用的命令 * 最终测试出图提示词(

【具身智能】机器人训练流程

机器人训练是一个涵盖硬件和软件、仿真与现实的复杂系统工程。不同类型的机器人(工业机械臂、服务机器人、人形机器人等)训练方法差异很大,但核心逻辑是相通的。 下面将梳理机器人训练的核心流程、关键技术和不同范式: 一、 机器人训练的总体流程 一个完整的机器人训练周期通常包含以下闭环: 感知 → 决策 → 执行 → 反馈 → 学习与优化 二、 核心训练方法与技术 机器人训练主要分为两大类:传统方法和基于机器学习(尤其是强化学习)的方法。 1. 传统方法(基于模型与规则) * 原理:工程师为机器人建立精确的数学模型(运动学、动力学模型),并编写明确的控制规则和任务逻辑。 * 如何训练: * 系统辨识:通过让机器人执行特定动作并收集数据,来反推和校准其数学模型参数。 * 轨迹规划:在已知模型的基础上,规划出最优、无碰撞的运动路径。 * PID控制:调试比例、积分、微分参数,让机器人动作稳定精准。 * 适用场景:结构化环境中的重复性任务,如汽车制造线上的焊接、喷涂。 2.

FPGA教程系列-Vivado AXI4-Stream Data FIFO核解读测试

FPGA教程系列-Vivado AXI4-Stream Data FIFO核解读测试

FPGA教程系列-Vivado AXI4-Stream Data FIFO核解读测试 FIFO depth (FIFO 深度): 定义了 FIFO 能存储多少个数据字(Data Words)。 注意:实际占用的存储资源取决于深度乘以数据宽度(TDATA width)。 Memory type (存储器类型): Auto * 决定用 FPGA 内部的哪种资源来实现 FIFO。 * Auto: 让 Vivado 综合工具根据 FIFO 的大小自动选择(通常小 FIFO 用分布式 RAM/LUTRAM,大 FIFO 用块 RAM/BRAM)。 * Block RAM: 强制使用 BRAM。 * Distributed RAM: 强制使用 LUT 搭建的