24 Eylül 2019 Salı

HLA RTIambassador Arayüzü - Time Management Kabiliyeti

Giriş
Bu işlevin açıklaması şöyle.
Handling of logical time including delivery of time stamped data and advancing federate time
Time Step
HLA zamanı bir frame'in en sonunda ilerletilir. Bu tür simülatörlere time-step-based simulators deniliyor. Açıklaması şöyle
"Step" is a process of calculating system's next state. "Timestep" is the time interval for which simulation will progress during next "step".
Time Step ve Rendering İlişkisi
Açıklaması şöyle
Games frequently use a time step close to the period between each rendered graphical frame, or an ideal time between graphical frames such as 0.01667 seconds, but this is not required. Some games like BeamNG.drive will calculate physics much more frequently than the game can render in order to generate a smoother physical approximation. Other games will calculate physics less frequently and blend the position of what's rendered between each point. It's up to each game what their approach will be.
enableTimeConstrained Çağrısı
- Her federe başlangıçta RTIambassador.enableTimeConstrained() çağrısı yapar. Böylece geçmişten mesaj alınmaz. Time Regulating federelere tabi olunur.

enableTimeRegulation Çağrısı
- Her federe başlangıçta RTIambassador.enableTimeRegulation(LogicalTimeInterval) çağrısı yapar. Böylece tüm federeler aynı anda zamanı ilerlet demeden zaman ilermemez. Ayrıca her federe ne kadar uzak geleceğe ait mesaj gönderebileceğini bildirir. Eğer bu değer 0 ise federe şu anki frame zamanından daha ileride mesaj gönderemez.

- Her federe frame'deki tüm işler bittikten sonra
RTIambassador.timeAdvanceRequest(LogicalTime) çağrısı yapar.

- HLA tüm federelerden bu mesajı aldıktan sonra yeni zamanı tüm federelere NullFederateAmbassador.timeAdvanceGrant(LogicalTime) metodu ile dağıtır.
Bu çağrı sonucunda tüm federelerimiz enableTimeContrained() oldukları için
* RTIambassador.sendInteraction()
* RTIambassador.updateAttributeValues()
* RTIambassador.deleteObjectInstance()
gibi metodlarda artık yeni zamanı kullanmak gerekir.


Zaman Kavramı
Simülasyon dünyasında şu zaman tipleri kullanılır.
1. Logical Time
2. Wall Clock Time
3. Real Time

- Logical Time kronometre gibi belli bir sayıdan - örneğin 0 - başlar ve ilerler.

- Wall Clock Time simülasyon zamanında bağımsız olarak kullanıcıya ekranda gösterilir. Duvar saati 1 saniye ilerlerken simülasyon mantıksal olarak 1x, 2x, 4x gibi hızlarda ilerleyebilir.

- Real Time simüle edilen zamanı gösterir ve kullanıcıya gösterilir. Ben simülasyonu çalıştırırken Real Time 1958 yılı olabilir. Veya simülasyon gündüz koşarken, Real Time gece olabilir.

Look Ahead Değeri Kavramı
Açıklama şöyle. Bir federenin her adımda ilerleyebileceği LogicalTime değeri.
Lookahead is a time interval during which the federate guarantees that it will not send any time-stamp-ordered (TSO) messages.
Lower Bound Time Stamp (LBTS) Kavramı
Bu kavrama eskiden Greatest Available Logical Time (GALT) deniliyordu. Regulating federelere ve sağladıkları lookahead değerlerine bakılarak geçilecek bir sonraki en küçük Logical Time anlamına gelir.

disableTimeConstrained metodu
Örnek ver

disableTimeRegulation metodu
Örnek ver

enableTimeConstrained metodu
Açıklaması şöyle.
Constrained federates are those who subject themselves to the time-coordination will of regulating federates.

Federates have constrained disabled by default. A federate utilizes the RTIambassador member function enableTimeConstrained() to request that the federate be acknowledged as a constrained federate. The timeConstrainedEnabled() callback informs a federate that the enableTimeConstrained() request has been granted. It is possible to change the constrained policy dynamically. The RTIambassador method disableTimeConstrained() is the counterpart to enableTimeConstrained().
Time Regulating federelere uyum sağlayarak bir federenin geçmişten mesaj almamasını sağlar. Çağrı sırası şöyle.
enableTimeConstrained ()  -> RTI - 1
timeConstrainedEnabled(LogicalTime time) <- RTI - 2
Maalesef LogicalTime ve LogicalTimeInterval nesnesi yaratma kodu HLA standardında sabit değil. Her HLA gerçekleştirimi farklı metodlar sunuyor.

Şu metodlar kullanılabilir
1 .LogicalTimeIntervalFactory.makeEpsilon()
2. LogicalTimeIntervalFactory.makeZero()

veya şöyle yaparız.
HLAfloat64TimeFactory factory = (HLAfloat64TimeFactory)rtiamb.getTimeFactory();
HLAfloat64Interval lookahead = factory.makeInterval (1.0);
rtiamb.enableTimeRegulation (lookahead);
Bu çağrı sonucunda FederateAmbassador arayüzünün timeConstrainedEnabled () metodu RTI tarafından callback olarak tetiklenir.
Örnek ver

enableTimeRegulation metodu
Time regulating federelerin hepsi zamanı ilerlet deyince federasyonun zamanı ilerler.
Çağrı sırası şöyle.
enableTimeRegulation(LogicalTimeInterval interval)  -> RTI - 1
timeRegulationEnabled (LogicalTime time) <- RTI - 2
Maalesef LogicalTime ve LogicalTimeInterval nesnesi yaratma kodu HLA standardında sabit değil.
Bu çağrı sonucunda FederateAmbassador arayüzünün timeRegulationEnabled () metodu RTI tarafından callback olarak tetiklenir.
Örnek ver.

timeAdvanceRequest metodu
Çağrı sırası şöyle. Bu metod bir frame'in en son çağrısı olmalı.
timeAdvanceRequest(LogicalTime time)  -> RTI - 1
timeAdvanceGranted (LogicalTime time) <- RTI - 2
Şöyle yaparız.
rtiAmb.timeAdvanceRequest(time);

Hiç yorum yok:

Yorum Gönder