[機器人仿真軟件(二)]C++控制V-REP中的Baxter機器人簡單例子


注:本文所提供的例子是在路徑V-REP_PRO_EDU\programming\bubbleRobClient下提供的代碼基礎上修改的,在其他路徑下使用時需更改代碼中的頭文件,庫,代碼中的路徑等。

 

一.程序的效果

 本例子將實現C++程序不斷讀取存儲在文本文件中的關節角信息,然后通過socket通信傳輸給V-REP中的Baxter機器人,實現簡單的位置控制功能。

二.V-REP端

在Baxter機器人模型的左臂,右臂分別添加以下的語句:

simExtRemoteApiStart(19998)

simExtRemoteApiStart(19999)

三.C++代碼

1.Socket的建立:

    int clientID = simxStart((simxChar*)"127.0.0.1", 19999, true, true, 2000, 5);
    int clientID1 = simxStart((simxChar*)"127.0.0.1", 19998, true, true, 2000, 5);

2.對各個關節的獲取:

simxGetObjectHandle(clientID, "Baxter_rightArm_joint1", &Baxter_rightArm_joint1, simx_opmode_oneshot_wait);
.....................................//包括了14個關節,不知能否用循環語句實現
simxGetObjectHandle(clientID1, "Baxter_leftArm_joint7", &Baxter_leftArm_joint7, simx_opmode_oneshot_wait);

3.讀取文本,同時傳輸關節角:

simxSetJointTargetPosition(clientID, Baxter_rightArm_joint1, x1, simx_opmode_oneshot);  //x1表示要傳輸的關節角
.....................................//同樣包括了14個關節
 simxSetJointTargetPosition(clientID1, Baxter_leftArm_joint7, 0, simx_opmode_oneshot);

4.全部的代碼

#include <stdio.h>
#include <stdlib.h>
#include <iostream>  
#include <iomanip>  
#include <fstream> 
#include <sstream>
#include <string> 
#include<windows.h>

extern "C" {
    #include "extApi.h"
}

