UR机械臂运动学正逆解方法
最近几个月因为工作接触到了机械臂的项目,突然对机械臂运动方法产生了兴趣,也就是如何控制机械臂的位置和姿态。借用一张网上的图片,应该是ur5的尺寸。我用到的是ur3机械臂,除了尺寸不一样,各关节结构和初始位置和ur5是一样的。

ur机械臂是六自由度机械臂,由D-H参数法确定它的运动学模型,连杆坐标系的建立如上图所示。我当时在这个地方的理解上走了不少弯路,后来找个一个视频,我觉得讲解地比较容易理解,可以参考一下Denavit-Hartenberg参数视频详解。ur机械臂DH参数表如下,
转动关节θi是关节变量,连杆偏移di是常数。
|
关节编号 |
α(绕x轴) |
a(沿x轴) |
θ(绕z轴) |
d(沿z轴) |
|
1 |
α1=90 |
0 |
θ1 |
d1=89.2 |
|
2 |
0 |
a2=-425 |
θ2 |
0 |
|
3 |
0 |
a3=-392 |
θ3 |
0 |
|
4 |
α4=90 |
0 |
θ4 |
d4=109.3 |
|
5 |
α5=-90 |
0 |
θ5 |
d5=94.75 |
|
6 |
0 |
0 |
θ6 |
d6=82.5 |
由此可以建立坐标系i在坐标系i-1的齐次变换矩阵,注意每次不管平移还是旋转是相对于当前的运动坐标系变换,矩阵右乘


那么把DH参数代入就可以得到所有相邻坐标系的变换矩阵






所以末端坐标系6到基座固定坐标系0的变换矩阵
。那么求正解就很简单了,只要输入六个关节角度θi,就得到末端坐标在基坐标系的变换矩阵T。ur机械臂的视教板上末端点的坐标是用六个值[x, y, z, rx, ry, rz]表示的。前三个值[x, y, z]是三维笛卡尔坐标,表示空间位置,后三个值[rx, ry, rz]是坐标旋转向量,表示空间姿态。我们得到的变换矩阵T怎么变成六值坐标[x, y, z, rx, ry, rz]呢?设

T的左上角的3x3矩阵是旋转矩阵,旋转矩阵和旋转向量之间可以通过罗德里格斯(Rodrigues)变换进行转换。opencv里有相应的函数调用。算法也比较简单,不用opencv的函数自己写代码也不难。T的右上角3x1就是空间位置[x, y, z]。这样有变换矩阵T得到六值坐标,完成了正解。
逆解相对要复杂一些,由末端的空间位置和姿态,计算可能的关节角度。逆解的方法有解析法,迭代法和几何法。其中解析法用数学推导,可以得到全部根,但是计算复杂。有的机械臂可以得到无穷解,比如7轴机械臂。而ur的6轴机械臂是有有限解的。这里推导一下ur的逆解。
首先计算求变换矩阵T过程其中的一些中间矩阵。
,其中c23=cos(θ2+θ3),s23=sin(θ2+θ3)。


由
得到
。计算
,
,得到

