External controller tutorial <<
Previous Next >> Simulation dialog
Simulation
由40723210提供
可以使用[菜單欄->模擬->開始/暫停/停止模擬]或通過相關的工具欄按鈕來啟動,暫停和停止CoppeliaSim中的模擬:

[模擬開始/暫停/停止工具欄按鈕]
在內部,模擬器將使用其他中間狀態,以正確告知腳本或程序接下來將發生的情況。以下狀態圖說明了模擬器的內部狀態:

[模擬狀態圖]
腳本和程序應始終根據當前系統調用功能以及可能的模擬狀態進行反應,以便正確運行。優良作法是將每個控制代碼分成至少4個系統調用函數(例如,用於非線程子腳本):
- 初始化函數:sysCall_init:僅在腳本初始化時才調用該函數。
- 激勵函數:sysCall_actuation:應在發生激勵時調用該函數。
- Sensing函數:sysCall_sensing:應在發生傳感時調用此函數。
- 清理函數:sysCall_cleanup:在取消初始化腳本之前(例如,在模擬結束時或銷毀腳本時)調用該函數。
有關如何安排典型腳本的示例,請參考main腳本,子腳本和自定義腳本頁面。
仿真循環
模擬器通過以恆定的時間步長推進模擬時間來進行操作。下圖說明了主要的仿真循環:

[主仿真循環]
通過嘗試使仿真時間與實時保持同步來支持實時仿真:

[實時仿真循環]
以下是一個非常簡化的主客戶端應用程序(為清晰起見,已省略了消息,插件處理和其他詳細信息):
void initializationCallback
{
// do some initialization here
}
void loopCallback
{
if ( (simGetSimulationState()&sim_simulation_advancing)!=0 )
{
if ( (simGetRealTimeSimulation()!=1)||(simIsRealTimeSimulationStepNeeded()==1) )
{
if ((simHandleMainScript()&sim_script_main_script_not_called)==0)
simAdvanceSimulationByOneStep();
}
}
}
void deinitializationCallback
{
// do some clean-up here
}
取決於仿真的複雜性,計算機的性能和仿真設置,實時仿真可能並不總是可能的。
仿真速度
在非實時仿真中,仿真速度(即感知速度)主要取決於兩個因素:仿真時間步長和一個渲染通道的仿真通道數量(有關更多詳細信息,請參見仿真對話框)。在實時仿真的情況下,仿真速度主要取決於實時乘法係數,而且在一定程度上取決於仿真時間步長(太小的仿真時間步長可能與實時時間不兼容)。由於計算機的計算能力有限,因此無法進行仿真。在模擬過程中,可以使用以下工具欄按鈕來調整模擬速度:

[模擬速度調整工具欄按鈕]
以某種方式調整模擬速度,以使初始模擬時間步長永遠不會增加(例如,這可能因此而導致機制中斷)。以下兩個圖說明了仿真速度調整機制:

[ 非實時模擬的模擬速度調整機制]

[用於實時仿真的仿真速度調整機制]
默認情況下,每個模擬週期由以下順序操作組成:
螺紋渲染
渲染操作將始終增加仿真週期的持續時間,從而也降低了仿真速度。可以定義每個場景渲染的主腳本執行次數(請參閱後面的內容),但這在某些情況下還不夠,因為渲染仍然會減慢每個第x個模擬週期的時間(這可能會限制實時性)。在這種情況下,可以通過用戶設置或以下工具欄按鈕激活線程渲染模式:

[線程渲染工具欄按鈕]
激活線程渲染模式後,模擬週期將僅包括執行主腳本,因此模擬將以最大速度運行。渲染將通過不同的線程進行,並且不會減慢模擬任務的速度。然而,必須考慮缺點。激活線程渲染後,:
- 渲染將與模擬循環異步進行,並且可能會出現視覺故障
- 該錄像機將不以恆定速度運轉(某些幀可能會跳過)
- 應用程序的穩定性可能會降低
- 某些操作(例如擦除對像等)需要等待渲染線程完成工作才能執行,反之亦然。在那些情況下,循環可能比順序渲染模式花費更多的時間。
External controller tutorial <<
Previous Next >> Simulation dialog