【机器人学导论】6自由度机械臂逆运动学求解—牛顿法(数值法,仅旋转关节)

本文主要是介绍【机器人学导论】6自由度机械臂逆运动学求解—牛顿法(数值法,仅旋转关节),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

我以前是机器人专业,不过学的不多,教程应该是灰色封面的《机器人学导论》。3年前学的了,软件仿真学的是ABB,上手操作是KUKA的机器人。本文是给别人解决问题的记录,写个笔记。代码是matlab的,不免费分享,但是看我的解析应该也能自己写出来。我不从事这个行业,很多东西已经模糊了。

文章目录

  • 一、DH参数
  • 二、正向运动学
  • 三、逆向运动学
    • 3.1 逆向运动学的求解方法:
      • 3.11 解析法(Analytical Method)
      • 3.12 数值法(Numerical Method)
    • 3.2 应用和挑战
  • 四、牛顿法机械臂逆运动学求解详解
    • 4.1 牛顿法
    • 4.2 牛顿法逆运动学求解算法
    • 4.3 代码(matlab)
      • 4.31 正向
      • 4.32 逆向
  • 五、齐次变换矩阵推导
    • 5.1 基本变换
    • 5.2 齐次变换矩阵的推导
    • 5.3 齐次变换矩阵的合成

一、DH参数

DH参数(Denavit-Hartenberg参数)是用于描述机械臂关节和连杆之间几何关系的一种标准方法。通过DH参数表,可以将机械臂的复杂几何结构简化为一系列标准化的变换,这些变换可以用于建立机械臂的运动学模型。

DH参数包括四个变量: α \alpha α a a a d d d θ \theta θ,它们分别描述了相邻连杆之间的空间关系。具体描述如下:

  1. α i \alpha_i αi(杆件扭角)

    • 定义:第 i i i根连杆和第 i − 1 i-1 i1根连杆的坐标系 Z Z Z轴之间的旋转角度,绕着第 i − 1 i-1 i1根连杆的 X i − 1 X_{i-1} Xi1轴进行旋转。
    • 作用:描述相邻两连杆之间的“扭曲”程度。
  2. a i a_i ai(杆件长度)

    • 定义:第 i i i根连杆上,坐标系 Z i − 1 Z_{i-1} Zi1轴沿 X i − 1 X_{i-1} Xi1轴到达 Z i Z_i Zi轴的距离,即相邻连杆 Z Z Z轴之间的距离。
    • 作用:描述相邻两连杆的“位移”距离。
  3. d i d_i di(关节距离)

    • 定义:第 i i i个关节沿 Z i Z_i Zi轴的偏移量,即从第 i i i根连杆的原点到第 i + 1 i+1 i+1根连杆的原点的位移。
    • 作用:描述关节在其轴线上的移动。
  4. θ i \theta_i θi(关节角)

    • 定义:第 i i i个关节绕着 Z i Z_i Zi轴旋转的角度。
    • 作用:描述关节的旋转角度。

如果你操作过机械臂或者近距离见过机械臂就能很好的理解这些参数,看那些示意图,画几个坐标是不够清晰的。

你可以使用ABB机器人仿真软件RobotStudio,仿真、操作机械臂。

如下图,可以看到这个机械臂只能转动(绝大多数机械臂都是这样的),每个关节转动到一定的角度,末端执行器就能到达不同的位姿(位置和姿态)。

机械臂的转动部位通常是关节。在机械臂中,关节(Joint)是用于连接相邻连杆(Link)的部件,并赋予机械臂一定的自由度,使得机械臂能够在空间中执行各种复杂的运动。每个关节通常会允许一个连杆相对于另一个连杆进行旋转或平移。

机械臂的关节可以分为以下几种类型:

  1. 旋转关节(Revolute Joint):这种关节允许连杆围绕一个固定轴进行旋转,类似于人类的肘关节。DH参数中的关节角 θ \theta θ就是描述旋转关节的旋转角度。

  2. 滑动关节(Prismatic Joint):这种关节允许连杆沿着一个固定方向进行平移,类似于推拉门的运动。DH参数中的关节距离 d d d就是描述滑动关节的平移距离。

  3. 球形关节(Spherical Joint):这种关节允许连杆绕着一个固定点进行多个方向的旋转,类似于人类的肩关节。

  4. 螺旋关节(Helical Joint):这种关节结合了旋转和滑动两种运动,即连杆在旋转的同时也进行平移。

最下面是底座,通常是固定的,与第一个连杆使用转动关节连接,它可以绕着竖直方向转,这个方向就是Z轴,X、Y轴则是右手定则确定。

以此类推,每个连杆都可以绕着前一个连杆末端的轴转动,最末端黑色那里要安装末端执行器,比如抓手、焊枪等等,上面还会有一些控制线缆来控制末端执行器,图中没显示。(这些关节转动角度通常是有角度限制的)

转动距离底座越近的关节,末端执行器的位姿变化就越大。
在这里插入图片描述

自由度是指机械臂在空间中可以独立控制的方向数(比如绕某个轴旋转、平移),上图机械臂的自由度是多少?

现在再结合坐标系理解一下:坐标系0(基坐标系)和1通常是重合的。
在这里插入图片描述

二、正向运动学

正向运动学(Forward Kinematics,FK)是机器人学中研究机械臂末端执行器在已知关节参数条件下的位置和姿态的计算方法。换句话说,正向运动学是给定机械臂各个关节的角度或位移,求解机械臂末端执行器在空间中的位置和朝向。

🟢基本概念:

  1. 连杆(Link):机械臂的刚性部分,连接两个相邻的关节。
  2. 关节(Joint):机械臂的运动部分,连接相邻的连杆。关节可以是旋转关节或滑动关节。
  3. 末端执行器(End-Effector):机械臂的末端部分,用于执行任务,例如抓取、焊接等。其位置和姿态由机械臂的关节参数决定。
  4. 关节变量:描述关节运动的参数,对于旋转关节是旋转角度 θ \theta θ,对于滑动关节是位移 d d d

前面图中的机械臂,只能转动,通过确定各个关节的角度,就可以确定末端执行器的位姿。

