V-rep planar one-line and fourbar linkage simulation

One-link Robot Velocity Control

One-link manipulator Python3 remote API program:

Joint Properties -

Torque/Force Mode.

Moter enabled with Maximum torque setup and zero target velocity.

Joint ObjectName: Revolute_joint

import vrep
import sys
# child threaded script: 
# 內建使用 port 19997 若要加入其他 port, 在  serve 端程式納入
#simExtRemoteApiStart(19999)

vrep.simxFinish(-1)

clientID = vrep.simxStart('127.0.0.1', 19997, True, True, 5000, 5)

if clientID!= -1:
    print("Connected to remote server")
else:
    print('Connection not successful')
    sys.exit('Could not connect')

errorCode,Revolute_joint_handle=vrep.simxGetObjectHandle(clientID,'Revolute_joint',vrep.simx_opmode_oneshot_wait)

if errorCode == -1:
    print('Can not find left or right motor')
    sys.exit()

errorCode=vrep.simxSetJointTargetVelocity(clientID,Revolute_joint_handle,2, vrep.simx_opmode_oneshot_wait)

while True:
    choice = input("(e to exit, p to pause and enter to exec)>")
    if choice == "e":
        print("exiting")
        vrep.simxStopSimulation(clientID, vrep.simx_opmode_oneshot_wait)
        break
    elif choice == "p":
        vrep.simxPauseSimulation(clientID, vrep.simx_opmode_oneshot_wait)
    else:
        vrep.simxStartSimulation(clientID, vrep.simx_opmode_oneshot_wait)

One-link Robot Position Control

One-link manipulator Python3 remote API program:

Joint Properties -

Torque/Force Mode.

Moter enabled with Maximum torque setup and zero target velocity.

Joint ObjectName: Revolute_joint

import vrep
import sys, math
# child threaded script: 
# 內建使用 port 19997 若要加入其他 port, 在  serve 端程式納入
#simExtRemoteApiStart(19999)

vrep.simxFinish(-1)

clientID = vrep.simxStart('127.0.0.1', 19997, True, True, 5000, 5)

if clientID!= -1:
    print("Connected to remote server")
else:
    print('Connection not successful')
    sys.exit('Could not connect')

errorCode,Revolute_joint_handle=vrep.simxGetObjectHandle(clientID,'Revolute_joint',vrep.simx_opmode_oneshot_wait)

if errorCode == -1:
    print('Can not find left or right motor')
    sys.exit()

deg = math.pi/180

#errorCode=vrep.simxSetJointTargetVelocity(clientID,Revolute_joint_handle,2, vrep.simx_opmode_oneshot_wait)

def setJointPosition(incAngle, steps):
    for i  in range(steps):
        errorCode=vrep.simxSetJointPosition(clientID, Revolute_joint_handle, i*incAngle*deg, vrep.simx_opmode_oneshot_wait)

# 每步 10 度, 轉兩圈
setJointPosition(10, 72)
# 每步 1 度, 轉兩圈
#setJointPosition(1, 720)
# 每步 0.1  度, 轉720 步
#setJointPosition(0.1, 720)

'''
三軸同動時
simxPauseCommunication(clientID,1);
simxSetJointPosition(clientID,joint1Handle,joint1Value,simx_opmode_oneshot);
simxSetJointPosition(clientID,joint2Handle,joint2Value,simx_opmode_oneshot);
simxSetJointPosition(clientID,joint3Handle,joint3Value,simx_opmode_oneshot);
simxPauseCommunication(clientID,0);
'''

Fourbar Linkage Velocity Control

the First Joint properties -

Torque/Force mode with motor enabled and target velocity 120 deg/s and maximum torque 50 N*m.

Joint ObjectName: Revolute_joint

All other joints with Torque/Force mode without motor enabled.

import vrep
import sys
# child threaded script: 
# 內建使用 port 19997 若要加入其他 port, 在  serve 端程式納入
#simExtRemoteApiStart(19999)

vrep.simxFinish(-1)

clientID = vrep.simxStart('127.0.0.1', 19997, True, True, 5000, 5)

if clientID!= -1:
    print("Connected to remote server")
else:
    print('Connection not successful')
    sys.exit('Could not connect')

errorCode,Revolute_joint_handle=vrep.simxGetObjectHandle(clientID,'Revolute_joint',vrep.simx_opmode_oneshot_wait)

if errorCode == -1:
    print('Can not find left or right motor')
    sys.exit()

errorCode=vrep.simxSetJointTargetVelocity(clientID,Revolute_joint_handle,2, vrep.simx_opmode_oneshot_wait)

while True:
    choice = input("(e to exit, p to pause and enter to exec)>")
    if choice == "e":
        print("exiting")
        vrep.simxStopSimulation(clientID, vrep.simx_opmode_oneshot_wait)
        break
    elif choice == "p":
        vrep.simxPauseSimulation(clientID, vrep.simx_opmode_oneshot_wait)
    else:
        vrep.simxStartSimulation(clientID, vrep.simx_opmode_oneshot_wait)

