首先需要将使用Python远程控制的文件导入到文件夹,核心是深蓝色的三个文件。
本版本为4.70,其文件所在位置如下图所示,需要注意的是,目前不支持Ubuntu22的远程api:
双击Sphere这一行的灰色文件,可以看到远程 simRemoteApi
的串口号为19998,当在Coppeliasim运行后,后台会发布该串口,可以利用Python进行远程控制。
import time
import numpy as np
import sys
sys.path.append('./VREP_RemoteAPIs/')
import sim as vrep_sim
# 连接Coppeliasim
vrep_sim.simxFinish(-1) # 关闭掉其他的连接
while True:
# simxStart()函数的第一个参数是连接的IP地址,第二个参数是端口号,第三个参数是是否等待连接,第四个参数是是否检查连接,第五个参数是连接超时时间,第六个参数是重连次数
# 返回的clientID是建立连接的ID,可以理解为指向你的scene
client_ID = vrep_sim.simxStart('127.0.0.1', 19998, True, False, 5000, 5)
# 根据返回的值,来判断是否连接成功
if client_ID > -1:
print('Connect to remote API server.')
break
else:
print('Failed connecting to remote API server! Try it again ...')
# 打开同步模式
synchronous_enable = True
# simxSynchronous()函数的第一个参数是连接的ID,第二个参数是是否开启同步模式
vrep_sim.simxSynchronous(client_ID, synchronous_enable)
vrep_sim.simxStartSimulation(client_ID, vrep_sim.simx_opmode_oneshot)
# ------------------------------- Initialization -------------------------------
# vrep_sim.simx_opmode_blocking为阻塞模式。命令被发送,函数将等待实际的应答并返回它(如果函数没有超时)
# vrep_sim.simxGetObjectHandle即获取在client_ID下的名字为'joint'的对象的句柄
return_code, joint_handle = vrep_sim.simxGetObjectHandle(client_ID, 'joint', vrep_sim.simx_opmode_blocking)
if (return_code == vrep_sim.simx_return_ok):
print('get object joint ok.')
# 获取'joint'的位置
_, q = vrep_sim.simxGetJointPosition(client_ID, joint_handle, vrep_sim.simx_opmode_streaming)
vrep_sim.simxSetJointTargetPosition(client_ID, joint_handle, 0, vrep_sim.simx_opmode_streaming)
# ------------------------------- Simulation -------------------------------
t = 0
# 时步,多少秒更新一次
delta_t = 0.005 # simulation time step
for _ in range(5000):
t = t + delta_t
_, q = vrep_sim.simxGetJointPosition(client_ID, joint_handle, vrep_sim.simx_opmode_buffer)
print('q=', q)
q_new = np.sin(t)
vrep_sim.simxSetJointTargetPosition(client_ID, joint_handle, q_new, vrep_sim.simx_opmode_streaming)
if synchronous_enable == True:
vrep_sim.simxSynchronousTrigger(client_ID)
# 检索将命令发送到服务器,执行和发回所需的时间。 那个时间取决于各种因素,如客户端设置,网络负载,仿真是否正在运行,仿真是否是实时,模拟时间步骤等。功能是阻塞。
_, ping_time = vrep_sim.simxGetPingTime(client_ID)
# 静止时步的时间
time.sleep(delta_t)
# 停止仿真
vrep_sim.simxStopSimulation(client_ID, vrep_sim.simx_opmode_blocking)
# 结束此场景
vrep_sim.simxFinish(client_ID)
print('Program terminated')
代码运行后,如图所示,可以驱动倒立摆末端转动。