🟢基本流程:

  1. 建立坐标系:为每个连杆和关节分配一个局部坐标系,一般使用DH(Denavit-Hartenberg)参数来描述这些坐标系之间的关系。
  2. 定义DH参数:根据机械臂的几何结构,计算每个连杆的DH参数,包括 α i \alpha_i αi(杆件扭角)、 a i a_i ai(杆件长度)、 d i d_i di(关节距离)和 θ i \theta_i θi(关节角)。
  3. 建立齐次变换矩阵:通过DH参数,可以为每个关节建立一个齐次变换矩阵 T i T_i Ti,该矩阵描述了从关节 i − 1 i-1 i1的坐标系到关节 i i i的坐标系的变换关系。矩阵形式如下(推导看本文后面小节):

T i = [ cos ⁡ θ i − sin ⁡ θ i cos ⁡ α i sin ⁡ θ i sin ⁡ α i a i cos ⁡ θ i sin ⁡ θ i cos ⁡ θ i cos ⁡ α i − cos ⁡ θ i sin ⁡ α i a i sin ⁡ θ i 0 sin ⁡ α i cos ⁡ α i d i 0 0 0 1 ] T_i = \begin{bmatrix} \cos\theta_i & -\sin\theta_i \cos\alpha_i & \sin\theta_i \sin\alpha_i & a_i \cos\theta_i \\ \sin\theta_i & \cos\theta_i \cos\alpha_i & -\cos\theta_i \sin\alpha_i & a_i \sin\theta_i \\ 0 & \sin\alpha_i & \cos\alpha_i & d_i \\ 0 & 0 & 0 & 1 \end{bmatrix} Ti= cosθisinθi00sinθicosαicosθicosαisinαi0sinθisinαicosθisinαicosαi0aicosθiaisinθidi1

  1. 连乘齐次变换矩阵:将所有的齐次变换矩阵按照关节的顺序连乘,得到从基坐标系到末端执行器坐标系的变换矩阵 T 0 , n T_{0,n} T0,n,即:

    T 0 , n = T 1 × T 2 × ⋯ × T n T_{0,n} = T_1 \times T_2 \times \dots \times T_n T0,n=T1×T2××Tn

    其中, T 0 , n T_{0,n} T0,n表示末端执行器相对于基座的齐次变换矩阵,即从坐标系0到n,有的写法是写在左边,如: 6 0 T _{6}^{0}T 60T

  2. 提取末端执行器的位置和姿态:从 T 0 , n T_{0,n} T0,n中可以提取出末端执行器的位置和姿态。位置由变换矩阵中的平移部分给出,姿态由旋转部分给出。

🟢末端执行器的位姿:

通过正向运动学的计算,我们可以得到机械臂末端执行器的位姿(位置和朝向)。假设 T 0 , n T_{0,n} T0,n为末端执行器的齐次变换矩阵,则:

  • 位置:末端执行器在空间中的位置由齐次变换矩阵的最后一列前三个元素表示,即:

位置 = [ x y z ] = [ T 0 , n ( 1 , 4 ) T 0 , n ( 2 , 4 ) T 0 , n ( 3 , 4 ) ] \text{位置} = \begin{bmatrix} x \\ y \\ z \end{bmatrix} = \begin{bmatrix} T_{0,n}(1,4) \\ T_{0,n}(2,4) \\ T_{0,n}(3,4) \end{bmatrix} 位置= xyz = T0,n(1,4)T0,n(2,4)T0,n(3,4)

  • 姿态:末端执行器在空间中的朝向由齐次变换矩阵的旋转部分表示,即前三行前三列的3x3矩阵:

姿态 = [ T 0 , n ( 1 , 1 ) T 0 , n ( 1 , 2 ) T 0 , n ( 1 , 3 ) T 0 , n ( 2 , 1 ) T 0 , n ( 2 , 2 ) T 0 , n ( 2 , 3 ) T 0 , n ( 3 , 1 ) T 0 , n ( 3 , 2 ) T 0 , n ( 3 , 3 ) ] \text{姿态} = \begin{bmatrix} T_{0,n}(1,1) & T_{0,n}(1,2) & T_{0,n}(1,3) \\ T_{0,n}(2,1) & T_{0,n}(2,2) & T_{0,n}(2,3) \\ T_{0,n}(3,1) & T_{0,n}(3,2) & T_{0,n}(3,3) \end{bmatrix} 姿态= T0,n(1,1)T0,n(2,1)T0,n(3,1)T0,n(1,2)T0,n(2,2)T0,n(3,2)T0,n(1,3)T0,n(2,3)T0,n(3,3)

🟢 正向运动学的应用
正向运动学在机器人学中的应用非常广泛,主要包括以下几个方面:

  1. 机器人控制:给定关节角度,通过正向运动学计算末端执行器的目标位置和姿态,并用于控制算法中。
  2. 路径规划:通过正向运动学计算不同关节角度下的末端执行器位置,用于生成合理的运动路径。
  3. 仿真与验证:在机器人仿真软件中,正向运动学用于验证机械臂的运动范围和操作能力。

三、逆向运动学

逆向运动学(Inverse Kinematics, IK)是机器人学中的一个重要问题,它的目标是给定机械臂末端执行器的目标位置和姿态,求解各个关节的角度或位移,使得机械臂能够到达这一目标位姿

逆向运动学的求解相对复杂,通常没有通用的解析解法,需要根据机械臂的结构和应用场景选择适合的方法。

🟢基本概念:

  1. 末端执行器位姿:指机械臂末端执行器在空间中的位置和朝向。通常用一个齐次变换矩阵 T 0 , n T_{0,n} T0,n或位置矢量 p = [ x , y , z ] T \mathbf{p} = [x, y, z]^T p=[x,y,z]T和姿态矩阵 R = [ R x , R y , R z ] R = [R_{x}, R_{y}, R_{z}] R=[Rx,Ry,Rz]来表示。
  2. 关节变量:描述机械臂每个关节的位置或角度。对于旋转关节,关节变量是角度 θ i \theta_i θi,对于滑动关节,关节变量是位移 d i d_i di
  3. 冗余度:如果机械臂的自由度(关节数)大于任务要求的自由度,则机械臂具有冗余度。冗余度允许机械臂在满足末端执行器位姿的同时,优化某些指标(如避障、最小能量消耗等)。

3.1 逆向运动学的求解方法:

逆向运动学的求解方法主要分为解析法和数值法两大类。

3.11 解析法(Analytical Method)

解析法试图通过代数运算直接求解机械臂的关节变量。这种方法通常适用于几何结构相对简单的机械臂(如6自由度机械臂),并且要求机械臂的运动学模型有明确的解析解。

步骤

  1. 建立正向运动学模型:根据机械臂的DH参数,建立机械臂的正向运动学模型,得到末端执行器的齐次变换矩阵 T 0 , n T_{0,n} T0,n
  2. 分解方程:将 T 0 , n T_{0,n} T0,n分解为位置部分和姿态部分的方程。
  3. 代数求解:通过代数方法(如三角函数关系、几何方法等)求解出关节变量。

优点

  • 计算速度快,适合实时控制。
  • 解法清晰明确。

缺点

  • 只适用于几何结构简单的机械臂。
  • 可能存在多个解或无解的情况。

3.12 数值法(Numerical Method)

对于复杂的机械臂结构,解析解通常难以获得,因此常用数值法求解逆向运动学。数值法基于迭代优化算法,通过逐步逼近目标位姿来求解关节变量。

常用方法

  1. 牛顿-拉夫森法(Newton-Raphson Method)

    • 基于正向运动学模型,通过迭代求解误差函数最小化来得到关节变量。误差函数通常定义为末端执行器实际位姿与目标位姿之间的差异。
    • 优点:收敛速度快,适用于初始估计接近真实解的情况。
    • 缺点:可能收敛到局部最优解,需良好的初始估计。
  2. 雅可比矩阵法(Jacobian Method)

    • 使用雅可比矩阵描述关节变量对末端执行器位姿的敏感性,通过雅可比矩阵的逆来调整关节变量。
    • 优点:适用于多自由度机械臂,能处理冗余度问题。
    • 缺点:雅可比矩阵可能出现奇异性,导致算法不稳定。
  3. 优化法(Optimization Method)

    • 将逆向运动学问题转换为优化问题,通过优化算法(如遗传算法、粒子群优化等)来求解关节变量。
    • 优点:可以处理高度非线性、无解析解的问题。
    • 缺点:计算量大,实时性较差。

优点

  • 能处理复杂的机械臂结构。
  • 可处理冗余自由度、避障等多目标问题。

缺点

  • 计算复杂,迭代过程可能需要大量计算资源。
  • 可能收敛慢,或陷入局部最优解。

3.2 应用和挑战

🟢 逆向运动学的应用:

逆向运动学在机器人控制、路径规划和虚拟现实等领域有广泛应用。例如:

  • 机器人抓取:机器人需要根据目标物体的位置,调整自身关节角度,使末端执行器能够准确抓取物体。
  • 动画制作:在计算机动画中,逆向运动学用于生成角色的自然运动。
  • 医学领域:逆向运动学在康复机器人和手术机器人中用于精确控制机械臂。

🟢逆向运动学的挑战:

  • 多解问题:一个给定的末端执行器位姿可能对应多个关节配置。需要选择最优解或者符合物理限制的解。
  • 无解问题:有些情况下,目标位姿超出了机械臂的工作空间,无法找到有效的关节角度。
  • 奇异性问题:在某些特殊位姿下,机械臂的雅可比矩阵可能退化,导致求解困难。

四、牛顿法机械臂逆运动学求解详解

4.1 牛顿法

牛顿法的核心思想是利用函数的切线来逼近函数的根。

牛顿法(Newton’s Method),也称为牛顿-拉夫森法(Newton-Raphson Method),是一种求解非线性方程或方程组的迭代方法。它的基本思想是利用函数的导数信息,通过逐步逼近的方法找到方程的根,即找到使得函数值为零的变量值。

🟢牛顿法的基本原理:

假设我们有一个一元非线性方程 f ( x ) = 0 f(x) = 0 f(x)=0,牛顿法的核心思想是从一个初始猜测值 x 0 x_0 x0开始,使用函数的切线逼近来找到更接近方程根的值。具体的迭代公式为:

x n + 1 = x n − f ( x n ) f ′ ( x n ) x_{n+1} = x_n - \frac{f(x_n)}{f'(x_n)} xn+1=xnf(xn)f(xn)

其中:

  • x n x_n xn是第 n n n次迭代的当前估计值。
  • f ( x n ) f(x_n) f(xn)是函数在 x n x_n xn处的值。
  • f ′ ( x n ) f'(x_n) f(xn)是函数 f ( x ) f(x) f(x) x n x_n xn处的一阶导数。

🟢 牛顿法的几何解释:

在几何上,牛顿法的思想可以解释为:

  1. 从当前的猜测点 x n x_n xn出发,计算 f ( x n ) f(x_n) f(xn) f ′ ( x n ) f'(x_n) f(xn)
  2. 通过点 ( x n , f ( x n ) ) (x_n, f(x_n)) (xn,f(xn)),绘制函数 f ( x ) f(x) f(x)在该点的切线。
  3. 切线与 x x x轴的交点给出下一个猜测点 x n + 1 x_{n+1} xn+1
  4. 重复以上步骤,直到 x n x_n xn收敛到一个足够精确的值。

在这里插入图片描述

🟣 多元方程组的牛顿法:

对于多元非线性方程组 f ( x ) = 0 f(\mathbf{x}) = \mathbf{0} f(x)=0,其中 x \mathbf{x} x是包含多个变量的向量,牛顿法可以推广为多元形式。假设 x = [ x 1 , x 2 , … , x n ] T \mathbf{x} = [x_1, x_2, \ldots, x_n]^T x=[x1,x2,,xn]T,方程组为:

F ( x ) = [ f 1 ( x ) f 2 ( x ) ⋮ f n ( x ) ] = 0 \mathbf{F}(\mathbf{x}) = \begin{bmatrix} f_1(\mathbf{x}) \\ f_2(\mathbf{x}) \\ \vdots \\ f_n(\mathbf{x}) \end{bmatrix} = \mathbf{0} F(x)= f1(x)f2(x)fn(x) =0

牛顿法的迭代公式为:

x n + 1 = x n − J ( x n ) − 1 F ( x n ) \mathbf{x}_{n+1} = \mathbf{x}_n - \mathbf{J}(\mathbf{x}_n)^{-1} \mathbf{F}(\mathbf{x}_n) xn+1=xnJ(xn)1F(xn)

其中, J ( x n ) \mathbf{J}(\mathbf{x}_n) J(xn)是雅可比矩阵(Jacobian Matrix),它是函数向量 F ( x ) \mathbf{F}(\mathbf{x}) F(x)对变量向量 x \mathbf{x} x的偏导数矩阵:

J ( x ) = [ ∂ f 1 ∂ x 1 ∂ f 1 ∂ x 2 ⋯ ∂ f 1 ∂ x n ∂ f 2 ∂ x 1 ∂ f 2 ∂ x 2 ⋯ ∂ f 2 ∂ x n ⋮ ⋮ ⋱ ⋮ ∂ f n ∂ x 1 ∂ f n ∂ x 2 ⋯ ∂ f n ∂ x n ] \mathbf{J}(\mathbf{x}) = \begin{bmatrix} \frac{\partial f_1}{\partial x_1} & \frac{\partial f_1}{\partial x_2} & \cdots & \frac{\partial f_1}{\partial x_n} \\ \frac{\partial f_2}{\partial x_1} & \frac{\partial f_2}{\partial x_2} & \cdots & \frac{\partial f_2}{\partial x_n} \\ \vdots & \vdots & \ddots & \vdots \\ \frac{\partial f_n}{\partial x_1} & \frac{\partial f_n}{\partial x_2} & \cdots & \frac{\partial f_n}{\partial x_n} \end{bmatrix} J(x)= x1f1x1f2x1fnx2f1x2f2x2fnxnf1xnf2xnfn

通过求解雅可比矩阵 J ( x n ) \mathbf{J}(\mathbf{x}_n) J(xn)的逆矩阵并与函数值相乘,可以得到新的估计向量 x n + 1 \mathbf{x}_{n+1} xn+1


🟠牛顿法的收敛性:

牛顿法的收敛性主要取决于以下几个因素:

  1. 初始值的选择:如果初始值 x 0 x_0 x0足够接近方程的实际根,牛顿法通常收敛非常快,甚至可以达到二次收敛,即误差平方级别的收敛速度。

  2. 函数的光滑性:如果函数 f ( x ) f(x) f(x)在解附近是光滑的且导数不为零,则牛顿法更容易收敛。

  3. 奇异性问题:如果在迭代过程中 f ′ ( x n ) ≈ 0 f'(x_n) \approx 0 f(xn)0,可能会导致迭代公式中的分母过小,使得迭代发散或收敛缓慢。这种情况下,通常需要调整算法或重新选择初始点。

  4. 多解和无解问题对于多解问题,牛顿法可能会收敛到不同的根,具体取决于初始点的选择。对于无解问题,牛顿法通常会发散。

牛顿法的优缺点

优点:

  • 高效性:在初始估计值接近实际根时,牛顿法具有非常快的收敛速度,通常是二次收敛。
  • 广泛适用性:适用于求解广泛的非线性方程和方程组。

缺点:

  • 依赖初始值:如果初始值选择不当,可能会导致算法不收敛。
  • 计算量大:对于多元方程组,求解雅可比矩阵及其逆矩阵可能会增加计算复杂度。
  • 可能的发散问题:在某些情况下,特别是函数导数接近零时,牛顿法可能会发散。

牛顿法的改进

  1. 阻尼牛顿法通过在每次迭代中引入一个阻尼因子(乘个系数即可),以控制步长,从而避免迭代发散。
  2. 拟牛顿法:使用近似的雅可比矩阵来替代真实的雅可比矩阵,从而减少计算量,例如Broyden法。
  3. 多重根处理:对于具有多重根的方程,可以使用修正的牛顿法来提高收敛速度。

应用

牛顿法在工程和科学计算中有广泛的应用,包括:

  • 机器人学中的逆向运动学求解:用于求解机械臂末端执行器的目标位置和关节角度之间的关系。
  • 优化问题:作为优化算法的一部分,用于求解无约束优化问题。
  • 根寻找:在数值分析中,用于求解各种非线性方程的根。
  • 经济学和物理学模型:用于求解复杂模型中的平衡点或状态变量。

牛顿法是求解非线性问题的一个重要工具,虽然存在一定的局限性,但通过适当的改进和应用策略,仍然可以在许多领域中实现高效、准确的求解。

4.2 牛顿法逆运动学求解算法

🟣🟢类似的,逆运动学已知末端执行器位姿,求解关节角度向量。

对六自 由度机械臂,利用牛顿迭代法求其运动学逆解。

构建非线性方程组:

F ( θ ) = 0 , F ( θ ) = ( f 1 , f 2 , ⋯ , f n ) T , θ = ( θ 1 , θ 2 , ⋯ , θ n ) T \boldsymbol{F}(\boldsymbol{\theta})=0 ,\quad\boldsymbol{F}(\boldsymbol{\theta})=(f_1,f_2,\cdots,f_n)^\mathrm{T},\quad\boldsymbol{\theta}=(\theta_1,\theta_2,\cdots,\theta_n)^\mathrm{T} F(θ)=0,F(θ)=(f1,f2,,fn)T,θ=(θ1,θ2,,θn)T

已知最终所需腕部坐标系{6}相对于基坐标系{0}的其次变换矩阵 6 0 T d e s _6^0T_{\mathrm{des}} 60Tdes(位姿已知嘛),对于每次迭代也可得到一个齐次变换矩阵:

6 0 T θ ( θ 1 i , θ 2 i , θ 3 i , θ 4 i , θ 5 i , θ 6 i ) {}_{6}^{0}T_{\theta}(\theta_{1}^{i},\theta_{2}^{i},\theta_{3}^{i},\theta_{4}^{i},\theta_{5}^{i},\theta_{6}^{i}) 60Tθ(θ1i,θ2i,θ3i,θ4i,θ5i,θ6i)

i为迭代次数。

将2个矩阵的元素一一相减得方程组:

F ( θ ) = ( 0 6 T θ − 0 6 T d e s ) = 0 F\left(\theta\right)=\left(\begin{smallmatrix}0\\6\end{smallmatrix}T_{\theta}-\begin{smallmatrix}0\\6\end{smallmatrix}T_{\mathrm{des}}\right)=0 F(θ)=(06Tθ06Tdes)=0

即:

f 1 ( θ ) = 6 0 T θ ( 1 , 4 ) − 6 0 T d e s ( 1 , 4 ) = 0 f 2 ( θ ) = 6 0 T θ ( 2 , 4 ) − 6 0 T d e s ( 2 , 4 ) = 0 f 3 ( θ ) = 6 0 T θ ( 3 , 4 ) − 6 0 T d e s ( 3 , 4 ) = 0 f 4 ( θ ) = 6 0 T θ ( 2 , 3 ) − 6 0 T d e s ( 2 , 3 ) = 0 f 5 ( θ ) = 6 0 T θ ( 3 , 3 ) − 6 0 T d e s ( 3 , 2 ) = 0 f 6 ( θ ) = 6 0 T θ ( 3 , 2 ) − 6 0 T d e s ( 3 , 2 ) = 0 f 7 ( θ ) = 6 0 T θ ( 1 , 1 ) − 6 0 T d e s ( 1 , 1 ) = 0 f 8 ( θ ) = 6 0 T θ ( 1 , 2 ) − 6 0 T d e s ( 1 , 2 ) = 0 f 9 ( θ ) = 6 0 T θ ( 1 , 3 ) − 6 0 T d e s ( 1 , 3 ) = 0 f 10 ( θ ) = 6 0 T θ ( 2 , 1 ) − 6 0 T d e s ( 2 , 1 ) = 0 f 11 ( θ ) = 6 0 T θ ( 2 , 2 ) − 6 0 T d e s ( 2 , 2 ) = 0 f 12 ( θ ) = 6 0 T θ ( 3 , 1 ) − 6 0 T d e s ( 3 , 1 ) = 0 \begin{aligned}&f_{1}(\theta)={}_{6}^{0}\boldsymbol{T}_{\theta}(1,4)-{}_{6}^{0}\boldsymbol{T}_{\mathrm{des}}(1,4)=0\\&f_{2}(\theta)={}_{6}^{0}\boldsymbol{T}_{\theta}(2,4)-{}_{6}^{0}\boldsymbol{T}_{\mathrm{des}}(2,4)=0\\&f_{3}(\theta)={}_{6}^{0}\boldsymbol{T}_{\theta}(3,4)-{}_{6}^{0}\boldsymbol{T}_{\mathrm{des}}(3,4)=0\\&f_{4}(\theta)={}_{6}^{0}\boldsymbol{T}_{\theta}(2,3)-{}_{6}^{0}\boldsymbol{T}_{\mathrm{des}}(2,3)=0\\&f_{5}(\theta)={}_{6}^{0}\boldsymbol{T}_{\theta}(3,3)-{}_{6}^{0}\boldsymbol{T}_{\mathrm{des}}(3,2)=0\\&f_{6}(\theta)={}_{6}^{0}\boldsymbol{T}_{\theta}(3,2)-{}_{6}^{0}\boldsymbol{T}_{\mathrm{des}}(3,2)=0\\&f_{7}(\theta)={}_{6}^{0}\boldsymbol{T}_{\theta}(1,1)-{}_{6}^{0}\boldsymbol{T}_{\mathrm{des}}(1,1)=0\\&f_{8}(\theta)={}_{6}^{0}\boldsymbol{T}_{\theta}(1,2)-{}_{6}^{0}\boldsymbol{T}_{\mathrm{des}}(1,2)=0\\&f_{9}(\theta)={}_{6}^{0}\boldsymbol{T}_{\theta}(1,3)-{}_{6}^{0}\boldsymbol{T}_{\mathrm{des}}(1,3)=0\\&f_{10}(\theta)={}_{6}^{0}\boldsymbol{T}_{\theta}(2,1)-{}_{6}^{0}\boldsymbol{T}_{\mathrm{des}}(2,1)=0\\&f_{11}(\theta)={}_{6}^{0}\boldsymbol{T}_{\theta}(2,2)-{}_{6}^{0}\boldsymbol{T}_{\mathrm{des}}(2,2)=0\\&f_{12}(\theta)={}_{6}^{0}\boldsymbol{T}_{\theta}(3,1)-{}_{6}^{0}\boldsymbol{T}_{\mathrm{des}}(3,1)=0\end{aligned} f1(θ)=60Tθ(1,4)60Tdes(1,4)=0f2(θ)=60Tθ(2,4)60Tdes(2,4)=0f3(θ)=60Tθ(3,4)60Tdes(3,4)=0f4(θ)=60Tθ(2,3)60Tdes(2,3)=0f5(θ)=60Tθ(3,3)60Tdes(3,2)=0f6(θ)=60Tθ(3,2)60Tdes(3,2)=0f7(θ)=60Tθ(1,1)60Tdes(1,1)=0f8(θ)=60Tθ(1,2)60Tdes(1,2)=0f9(θ)=60Tθ(1,3)60Tdes(1,3)=0f10(θ)=60Tθ(2,1)60Tdes(2,1)=0f11(θ)=60Tθ(2,2)60Tdes(2,2)=0f12(θ)=60Tθ(3,1)60Tdes(3,1)=0

式中, 6 0 T θ ( a , b ) {}_6^0T_\theta(\mathfrak{a},\mathfrak{b}) 60Tθ(a,b) 6 0 T θ _{6}^{0}T_{\theta} 60Tθ齐次变换矩阵第a行第b列元素, 6 0 T d e s ( a , b ) {}_{6}^{0}T_{\mathrm{des}}(a,b) 60Tdes(a,b)同理。

这个方程组的意思就是:我们迭代得到各个关节的角度值,然后根据求得的关节角度+已知DH参数,可以求得此关节角度对应的末端执行器位姿,然后与目标位姿比较,如果误差不满足要求,就继续改变关节角度值,一直迭代。

我们会给一个各个关节角度的初始值(一个向量嘛),那么如何根据这个初始值,推出下一个角度向量呢?显然,前面的牛顿迭代法已经解决这个问题了。

方程组的雅可比矩阵为:

J i ( θ i ) = [ ∂ f 1 ∂ θ 1 i ∂ f 1 ∂ θ 2 i ⋯ ∂ f 1 ∂ θ 6 i ∂ f 2 ∂ θ 1 i ∂ f 2 ∂ θ 2 i ⋯ ∂ f 2 ∂ θ 6 i ⋮ ⋮ ⋮ ∂ f 12 ∂ θ 1 i ∂ f 12 ∂ θ 2 i ⋯ ∂ f 12 ∂ θ 6 i ] J_i\left(\theta^i\right)=\begin{bmatrix}\frac{\partial f_1}{\partial\theta_1^i}&\frac{\partial f_1}{\partial\theta_2^i}&\cdots&\frac{\partial f_1}{\partial\theta_6^i}\\\frac{\partial f_2}{\partial\theta_1^i}&\frac{\partial f_2}{\partial\theta_2^i}&\cdots&\frac{\partial f_2}{\partial\theta_6^i}\\\vdots&\vdots&&\vdots\\\frac{\partial f_{12}}{\partial\theta_1^i}&\frac{\partial f_{12}}{\partial\theta_2^i}&\cdots&\frac{\partial f_{12}}{\partial\theta_6^i}\end{bmatrix} Ji(θi)= θ1if1θ1if2θ1if12θ2if1θ2if2θ2if12θ6if1θ6if2θ6if12

求解方程组的牛顿迭代公式为:

θ i + 1 = θ i − J − 1 F ( θ i ) \theta^{i+1}=\theta^{i}-J^{-1}F(\theta^{i}) θi+1=θiJ1F(θi)

但雅可比矩阵 1 0 T _{1}^{0}T 10T是一个12*6的矩阵,只能求其伪逆:

θ i + 1 = θ i − ( J i T J i ) − 1 J i T ( θ i ) F ( θ i ) \theta^{i+1}=\theta^i-(J_i^{\mathrm{T}}J_i)^{-1}J_i^{\mathrm{T}}(\theta^i)F(\theta^i) θi+1=θi(JiTJi)1JiT(θi)F(θi)

利用此式,不断迭代,可求解6自由度机械臂逆运动学。

🟢有人要问了:6自由度机械臂的雅可比矩阵不是6*6的嘛?
那是你还没理解牛顿法的核心思想、雅可比矩阵的含义,以及前面这个方程组的含义,仔细看一遍就明白了。

4.3 代码(matlab)

4.31 正向

带公式计算就行了:

function T = forward_kinematics(DH_params)% DH_params: DH参数矩阵,每行代表一个连杆的DH参数% T: 末端执行器的变换矩阵% 初始化变换矩阵为单位矩阵T = eye(4);% 遍历所有的DH参数for i = 1:size(DH_params, 1)% alpha = DH_params(i, 2) * pi / 180;  % 将角度转为弧度alpha = deg2rad(DH_params(i,2));a = DH_params(i, 3);d = DH_params(i, 4);% theta = DH_params(i, 5) * pi / 180;  % 将角度转为弧度theta = deg2rad(DH_params(i,5));% 计算当前连杆的变换矩阵A_i = [cos(theta) -sin(theta)*cos(alpha) sin(theta)*sin(alpha) a*cos(theta);sin(theta) cos(theta)*cos(alpha) -cos(theta)*sin(alpha) a*sin(theta);0 sin(alpha) cos(alpha) d;0 0 0 1];% 累乘到总变换矩阵TT = T * A_i;end
end

注意DH参数与代码对应:

% 杆件编号, 杆件扭角 (alpha), 杆件长度 (a), 关节距离 (d), 关节角 (theta)
DH_params = [1, -45, 0, 560, 10;2, 45, 0, 450, 0;3, 45, 0, 410, 10;4, -45, 0, 380, -20;5, 45, 0, 360,0;6, 0, 0, 210, 40
];
T = forward_kinematics(DH_params);

4.32 逆向

根据前面的详细介绍你应该能写代码了,我不提供免费的:https://mbd.pub/o/bread/ZpqZkp5y

核心:

    % 牛顿法的核心思想是利用函数的切线来逼近函数的根。for iter = 1:max_iter% 计算当前的 F(theta) 和雅可比矩阵F = compute_F(forward_kinematics(q, DH_params),T_des);J = compute_jacobian(q, DH_params,T_des);% 打印调试信息% fprintf('Iteration %d: Norm of F = %f\n', iter, norm(F));% 计算雅可比矩阵的伪逆J_pseudo_inv = pinv(J);% 更新关节角度q = q - J_pseudo_inv * F;% 限制关节角在[-90, 90]度范围内q = mod(q + 90, 2*90) - 90; % 检查收敛性if norm(F) < tolbreak;endend

测试:

(1)求得关节角和实际值相同:
在这里插入图片描述

(2)得到与实际值不同的角度向量:因为同一位姿,可能有多种关节角度组合。当然也有可能无解。

将DH参数中的关节角替换为求得的角度,再计算末端执行器位姿,即可验证。
在这里插入图片描述

五、齐次变换矩阵推导

齐次变换矩阵是描述从一个坐标系到另一个坐标系的位姿(位置和姿态)变化的重要工具。在机器人学中,齐次变换矩阵通常用于将机械臂的一个关节坐标系转换到下一个关节坐标系。推导齐次变换矩阵涉及到平移和旋转两种基本变换。

5.1 基本变换

  1. Z Z Z轴的旋转变换
    设一个点在坐标系 O i X i Y i Z i O_iX_iY_iZ_i OiXiYiZi中的坐标为 ( x i , y i , z i ) (x_i, y_i, z_i) (xi,yi,zi),经过绕 Z Z Z轴旋转角度 θ i \theta_i θi后,在新的坐标系 O i + 1 X i + 1 Y i + 1 Z i + 1 O_{i+1}X_{i+1}Y_{i+1}Z_{i+1} Oi+1Xi+1Yi+1Zi+1中的坐标为 ( x i + 1 , y i + 1 , z i + 1 ) (x_{i+1}, y_{i+1}, z_{i+1}) (xi+1,yi+1,zi+1)。旋转变换矩阵为:

    R z ( θ i ) = [ cos ⁡ θ i − sin ⁡ θ i 0 sin ⁡ θ i cos ⁡ θ i 0 0 0 1 ] R_z(\theta_i) = \begin{bmatrix} \cos\theta_i & -\sin\theta_i & 0 \\ \sin\theta_i & \cos\theta_i & 0 \\ 0 & 0 & 1 \end{bmatrix} Rz(θi)= cosθisinθi0sinθicosθi0001

  2. 沿 Z Z Z轴的平移变换
    沿 Z Z Z轴的平移变换将一个点沿 Z Z Z轴移动距离 d i d_i di,变换矩阵为:

T z ( d i ) = [ 1 0 0 0 0 1 0 0 0 0 1 d i 0 0 0 1 ] T_z(d_i) = \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & d_i \\ 0 & 0 & 0 & 1 \end{bmatrix} Tz(di)= 10000100001000di1

  1. 沿 X X X轴的平移变换
    沿 X X X轴的平移变换将一个点沿 X X X轴移动距离 a i a_i ai,变换矩阵为:

T x ( a i ) = [ 1 0 0 a i 0 1 0 0 0 0 1 0 0 0 0 1 ] T_x(a_i) = \begin{bmatrix} 1 & 0 & 0 & a_i \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} Tx(ai)= 100001000010ai001

  1. X X X轴的旋转变换
    设一个点绕 X X X轴旋转角度 α i \alpha_i αi后,变换矩阵为:

    R x ( α i ) = [ 1 0 0 0 0 cos ⁡ α i − sin ⁡ α i 0 0 sin ⁡ α i cos ⁡ α i 0 0 0 0 1 ] R_x(\alpha_i) = \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & \cos\alpha_i & -\sin\alpha_i & 0 \\ 0 & \sin\alpha_i & \cos\alpha_i & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} Rx(αi)= 10000cosαisinαi00sinαicosαi00001

