Hey! Points are spawned in my scene as sim.loadModel().
Drones fly to these points. Time is counted.
After the end of the flight, the simulation ends, the timer is displayed in the console. I need to run> 100 experiments. How can i do this? The problem is that 100+ points will spawn in more than 7 seconds, which makes this process very difficult when it comes to looping this process in 1 simulation. Perhaps you can somehow sequentially run 100 simulations in a row without clicking the mouse on the "run simulation" button
Reusable simulation run
Re: Reusable simulation run
Hello,
I am not sure I understand where the bottleneck lies... is it because at simulation start, you dynamically load a lot of models?
If you have n simulations to run, you would normally start/stop a simulation n times. Depending on the content of the scene, the start/stop process might add some delays. So if those delays can somehow be reduced then I'd continue with the start/stop simulation approach. But for that we need to understand where the delays come from.
If those delays cannot be reduced, then you should try to run your n simulations within a single and same simulation, i.e. start the simulation only once. To do this, you will have to be able to reset your models n times, e.g. when a certain event occurs. You'll also need a new simulation time function that computes the n-th simulation time from sim.getSimulationTime(). And you'll need to reset your models to an initial pose n times. In CoppeliaSim V4.3.0 you will be able to find such an example scene in teleportDynamicModel.ttt, but until release of that version, you can find it here.
Cheers
I am not sure I understand where the bottleneck lies... is it because at simulation start, you dynamically load a lot of models?
If you have n simulations to run, you would normally start/stop a simulation n times. Depending on the content of the scene, the start/stop process might add some delays. So if those delays can somehow be reduced then I'd continue with the start/stop simulation approach. But for that we need to understand where the delays come from.
If those delays cannot be reduced, then you should try to run your n simulations within a single and same simulation, i.e. start the simulation only once. To do this, you will have to be able to reset your models n times, e.g. when a certain event occurs. You'll also need a new simulation time function that computes the n-th simulation time from sim.getSimulationTime(). And you'll need to reset your models to an initial pose n times. In CoppeliaSim V4.3.0 you will be able to find such an example scene in teleportDynamicModel.ttt, but until release of that version, you can find it here.
Cheers
Re: Reusable simulation run
Thanks for the answer. I will clarify about the bottleneck. I call the
With n = 100, it takes about 20-25 seconds of program runtime (simulation)
Let me remind you that I need to do 100 experiments and spawn these points 100 times. With such slowness, it can take a very long time ...
SpawnPoint()
function n times. This is how I generate points on the stage (each of which is a ball model).
Code: Select all
function SpawnPoint()
POINTArray[#POINTArray+1]=sim.copyPasteObjects({point},0)[1]
local position=RANDTable[#POINTArray]
sim.setObjectPosition(POINTArray[#POINTArray],-1,position)
--sim.switchThread()
end
Let me remind you that I need to do 100 experiments and spawn these points 100 times. With such slowness, it can take a very long time ...
Re: Reusable simulation run
Ok, now I understand a bit better. You have several possibilities.
First of all, if your script runs threaded, then you should forbit thread switches during the creation of the points:
Next, you can save a copy operation at each point creation if you use sim.saveModel and sim.loadModel, saving and loading to/from buffer, e.g.:
For above to work, you will need to have a model first. You can do it via the API like:
And of course, if you simply need visualization of spheres, you can also use drawing objects:
Cheers
First of all, if your script runs threaded, then you should forbit thread switches during the creation of the points:
Code: Select all
function sysCall_init()
corout=coroutine.create(coroutineMain)
end
function sysCall_actuation()
if coroutine.status(corout)~='dead' then
local ok,errorMsg=coroutine.resume(corout)
if errorMsg then
error(debug.traceback(corout,errorMsg),2)
end
end
end
function SpawnPoint()
POINTArray[#POINTArray+1]=sim.copyPasteObjects({point},0)[1]
local position=RANDTable[#POINTArray]
sim.setObjectPosition(POINTArray[#POINTArray],-1,position)
end
function coroutineMain()
...
-- temporarily forbid automatic thread switches:
local l=sim.setThreadAutomaticSwitch(false)
for i=1,100,1 do
SpawnPoint()
end
-- Restore the automatic thread switching:
sim.setThreadAutomaticSwitch(l)
...
end
Code: Select all
function sysCall_init()
corout=coroutine.create(coroutineMain)
end
function sysCall_actuation()
if coroutine.status(corout)~='dead' then
local ok,errorMsg=coroutine.resume(corout)
if errorMsg then
error(debug.traceback(corout,errorMsg),2)
end
end
end
function SpawnPoint(modelData)
POINTArray[#POINTArray+1]=sim.loadModel(modelData)
local position=RANDTable[#POINTArray]
sim.setObjectPosition(POINTArray[#POINTArray],-1,position)
end
function coroutineMain()
local serializedModel=sim.saveModel(originalModel)
...
-- temporarily forbid automatic thread switches:
local l=sim.setThreadAutomaticSwitch(false)
for i=1,100,1 do
SpawnPoint(serializedModel)
end
-- Restore the automatic thread switching:
sim.setThreadAutomaticSwitch(l)
...
end
Code: Select all
local saveProp=sim.getModelProperty(originalObject)
sim.setModelProperty(originalObject,0) -- this make a model from originalObject
local serializedModel=sim.saveModel(originalObject)
sim.setModelProperty(originalObject,saveProp)
Code: Select all
local sphereContainer=sim.addDrawingObject(sim.drawing_spherepoints,0.1,0,-1,100,color)
while true do
sim.addDrawingObjectItem(sphereContainer,nil) -- clear the container
for i=1,100,1 do
local position={math.random(),math.random(),math.random()}
sim.addDrawingObjectItem(sphereContainer,position)
end
end
Re: Reusable simulation run
Hello. I am sending you the main scene and 3 models that are used there.
I will provide access to the folder on the google drive. https://drive.google.com/drive/folders/ ... sp=sharing
You should scale this folder to the path "C:\Program Files\CoppeliaRobotics\CoppeliaSimEdu\projects" (or otherwise change some of the loading paths in the MAIN file).
Start MAIN. It contains that problematic part of the program.
Scripts contains everything you need.
I will provide access to the folder on the google drive. https://drive.google.com/drive/folders/ ... sp=sharing
You should scale this folder to the path "C:\Program Files\CoppeliaRobotics\CoppeliaSimEdu\projects" (or otherwise change some of the loading paths in the MAIN file).
Start MAIN. It contains that problematic part of the program.
Scripts contains everything you need.