其他分享
首页 > 其他分享> > Coppeliasim仿真日记(四): 如何在Coppeliasim进行多计算机联合仿真

Coppeliasim仿真日记(四): 如何在Coppeliasim进行多计算机联合仿真

作者:互联网

上篇:Coppeliasim仿真日记(三): Coppeliasim与python的联动——The B0-based remote API

当我们进行群体机器人仿真时,往往需要进行几十台或者几百台机器人的仿真,由于单台计算机的计算机资源有限,往往需要进行多台计算机联合并行仿真,本节将说明具体的操作步骤。


具体步骤:

首先将进行并行仿真的计算机都连接到同一个局域网上面,这边我采用的是通过路由器来连接局域网,连接完后选择其中一台作为和仿真软件连接的主计算机,查看其内网ip,具体步骤详见https://jingyan.baidu.com/article/00a07f38f8e483c2d128dc3c.html

这台主计算机的内网ip如图所示:

然后我们在这台计算机添加一个环境变量B0_RESOLVER_PORT,设置一个端口号:

最后在其它计算机添加另一个环境变量B0_RESOLVER,以便其它计算机能通过局域网连接上软件:

主计算机端(打开软件的计算机)的相关代码(一般只控制仿真的运行和结束):

import b0RemoteApi
import time

with b0RemoteApi.RemoteApiClient('Scene', 'b0RemoteApi') as client:
    client.doNextStep = True

    def simulationStepStarted(msg):
        simTime = msg[1][b'simulationTime']

    def simulationStepDone(msg):
        simTime = msg[1][b'simulationTime']
        client.doNextStep = True

    client.simxSynchronous(True)
    client.simxGetSimulationStepStarted(client.simxDefaultSubscriber(simulationStepStarted))
    client.simxGetSimulationStepDone(client.simxDefaultSubscriber(simulationStepDone))
    client.simxStartSimulation(client.simxDefaultPublisher())
    startTime = time.time()
    while time.time() < startTime + 1000:
        if client.doNextStep:
            client.doNextStep = False
            client.simxSynchronousTrigger()
        client.simxSpinOnce()
    client.simxStopSimulation(client.simxDefaultPublisher())

其它计算机相关代码(一般只包含机器人的控制代码):

import b0RemoteApi
import time

with b0RemoteApi.RemoteApiClient('uav', ' b0RemoteApi') as client:
    client.doNextStep = True

    def simulationStepStarted(msg):
        simTime = msg[1][b'simulationTime']

    def simulationStepDone(msg):
        simTime = msg[1][b'simulationTime']
        client.doNextStep = True

    client.simxSynchronous(True)
    client.simxGetSimulationStepStarted(client.simxDefaultSubscriber(simulationStepStarted))
    client.simxGetSimulationStepDone(client.simxDefaultSubscriber(simulationStepDone))
    startTime = time.time()
    while time.time() < startTime + 150:   # 仿真时间设定
    if client.doNextStep:
        client.doNextStep = False
        '''控制代码'''
        client.simxSynchronousTrigger()
    client.simxSpinOnce()

最后,在主计算机端打开b0resolver和仿真软件,之后运行主计算机端的程序,然后其它计算机运行自身的程序就能连接到主计算机端的仿真软件,执行机器人的控制操作。

最后

这个方法也是困扰了我好长的时间解决,最后在论坛上有人回答才搞定的,希望大家有问题还是多多查阅用户手册还有论坛。

标签:仿真,计算机,Coppeliasim,doNextStep,client,time,msg,日记
来源: https://blog.csdn.net/qq_42286607/article/details/116998607