V-rep是如何通過remoteAPI的交互,只需要一行代碼simExtRemoteApiStart()。
以ABB為例,在新場景中直接從現有模型中拖出abb的模型。
1.1 ABB 機械臂
在Scene窗口中Abb元素的右邊有一個小本子的標志,雙擊打開編譯腳本。
1.2 程序界面
里面的代碼已經編譯好啦,V-rep的代碼示弱語言,內容主要分為幾大塊,以if(sim_call_type == xxxx)then .... end 為分界。
表示仿真開始,仿真中,仿真暫停,仿真結束等等不同的狀態。在不同的狀態里寫入相應的指令就好啦。
而初始化調用RemoteApi需要在初始化過程中,調用simExtRemoteApiStart(3000)。 其中3000表示端口號。端口號只要不與已有進程沖突就可以了,具體可以查詢端口使用的列表。
1.3 添加RemoteApi
這里我們通過C++連接V-rep。首先我們先找到v-rep的根目錄里的programming引入include和RemoteApi兩個文件夾。想了解更多可以以bubbleRobClient中的例程為例。
我們這里在VS中創建一個自己的C++控制台程序。
這里要添加預處理:
WIN32
NDEBUG
_CONSOLE
NON_MATLAB_PARSING
MAX_EXT_API_CONNECTIONS=255zasda
注意添加附加包含目錄,要包括inclue和remoteapi兩個文件夾,添加頭文件
#include <stdio.h>
#include <stdlib.h>
extern "C" {
#include "extApi.h"
}
其中Port是之前定下的端口號:3000。
使用simxStart函數開啟RemoteApi的通信。返回值int,判斷是否能夠連接。
使用simxGetObjectHandle函數添加需要讀取的ObjectHandle。
使用simxGetObjectPosition函數獲得handle的位置信息。
例程如下:
#include "stdafx.h" #include <stdio.h> #include <stdlib.h> extern "C" { #include "extApi.h" } int main() { int Port = 3000; int PositionControlHandle; simxChar* Adresse = "127.0.0.1"; float position[3]; int clientID = simxStart(Adresse, Port, true,true,2000,5); if (clientID != -1) { printf("V-rep connected."); extApi_sleepMs(300); while (simxGetConnectionId(clientID) != -1) { simxGetObjectHandle(clientID,"IRB140_manipulationSphere", &PositionControlHandle, simx_opmode_oneshot); simxGetObjectPosition(clientID,PositionControlHandle,-1,position, simx_opmode_oneshot); printf("(%f,%f,%f)\r\n",position[0],position[1],position[2]); } simxFinish(clientID); } else { printf("V-rep can't be connected."); extApi_sleepMs(300); } return 0; }
更多函數用法及參數見v-rep使用手冊,RemoteApi中C++部分及Server部分介紹。