int main(int argc,char* argv[])
{
    int clientID = simxStart((simxChar*)"127.0.0.1", 19999, true, true, 2000, 5);
    int clientID1 = simxStart((simxChar*)"127.0.0.1", 19998, true, true, 2000, 5);
    if (clientID != -1 || clientID1 != -1)
    {
        printf("Connected to remote API server\n");

        int Baxter_rightArm_joint1;
        int Baxter_rightArm_joint2;
        int Baxter_rightArm_joint3;
        int Baxter_rightArm_joint4;
        int Baxter_rightArm_joint5;
        int Baxter_rightArm_joint6;
        int Baxter_rightArm_joint7;

        int Baxter_leftArm_joint1;
        int Baxter_leftArm_joint2;
        int Baxter_leftArm_joint3;
        int Baxter_leftArm_joint4;
        int Baxter_leftArm_joint5;
        int Baxter_leftArm_joint6;
        int Baxter_leftArm_joint7;

        simxGetObjectHandle(clientID, "Baxter_rightArm_joint1", &Baxter_rightArm_joint1, simx_opmode_oneshot_wait);
        simxGetObjectHandle(clientID, "Baxter_rightArm_joint2", &Baxter_rightArm_joint2, simx_opmode_oneshot_wait);
        simxGetObjectHandle(clientID, "Baxter_rightArm_joint3", &Baxter_rightArm_joint3, simx_opmode_oneshot_wait);
        simxGetObjectHandle(clientID, "Baxter_rightArm_joint4", &Baxter_rightArm_joint4, simx_opmode_oneshot_wait);
        simxGetObjectHandle(clientID, "Baxter_rightArm_joint5", &Baxter_rightArm_joint5, simx_opmode_oneshot_wait);
        simxGetObjectHandle(clientID, "Baxter_rightArm_joint6", &Baxter_rightArm_joint6, simx_opmode_oneshot_wait);
        simxGetObjectHandle(clientID, "Baxter_rightArm_joint7", &Baxter_rightArm_joint7, simx_opmode_oneshot_wait);

        simxGetObjectHandle(clientID1, "Baxter_leftArm_joint1", &Baxter_leftArm_joint1, simx_opmode_oneshot_wait);
        simxGetObjectHandle(clientID1, "Baxter_leftArm_joint2", &Baxter_leftArm_joint2, simx_opmode_oneshot_wait);
        simxGetObjectHandle(clientID1, "Baxter_leftArm_joint3", &Baxter_leftArm_joint3, simx_opmode_oneshot_wait);
        simxGetObjectHandle(clientID1, "Baxter_leftArm_joint4", &Baxter_leftArm_joint4, simx_opmode_oneshot_wait);
        simxGetObjectHandle(clientID1, "Baxter_leftArm_joint5", &Baxter_leftArm_joint5, simx_opmode_oneshot_wait);
        simxGetObjectHandle(clientID1, "Baxter_leftArm_joint6", &Baxter_leftArm_joint6, simx_opmode_oneshot_wait);
        simxGetObjectHandle(clientID1, "Baxter_leftArm_joint7", &Baxter_leftArm_joint7, simx_opmode_oneshot_wait);

        std::ifstream fin("angle.txt", std::ios::in);
        char line[1024] = { 0 };
        float x1;
        float x2;
        float x3;
        float x4;
        float x5;
        float x6;
        float x7; 
        
            while (simxGetConnectionId(clientID) != -1 || simxGetConnectionId(clientID1) != -1)
            {
                while (fin.getline(line, sizeof(line)))
                {
                    std::stringstream word(line);
                    word >> x1;
                    word >> x2;
                    word >> x3;
                    word >> x4;
                    word >> x5;
                    word >> x6;
                    word >> x7;
                //printf("chuanshu");
                // default settings for baxter robot.
                simxSetJointTargetPosition(clientID, Baxter_rightArm_joint1, x1, simx_opmode_oneshot);
                simxSetJointTargetPosition(clientID, Baxter_rightArm_joint2, x2, simx_opmode_oneshot);
                simxSetJointTargetPosition(clientID, Baxter_rightArm_joint3, x3, simx_opmode_oneshot);
                simxSetJointTargetPosition(clientID, Baxter_rightArm_joint4, x4, simx_opmode_oneshot);
                simxSetJointTargetPosition(clientID, Baxter_rightArm_joint5, x5, simx_opmode_oneshot);
                simxSetJointTargetPosition(clientID, Baxter_rightArm_joint6, x6, simx_opmode_oneshot);
                simxSetJointTargetPosition(clientID, Baxter_rightArm_joint7, x7, simx_opmode_oneshot);

                simxSetJointTargetPosition(clientID1, Baxter_leftArm_joint1, 0, simx_opmode_oneshot);
                simxSetJointTargetPosition(clientID1, Baxter_leftArm_joint2, 0, simx_opmode_oneshot);
                simxSetJointTargetPosition(clientID1, Baxter_leftArm_joint3, 0, simx_opmode_oneshot);
                simxSetJointTargetPosition(clientID1, Baxter_leftArm_joint4, 0, simx_opmode_oneshot);
                simxSetJointTargetPosition(clientID1, Baxter_leftArm_joint5, 0, simx_opmode_oneshot);
                simxSetJointTargetPosition(clientID1, Baxter_leftArm_joint6, 0, simx_opmode_oneshot);
                simxSetJointTargetPosition(clientID1, Baxter_leftArm_joint7, 0, simx_opmode_oneshot);
                std::cout << "x1: " << x1;
                Sleep(200);
            }
        }
        fin.clear();
        fin.close();          
   }
    return(0);
}

四.實驗結果

先運行V-REP,再運行C++程序。運行成功后,C++控制窗口顯示關節角信息,V-REP中的機器人開始運動,直到讀取完文本。

 

Github地址:https://github.com/scutXuYang/Communication-between-C--and-V-REP.git

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM