N轴机械臂的MDH正向建模,及python算法

news2024/11/27 16:37:12

目录

  • 一、前言
  • 二、三维空间的坐标系变换
  • 三、MDH建模要点
  • 四、MDH的变换矩阵推导
  • 五、机械臂MDH的python模型
  • 六、python源码

一、前言

如果机器人工程师缺乏机器人学理论的支撑和足够的认识,那么随着机器人项目的深入推进,可能会越走越艰难,所谓万丈高楼平地起,必须得打好比万丈高楼还要夯实得地基,大厦才能牢固。本篇对六轴机械臂的基础建模知识进行了较为彻底的梳理,参考了较多的网上资料,发现,很多文章或者教程并没有把DH建模这个事说得特别清楚,这里对一些注意点或者所谓的坑做了一些着重说明,仅供参考。本篇花了笔者1周的时间整理和思考,全篇的思路如下:
在这里插入图片描述
在这里插入图片描述

二、三维空间的坐标系变换

我们知道,一个直角坐标系遵照右手定则,沿着某个轴逆时针旋转θi角度的旋转矩阵为:
在这里插入图片描述
我们知道,任何一个坐标系f0,可以通过三个以上基础旋转,唯一变换到另一个同原点的坐标系fn,两个关系可以用按照变换的先后顺序左乘表示,如上图右侧。
我们知道,三维空间里,如果有两个坐标系F0,F6,如果想知道P在F6系中的向量(或者点坐标)在F0系中是多少,可以通过如下的两种形式表示:
在这里插入图片描述

如上式2所示,旋转和平移可以组成一个齐次变换矩阵T,用在机械臂上面,可以表示一个机械臂的末端位姿:
在这里插入图片描述
如上图,机械臂的末端位姿有两部分组成:
在这里插入图片描述

可以理解为一个是末端原点的坐标t0,一个是旋转量R06(或者可以用欧拉角序列、翻滚⾓-俯仰⾓-偏航⾓序列等表示),在图中对应的红点就是机械臂的末端的原点,其坐标其实就是t0,也就是式2中的T中的最后一列前三个(dx0,dy0,dz0)。末端的姿态还涉及到旋转,这个信息是含在了旋转矩阵R06(见式1)中。
在机械臂中,可以控制的只有各个关键的电机角度,六轴就是六个电机的角度[q1,q2,q3,q4,q5,q6],通过设定六个电机角度,可以把机械臂的末端送到目标的位置。这个过程,数学上相当于机械臂基座的坐标系,通过一些列的旋转平移变换到了末端,由如下的这种机制:
在这里插入图片描述

变换的矩阵T可以分解连乘得到:
在这里插入图片描述
T60表示的是末端F0到F6的运动,注意到,由于变换的顺序是左乘原则,就是越左边的运动越晚,这与我们直观的感觉想违背,我们直观理解是从左往右依次进行(右乘原则),这个可以根据变换矩阵的性质,给转变过来:
在这里插入图片描述

根据以上性质,可以得到右乘形式:
在这里插入图片描述
机械臂的建模就是基于类似这样的机制,有学者经过研究简化后,提出了机器人的DH建模理论。
于是,DH建模所用到的基础旋转矩阵就变为:
在这里插入图片描述

三、MDH建模要点

DH建模有两种,一种是标准DH建模,SDH,一种是改进DH,MDH。为了后续建模方便,建议使用MDH规则建模。其主要的原理是这样的:
(1)先确定z轴(各关节的电机转轴):
在这里插入图片描述
(2)逐步从固定支座base坐标系F0,确定x轴的方向,原则是x轴的要是本坐标系z轴和下一个坐标系z轴的公垂线。如上图,X0轴应该垂直于Z0,和Z1,那么可以这么定:
在这里插入图片描述

如上图,X0垂直于轴Z0和Z1,X1轴垂直于Z1和Z2,X2应该垂直于Z2和Z3…
(3)根据右乘原理,MDH中规定当前关节i的参数先后的顺序是:
在这里插入图片描述
以上面的坐标系F1为例,四个参数代表是坐标F0系,先以X0轴旋转Alpha,再沿着x0轴方向移动a(负方向移动为负数),再以Z0为轴旋转Offset,最后沿着Z0方向移动d(负方向移动为负数),最后得到F1坐标系。此处,alpha1=0,X0不需要旋转,a=0,沿着X0没有平移,offset=pi/2,沿着Z0逆时针旋转90度,X0轴转到了X1轴的位置,然后d=170.56,沿着Z0正方向移动了170.56,这样经过连续的旋转+平移后,就完成了关键1的参数建模。以此类推,逐步确定其余5组参数。
所有的参数确定,如下图示例所示:
在这里插入图片描述

四、MDH的变换矩阵推导

根据以上的分析,MDH模型中,从一个坐标系Fi-1到Fi的变换矩阵其实可以这些推导:用python表示:

import sympy as sy

#MDH
alpha=[0,np.pi/2,0,np.pi,-np.pi/2,np.pi/2]
a=[0,0,136.35,100,0,0]
offset=[np.pi/2,np.pi/2,0,np.pi/2,0,0]
d=[170.46,80,0,0,-85,-62.4]


"""推导转换矩阵"""
#z轴旋转角度
theta1=sy.Symbol("theta1")
#z轴平移
d1=sy.Symbol("d1")

#x轴旋转角度
al1=sy.Symbol("al1")
#x轴平移

a1=sy.Symbol("a1")

def MTi(alpha,a,d,theta,DHtype="MDH"):

    #x轴旋转变化阵,右手系,逆时针为正
    Rx=sy.Matrix([
       [1, 0,        0,        0],
       [0, sy.cos(alpha), -sy.sin(alpha), 0],
       [0, sy.sin(alpha), sy.cos(alpha),  0],
       [0, 0,        0,         1]
        ])
    #沿着x轴平移,有方向
    Tx=sy.Matrix([
       [1, 0, 0,  a],
       [0, 1, 0,  0],
       [0, 0,1,   0],
       [0, 0,0,   1]
        ])
    #z轴旋转阵,右手系,逆时针为正
    Rz=sy.Matrix([
       [sy.cos(theta),  -sy.sin(theta),   0,  0],
       [sy.sin(theta), sy.cos(theta),   0,  0],
       [0,             0,            1,  0],
       [0,             0,            0,  1]
        ])
    #沿着z轴平移,有方向
    Tz=sy.Matrix([
       [1, 0, 0,  0],
       [0, 1, 0,  0],
       [0, 0,1,   d],
       [0, 0,0,   1]
        ])

    print("MDH——TR",Rx@Tx@Rz@Tz)
    #右乘原则,先旋转X轴alpha,再沿X轴平移a,再旋转Z轴theta(这里为offset值),最后沿着Z轴平移D
    return Rx@Tx@Rz@Tz
#MDH的转换矩阵如下:
MTi(al1,a1,d1,theta1)

可得到MDH的基本变换矩阵为:
在这里插入图片描述
简写如下:
在这里插入图片描述

五、机械臂MDH的python模型

根据右乘原则,整个机械臂的变换矩阵,可以由6个基本变换矩阵右先后右乘获得:
A06=A1A2A2A4A5*A6
用python推导计算如下:

#MDH方法
import sympy as sy
import numpy as np
import math
from math import atan2

#MDH参数
alpha=[0,np.pi/2,0,np.pi,-np.pi/2,np.pi/2]
a=[0,0,136.35,100,0,0]
offset=[np.pi/2,np.pi/2,0,np.pi/2,0,0]
d=[170.46,80,0,0,-85,-62.4]

def MTi(alpha,a,d,theta,DHtype="MDH"):

    #x轴变化阵,右手系,顺针旋负方向
    Rx=sy.Matrix([
       [1, 0,        0,        0],
       [0, sy.cos(alpha), -sy.sin(alpha), 0],
       [0, sy.sin(alpha), sy.cos(alpha),  0],
       [0, 0,        0,         1]
        ])
    #沿着x轴平移,有方向
    Tx=sy.Matrix([
       [1, 0, 0,  a],
       [0, 1, 0,  0],
       [0, 0,1,   0],
       [0, 0,0,   1]
        ])
    #z轴旋转阵,右手系,顺针旋负方向
    Rz=sy.Matrix([
       [sy.cos(theta),  -sy.sin(theta),   0,  0],
       [sy.sin(theta), sy.cos(theta),   0,  0],
       [0,             0,            1,  0],
       [0,             0,            0,  1]
        ])
    #沿着z轴平移,有方向
    Tz=sy.Matrix([
       [1, 0, 0,  0],
       [0, 1, 0,  0],
       [0, 0,1,   d],
       [0, 0,0,   1]
        ])

    print("MDH——TR",Rx@Tx@Rz@Tz)
    return Rx@Tx@Rz@Tz