Fourbar Linkage Position Control

V-rep Fourbar linkage remote API program:

the First Joint properties -

Passive mode with Hybrid operation.

Position control (PID) with proportional parameter 0.1 without I and D controls.

Joint ObjectName: Revolute_joint

All other joints properties -

Inverse kinematics mode with Hybrid operation.

Position control (PID) with proportional parameter 0.1 without I and D controls.

import vrep, math
import sys
# child threaded script: 
#simExtRemoteApiStart(19999)

vrep.simxFinish(-1)

clientID = vrep.simxStart('127.0.0.1', 19997, True, True, 5000, 5)

if clientID!= -1:
    print("Connected to remote server")
else:
    print('Connection not successful')
    sys.exit('Could not connect')

errorCode,Revolute_joint_handle=vrep.simxGetObjectHandle(clientID,'Revolute_joint',vrep.simx_opmode_oneshot_wait)

deg = math.pi/180

if errorCode == -1:
    print('Can not find left or right motor')
    sys.exit()

#errorCode=vrep.simxSetJointTargetVelocity(clientID,Revolute_joint_handle,2, vrep.simx_opmode_oneshot_wait)

def setJointPosition(incAngle, steps):
    for i  in range(steps):
        errorCode=vrep.simxSetJointPosition(clientID, Revolute_joint_handle, i*incAngle*deg, vrep.simx_opmode_oneshot_wait)

# 每步 10 度, 轉兩圈
setJointPosition(10,72)

與上述四連桿位置控制流程相同, 但是由 Python3 remote API 程式負責控制 V-rep 的模擬啟動與模擬終止.

import vrep, math
import sys
# child threaded script: 
#simExtRemoteApiStart(19999)

vrep.simxFinish(-1)

clientID = vrep.simxStart('127.0.0.1', 19997, True, True, 5000, 5)
#啟動模擬
vrep.simxStartSimulation(clientID, vrep.simx_opmode_oneshot)

if clientID!= -1:
    print("Connected to remote server")
else:
    print('Connection not successful')
    sys.exit('Could not connect')

errorCode,Revolute_joint_handle=vrep.simxGetObjectHandle(clientID,'Revolute_joint',vrep.simx_opmode_oneshot_wait)

deg = math.pi/180

if errorCode == -1:
    print('Can not find left or right motor')
    sys.exit()

#errorCode=vrep.simxSetJointTargetVelocity(clientID,Revolute_joint_handle,2, vrep.simx_opmode_oneshot_wait)

def setJointPosition(incAngle, steps):
    for i  in range(steps):
        errorCode=vrep.simxSetJointPosition(clientID, Revolute_joint_handle, i*incAngle*deg, vrep.simx_opmode_oneshot_wait)
    #終止模擬
    vrep.simxStopSimulation(clientID, vrep.simx_opmode_oneshot_wait)

# 每步 10 度, 轉兩圈
setJointPosition(10, 72)

兩軸同動資料傳送:

import vrep
import sys, math
# child threaded script: 
# 內建使用 port 19997 若要加入其他 port, 在  serve 端程式納入
#simExtRemoteApiStart(19999)

vrep.simxFinish(-1)

clientID = vrep.simxStart('127.0.0.1', 19997, True, True, 5000, 5)

if clientID!= -1:
    print("Connected to remote server")
else:
    print('Connection not successful')
    sys.exit('Could not connect')

errorCode,Revolute_joint_handle=vrep.simxGetObjectHandle(clientID,'Revolute_joint',vrep.simx_opmode_oneshot_wait)

errorCode0,Revolute_joint_handle0=vrep.simxGetObjectHandle(clientID,'Revolute_joint0',vrep.simx_opmode_oneshot_wait)

if errorCode == -1:
    print('Can not find left or right motor')
    sys.exit()

deg = math.pi/180

#vrep.simxStartSimulation(clientID, vrep.simx_opmode_oneshot)

for i in range(36):
    vrep.simxSynchronous(clientID,True)
    vrep.simxPauseCommunication(clientID,True)
    vrep.simxSetJointPosition(clientID, Revolute_joint_handle, 10*deg, vrep.simx_opmode_oneshot)
    vrep.simxSetJointPosition(clientID, Revolute_joint_handle0, 10*deg, vrep.simx_opmode_oneshot)
    vrep.simxPauseCommunication(clientID, False)
    vrep.simxSynchronous(clientID, False)

    vrep.simxSynchronous(clientID,True)
    vrep.simxPauseCommunication(clientID,True)
    vrep.simxSetJointPosition(clientID, Revolute_joint_handle, -10*deg, vrep.simx_opmode_oneshot)
    vrep.simxSetJointPosition(clientID, Revolute_joint_handle0, -10*deg, vrep.simx_opmode_oneshot)
    vrep.simxPauseCommunication(clientID, False)
    vrep.simxSynchronous(clientID, False)