本教程将试着来说明如何使用反向运动学功能,同时构建一个 7 DoF 冗余操纵臂。但在此之前,请确保在文件夹scenes/ik_fk_simple_examples 中查看与 IK 和 FK 相关的各种简单示例场景。本教程中,我们将构建一个非动态的操纵臂,只需使用反向运动学,而不使用任何物理引擎功能。与本教程相关的 V-REP CAD 数据( “redundantManipulator.stl”)位于V-REP 安装文件夹的“cadFiles”中。在V-REP 安装文件夹的“tutorials\InverseKinematics”中可以找到与本教程相关的V-REP 场景。单击 [Menu bar --> File --> Import --> Mesh...] ,然后选择要导入的文件。另请参阅有关如何导入或导出形状的章节。这时弹出一个对话框,询问是否进行网格缩放和网格定向。单击确定。就在场景中间导入了一个简单的形状。这个形状也会出现在主窗口左侧的场景层次结构中。导入的CAD 数据可能会有不同的规模,有不同的位置,甚至是被细分为几种形状,这都取决于原始CAD 数据的导出方式。输入的形状颜色是随机分配的。下图显示的就是导入的形状:

正如你所见,导入操作在我们预期的几种形状中给我们留下一个单一的形状。这意味着我们必须自己来划分操纵臂对象:选择对象(只需在场景或场景层次结构中单击它),然后单击 [Menu bar --> Edit --> Grouping/Merging --> Divide selected shapes] 来划分形状。以下就是我们会看到的场景:

原始形状分为几个子形状(另见场景层次结构中)。形状分割算法通过对由公共边缘连接的所有三角形进行分组来进行操作。这种划分程序无法执行,因为这取决于原始网格的创建或导出方式。在这种情况下,你必须在三角形编辑模式下手动提取形状。

接下来,我们将改变各种对象的颜色,使它们的外表美观。首先双击场景层次结构中的形状图标。会弹出形状属性对话框。选择形状时,单击 Adjust outside color :这样您就可以调整所选形状的外部颜色组成了。现在,只需调整形状周围或四散的开来的颜色组成。想要将一种形状的颜色转移到另一种形状上,请先选择两种形状,并确保最后选定的形状(显示为白色边框)是要从中获取颜色的形状,然后只需单击形状对话框中的 Colors 部分的 Apply to selection。也可以随意调整其他视觉参数,如 Shading angleEdges width Edges color。完成着色后,你可能会看到以下情况:

在下一步中,我们将添加操纵臂的 7 个关节。方法之一是将关节添加到场景中,然后指定其适当的位置和方向(通过坐标和变换对话框)。然而这是不可能的,在这种情况下,不知道关节的确切位置,就必须从所拥有的形状中提取关节:

选择所有导入的形状,然后单击 [Menu bar --> Edit --> Bounding box alignment --> Align selected shapes' coordinate frame with world]。这一操作保证了边界框与绝对参考系对齐,并且给定了当前的操纵臂配置,还表示了最小的边界框。单击 [Menu bar --> Add --> Joint --> Revolute] 将旋转关节插入场景。默认位置为(0; 0; 0),其默认方向为垂直,因此这个关节由操纵臂的基圆柱面隐藏起来了。在关节仍被选中的情况下,按 ctrl 键选择基圆柱,然后打开位置和转换对话框,单击第 1 部分底部的 Apply to selection 按钮。这仅将接头定位在与基圆柱完全相同的坐标上(然而此操作只会稍微调整关节的垂直位置,因为它几乎已经处于合适的位置了)。现在重复操纵臂中其他所有关节的程序(应该总共有 7 个)。所有关节现在都处于合适的位置,只是其中的一些方位有错误。选择所有应与虚拟环境中的 Y 轴对齐的关节,然后在方向和旋转对话框第 1 部分中的 Alpha , BetaGamma 三项输入(90,0,0),然后单击 Apply to selection。接下来,选择应该与虚拟环境中的 X 轴对齐的关节, 然后在 Alpha,BetaGamma 三项分别输入(0,90,0)。所有关节现在都处于正确的位置和方向。

现在可以在关节属性对话框中(双击场景层次结构中的关节图标弹出对话框)调整关节尺寸(调节 Joint length 和 Joint diameter)。确保所有关节清晰可见。这就是现在的场景:

本教程的下一步是将属于同一刚体的形状进行分组。选择属于连杆 1 的 5 个形状(基圆柱为“link 0”),然后单击 [Menu bar --> Edit --> Grouping/Merging --> Group selected shapes] 将选定的形状分组。一旦这些形状形成一个复合形状,你就可以将其边框与虚拟环境重新对齐,但此步骤并非必需进行(并且只是具有视觉效果)。对逻辑上同属一体的所有形状重复相同的步骤。在本教程中,我们将不会启动夹具的操作手,因此只需将其与最后一个链接进行刚性分组即可。当所有要分组的形状都有相同的视觉属性时,请尝试将它们合并在一起(点击 [Menu bar --> Edit --> Grouping/Merging --> Merge selected shapes] 来进行合并)。

此时,可以按照以下方式重新命名场景中的所有对象:即“底座”到“顶端”的这些对象:“redundantRobot” - “redundantRob_joint1” - “redundantRob_link1” - “redundantRob_joint2”等。只需双击场景中的对象名称即可在层次结构中编辑其名称。

现在我们可以从顶端到底座依次构建运动链:选择对象“redundantRob_link7”,接着 ctrl 选择对象“redundantRob_joint7”,然后单击[Menu bar --> Edit --> Make last selected object parent]。或者,可以将一个对象拖动到场景层次结构中的另一个对象上,以实现相似的操作。接下来对对象“redundantRob_joint7”和对象“redundantRob_link6”进行同样的步骤。继续按照相同的方式操作,直到建立了操纵臂的整个运动链。这是你现在看到的场景(注意场景层次结构):

选择所有关节,然后在关节对话框中,在 Joint mode 中选择 joint is in inverse kinematics mode,然后单击 Apply to selection。然后打开对象基本属性,在 Visibility layers 部分,禁用第 2 层并启用第 10 层,然后单击 Apply to selection。这只是将所有关节发送到可见层 10,实际上看不见它们。如果想要暂时启用/禁用某些图层,可以查看图层选择对话框。

现在我们将为操纵臂定义一个逆运动学任务。在V-REP 中,IK 任务最起码需要指定以下元素:

用“末端”仿真体和“底座”来描述的运动链。

一个“目标”仿真体,即“末端”仿真体将受下一个对象约束。

我们已经有“底座”对象(即对象“redundantRobot”)。我们再添加一个虚拟对象,将其重命名为“redundantRob_tip”,并在坐标和变换对话框中将其位置设置为(0.324, 0, 0.62)。接下来,将仿真体与“redundantRob_link7”连接起来(先选择“redundantRob_tip”,然后选择“redundantRob_link7”,然后单击 [Menu bar --> Edit --> Make last selected object parent] 选择上层。我们的“末端”模拟器就好了。

现在让我们准备“目标”仿真体:复制并粘贴“redundantRob_tip”并将其重命名为“redundantRob_target”。“目标”仿真体准备就绪。接下来,我们要通知 V-REP , “redundantRob_tip” 和“redundantRob_target”是用于逆运动学解析的 tip-target 对。双击场景层次结构中“redundantRob_tip”的图标:这将打开虚拟属性对话框。在 Dummy-dummy linking 中,将“redundantRob_target”指定为 Linked dummy。要注意这两个仿真体是如何通过场景层次结构中的一个红色点画线连接起来的(两个仿真体也是通过红线连接在场景中,但是由于这两个仿真体都是重合的,所以不能看到这条线)。在同一个对话框中,Link type 已经是 IK,tip-target,这就是默认值。这是现在看到到的场景:

在这个阶段,所有用于定义逆运动学任务的所有元素已经准备就绪,我们只需要将该任务注册为 IK 组。打开逆运动学对话框,然后单击 Add new IK group。一个新项目出现在IK 组列表中:“IK_Group”。选择该项目时,单击 Edit IK elements 打开 IK 元素对话框。接下来在 Add new IK element with tip 旁边,在下拉框中选择 redundantRob_tip,然后单击 Add new IK element with tip。这只是添加了列表中出现的 IK 元素。继续向下,将“redundantRobot”显示为底座。最后,确保在 Constraints 部分中检查所有项目(检查 Alpha-Beta 和 Gamma)。事实上,我们想让我们的“尖端”仿真体与我们的“目标”仿真体的位置和方向一致:

关闭IK 元素对话框。在反向运动学对话框中,您可以随意检查机构是否冗余,但是在这个阶段,由于没有定义关节限制或障碍物回避参数,因此不会有任何影响。

逆运动学任务已经准备好了!我们来测试一下。运行模拟, 然后选择“redundantRob_target”。接下来,选择转换工具栏按钮:现在用鼠标拖动对象:

操纵臂应该随之而动。也可以尝试旋转工具栏按钮:

在操作过程中也可以尝试按住 ctrl 或 shift 键,切换到转换工具栏按钮,尽力拖动对象,并留意逆运动学任务是如何中断的。实际上,当配置是单数或不可达成时,会发生这种情况,这种行为的解决方法如下:在模拟仍在运行中时, 在反向运动对话框列表中选择“IK_Group”,然后指定 DLS 为 Calc. method。将对象拖到无法控制的位置,并留意逆运动学分辨率如何变得更加稳定。尝试来回调节Damping 。基本上,当阻尼大时,分辨率变得更稳定但却更慢。实际上,你可以集两种解决方法的优势,而你所需要做的是定义两个相同的“IK 组”,其中第一个无阻尼,第二个有阻尼。然后,对于第二个“IK 组”,您可以指定条件分离度(如需有关详细信息,请参阅 Edit conditional parameters)。现在将 Calc. method 项转换到 Pseudo inverse

在 IK 元素对话框中,选择“redundantRob_tip”,然后尝试禁用一些 Constraints, 并注意当拖动或旋转“redundantRob_target”时操纵臂如何运转。只要进行足够的实验,就可以复位所有 Constraints 为“checked”,然后停止模拟。

我们现在要做的是添加一种方式来轻松操纵机器人,而不必担心在调整周围的错误对象时会破坏它。因此,我们将其定义为一个模型。首先, 将“redundantRob_tip” 和“redundantRob_target”移动到第 11 层,使两个虚拟变量都不可见。然后在场景视图中按 shift 键选择所有可见对象,按 ctrl 键单击场景层次结构中的“redundantRobot”,将其从选择中删除,然后打开对象基本属性对话框。点击 Select base of model instead,然后点击 Apply to selection。点击 ESC 清除选择, 然后选择“redundantRobot”。在同一个对话框中,点击 Object is model base,然后关闭对话框。请留意点画的边界框如何围住整个操纵臂:

单击操操纵臂上的任何一个对象,并注意虚拟底座(“redundantRobot”)是为何总被选中。

接下来,我们添加一个“操纵臂球体”,我们将用它来操纵机器人的夹具位置/方向。点击 [Menu bar --> Add --> Primitive shape --> Sphere] 打开原始形状对话框,将 X-SizeY-Size 和 Z-Size 设为 0.05,然后取消选中 Create dynamic and respondable shape 并单击确定。将新添加的球体的位置调整为与“redundantRob_target”相同(使用坐标和转换对话框)。球体现在出现在操作臂的末端。将球体重命名为“redundantRob_manipSphere”,然后将其设为“redundantRob_target”的本体。现在当你运行模拟时,您应该可以通过移动操作臂球体来改变操作臂的配置。再次停止模拟。

我们来更改一些其他的细节。在形状属性对话框中,单击 Adjust outside color,然后调节 Opacity。注意球体外观如何改变。为了得到一个更美观的外表,调节 Backface culling

在对象基本属性对话框中,取消选中 Object special properties 中的所有项目(这是因为操作臂球体并不真正属于操作臂,它更是一种用户界面元素)。现在使“redundantRob_manipSphere” 成为“redundantRobot”的本体:

在本教程的最后一步中,我们将设置一个碰撞对象,该对象应该能够检测操作臂及其环境之间的碰撞。我们想要的结果是,操作臂中的每个单个形状(除了操纵球体),都能够检测出他们与环境之间的碰撞。我们先来为操作臂定义一个集合:

点击 [Menu bar --> Tools --> Collections] 或单击适当的工具栏按钮,打开集合对话框。选择“redundantRobot”,然后单击 Add new collection。添加了一个新的空集合,现在我们需要定义集合内容:单击 Add(确保“redundantRobot”仍被选中)。注意集合的内容如何变化。现在选择新添加的集合项目,然后单击 Visualize selected collection:场景中所有构成操作臂的对象都变成粉红色!将集合重命名为“redundantRob”。这是你应该得到的场景:

现在已经定义了“redundantRob”集合,我们可以生成一个碰撞对象:打开碰撞对话框,然后单击 Add new collision object , 并指定以下项目对: “[Collection] redundantRob” - “all other collidable objects in the scene” 。这会添加一个新的碰撞对象,你可以双击并重命名列表(将其重命名为“redundantRob”)。

重叠场景层次结构中的“redundantRobot”树。冗余操纵臂模型就准备就绪了!

运行模拟,并复制粘贴几次机械臂。移动或旋转周围的副本,并拖动其操纵球来更改其配置。注意每个机器人实例是如何充分发挥功能的,以及如何随着颜色变化表示碰撞。打开逆运动学对话框,集合对话框和碰撞检测对话框,会注意到列表的项目也被自动复制。然后停止模拟。

记录最小距离对象的步骤与上述碰撞对象记录非常相似。所有的生成对象(碰撞检测,集合,IK 组等)和所有场景对象都可以通过适当的 API 调用访问。此外,它们可以通过图形对象直接记录和可视化。

参考资料

1.V-REP官方文档:http://www.coppeliarobotics.com/helpFiles/

V-REP 反向运动学教程相关推荐

  1. php对接V免签支付教程_【全网首发】最新版影视小程序搭建教程完整版

    大家好,这里是深海网络,今天给大家讲解一下新版影视小程序搭建. 首先给大家看一下新版影视小程序是什么样子的,它有黑夜和白天两种观影模式,而且搜索精准,播放速度快. 01第一步,开始正式搭建. 新版区小 ...

  2. Real-Time-Voice-Cloning的使用教程

    文章目录: 1 环境的搭建 2 如何使用Real-Time-Voice-Cloning 2.1 下载预训练的模型 2.2 先测试环境是否可用(optional) 2.3 下载数据集(optional) ...

  3. XIII Open Cup named after E.V. Pankratiev. GP of Ukraine

    A. Automaton 后缀自动机可以得到$O(2n+1)$个状态,但是后缀自动机会拒绝接收所有不是$S$的子串的串,所以在建立后缀自动机的时候不复制节点即可得到$n+1$个状态的DFA. #inc ...

  4. python - BeautifulSoup教程

    BeautifulSoup BeautifulSoup将网页元素的正则化查找简单化. from bs4 import BeautifulSouphtml_doc = """ ...

  5. f15纸飞机折法_A4纸折F15战斗机的折法视频折纸飞机教程

    康乃馨的折法视频教程之母亲节简单折纸花康乃馨 康乃馨的折法 一直以来都深受大家的喜欢,主要还是因为康乃馨和我们熟悉的 母亲节 是密不可分的.每当母亲节到来的时候,我们都会制作各种各样漂亮的手工制作送给 ...

  6. 拿命 3 天肝出来的计算机考研数据结构与算法复习笔记(超详细教程,更新中)

    数据结构与算法 基本概述 数据结构指的是"一组数据的存储结构",算法指的是"操作数据的一组方法". 数据结构是为算法服务的,算法是要作用再特定的数据结构上的. ...

  7. 非主流效果等等Photoshop教程集+非主流笔刷

    转自[粑粑工作室]         今天我在网上发发现了一些学习photoshop的好教程,都是很实用的教程,大部分都是关于非主流的教程,所以我将他们收集起来,和大家一起分享,相信当你看完下面这些教程 ...

  8. 史上最全的Android开发学习教程集锦【初学者】

    根据Google的报告,截止2017年5月为止,Android活跃用户已超过20亿,并还在持续增长中.Android系统在几个主要的市场上已超过了iOS系统,特别是在美国,欧洲和日本,然而苹果确实在中 ...

  9. VScode打开vivado中v文件

    VScode打开vivado中v文件 参考教程 参考教程: Vivado加上VsCode让你的生活更美好 Vivado:Tools-Setting-Text Editor进行文本编辑器的更换 更换为C ...

最新文章

  1. 【 MATLAB 】范数的必备基础知识
  2. 创建数据库是列名无效咋办_怎样解决列名无效 - 技术问答 - .Net源码论坛 .net源码,ASP.net|论坛 - Powered by Discuz!NT...
  3. 腾讯技术直播间 | 当感性遇上理性,当魔术遇上数学
  4. android适配器持有者模式
  5. when and where is gt_cache_in_memory filled
  6. 产品经理有哪些类型?
  7. HEVC/H265 文档获得
  8. hibernate oracle clob 注解,Hibernate3.X实现基于CLOB字段类型的注解方式:
  9. Windows启动管理器
  10. oracle 聚合函数 LISTAGG ,将多行结果合并成一行
  11. 自己闲着没事整理的人工智能的思维导图
  12. 截图上传录屏gif上传工具推荐
  13. 开始时间 结束时间,全程的运行时间的计算
  14. 计算机类sci一区是什么水平,计算机类高质量SCI分区高水平期刊投稿建议汇总
  15. CoreOS在儿童节发布了自己的分布式存储Torus
  16. Zookeeper之基础知识
  17. Apache POI(Word)教程_编程入门自学教程_菜鸟教程-免费教程分享
  18. 建议118:使用SecureString保存密钥等机密字符串
  19. 总结40条常见的移动端Web页面问题及解决方案
  20. android平板电脑怎么样,苹果还是安卓?一图教你如何选择适合自己的平板

热门文章

  1. 2021-2027全球与中国海上甚高频电台市场现状及未来发展趋势
  2. 要为了愉悦和理解而阅读,如果你认为阅读不过是上传一些信息,那么你就会一直觉得它太慢了
  3. 计算机基础研究论文,计算机基础教学法研究的论文
  4. 推荐|6 款免费又好用的远程管理工具
  5. Reconcile failed: Signature mismatch for shared user:
  6. 2021-09-25 关于启动代码出现炸内核的解决方法
  7. codevs——1553 互斥的数
  8. 关于离职证明和竞业条款
  9. 选购笔记本电脑的三招半式
  10. 51单片机c语言复位程序,51单片机如何实现软件复位系统(C语言),谢谢