def Aiv(alpha,a,d,offset,theta=[0,0,0,0,0,0],Tnum=6):
    """
    依次右乘,推导出机械臂位姿矩阵
    """
    for i in range(Tnum):
        Ti=MTi(alpha[i],a[i],d[i],offset[i])
        if i==0:
            Ai=Ti
        else:
            Ai=Ai@Ti
    return Ai
#机械臂位姿矩阵如下
A06= Aiv(alpha,a,d,offset)  
print("位姿矩阵:",A06)

可以计算得到机械臂的位姿矩阵:
在这里插入图片描述
至此根据建立的MDH参数,就可以计算出末端的位姿矩阵了,为了画出机械臂的样子,我们可以通过连续变换矩阵,分别计算出各轴的位姿,并用matplot画出来:
在这里插入图片描述

六、python源码

可复制直接运行。
python源码资源地址

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/524482.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Lambda】集合的Lambda表达式

【Lambda】集合的Lambda表达式 【一】Stream的方法介绍【1】Stream里常用的方法【2】collect(toList()) & filter【3】map【4】flatMap【5】max&min【6】reduce 【二】常用案例总结【1】准备方法查询数据库获取List结果【2】取值【3】分组【4】去重【5】排序【6】list的…

uniapp制作水印相机给图片添加水印并且保存图片至本地

uniapp保存文件的三种方式 文件主要分为两大类: 1.代码包文件:代码包文件指的是在项目目录中添加的文件。 2.本地文件:通过调用接口本地产生,或通过网络下载下来,存储到本地的文件。 其中本地文件又分为三种&#…

【K8s】Service详解

文章目录 一、Service介绍1、认识Service2、kube-proxy的三种工作模式3、Service的类型 二、Service的使用1、实验数据准备2、Service类型为ClusterIP补充:Endpoints补充:负载分发策略 3、Service类型为HeadLiness3、Service类型为NodePort4、Service的类…

Ovito渲染技巧之体系边界识别

关注 M r . m a t e r i a l , \color{Violet} \rm Mr.material\ , Mr.material , 更 \color{red}{更} 更 多 \color{blue}{多} 多 精 \color{orange}{精} 精 彩 \color{green}{彩} 彩! 主要专栏内容包括: †《LAMMPS小技巧》: ‾ \textbf…

性能、性能还是性能---下一代Android性能框架分析

性能优化的重要性和难度毋庸置疑,事实上,性能优化也是一个永无止境的游戏,总会发现有一些东西需要优化。但是不可避免的是,这也是一个边际效益递减的事情,项目或应用获得的收益在一定程度上也会逐渐降低。What’s new …

ReentrantLock 原理

目录 ReentrantLock 概述 ReentrantLock 的原理 什么是 AQS ? 获取锁资源(以⾮公平锁为例) tryAcquire addWaiter acquireQueued 释放锁资源 ⾮公平锁体现在哪⾥? 调试代码 总结 ReentrantLock 概述 ReentrantLock是Lock接⼝的默认实现,是⼀…

【Linux】-关于Linux的指令(下)

💖作者:小树苗渴望变成参天大树 ❤️‍🩹作者宣言:认真写好每一篇博客 💨作者gitee:gitee 💞作者专栏:C语言,数据结构初阶,Linux,C 文章目录 前言一、时间相关的指令二、cal指令三、find -name指…

Centos7 经典模式安装GBase 8s 图文教程

Centos7安装GBase 8s 图文教程 前言1.1 硬件要求1.2 系统要求1.3 虚拟 PC 软件1.4 安装及配置数据库服务器1.4.1 创建 gbasedbt 组和用户1.4.2 创建 GBase 8s 数据库安装目录1.4.3 上传并解压安装包1.4.4 执行安装 参考文献 前言 本篇博文分享如何在Centos7 x86架构的系统中安…

第2章-Selenium-API操作