等式两边矩阵的行列应该分别相等,由第三行第四列得到
,可解得
,有两个解。这里注意写程序的时候,求解这里的反正切是用atan2()这类的函数,返回之在(-π,+π]。而反余弦的返回值在[0,π],从而保证在2π范围两个解是不同的。
由第三行第三列得
,可解得
,两个解。由第三行第二列得到
,可解得
。
接着由
,
计算
,得出等式左边等于
。
由
,两边平方,令
,
。
同样由
,令
,
。
两式相加得到
,则
,有两个解。
把θ3带入
和
,得
,
,其中t2=tanθ2。两式消去c2,得到
。
最后得到
,从而得到θ4。
p { margin-bottom: 0.1in; line-height: 120% }
a:link { }
综合有两个解的情况,ur机械臂逆解总共由2x2x2=8组解。
按照上面的算法,用python写了两个程序,一个正解一个逆解验证一下。工作手边是ur3的机械臂,上面的图和表都是ur5的,换成ur3的参数。正解算出来都没有问题,可以和实际机械臂的空间位姿对应。可是逆解算出来8组值,好像只有四组值是对的。一直还没理解到底是怎么回事,仔细检查了算法和程序好像都没有错阿,不知道是哪里出了问题。网上也没有找到答案,如果哪位大神知道,望不吝赐教!
UR机械臂运动学正逆解方法的更多相关文章
- 机械臂运动学逆解(Analytical solution)
计算机器人运动学逆解首先要考虑可解性(solvability),即考虑无解.多解等情况.在机器人工作空间外的目标点显然是无解的.对于多解的情况从下面的例子可以看出平面二杆机械臂(两个关节可以360°旋 ...
- 基于 Mathematica 的机器人仿真环境(机械臂篇)[转]
完美的教程,没有之一,收藏学习. 目的 本文手把手教你在 Mathematica 软件中搭建机器人的仿真环境,具体包括以下内容(所使用的版本是 Mathematica 11.1,更早的版本可能缺少某些 ...
- V-rep学习笔记:并联机构正逆运动学
Solving the FK problem of simple kinematic chains is trivial (just apply the desired joint values to ...
- ROS机械臂 Movelt 学习笔记2 | Move Group 接口 C++
Movelt为使用者提供了一个最通用且简单的接口 MoveGroupInterface 类,这个接口提供了很多控制机器人的常用基本操作,如: 设置机械臂的位姿 进行运动规划 移动机器人本体 将物品添加 ...
- 使用VTK与Python实现机械臂三维模型可视化
三维可视化系统的建立依赖于三维图形平台, 如 OpenGL.VTK.OGRE.OSG等, 传统的方法多采用OpenGL进行底层编程,即对其特有的函数进行定量操作, 需要开发人员熟悉相关函数, 从而造成 ...
- ROS机械臂 Movelt 学习笔记1 | 基础准备
环境:Ubuntu18.04 + ROS Melodic 1. 安装ROS 官网下载安装步骤:http://wiki.ros.org/melodic/Installation/Ubuntu 一键安装的 ...
- ROS机械臂 Movelt 学习笔记4 | Move Group 接口 Python
Python 的使用总是比 C++ 简单许多,Move Group 的 Python 接口更为便捷,也为使用者提供了很多用于操纵机器人和机械臂的函数,能够和 C++ 接口实现相同的功能: 设置机械臂的 ...
- Android版网易云音乐唱片机唱片磁盘旋转及唱片机机械臂动画关键代码实现思路
Android版网易云音乐唱片机唱片磁盘旋转及唱片机机械臂动画关键代码实现思路 先看一看我的代码运行结果. 代码运行起来初始化状态: 点击开始按钮,唱片机的机械臂匀速接近唱片磁盘,同时唱片磁盘也 ...
- 记一次 .NET 某机械臂智能机器人控制系统MRS CPU爆高分析
一:背景 1. 讲故事 这是6月中旬一位朋友加wx求助dump的故事,他的程序 cpu爆高UI卡死,问如何解决,截图如下: 在拿到这个dump后,我发现这是一个关于机械臂的MRS程序,哈哈,在机械臂这 ...
随机推荐
- 一篇文章带你了解Cloud Native
背景 Cloud Native表面看起来比较容易理解,但是细思好像又有些模糊不清:Cloud Native和Cloud关系是啥?它用来解决什么问题?它是一个新技术还是一个新的方法?什么样的APP符合“ ...
- es6(六):module模块(export,import)
es6之前,社区模块加载方案,主要是CommonJS(用于服务器)和AMD(用于浏览器) 而es6实现的模块解决方案完全可以替代CommonJS和AMD ES6模块设计思想:尽量静态化,在编译时就能确 ...
- 一个简单而实用的JQ插件——lazyload.js图片延迟加载插件
前 言 Cherish 看多了炫酷的插件之后再来看这么一个小清新的东西,是不是突然感觉JQ插件感觉很友好了,简单强大最重要的是实用. 这篇文章将详细讲解一下lazyload.js的用法 lazy ...
- Java虚拟机-类文件
代码编译的结果从本地机器码转换为字节码,是存储格式发展的一小步,却是编程语言发展的一大步.计算机只认识0和1,所以我们的程序需要经过编译器翻译成由0和1组成的二进制格式才能由计算机执行.经过技术的发展 ...
- java之jsp页面语法
jsp页面相比静态页面html来说,就是多了一些脚本,利用这些脚本来动态地改变页面内容的显示. 1.JSP脚本写法 <% 这里写java代码; %> <%! JSP声明,用来声明变量 ...
- JDK安装:CentOS和Windows环境
Windows上JDK安装 1:下载jdk. 地址在 http://www.oracle.com/index.html >downloads>se>Ja ...
- 重温《STL源码剖析》笔记 第三章
源码之前,了无秘密. --侯杰 第三章:迭代器概念与traits编程技法 迭代器是一种smart pointer auto_Ptr 是一个用来包装原生指针(native pointer)的对象,声明狼 ...
- Vue初学跳坑
1. uncaught TypeError: Cannot read property '0' of undefined <div class="home-module-wrap&qu ...
- AngularJS 最常用的几种功能
AngularJS 最常用的几种功能 2017-04-13 吐槽阿福 互联网吐槽大会 第一 迭代输出之ng-repeat标签ng-repeat让table ul ol等标签和js里的数组完美结合 1 ...
- C#学习(一):委托和事件
预备知识 在学习委托和事件之前,我们需要知道的是,很多程序都有一个共同的需求,即当一个特定的程序事件发生时,程序的其他部分可以得到该事件已经发生的通知. 而发布者/订阅者模式可以满足这种需求.简单来说 ...