matlab中k-means算法_MATLAB中的机械臂算法

目录

1. 机械臂算法简介

2. 运动学部分 2.1.1. Rigid Body Tree (刚体树) 2.1.2. 反向运动学算法 2.1.3. Simulink示例

906288bc1291cbd432a76f18a6784580.png

1 机械臂算法简介

MATLAB在2016年就推出了Robotics System Toolbox(RST),其中有很多关于机械臂方面的算法。而且随着客户需求的增加,也在加入一些新的功能。为了试图让读者了解更多RST在机械臂方面的支持,让我们来看一下机械臂方面的算法概貌。

1d8dbfd931ba6bb293800c80d5fff470.png

这些名词听起来都比较深奥,但是在机械臂的世界里,这些都非常有用。让我们看一个简单的例子。下图是一个简单的机械臂示意:机械臂的end-effector(末端机构)受到4个旋转关节和3个连杆的共同作用,可以到达不同的作业地点,也可以处于不同的旋转角度。

16989012f23ff47a61c10c9cf6386327.png

为了分析end-effector的具体位置和角度,我们看到:它相对底座开始,做了4次旋转(rotation)和3次转置(translation)。那这4次旋转和3次转置的总和,我们可以用一个矩阵来表示:

7d0ba2545d914a32cbe6151b69a8c0a4.png

这个矩阵也叫Homogeneous Transformation(齐次变换)。有时候,对于旋转会有不同的表达方式,例如欧拉角(Euler Angles)、四元数(Quaternion)、旋转矩阵(Rotation Matrix)等等;表达转置,也可使用转置向量(Translation Vector)。有了RST这些都可以轻松通过不同的函数进行互换。下图为具体的函数列表:

0a5832963a87abe947f47e41262515da.png 例如:

将欧拉角转为Homogeneous Transformation。

ef8f8f8a8eb5ab1b78106de409a0a4fa.png

由于机械臂的连杆长度是已知的,只要确定了各个关节转动的角度,我们就可以确定end-effector的最终位置和方向。 这个我们称之为forward kinematics(正向运动学)。 反过来,如果我们知道了end-effector的最终位置和方向,我们也可以推导各个关节的角度,这个我们称之为inverse kinematics(反向运动学)。机械臂关注的主要是反向运动学。

如果end-effector,需要走一段比较长的路程(path),从甲点运行到乙点。我们为了使得机械臂的end-effector 的路径平滑,需要规划一系列的路径点(waypoints),这个我们叫做路径规划(trajectory planning)或者叫运动插补(interpolation)。

例如下图:蓝色的曲线叫path,而各个时间经过的路径点叫trajectory。如何设计经过这些路径点的trajectory,比较显而易见的指标是 “平滑” 。那什么是 “平滑” ,它可能意味着 “速度连续” 、 “加速度连续” 、 “没有顿挫” 等等。这些指标,都会转化成数学算法。RST也会有相应的算法支持,作者在MATLAB 2019a发布后,会另外写文章描述。

cc140ac709e0ad0a019892fdbad4b290.png

机械臂的关节位置我们一般用电机来驱动。电机通过产生力矩来转动机械装置,驱动机械臂。不同场合或者时机,需要的力矩不尽相同。

例如:

  • 机械臂水平放置的时候需要关节电机产生力矩来抵消地球引力;
  • 当机械臂需要迅速移动的时候,需要的力矩比缓慢移动的要大,当机械臂弯曲或者平展时候,重心发生变化,由于惯量(I = mr²)的不同,需要的关节力矩也不相同;
  • 另外,在很多场合,机械臂需要和人交互(collaborative robots),在碰到人体的时候,需要做出安全的保护动作,并对力矩进行调整。

这些需要考虑力矩的因素,我们称之为动力学(dynamics)。和运动学类似,动力学分为正向动力学(forward dynamics)和反向运动学(inverse dynamics)。RST里支持两种都有相应的MATLAB函数和Simulink block。作者也会另外写文章详细介绍RST关于动力学的部分。

2 运动学部分2.1.1 Rigid Body Tree (刚体树)

我们说研究运动学(主要是反向运动学),就是研究end-effector的位置改变会带动各个关节的角度如何改变。RST用Rigid Body Tree这样一个对象,在这个对象上可以使运动学设计易用且可视化。下图展示了机械臂的刚体树样例,可以在MATLAB界面中展示各个body的详细参数。

aed20f61c27ba4f9b56ea94d759612d0.png

745aaa441f779b613feb08be04f61784.png

一般来说,Rigid Body Tree都是直接从机械臂的CAD文件或者URDF(Unified Robot Description Format)文件导入。不过,也支持每个body的逐步添加。

我们随便敲几行MATLAB命令:

robot = importrobot('iiwa14.urdf');

show(robot);

da7d18644df55671323fdcb750e1704f.png

让我们来改变一下机器人的各个关节角度(configuration),比如让MATLAB自动给一个随机角度配置,再看一下结果。显然各个角度发生了变化。

q=randomConfiguration(robot);

show(robot,q);

