有些同学催我继续做一些教程,但实在是做教程太牵扯精力了,但是为了大家能够快速入门Vrep,我也是在克服各种困难。讲完[连载 3]Vrep小车建模——matlab控制这篇教程之后,我觉得大家应该对Vrep有了基本的认识,但是可能对细节把握的不是非常准,这时候大家千万不要急于求成,很多同学觉得啊啊啊,我会用vrep啦,就机械臂、机器人啥都上,然后面临的问题就是仿真过程很多事情把握不住,即使仿真有点样子,也不能保证仿真结果准确。

插一句,大家做仿真的时候一定要注意仿真的目的:仿真是为了尽可能的模拟实际的状态,使得得到的观测数据对实际实验具有指导作用。仿真并不是为了看起来像,而是要经过合理的抽象,真正的使仿真结果指导实际使用。

这个番外教程不针对初学者!!,需要一定的基础,起码你要对三个连载教程的内容非常熟悉。当你掌握了一定的基础知识后大家可能想了解一下如何实现一个控制器,实现控制、规划等任务。所以这一节的番外教程主要用于给大家展示一下设计的思路。

再插一句。仿真速度基本绝对了最后的成败,举个例子,有个同学四处粘贴代码,一部分控制器在non-thread script实现,另一部分在thread script实现,结果thread script中各种阻塞的写法,导致很简单的功能仿真很慢,基本你最后很难仿真成功,因为快速的仿真意味着你调参更快更快的看到结果反馈明确代码运行的时序

实在是有好多的话对大家说,授人以鱼不如授人以渔,所以就有了这篇,给大家展示一下。

完整的代码和例程请点击购买。(番外类型的程序绝对物超所值)

前言

废话少说,咱们步入正题。咱们这一节的内容为将机械臂安装在移动小车上,能够实现小车移动到指定位置,机械臂能够实现抓取和放下的操作。(对应的场景就是小车进入一个工作环境,运动到工作台前,然后抓取相应的物体,然后再放到另一个地方),工作空间见下图

部件组成

要求基础

  1. 灵活操作平移、旋转等,明确模型树层次结构。(见连载0连载1
  2. 会使用lua脚本完成基本的控制功能,能够读懂lua脚本程序,了解常见的Regular API(见连载2
  3. 会使用matlab与vrep连接,了解常见的Remote API(见连载3
  4. 想要研究机械臂

下面的内容安排为:

  1. 小车移动到目标点、目标姿态控制算法
  2. 机械臂逆解求解
  3. 抓取过程简述
  4. 代码结构

小车控制算法

连载3中已经给出了完整的lua控制代码和matlab控制代码(点击购买),并给出了草图。在连载3中并没有好好讲有限状态机,这里抛砖引玉吧。
有限状态机是嵌入式开发、软件开发、游戏开发常用的一种结构,在本小车控制时划分为以下几个状态:

  1. 小车停止状态
  2. 小车开始运行,先运动到目标点的过程
  3. 小车已经运动到目标点,运动到目标朝向的过程
  4. 小车运动到目标位置和姿态,处于检测状态。如果目标点位置发生偏离,小车跳转到状态2。

状态机最重要的就是状态的划分和状态的切换,这里只是引出思路,大家可以参考网上的材料进行学习,当然后面如果有时间的话,我会在连载教程里给出几种状态机的实现方式。(自学状态机可以学习Matlab下的Stateflow,会理解更加深刻)。

如果大家跑了我在连载3中的例程会发现,有时候会出现小车无法运动到目标点的情况,而是绕目标点进行旋转(由于欠驱动的问题),这里我进行了改进,大家可以试试,基本没有任何问题。

小车运动控制

QT-GUI控制台说明

机械臂求逆解

如果你不清楚运动学逆解的话,那么你需要百度学习一下逆解的概念了,不知道逆解,机械臂是没法玩的。我这里用了vrep再带的计算模块,IK group,配置的话直接看我的例程吧,具体配置过程会放到连载教程里。机械臂采用的UR5,手抓采用的是RG2,抓取过程见下图。

抓取过程简述

通过求解逆解,得到机械臂各个关节的角度,再通过vrep再带的Reflexxes Motion Library type IV工具箱,生成关节的控制指令,将手抓运动到指定位置即可。

代码结构

这个例程里面我使用了两种方式实现,第一种方式为全部使用lua代码,第二种方式为将一部分功能分离出matlab接口,供matlab使用。
首先我用一个non-htread script实现了小车的运动控制功能,和QT-GUI控制台,作为整个程序的控制中心,然后在UR5上实现了机械臂抓取的过程和逆解求解等(采用的是 thread script),在手抓RG2上实现了抓取和松开的功能,通信全部采用Signal的方式。由于在UR5上采用的是 thread script,具有阻塞指令,因此,尽可能的将其功能完整封装,不要让non-thread 的脚本等待他执行完。详细中文注释代码请点击购买

最终使用matlab控制小车运动到指定位置后抓取的过程为:

文件清单.png
文件清单1.png