matlab 角度转四元数_基于Matlab的机械臂路径规划

9b14be1326a82a95acb6a1eec2ea812a.png

什么是 trajectory(路径)规划

中文路径在英语中可能有两种翻译:

1. path

2. trajectory

首先告诉大家,我们所说的“路径”是后者——trajectory。我们看一下这两种“路径”在机械臂的世界里有什么区别。

设想机械臂的 end-effector 要从 A 点运动到 B 点:

49e3d46b3883f0d8e383198f6cd67f69.png

从 A 到 B 叫 path:

7981cf2c3219d1f387299b03b23a62ab.png

如果我们规定从 A 到 B 这个 path,必须在特定的时间(t0 – t6),经过这 7 个点。

那么这 7 个点叫 waypoints。路径(trajectory)指的是通过这 7 个点的具体计划(例如什么时间,以什么速度等等)。规划我们如何经过这 7 个点的算法,叫做路径规划(trajectory planning)算法

上面这 7 个点,如果机械臂的 end-effector 在通过的时候,位置连续、速度连续、甚至加速度也是连续的,那么我们说这个 trajectory 是平滑的(smooth)。 

机械臂中有几种比较常见的 trajectory:

Trapezoidal Trajectories(梯形路径)

6e50f3daf1519d590d83df0caaeb429b.png

梯形路径指的是:

end-effector 在相邻 waypoints 之间的速度是象梯形一样,先线性加速,然后速度保持不变,在接近目标后线性减速。梯形路径的优点是比较简单实用,但是在每个 waypoint 会有停顿。下图是一个机械臂走梯形路径的样例:在过 waypoints 的时候,会完全停止,所以走的是直线,速度和加速度肯定不连续。

1d7752532bcb3d546673e244a58a23c6.png

Polynomial Trajectories(多项式路径)

其中又分三次多项式和五次多项式。分别写作:

c7b9c7c526e0e78b59f9e2b52c67d80c.png

三次多项式可以记录 end-effector 的速度、位置的信息。五次多项式可以记录 end-effector 的位置、速度、加速度的信息。下图是一个五次多项式的例子,可以看到速度、加速度都是连续的。三次或者五次多项式的 trajectory 在通过 waypoints 的时候速度都是连续的,这和梯形路径是不一样的。

ed52e1310f180c60d4e60d97d472cc4d.png

下图是一个机械臂走五次多项式路径的样例:为了保证过 waypoints 的时候速度不停顿,走的是曲线。

7a7718e66ba889376c047bed7bdf32ff.png

B-splines(B样条曲线)

B 样条曲线将除了起始点和终点外,将其他的 waypoints 看成是控制点(control points)。机械臂的 end-effector 并不会真正通过这些 control points,而在他们之间找一条平滑的曲线。这样做的目的是在平滑加速度和曲线拟合的准确性之间找一个折衷方法。

c75141ce6f528b789218f199c522b961.png

(图片来自于Wikipedia)

如果一个 trajectory 只有这 7 个点,无论机械臂控制器的运动控制模块如何强大,都无法保证做到“平滑”的运行。我们必须对路径点进行插值(interpolation)。

下图的橙色点为插值点示意:

b1416d29a9b064e86c18933ae182363c.png

在了解插值后,我们来看一下路径规划出来的信息如何和传递到反向运动学(inverse kinematics)。反向运动学模块将确保end-effector按照规划出来的路径运行,即路径跟随(trajectory following)。

这里,我们按插值类型情况分两种模式:

1. Trajectory interpolated in task space

在这种模式下,中间插值的点是在 task space(即 XYZ 坐标系,或者叫笛卡尔坐标系)进行插值。下图表明了这一过程,这时候 trajectory generation 只需要做一次,产生所有的 waypoints 和 interpolation points (插值点)。然后运动控制系统在每个控制周期都必须调用 inverse kinematics 算法去做路径跟随(trajectory following)。