5090ec2a569b223129382390d5471612.png

我们看看这个机械臂最末端的end-effector是什么?

showdetails(robot)

2a5c77d7628dc38d8a27b9049d687345.png

我们再看看end-effector相对机器人底座(base)的Homogeneous Transformation(相对位置和角度)。

5268ba584977d37e19bc8a64a0ad0521.png

2.1.2 反向运动学算法

反向运动学算法求解分两种,一种是分析解法(Analytic solutions);一种是数值解法(Numerical solutions)。MATLAB用的是数值解法,可以理解为迭代寻优,或者近似解。

MATLAB里面的反向运动学求解器(solver)有两个: 1. Inverse Kinematics 2. Generalized Inverse Kinematics

两者的区别是,后者比前者多了很多限制(constraints) 。例如end-effector的方向限制、机械臂各个关节的角度限制、位置限制等等。

我们先看一下比较简单的Inverse Kinematics

76bbc42a7ab5053403320032180d110e.png

这是一个6轴机器人,end-effector是L6。

randConfig = puma1.randomConfiguration;

tform = getTransform(puma1,randConfig,'L6','base');

show(puma1,randConfig);

我们想要的最终结果就是下图:

tform是L6相对base的位置和方向(合称pose)。

bb1c93cfea133728d897d97abc5b557f.png

下面的MATLAB代码是计算出最终的各个关节的角度(configSoln),由于是用了迭代的数值解法,weights为权重,initialguess为给出一个初始估计。

ik = robotics.InverseKinematics('RigidBodyTree',puma1);

weights = [0.25 0.25 0.25 1 1 1];

initialguess = puma1.homeConfiguration;

[configSoln,solnInfo] = ik('L6',tform,weights,initialguess);

我们再看一下比较复杂的Generalized Inverse Kinematics:

下面的代码,做了这么几件事情:

a) 导入了一个7自由度的rethink机械臂 -- sawyer

b) 设定反向运动学的求解限制 – 例如机械臂的end-effector永远指向地面的一个物体

c) 对反向运动学进行求解

sawyer = importrobot('sawyer.urdf', 'MeshPath', ...

fullfile(fileparts(which('sawyer.urdf')),'..','meshes','sawyer_pv'));

gik = robotics.GeneralizedInverseKinematics('RigidBodyTree',sawyer, ...

'ConstraintInputs',{'position','aiming'});

% Target Position constraint

targetPos = [0.5, 0.5, 0];

handPosTgt = robotics.PositionTarget('right_hand','TargetPosition',targetPos);

% Target Aiming constraint

targetPoint = [1, 0, -0.5];

handAimTgt = robotics.AimingConstraint('right_hand','TargetPoint',targetPoint);

% Solve Generalized IK

[gikSoln,solnInfo] = gik(sawyer.homeConfiguration,handPosTgt,handAimTgt)

show(sawyer,gikSoln);

如果我们加一段end-effector位置变化后,调用这段代码的动画效果,你会发现end-effector的指向没有变化 – 带限制的反向动力学求解成功了:

d4b6c8aec3efe0f86004fc6b017ba75e.gif

2.1.3 Simulink示例 在安装RST之后,Simulink的library里就会出现几个和机械臂(manipulator)相关的block: 其中Inverse Kinematics就是反向运动学block,其他的一些模块顾名思义和动力学有关,在下一篇文章我会重点介绍。 27add451c3309e89181c4dc484a47133.png

在MATLAB Central File Exchange上搜索“Designing Robot Manipulator Algorithms”,这是一个基于Simulink和Stateflow的例子。我们先看一下运行结果:

7e0793caec74eec15908d4bc64fbd133.gif

这个例子展现了机械臂的end-effector抓了红色物体,沿着规划好的紫色trajectory,进行运动。下图的stateflow状态机是一个trajectory tracking的算法,它的作用是确保end-effctor沿着预设的trajectory运行。

9b8e9f88f55c144b168af28301ea3e58.png

状态机下面的是运动控制部分和环境和物理模型。运动控制很简单 – 直接计算反向运动学,将算好的关节角度交给物理模型去展现。物理模型构建也很简单 – 用SimScape中的SimMultibody直接导入机械臂的URDF文件即可。

3ed65a2170e360674f921b59c5f4f195.png 这里可以看到物理模型并没有包含伺服电机,而是“透明传输”— 反向运动学的结果直接发给了机械模型去展现。实际上真实的运动控制器会将位置、速度、力矩指令通过伺服总线(例如EtherCAT)发给每个关节的电机去执行,电机通过减速器去带动机械结构。 例如

一个6轴机械臂会有6个伺服电机,运动控制器会将运动过程解析为6个电机可以理解的位置、速度、力矩指令。如果想对机械模型+电机模型+电机控制+运动控制 有深入了解,可以在MathWorks官网搜索“How a Differential Equation Becomes a Robot”。这是一个系列视频,将对上述技术点进行顺序讲解。

关注MathWorks订阅号

学习更多MATLAB机械臂算法知识

aa278343df84ee9b47dd2214c6806b1f.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值