5.2 齐次变换矩阵的推导

为了将一个坐标系 O i X i Y i Z i O_iX_iY_iZ_i OiXiYiZi变换到下一个坐标系 O i + 1 X i + 1 Y i + 1 Z i + 1 O_{i+1}X_{i+1}Y_{i+1}Z_{i+1} Oi+1Xi+1Yi+1Zi+1,需要依次进行以下变换:

  1. Z i Z_i Zi轴旋转 θ i \theta_i θi:引入关节角度 θ i \theta_i θi,得到变换矩阵 R z ( θ i ) R_z(\theta_i) Rz(θi)

R z ( θ i ) = [ cos ⁡ θ i − sin ⁡ θ i 0 0 sin ⁡ θ i cos ⁡ θ i 0 0 0 0 1 0 0 0 0 1 ] R_z(\theta_i) = \begin{bmatrix} \cos\theta_i & -\sin\theta_i & 0 & 0 \\ \sin\theta_i & \cos\theta_i & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} Rz(θi)= cosθisinθi00sinθicosθi0000100001

  1. 沿 Z i Z_i Zi轴平移 d i d_i di:沿 Z i Z_i Zi轴平移 d i d_i di,得到平移矩阵 T z ( d i ) T_z(d_i) Tz(di)

    T z ( d i ) = [ 1 0 0 0 0 1 0 0 0 0 1 d i 0 0 0 1 ] T_z(d_i) = \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & d_i \\ 0 & 0 & 0 & 1 \end{bmatrix} Tz(di)= 10000100001000di1

  2. 沿 X i X_i Xi轴平移 a i a_i ai:沿 X i X_i Xi轴平移 a i a_i ai,得到平移矩阵 T x ( a i ) T_x(a_i) Tx(ai)

    T x ( a i ) = [ 1 0 0 a i 0 1 0 0 0 0 1 0 0 0 0 1 ] T_x(a_i) = \begin{bmatrix} 1 & 0 & 0 & a_i \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} Tx(ai)= 100001000010ai001

  3. X i X_i Xi轴旋转 α i \alpha_i αi:引入扭角 α i \alpha_i αi,绕 X i X_i Xi轴旋转 α i \alpha_i αi,得到变换矩阵 R x ( α i ) R_x(\alpha_i) Rx(αi)

    R x ( α i ) = [ 1 0 0 0 0 cos ⁡ α i − sin ⁡ α i 0 0 sin ⁡ α i cos ⁡ α i 0 0 0 0 1 ] R_x(\alpha_i) = \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & \cos\alpha_i & -\sin\alpha_i & 0 \\ 0 & \sin\alpha_i & \cos\alpha_i & 0 \\ 0 & 0 & 0 & 1 \end{bmatrix} Rx(αi)= 10000cosαisinαi00sinαicosαi00001

