“ 坚持是一件很难的事情。”
今天介绍Inverse kinematics 教程的相关内容。
这次将尝试解释如何使用逆运动学的功能,同时建立一个7自由度冗余的机械手。在本教程中,我们将构建一个非动态机械手,它只使用逆运动学而不使用任何物理引擎功能。
与本教程相关的V-REP CAD数据(“redundantManipulator.stl”)位于V-REP安装文件夹的“cadFiles”文件夹中。redundant Manipulator:冗余操作器
与本教程相关的V-REP场景可以在V-REP安装文件夹的“tutorialsInverseKinematics”文件夹中找到。点击 [Menu bar --> File --> Import --> Mesh...] 然后选择要导入的文件。也请参考如何导入/导出形状部分。弹出一个对话框询问网格缩放和网格方向。一个简单的形状被导入并位于场景的中间。这个形状也出现在主窗口左边的场景层次结构中。根据原始CAD数据是如何导出的,导入的CAD数据可以是在不同的规模,不同的位置,甚至可以细分为几个形状。导入形状的指定颜色是随机的。导入形状如下图:
导入操作只给我们留下了一个形状,而我们希望在这个形状中有几个形状。这意味着我们需要自己对机械手对象进行分割:选择对象(在场景或者场景层次中点击它),然后点击 [Menu bar --> Edit --> Grouping/Merging --> Divide selected shapes]。以下是分割完之后的:
原始的形状被划分为几个子形状(参见场景层次结构)。形状划分算法通过将公共边连接的所有三角形分组来操作。取决于原始网格是如何创建或导出的,这样的划分过程不能执行。在这种情况下,将不得不在 triangle edit mode三角形编辑模式中手动提取形状。
接下来,我们将改变各种对象的颜色,以获得一个良好的视觉外观。首先在场景树中双击一个形状图标。打开 shape properties形状属性对话框。当一个形状被选中时,在对话框中点击调整外部颜色:这将允许你调整所选形状外部面的各种颜色组件。现在,只需要调整你的形状的环境色/漫反射色组件。将一个形状的颜色转移到另一个形状,选择这两个形状、确保最后选定的形状(白色的边界框表示)是一个你想要的颜色,然后在形状的颜色的部分对话框单击apply to selection按钮。也可以随意调整其他视觉参数,如阴影角度参数、边缘宽度或边缘颜色。完成上色后,可能会出现以下情况:
下一步,我们将添加机械手的7个关节。一种方法是将关节添加到场景中,然后指定它们适当的位置和方向(通过位置对话框和方向对话框),然而,当不知道确切的关节位置,这种方法是不可能的。所以我们将不得不从形状提取它们:
选择所有导入的形状,点击 [Menu bar --> Edit --> Bounding box alignment --> Align selected shapes' coordinate frame with world]。这个操作保证了边界框与绝对参考系对齐,并且给定当前机械手的配置,表示最小的边界框。点击 [Menu bar --> Add --> Joint --> Revolute],将一个旋转关节插入场景。默认位置为(0;0;0),默认方向为垂直,因此关节被机械手隐藏。当关节仍然被选中时,按住ctrl键并且选中基柱,然后打开position选项卡上的position对话框,点击Apply to selection。这只是将关节定位在与基缸完全相同的坐标上(然而,这种操作只是稍微调整了关节的垂直位置,因为它已经几乎在位置上了)。现在对机械手的其他关节重复这个步骤(记住总共应该有7个关节)。所有的关节现在都在位置上,但是他们中的一些有错误的方向。选择所有应该与世界y轴对齐的关节,然后在方向对话框的方向选项卡上为Alpha、Beta和Gamma项目输入(90,0,0),然后单击应用到选择按钮。接下来,选择应该与世界x轴对齐的关节,然后为,和进入(0,90,0)。现在所有的关节都有正确的位置和方向。
现在你可以在关节属性对话框中调整关节大小(检查关节长度和关节直径)(你可以在场景层次中双击关节图标打开)。确保所有的关节都清晰可见。这是你应该拥有的:
下一步是对属于同一刚性实体的形状进行分组。选择link1(基柱为“link0”)的5个形状,点击 [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]。或者,您可以拖动一个对象到场景层次结构中的另一个对象上(比较方便),以实现类似的操作。继续以同样的方式,直到机械手的整个运动学链被建立。这是你应该拥有的(注意场景层次结构):
选择所有关节,然后在关节对话框中,在关节模式部分选择“joint is in inverse kinematics mode ”,点击应用进行选择。然后打开对象的公共属性和可见层部分,禁用层2和启用层10,然后点击相关的应用到选择按钮。这只是将所有的关节发送到可见层10,有效地使它们不可见。如果想临时启用/禁用一些图层,可以看看图层选择对话框(layer的相关内容之前介绍过)。
现在我们将为机械手定义一个逆运动学任务。在V-REP中,IK任务至少需要指定以下元素:
- a kinematic chain described with a "tip" dummy and a "base" object.
- A "target" dummy that the "tip" dummy will be constrained to follow.
我们已经有了“base”对象(redundantRobot)。让我们添加一个虚拟对象,将其重命名为“"redundantRob_tip”,并使用坐标和转换对话框将其位置设置为(0.324,0,0.62)。接下来,将redundantRob_tip附加到“redundantRob_link7”(选择“redundantRob_tip”,然后“redundantRobRob_link7”,然后点击[Menu bar --> Edit --> Make last selected object parent])。
现在让我们准备"target" dummy:复制并粘贴“redundantRob_tip”,并将复制物重命名为“redundantRob_target”。"target" dummy准备好了。接下来,我们必须通知V-REP“redundantRob_tip”和“redundantRob_target”是用于解决逆向运动学的末端-目标对。双击场景层次结构中的虚拟图标“redundantRob_tip"”:这会打开虚拟属性对话框。在dummy -dummy链接部分,指定“redundantRob__target”为Linked dummy。注意两个假人是如何通过场景层次结构中的一条红色点画线连接起来的(两个dummies在场景中也是通过一条红色线连接起来的,但是由于两个dummies是重合的,这条线是看不到的)。在同一个对话框中,链接类型已经是IK, tip-target,这是默认值。这是现在应该有的:
在这个阶段,定义逆运动学任务的所有元素都已经准备好了,只需要将任务注册为IK组即可。打开逆向运动学对话框,点击添加新的IK组。IK群组列表中出现了一个新项目:“IK_Group”。选中该项目后,单击Edit IK elements打开IK元素对话框。在带有提示的添加新IK元素旁边,在下拉框中选择“redundantRob_tip”,然后单击带有提示的添加新IK元素。这只是添加了一个出现在列表中的IK元素。再往下,以“"redundantRobot”为基础。最后,确保检查了Constraints部分中的所有项(检查als Alpha-Beta和Gamma)。事实上,我们希望我们的"tip" dummy 在位置和方向上跟随我们的"target" dummy:
关闭IK元素对话框。在逆运动学对话框中,你可以自由地检查项目机构是否冗余,但在这个阶段,它不会有任何区别,因为没有已经被定义的关节限制或避障参数。
我们的逆运动学任务准备好了!让我们来测试一下。运行模拟,然后选择“redundantRob_target”。下一步,选择对象转换;
现在用鼠标拖动对象:机械手应该跟随。也尝试对象旋转;
在操作过程中也试着按住ctr键或shift键。切换回对象转换工具栏按钮,并尽量拖动对象,注意逆向运动学任务是如何中断的。实际上,当配置是单一的或者不可达时,就会发生这种情况,但是有解决这种行为的方法:当仿真仍在运行时,在逆向运动学对话框列表中选择“IK_Group”,然后为Calc. method项指定DLS。把物体拖到够不着的地方,注意到逆运动学的解决如何变得更稳定。试着上下调节阻尼项。基本上,当阻尼较大时,分辨率会变得更稳定但更慢。实际上,可以获得两种分辨率方法的优点,所需要做的就是定义两个相同的“IK组”,其中第一个是无阻尼的,第二个是有阻尼的。然后,对于第二个“IK组”,可以指定条件解析。现在将Calc.method项设置为Pseudo inverse。
现在,在IK元素对话框中,选择“redundantRob_tip”,然后尝试禁用一些约束项,并注意当“redundantRob_target”对象被拖动或旋转时机械手的行为。一旦你做了足够的实验,重置所有的约束项为“checked”,然后停止模拟。
我们现在要做的是添加一种方法来轻松操作机器人,而不必担心由于移动错误的对象而破坏它。因此,我们将把它定义为一个模型。首先,将“redundantRob_tip”和“redundantRob_target”移动到第11层,使它们都不可见。然后shift-选择场景视图中所有可见的对象,ctrl-单击场景层次结构中的对象“redundantRobot”将其从选择中移除,然后打开 object common properties对象公共属性对话框。检查Select base of model instead item,然后应用到选择按钮。用<Esc>清除选择,然后选择“redundantRobot”。在同一个对话框中,检查 Object is model base对象是模型基项,然后关闭对话框。注意点画的包围框现在如何包围整个机械手:
单击机械手上的任何对象,注意到如何base dummy(“redundantRobot”)总是被选中。
接下来,让我们添加一个“操纵球”,我们将使用它来操纵机器人的抓手位置/方向。点击 [Menu bar --> Add --> Primitive shape --> Sphere] ,打开基元形状对话框,X-Size, Y-Size, Z-Size分别设置为0.05,取消选中 Create dynamic and respondable shape创建动态可响应形状项目,点击确定。将新添加的球体的位置调整为与“redundantRob_targe”相同(使用坐标和转换对话框)。球体现在出现在机械手的顶端。将球体重命名为“redundantRob_manipSphere”,然后将其作为“redundantRob_target”的父元素。现在运行仿真时,应该能够通过移动操纵球来改变机械手的配置。再次停止模拟。
让我们改变一些其他细节。在形状属性对话框中,点击调整外部颜色,然后检查不透明度项目。注意球体的外观是如何变化的。为了更好的外观,检查形状对话框中的Backface culling。
在“对象通用属性”对话框中,取消选中“对象特殊属性”部分的所有项目(这是因为操作球实际上并不属于机械手,它更多的是一个用户界面元素)。现在将“redundantRobo”作为“edundantRob_manipsphere”的父元素:
最后一步,我们将注册一个碰撞对象,它将检测机械手与其环境之间的碰撞。我们想要的是机械手中的每一个形状(除了操纵球)都能够检测到与环境的碰撞。让我们首先为机械手定义一个集合:
使用 [Menu bar --> Tools --> Collections]或单击相应的工具栏按钮,打开collection对话框。选择“redundantRobot”,然后点击添加新集合。添加了一个新的空集合。现在我们需要定义集合内容:单击Add(确保仍然选择“redundantRobot”)。注意集合的内容是如何更改的。现在选择新添加的集合项,然后点击Visualize selected collection可视化选择集合:组成机械手的所有对象在场景中得到粉红色!将集合重命名为“"redundantRob”。这是我们现在所拥有的:
现在已经定义了“redundantRob”集合,我们可以注册一个碰撞对象:打开碰撞对话框,然后点击添加新的碰撞对象,并指定以下项目对:“[collection]redundantRob”—“all other collidable objects in the scene”。这增加了一个新的碰撞对象,你可以在列表中双击重命名它(重命名为“redundantRob”)。
在场景层级中折叠redundantRob场景树。redundantRob操纵器模型准备好了!
运行仿真,并复制粘贴几次机械手。移动/旋转副本,并通过拖动它们的操作球体来改变它们的配置。请注意,每个机器人实例都具有完整的功能,以及碰撞是如何用颜色变化来表示的。打开逆向运动学对话框,收集对话框和碰撞检测对话框。请注意列出的项也是如何被自动复制的。停止仿真。
注册最小距离对象的过程与上面的碰撞对象注册非常相似。所有已注册的对象(碰撞检测、集合、IK组等)和所有场景对象都可以通过适当的API调用访问。此外,还可以通过图形对象直接记录和可视化。
以上内容希望能对你们的V-REP 学习起到一定的辅助作用,做这个公众号的初衷就是辅助自己来学习软件。在对help文件进行翻译的过程中,自己也的确是对软件有了更多的了解,不再是两眼一抹黑不知道如何下手的状态了哈哈。
谢谢大家的关注,以上内容如果有什么不对的地方,欢迎大家批评指正。