d6298caa46bad9d235a66d9d6c6f8dcf.png

2. Trajectory interpolated in joint space

在这种模式下,中间插值点的点是在 joint space(即对关节角度插值)。下图表明了这一过程。这时候 trajectory generation 也只需要做一次,但做的过程和 task space 的做法不同。即在每一个 waypoint 调用一次 inverse kinematics,然后对关节角度的进行插值。Trajectory following 模块只需执行插值后的角度指令。

0803a3fe892e21a7bafb019e7e9fab34.png

角度方向插值 (orientation interpolation)

我们刚才谈到的插值,都是针对 end-effector 的位置(position,即 XYZ 的坐标)。我们不应该忽略 end-effector 的角度方向(orientation)插值。我们看一段动画来了解一下,什么是 orientation 的插值:

912389acbbd14dc96631f28f57fe660f.gif

可以看到,随着 end-effector 的移动,它的方向也在不断做出平滑的调整,在 end-effector 运行到目标位置后,它的方向也调整到位。当然,有很多场合角度方向是不需要调整的。例如:喷漆机械臂,永远将 end-effector 指向喷漆作业面。

MATLAB 中的机械臂路径规划算法

在 R2019a 发布后 Robotics System Toolbox (RST) 中多了几个机械臂路径规划的 MATLAB 函数和 Simulink 模块。

MATLAB 函数:

db803ae0325948c6823952b1bab20fa3.png

Simulink 模块:

6eb250271ec7b560468c3fc8b907ccc8.png

不管是 MATLAB 函数还是类似 Simulink block,大概这么几项功能:

  • 生成梯形或者多项式的位置 trajectory

  • 生成角度方向的 trajectory

  • 将上两者合二为一的生成既包含位置,也包含角度方向(合称 pose)的 trajectory——即基于 homogeneous transforms 的  pose trajectory。

让我们写几行代码,来产生一个三次多项式的 trajectory:

9efb0747717f87ff8c8019d0798c7e53.png

可以看到,位置是连续的。如果我们将速度 (qd)、加速度 (qdd) 画出来,可以看到 qdd 是不连续的。

412a8488a56fb9f539164cb17d532239.png

Simulink示例

在 MATLAB file exchange 里搜索 “Trajectory Planning for Robot Manipulators”,会找到一个用多种方式产生 trajectory 的例子。

用一张表格总结如下:

07cc73520a1ba1285b84de0f5aa8685d.png

这里有两点值得注意:

  1. 无论是 MATLAB 函数还是 Simulink block,所有角度方向的插值都是基于 SLERP (spherical linear interpolation)。这是一种基于四元数(quaternions)的插值法。不会造成下图所示的“不走近路,绕远路”的问题。例如,角度要从 0 度转到 30 度。因为圆周是 360 度,错误的方式是从 0 度转到 330 度 – 虽然也能到达指定位置或者角度,但它是错误的。在manipJointTrajectory 模型中,因为用到了基于 joint space(关节角度)的插值,读者可以注意一下如何处理这个问题。

    2a67e4e28d3081b4e3de55e3a13e1820.png

  2. Time-scaling。在 manipTransformTrajectoryTimeScaling 模型中,如果不加 time scaling 这个模块,那么所有的角度变化和位置变化都是基于线性插值。如果加入了 “想要的” 速度、加速度信息 ---即 time scaling。我们可以使角度变化和位置变化按照我们想要的梯形或者多项式形式去调整。例如,我想让角度一开始不变,然后快速变化,最后速度为0。

    4f348d5e166d43ce9d4464722dd1d40c.png

来源:Matlab

e3fbb4c6f3588f2af86caec37d87cc16.png

更多关于机器人技术相关的文章,请关注微信公众号【机器人R1】。

259bf91c3fd175f95084e0ec3aaa52f9.png

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

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

相关文章

ASP.NET Core 中间件的几种实现方式

