Simulation
A simulation in CoppeliaSim can be started, paused and stopped with [Menu bar --> Simulation --> Start/Pause/Stop simulation] or through the related toolbar buttons:
[Simulation start/pause/stop toolbar buttons]
Internally, the simulator will use additional intermediate states in order to correctly inform scripts or programs about what will happen next. Following state diagram illustrates the simulator's internal states:
[Simulation state diagram]
Simulation loop
The simulator operates by advancing the simulation time at constant time steps. Following figure illustrates the main simulation loop:
[Main simulation loop]
Real-time simulation is supported by trying to keep the simulation time synchronized with the real time:
[Real-time simulation loop]
Simulation speed
In non real-time simulations, the simulation speed (i.e. the perceived speed) is mainly dependent on two factors: the simulation time step and the number of simulation passes for one rendering pass (see the simulation dialog for more details). In the case of a real-time simulation, the simulation speed mainly depends on the real-time multiplication coefficient, but also to a certain degree of the simulation time step (a too small simulation time step might not be compatible with the real-time character of a simulation because of the limited calculation power of the computer). During simulation, the simulation speed can be adjusted with following toolbar buttons:
[Simulation speed adjustment toolbar buttons]
The simulation speed is adjusted in a way so that the initial simulation time step is never increased (because this might have as consequence the breaking of a mechanism for example). Following two figures illustrate the simulation speed adjustment mechanisms:
[Simulation speed adjustment mechanism for non real-time simulations]
[Simulation speed adjustment mechanism for real-time simulations]
By default, each simulation cycle is composed by following sequential operations:
Executing the main script
Rendering the scene
Stepped mode
By default, CoppeliaSim executes a simulation by running one simulation step after another, automatically. There are however many situations where it is important to be able to manually trigger each simulation step, e.g. in order to inspect each simulation step individually, or in order to synchronize CoppeliaSim with an external application. There is such a mechanism, which is the stepped mode (or synchronous mode):
[Stepped simulation mode]
From within CoppeliaSim, a stepped simulation can easily be implemented via the sysCall_beforeMainScript callback function. From an external application, there is usually a dedicated function to enable the stepped mode, and then to trigger each individual step. Following illustrates the stepped mode from a Python ZeroMQ remote API client:
import time
from zmqRemoteApi import RemoteAPIClient
client = RemoteAPIClient()
sim = client.getObject('sim')
client.setStepping(True)
sim.startSimulation()
while (t := sim.getSimulationTime()) < 3:
s = f'Simulation time: {t:.2f} [s]'
print(s)
client.step()
sim.stopSimulation()
|