OS: Win10 x64
Matlab: R2016b
V-REP: V-REP PRO EDU v3.5.0
对V-REP有一定了解的读者可以直接跳到第三节Matlab环境准备。
V-REP提供Windows、Linux和MacOS三个平台的应用程序支持,任意平台都提供教育版和专业版两个版本。教育版是免费的,因此后续教程我们均以教育版为例。安装方法也非常简单,Windows版按照正常的安装流程即可,Linux版本只要解压缩就行。
目前来说,V-REP是一个比较小众的仿真工具,尽管它功能非常强大。目前唯一的技术支持就是V-REP官方论坛。V-REP提供的技术手册可以解决大部分问题,功能细节介绍也非常详细。
打开V-REP,V-REP会自动生成一个新的场景(Scene),该场景是空白的。然后你要做的是添加你的仿真对象。V-REP自带的Tutorial会领着你一步一步地从零开始添加一个机械臂,前提是你有CAD模型。
添加自定义仿真对象是基本教程中的内容,尽管大部分用户其实不需要自己做机械臂。但是看完后你会对V-REP的仿真原理有初步的了解,还是很有必要稍微看下的。
V-REP中的形状按照动态性能可以分成动态(dynamic)和静态(static)两种,也可分成可响应的(respondable)和不可响应的(non-respondable)两种:
respondable形状在仿真的时候越简单越好,物理引擎在仿真时会按照5种不同类型的形状进行区分:
多数情况下,你需要的仿真模型都可以在V-REP自带的模型浏览器中找到。
找到后你只需要拖动到工作空间即可,你可以通过位置与方向调整按钮来调整其位置和姿态。
V-REP的操作界面十分精简,默认添加了一部分用户交互按钮。你可以不借助菜单栏目完成绝大多数常用的操作,其它按钮的使用方法你可以自己体会,手册上也有详细说明。
仿真最简答的方式是使用 embedded scripts ,当然这种方式仅支持Lua语言。你也可以通过 plugin 、remote API client、ROS node、BlueZero node 和 add-on进行仿真。除此之外还有很多其它接口。关于这些接口的使用官方给出了示例。
这里我们仅介绍 remote API 方式,不对其它的API进行介绍。官方手册中提供了三篇重要的说明:
强烈建议先阅读以上三篇说明。手册也提供了所有Matlab API的列表。
关于仿真环境的设定官方手册也给出了几点建议。
V-REP与Matlab的通信可以通过 shareMemoryCommunicationPlugin ,也可通过 socket,这里我们仅介绍使用 Sockets的方法。
Step 1:新建你的Matlab项目文件夹,这是我的习惯,例如新建一个名为 vrep api的文件夹。
Step 2:在V-REP安装文件夹下找到 \programming\remoteApiBindings\matlab\matlab 文件夹,将该文件夹下的所有文件拷贝到项目文件夹 vrep api下。其实只有remApi.m 和 rempteApiProto.m 是有用的,其它可留作参考。
Step 3:在V-REP安装文件夹下找到 \programming\remoteApiBindings\lib\lib\Windows\64Bit 文件夹,将该文件夹下的所有文件拷贝到项目文件夹 vrep api下。当然只有一个文件。完成后你的项目文件夹下会有如下文件:
(readMe那个可以删除了)
如此,Matlab环境就准备完毕了。是不是挺简单的?
下面用一个简单的例子来测试一下V-REP与Matlab是否能够重新通信。
Step 1:打开V-REP,系统会自动创建一个新的scence。将UR5拖拽到工作空间。
Step 2:打开Matlab,将工作空间定位到vrep api文件夹下。并打开simpleTest.m文件。
Step 3:如simpleTest.m文件的注释所说,打开V-REP中UR5的脚本文件,在最顶端插入
simRemoteApi.start(19999)
UR5的脚本文件中已经自带了一个例子,可以删了,或者留着也行。
Step 4:运行V-REP仿真,再运行Matlab仿真,观测Matlab输出结果。在V-REP界面移动鼠标可以看到Matlab Command窗口输出的变化,直到Matlab程序执行完毕。
V-REP 与 Matlab 通信的关键脚本代码如下:
% V-REP脚本:
simExtRemoteApiStart(19999)
% MATLAB端:
vrep=remApi('remoteApi'); % using the prototype file (remoteApiProto.m)
vrep.simxFinish(-1); % just in case, close all opened connections
clientID=vrep.simxStart('127.0.0.1',19999,true,true,5000,5);
好了,基本的介绍到此为止。