前言ASP.NET Core 中 HTTP 管道使用中间件组合处理的方式,换句人话来说,对于写代码的人而言,一切皆中间件.业务逻辑/数据访问/等等一切都需要以中间件的方式来呈现.那么我们必须学会如何实现自定义中间件 这里划重点,必考这里我们介绍下中间件的几种实现方式...匿名函数通常新建…

cookies默认过期时间_「图」Chrome Canary新版已启动“增强版cookies控制”预览测试...

近日谷歌承诺将于今年晚些时候在Chrome浏览器启动“增强版cookies控制”的预览测试。在今年的I/O开发者大会上,谷歌宣布携手Mozilla等开发者耗时3年多时间制定了名为“same-site cookies”的IETF 标准,而该功能就是建立在same-site cookies的基础上&…

【原创】StackOverflow 20万关注的问题:如何实现异步Task超时的处理?

前文传送门 dotNET开发系列收藏!推荐12个超实用的Visual Studio插件程序员:这10种糟糕的程序命名,你遇到过几个?使用Vistual Studio N年,推荐2个异常捕获的技巧面试官:你连RESTful都不知道我怎么敢要你&…

C# WPF 表单更改提示

微信公众号:Dotnet9,网站:Dotnet9,问题或建议,请网站留言; 如果您觉得Dotnet9对您有帮助,欢迎赞赏Dotnet9.com内容目录实现效果业务场景编码实现本文参考源码下载1.实现效果未做修改的表单展示 …

XRPC接口双向调用

一般远程接口调用的服务都是基于客户端主动调用服务端,由服务端来提供相关的接口服务;在新版本的XRPC中引入了一个新的功能,即接口双向通讯,组件提供服务创建客户会话的接口代理并调用客户提供的接口服务。接下来介绍如何通过XRPC…

电机控制pid_微电机控制如此简单,揭秘微电机调速的控制,PID控制之双环调速...

​​在微型电机应用中,由于各种应用产品的不同会用到不同的调速方式,在调速中可能会遇到各种不同的问题,下面天孚电机对最近客户对微电机PID调速遇到的双环控制问题来讲一讲。智能小车TFMOTOR-N30减速电机​客户是做智能小车的采用的是tfn30微…

简单的01背包和完全背包

2020.12.30开始学习AcWing算法《算法竞赛进阶指南》&#xff1b; 上传博客方便复习。 01背包&#xff08;每种物品只能使用一次&#xff09;&#xff1a; //Wecccccccc //2020.12.31 #include <iostream> using namespace std; int n,m,v[1010],w[1010],dp[1010]; int…

图片上传组件_配置Django-TinyMCE组件 实现上传图片功能

Django自带的Admin后台&#xff0c;好用&#xff0c;TinyMCE作为富文本编辑器&#xff0c;也蛮好用的&#xff0c;这两者结合起来在做博客的时候很方便&#xff08;当然博客可能更适合用Markdown来写&#xff09;&#xff0c;但是Django-TinyMCE这个组件默认没有图片上传功能的…

.NET Core 3.1之深入源码理解HealthCheck(二)

写在前面前文讨论了HealthCheck的理论部分&#xff0c;本文将讨论有关HealthCheck的应用内容。可以监视内存、磁盘和其他物理服务器资源的使用情况来了解是否处于正常状态。运行状况检查可以测试应用的依赖项&#xff08;如数据库和外部服务终结点&#xff09;以确认是否可用和…

多重背包问题以及二进制优化

2020.12.30开始学习AcWing算法《算法竞赛进阶指南》&#xff1b; 上传博客方便复习。 多重背包问题&#xff08;N< 100): //Wecccccccc //2020.12.31 #include <iostream> using namespace std; int n,m,dp[110]; int main() {cin>>n>>m;for(int i0;i&…

UnitTest in .NET(Part 2)