5.3 齐次变换矩阵的合成

现在,将上述所有变换组合在一起,得到齐次变换矩阵 T i T_i Ti

T i = T z ( d i ) ⋅ R z ( θ i ) ⋅ T x ( a i ) ⋅ R x ( α i ) T_i = T_z(d_i) \cdot R_z(\theta_i) \cdot T_x(a_i) \cdot R_x(\alpha_i) Ti=Tz(di)Rz(θi)Tx(ai)Rx(αi)

将这些矩阵逐项相乘,得到齐次变换矩阵 T i T_i Ti的最终表达式:

T i = [ cos ⁡ θ i − sin ⁡ θ i cos ⁡ α i sin ⁡ θ i sin ⁡ α i a i cos ⁡ θ i sin ⁡ θ i cos ⁡ θ i cos ⁡ α i − cos ⁡ θ i sin ⁡ α i a i sin ⁡ θ i 0 sin ⁡ α i cos ⁡ α i d i 0 0 0 1 ] T_i = \begin{bmatrix} \cos\theta_i & -\sin\theta_i \cos\alpha_i & \sin\theta_i \sin\alpha_i & a_i \cos\theta_i \\ \sin\theta_i & \cos\theta_i \cos\alpha_i & -\cos\theta_i \sin\alpha_i & a_i \sin\theta_i \\ 0 & \sin\alpha_i & \cos\alpha_i & d_i \\ 0 & 0 & 0 & 1 \end{bmatrix} Ti= cosθisinθi00sinθicosαicosθicosαisinαi0sinθisinαicosθisinαicosαi0aicosθiaisinθidi1

🟢 解释

  • 旋转部分:由 3 × 3 3\times3 3×3的子矩阵构成,描述了坐标系之间的旋转关系。
  • 平移部分:由最后一列前三个元素组成,描述了坐标系之间的平移关系。
  • 齐次部分:最后一行为 [ 0 0 0 1 ] [0\ 0\ 0\ 1] [0 0 0 1],确保齐次变换矩阵的性质。

该矩阵用于描述从关节 i − 1 i-1 i1的坐标系到关节 i i i的坐标系的变换,通过逐级相乘,可以将基座坐标系下的位姿变换到末端执行器坐标系。


参考文献:
[1] 张栩曼,张中哲,王燕波,杨涛,邓涛.基于空间六自由度机械臂的逆运动学数值解法[J] 导弹与航天运载技术,2016,345(3):81-84

这篇关于【机器人学导论】6自由度机械臂逆运动学求解—牛顿法(数值法,仅旋转关节)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1128500

相关文章

有关机械硬盘的基础知识

1,机械硬盘的品牌   目前市场中常见的笔记本电脑的机械硬盘品牌主要有希捷、西部数据、三星等。   2,机械硬盘的容量   硬盘容量,即硬盘所能存储的最大数据量。虽然笔记本电脑硬盘的容量会因单位密度的提升而增加,不过和台式电脑的大容量比起来,笔记本电脑硬盘的容量仍然落后许多。笔记本电脑的硬盘除了对磁盘有体积较小和数量较少的要求之外,对功耗、耐用程度、抗震性及成本等的考虑,也让笔记

2024 年高教社杯全国大学生数学建模竞赛题目——2024 年高教社杯全国大学生数学建模竞赛题目的求解

2024 年高教社杯全国大学生数学建模竞赛题目 (请先阅读“ 全国大学生数学建模竞赛论文格式规范 ”) 2024 年高教社杯全国大学生数学建模竞赛题目 随着城市化进程的加快、机动车的快速普及, 以及人们活动范围的不断扩大,城市道 路交通拥堵问题日渐严重,即使在一些非中心城市,道路交通拥堵问题也成为影响地方经 济发展和百姓幸福感的一个“痛点”,是相关部门的棘手难题之一。 考虑一个拥有知名景区

【Rust光年纪】Rust 机器人学库全景:功能、安装与API概览

机器人学+Rust语言=无限可能:六款库带你开启创新之旅! 前言 随着机器人技术的快速发展,对于机器人学领域的高效、可靠的编程语言和库的需求也日益增加。本文将探讨一些用于 Rust 语言的机器人学库,以及它们的核心功能、使用场景、安装配置和 API 概览,旨在为机器人学爱好者和开发人员提供参考和指导。 欢迎订阅专栏:Rust光年纪 文章目录 机器人学+Rust语言=无限可能:

交换两个变量数值的3种方法

前言:交换两个数值可不是"a = b,b = a"。这样做的话,a先等于了b的值;当“b = a”后,因为此时a已经等于b的值了,这个语句就相当于执行了b = b。最终的数值关系就成了a == b,b == b。 下面教给大家3种交换变量数值的方法: 目录 1. 中介法 2. 消和法 3. 异或法 4. 总结 1. 中介法 中介法(又称 临时变量法 或 酱油法),其中心

基于SA模拟退火算法的多车辆TSP问题求解matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述        基于SA模拟退火算法的多车辆TSP问题求解matlab仿真,三个车辆分别搜索其对应的最短路径,仿真后得到路线规划图和SA收敛曲线。 2.测试软件版本以及运行结果展示 MATLAB2022A版本运行 (完整程序运行后无水印)

OpenGL/GLUT实践:流体模拟——数值解法求解Navier-Stokes方程模拟二维流体(电子科技大学信软图形与动画Ⅱ实验)

源码见GitHub:A-UESTCer-s-Code 文章目录 1 实现效果2 实现过程2.1 流体模拟实现2.1.1 网格结构2.1.2 数据结构2.1.3 程序结构1) 更新速度场2) 更新密度值 2.1.4 实现效果 2.2 颜色设置2.2.1 颜色绘制2.2.2 颜色交互2.2.3 实现效果 2.3 障碍设置2.3.1 障碍定义2.3.2 障碍边界条件判定2.3.3 障碍实现2.3.

人工智能导论(上)

一、人工智能概述 人工智能这个基本概念的起源(人工智能作为计算机科学的一个分支) 很多应用研究领域都在人工智能的范畴里,比如机器人、语言识别、图像识别、自然语言处理和专家系统等等。更加通俗的说,人工智能是要让一部机器能够像人一样进行环境的感知与认知,做出像人一样合理的行动和决策,并且可以执行的系统。 基于目前对人工

JD 1147:Jugs(一种用最少步骤求解的方法)

OJ题目:click here~~ 题目分析:九度上这道没有要求最少步数,只要得到最后结果即可AC , bfs , dfs都行。最少步骤的方法肯定也能AC啦,分析如下。 输入的三个数:a,b,n;> 由题不定方程ax+by=n必定有解> 如果b=n,则fill B即可,否则用试探法求出这样的两组解(a1,b1)及(a2,b2),其中a1 >0,b1<0;a1是满足方程的最小正整数;a2

【2024全国大学生数学建模竞赛】B题 模型建立与求解(含代码与论文)

目录 1问题重述1.1问题背景1.2研究意义1.3具体问题 2总体分析3模型假设4符号说明(等四问全部更新完再写)5模型的建立与求解5.1问题一模型的建立与求解5.1.1问题的具体分析5.1.2模型的准备 目前B题第一问的详细求解过程以及对应论文部分已经完成! - 晚上7-8点之前第二问完成 - 明天中文之前全部写完 按照提交论文的格式进行撰写!完整版请看文章最后!

Java 快速求解x的x次幂结果为10

1.问题描述 如果x的x次幂结果为10(如图所示),你能计算出x的近似值吗? 显然,这个值是介于2和3之间的一个数字。 可以使用牛顿迭代公式进行求解,因为是逼近算法可以大大减少运算次数 public static void main(String[] args) {int i = 0;double x1 = 2.5;while (true) {i++;//x^x - 10 = 0//这一步