目标: 1. 熟练应用八种元素定位方式 2. 掌握对元素和浏览器的操作方法 3. 掌握键盘鼠标的操作 4. 掌握元素等待的操作 5. 掌握下拉选择框、 警告框和滚动条的操作 6. 掌握如何切换frame框架和多窗口 7. 掌握如何实现窗口截图 1.元素定位 1. 掌握id、 name、 cla…

【leetcode】622 二叉树的最大宽度

题目描述 给你一棵二叉树的根节点 root ,返回树的 最大宽度 。 树的 最大宽度 是所有层中最大的 宽度 。 每一层的 宽度 被定义为该层最左和最右的非空节点(即,两个端点)之间的长度。将这个二叉树视作与满二叉树结构相同&#…

MATLAB 之 M 文件和程序控制结构(顺序、选择、循环)

文章目录 一、M 文件1. M 文件的建立与打开1.1 建立新的 M 文件1.2 打开已有的 M 文件 2. M 文件的分类 二、 程序控制之顺序结构1. 数据的输入2. 数据的输出3. 程序的暂停 三、程序控制之选择结构1. if 语句2. switch 语句3. try 语句 四、程序控制之循环结构1. for 语句2. wh…

畸变像差校正技术(畸变相位补偿)发展现状及其仿真实验研究-技术汇总-Matlab代码

▒▒本文目录▒▒ 一、引言二、物理方法2.1 基于二次曝光法的畸变像差补偿仿真实验验证 三、数值方法3.1 基于主成分分析法的畸变像差补偿仿真实验验证3.2 基于标准多项式拟合法的畸变像差校正仿真实验验证3.3 基于最小二乘拟合法的畸变像差校正仿真实验验证3.4 基于泽尼克多项…

Simulink 自动代码生成电机控制——永磁同步电机参数获取

目录 前言 极对数测量 电阻测量(Rs) 电感测量(Ld和Lq) 磁链测量 总结 前言 在建模之前或者需要更换一个新电机,需要获取目标电机的电气参数,如果参数不对,对于电流环参数的整定&#xff0…

2023/05/08~14 刷题记录

A - Plus and Multiply 题意: 题解: 题目说可以将集合里面的数字 *a 或者 b 操作,并将新的值放进集合中,首先想到 dfs 暴力求解,但是太暴力了,直接 时间超限 。通过观察我们可以知道,要求 n 是否…

前端模块化

什么是模块化 事实上模块化开发最终目的是将程序划分成一个个小的结构在这个结构中编写属于自己的逻辑代码,有自己的作用域,不会影响到其他的结构这个结构可以将自己希望暴露的变量、函数、对象等导出给其他结构使用。可以通过某种方式,导入…

电脑软件:国内最好用解压缩软件 7-Zip 新版本发布

5 月 9 日消息,7-Zip 是一款拥有极高压缩比的的开源压缩软件,支持 LZMA2 等 7 种开源算法,以及支持较广泛的压缩格式 .7z,体积不大(1.5MB)、功能完善,除了默认 UI 不符合国内审美外几乎没什么可…

Oracle数据库安装教程,并实现公网远程连接【内网穿透】

✨ 目录 🎈 前言🎈 1. 数据库搭建🎈 2. 内网穿透🎈 2.1 安装cpolar内网穿透🎈 2.2 创建隧道映射 🎈 3. 公网远程访问🎈 4. 配置固定TCP端口地址🎈 4.1 保留一个固定的公网TCP端口地址…

Java经典笔试题—day08

Java经典笔试题—day08 🔎选择题🔎编程题🥝两种排序方法🥝求最小公倍数 🔎结尾 🔎选择题 (1)下列选项中关于Java中super关键字的说法正确的是() A.super关键字是在子类对象内部指代…

JAVA JDK下载安装手册

JDK的介绍与安装 JDK简介 JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。编写 Java 程序必须使用 JDK,它提供了编译和运行 Java 程序的环境。是整个java开发的核心。 准备JDK 本次使用的是JDK1.8 如下所示: 下载完…

记两道AES-CBC题

文章目录 知识导入(AES-CBC模式)题一(buu [ACTF新生赛2020]crypto-aes 1)题目描述:题目分析:知识导入os.urandom(n)函数比特,字节,二进制数之间的关系AES.new(key,AES.MODE_CBC,iv) 题二(crack AES-CBC IV)…