Photo &#xff1a;Unit Test in Visual Studio文 | Edison Zhou上一篇我们学习基本的单元测试基础知识和入门实例。但是&#xff0c;如果我们要测试的方法依赖于一个外部资源&#xff0c;如文件系统、数据库、Web服务或者其他难以控制的东西&#xff0c;那又该如何编写测试呢&…

二维费用的背包问题

2020.12.30开始学习AcWing算法《算法竞赛进阶指南》&#xff1b; 上传博客方便复习。 //Wecccccccc //2020.12.31 #include <iostream> using namespace std; int n, v, m, dp[120][120];int main() {cin >> n >> v >> m;for (int i 0; i < n; i) …

UnitTest in .NET(Part 1)

Photo &#xff1a;Unit Test in Visual Studio文 | Edison Zhou2015年看了Roy Osherove的《单元测试的艺术》一书&#xff0c;颇有收获。因此&#xff0c;我在当时就将我的学习笔记过程记录了下来&#xff0c;并分为四个部分分享成文&#xff0c;与各位Share。本篇作为入门&am…

找出一个字符串中出现次数最多的字_Day34:第一个只出现一次的字符

剑指Offer_编程题——第一个只出现一次的字符题目描述&#xff1a;在一个字符串(0<字符串长度<10000&#xff0c;全部由字母组成)中找到第一个只出现一次的字符&#xff0c;并返回它的位置&#xff0c;如果没有则返回-1&#xff0c;需要区分大小写。(从0开始计数)。具体要…

2020 WTM 继续向前

WTM3.1 正式发布在过去的2019年&#xff0c;承蒙各位的厚爱&#xff0c;WTM从零开始一年的时间在GitHub上收获了将近1600星&#xff0c;nuget上的下载量累计超过10万。WTM所坚持的低码开发&#xff0c;快速实现的理念受到了越来越多.netcore使用者的喜爱。在2020年&#xff0c;…

使用ASP.NET Core 3.x 构建 RESTful API - 4.3 HTTP 方法的安全性和幂等性

什么样的HTTP方法是安全的&#xff1f; 如果一个方法不会改变资源的表述&#xff0c;那么这个方法就被认为是安全的。 例如 HTTP GET 和 HTTP HEAD 就被认为是安全的&#xff0c;但需要注意的是&#xff0c;这并不意味着执行GET请求就不会引起其它的资源操作&#xff0c;在表面…

混合背包问题

2020.12.30开始学习AcWing算法《算法竞赛进阶指南》&#xff1b; 上传博客方便复习。 //Wecccccccc //2020.12.31 #include <iostream> using namespace std; #include <vector>struct note {int kind;int v, w; };vector <note> kinds; int n, v, v1, w, dp…

.NET Core 3.1通用主机原理及使用

一、前言只是讲asp.net core 3.x通用主机的大致原理&#xff0c;这些东西是通过查看源码以及自己根据经验总结得来的&#xff0c;在文章中不会深入源码&#xff0c;因为个人觉得懂原理就晓得扩展点&#xff0c;后期碰到有需求的时候再仔细去研究源码也不迟。阅读前你应该先去了…

火焰效果材质实现_「游戏开发」使用Unity实现魔法火焰效果

*本文转载自公众号“Unity官方平台”。本文由视觉效果艺术家Evgeny Starostin分享如何使用Unity制作魔法火焰效果的过程&#xff0c;让我们一起学习和制作魔法火焰吧。下面是魔法火焰效果图。项目下载本文提供项目工程及着色器下载。本文为转载文章&#xff0c;请关注公众号“U…

激光炸弹(二维前缀和问题)

2020.12.30开始学习AcWing算法《算法竞赛进阶指南》&#xff1b; 上传博客方便复习。 //Wecccccccc //2021.1.2 #include <iostream> using namespace std; const int N 5010; int mp[N][N]; int main() {int n,m,k,r,x,y,w;cin>>k>>r;r min(r,5001);n m …