RTIambassador etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
RTIambassador etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

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);

HLA RTIambassador Arayüzü - Federation Synchronization

Giriş
Senkronizasyon noktası tüm federeler synchronizationPointAchieved() çağrısını yapınca geçilir.

registerFederationSynchronizationPoint metodu - String
Federate için çağrı sırası şöyle. Birinci parametre point ismi, ikinci parametre tag verisidir. Tag verisinin ne işe yaradığını bilmiyorum.

- RTIambassador tarafından yapılan çağrılar koyu mavi renkte gösteriliyor.
 -NullFederateAmbassador tarafından yapılan callback'ler ise açık mavi renkte gösteriliyor.
void registerFederationSynchronizationPoint (String,byte[],FederateHandleSet)  -> RTI - 1
synchronizationPointRegistrationSucceeded () <- RTI - 2
announceSynchronizationPoint ()  <- RTI - 3
void synchronizationPointAchieved (String,boolean)  -> RTI - 4
federationSynchronized ()  <- RTI - 5
2. RTI ismini belirttiğimiz "Synchronization Point" nesnesinin başarıyla yaratıldığını belirtir
3. RTI ismini belirttiğimiz "Synchronization Point" nesnesini ilan eder. Callback bizim uygulamamıza da gelir.
4. Uygulamamız ismini belirttiğimiz "Synchronization Point" noktasına ulaştığını bildirir.
5. RTI ismi belirtilen "Synchronization Point" noktasına herkesin ulaştığını bildirir

Açıklaması şöyle.
When you want to synchronize only a subset of federates, specify the set of federate handles as a parameter in the call. In case you don't provide a federate list, then it implies that synchronization is intended for all the (joined) federates
Örnek
HLA örnek uygulamalarında başlatma aşamasındaki kullanım şöyle.

- Simülasyonlar teker teker çalıştırılır. Hepsi synchronizationPointAchieved () çağrısı
yapıp federationSynchronized () callback'i beklerler.

- Manager uygulama registerFederationSynchronizationPoint () çağrısı yapar. Beklenen tüm federelerin bağlandığını tesbit ettikten sonra synchronizationPointAchieved () çağrısı yapar. Tüm federeler federationSynchronized () callback'i tetiklenip devam ederler.

Örnek
Senaryo koşarken kullanım şekli şöyle.

- Simülasyonlar synchronizationPointAchieved () çağrısı yapıp federationSynchronized () callback'i beklerler. Burada Manager uygulamanın federe sayısını kontrol etmesine gerek yok.



6 Ağustos 2019 Salı

HLA RTIambassador Arayüzü - Federation Management

Federasyonu yaratmak için 
Şu çağrılar yapılır
1. RTIambassador.connect(federateAmbassador, CallbackModel.HLA_IMMEDIATE)
2. RTIambassador.createFederatonExecution(federationName,url)
3. RTIambassador.joinFederationExecution(federateName,federationName)

Federasyonu yok etmek için
Şu çağrılar yapılır
1. RTIambassador.resignFederaitonExecution(ResignAction.DELETE_OBJECTS_THEN_DIVEST)
2. RTIambassador.destroyFederationExecution()

createFederationExecution metodu
Federasyonu yaratır.

destroyFederationExecution metodu
Parametre olarak federasyon ismini alır. Eğer halen çalışan Federe'ler var FederatesCurrentlyJoined exception fırlatılır. Her federa bu çağrıyı yaparak federasyondan çıkarsa en son federe aynı zamanda federasyonu da sonlandırır

resignFederationExecution metodu
Bir federe federasyondan ayrılmak isterse resignFederationExecution() metodunu kullanır.

Genelde ResignAction.CANCEL_THEN_DELETE_THEN_DIVEST seçeneği ile birlitek kullanılır. Federe tarafından yaratılan ancak silinmeyen nesneleri de siler.

1 Ekim 2018 Pazartesi

HLA RTIambassador Arayüzü - Federation Restore Kabiliyeti

Giriş
Yazının ismi RTIambassador Arayüzü ancak hem RTIambassador hem de FederateAmbassador çağrılarını gösteriyor.

requestFederationRestore metodu
Federate için çağrı sırası şöyle.
requestFederationRestore (String label)  -> RTI - 1
requestFederationRestoreSucceded (String label) <- RTI - 2
requestFederationRestoreFailed (String label) <- RTI - 2
federationRestoreBegun () <- RTI - 3
initiateFederateRestore (String label, String federateName) <- RTI - 4
federationRestoreComplete() -> RTI - 5
federationRestoreNotComplete() -> RTI - 5
federationRestored() <- RTI - 6
federationNotRestored () <- RTI - 6
Bu çağrının sonucunda RTI requestFederationRestoreSucceded() metodu ile restore işlemine başlayabileceğini belirtir. Eğer başlayamayacaksa requestFederationRestoreFailed() çağrısını yapar ve akış burada biter.

Federation Save işleminde RTI save işlemine başlayıp başlayamayacağını belirtmiyor. restore işleminde neden bu yapıya ihtiyaç duyulmuş bilmiyorum. Sanırım RTI kendi içinde tutarlılık kontrolleri yapıyor diye düşünüyordum. Ancak save edilmemiş bir labe ile çağrılsa bile bu metod hata dönmüyor!

FederateAmbassador.federationRestoreBegun metodu
HLA thread'i içinde çalılır. Bu metod içinde genellikle bir  başka thread'e Command gönderilir. Yani Command Örüntüsü kullanılır.

RTI'dan bu çağrıyı aldıktan sonra uygulamanın HLA mesajları göndermemesi gerekir. Özellikle yavaş olan katılımcıların bu çağrıdan sonra bir şekilde hesaplama yapmayı durdurması gerekir. Çünkü yapacağı işlemler muhtemelen çöpe gidecektir.

Ben bu kullanım şeklini çok pratik bulmuyorum çünkü hesaplamanın ortasında işlemi bölmek mümkün olmayabilir. Daha pratik bir kullanım şeklinde tüm hesaplamaları halen göndermek ve alıcı tarafta bir kuyrukta biriktirmek olabilir.

FederateAmbassador initiateFederateRestore metodu
HLA thread'i içinde çalılır.  Bu metod içinde genellikle bir  başka thread'e Command gönderilir. Yani Command Örüntüsü kullanılır.

Bu çağrının parametrelerinden bir tanesi federateName. Bu parametre neden gerekli bilmiyorum. Bu çağrı sonucunda  katılımce eski veriyisine geri döner. Eğer geriye sarma işlemi başarılı ise federationRestoreComplete() metodunu çağırır. Başarılı değilse federationRestoreNotComplete() metodunu çağırır.

Tüm katılımcıların geriye sarma işlemi başarılı ise RTI federationRestored() metodunu çağırır. Başarılı değilse federationNotRestored() metodunu çağırır.

Federation Restore işlemi devam ederken updateAttributeValues() çağrısı yapılırsa hla.rt.1516e.exceptions.RestoreInProgress fırlatılır.

FederateAmbassador federationNotRestored  metodu
Hata kodu FEDERATE_REPORTED_FAILURE_DURING_RESTORE olabilir.



5 Eylül 2018 Çarşamba

HLA RTIambassador Arayüzü - Object Management

Giriş
Açıklaması şöyle.
Registering and discovering object instances, updating and reflecting attributes, sending and receiving interactions
Bu alan ile ilgili metodlar şöyle
1. changeAttributeTransportationType()
2. changeInteractionTransportationType ()
3. deleteObjectInstance()
4. localDeleteObjectInstance()
5. registerObjectInstance()
6. requestAttributeValueUpdate()
7. sendInteraction()
8. updateAttributeValues()

changeAttributeTransportationType metodu
Örnek ver

changeInteractionTransportationType metodu
Örnek ver

deleteObjectInstance - ObjectInstanceHandle 
Belirtilen nesneyi siler. Eğer nesne HLA tarafından bilinmiyorsa
RTIException("Unknown object id ...")
şeklinde bir exception fırlatılır. Sanırım sadece kendi yarattığımız nesneleri silebiliyoruz.

localDeleteObjectInstance - ObjectInstanceHandle 
deleteObjectInstance() ile farkını bilmiyorum

registerObjectInstance metodu - ObjectClassHandle
Eğer yanlış bir ObjectClassHandle verilirse hla.rti1516e.exceptions.ObjectClassNotPublished exception fırlatılır.

Object instance silmek için deleteObjectInstance() çağrısı yapılır. Nesneye abone olan karşı federedeki FederateAmbassador sınıfının discoverObjectInstance() metodu tetiklenir.

requestAttributeValueUpdate metodu - ObjectInstanceHandle + AttributeHandleSet
AttributeHandleValueMap yerine AttributeHandleSet kullanılıyor.

sendInteraction metodu - InteractionClassHandle
Interaction gönderir
Örnek
Hiç parametresi olmayan interaction göndermek için şöyle yaparız.
Önce bir InteractionClassHandle yaratırız.
InteractionClassHandle icHandle = rti.getInteractionClassHandle ("HLAinteractionRoot.HLAmanager.SimulationStarts");
Daha sonra parametreler için bir ParameterHandleValueMapFactory yaratırız.
ParameterHandleValueMapFactory pf = rti.getParameterHandleValueMapFactory();
Daha sonra şöyle yaparız.
ParameterHandleValuemap map = pf.create (0);
rti.sendInteraction(icHandle,map,null);

updateAttributeValues metodu - ObjectInstanceHandle + AttributeHandleValueMap + byte [] + LogicalTime
Belirtilen nesenin alanlarını günceller. Nesneye abone olan karşı federedeki FederateAmbassador sınıfının reflectAttributeValues() metodu tetiklenir.

HLA thread'i içinde çalılır. Bu metod içinde genellikle bir  başka thread'e Command gönderilir. Yani Command Örüntüsü kullanılır.

Bazı projelerde güncellenen alan hemen işleme koyuluyor. Bazı projelerde ise güncelleme işlemi bir  sonraki frame'de uygulanmak üzere saklanıyor. Bu önemli bir karar.

1.  Hemen İşleme Yöntemi
- Elimizde hareket eden bir araba olsun. Hesaplama yapan katılımcı arabayı hareket ettirir.
- Haritayı gösteren katılımcı hemen bu değişikliği gösterir.

2.  Bir Sonraki Frame Yöntemi
- Elimizde hareket eden bir araba olsun. Hesaplama yapan katılımcı arabayı hareket ettirir.
x - x + 10
- Haritayı gösteren katılımcı bir sonraki frame'de bu değişikliği gösterir.



31 Ağustos 2018 Cuma

HLA RTIambassador Arayüzü - Federation Save Kabiliyeti

requestFederationSave metodu
Federate için çağrı sırası şöyle.
requestFederationSave (String label)  -> RTI - 1
initiateFederateSave (String label) <- RTI - 2
federateSaveBegun ()  -> RTI - 3
federateSaveComplete ()  -> RTI - 4
federateSaveNotComplete ()  -> RTI - 5
federationSaved () <- RTI - 6
federationNotSaved () <- RTI - 7
Bu metod aynı label ile iki defa arka arkaya çağrılsa bile bir sorun olmuyor. Hatta arka arkaya iki farklı label ile çağrılırsa da sorun olmuyor

Ancak eğer save işlemi başlamışsa timeAdvanceRequest() yapılamaz. Yapılırsa SaveInProgress exception fırlatılır. Dolayısıyla save işleminin bitmesini beklemek gerekir.

federationNotSaved Callback
Hatalardan birisi şöyle
FEDERATE_RESIGNED_DURING_SAVE

11 Haziran 2018 Pazartesi

HLA RTIambassador Arayüzü - Data Distribution Management

Giriş
Region'lar tanımlayarak verinin abone olan herkese gitmesi yerine, belli filtrelerden geçerse abonelere dağıtılmasını amaçlar. Böylece veri dağıtımı daha verilmi olabilir.

createRegion metodu
Örnek ver

deleteRegion metodu
Örnek ver

HLA RTIambassador Arayüzü - Declaration Management

Giriş
Açıklaması şöyle.
Publish and subscribe of object and interaction classes 

Interaction İçin
Metodlar şöyle
1 .getInteractionClassHandle
2 .getParameterHandle
3. subscribeInteractionClass
4. publishInteractionClass

getInteractionClassHandle metodu
Örnek ver

getParameterHandle metodu
Örnek ver

subscribeInteractionClass metodu
Alınması istenen interaction tipi belirtilir. Interaction gelince FederateAmbassador.receiveInteraction() metodu tetiklenir.

publishInteractionClass metodu
RTI'ye yaratacağımız interaction tipi bildirilir. Aynı tip interaction'ı almak için subscribeInteractionClass() çağrısı yapılır.

Object İçin
Metodlar şöyle
1. getObjectClassHandle
2. getAttributeHandle
3. subscribeObjectClassAttributes
4. publishObjectClassAttributes

getObjectClassHandle metodu - string
Bu metod ile getInteractionClassHandle() benzer şeyleri yaparlar. hla.rti1516.ObjectClassHandle nesnesi döner. Çağrı sırası şöyle. Parametre olarak sınıf ismini alır.
getObjectClassHandle ()  -> RTI
getAttributeHandle () -> RTI
publishObjectClassAttributes ()  -> RTI
getAttributeHandle metodu - hla.rti1516.ObjectClassHandle + string
Publish edilecek sınıfın alanına ait hla.rti1516.AttributeHandle nesnesi döner.

subscribeObjectClassAttributes metodu
Alınması istenen object belirtilir. Object gelince FederateAmbassador arayüzünün reflectAttributeValues() metodu tetiklenir.

publishObjectClassAttributes metodu
RTI'ye yaratıp güncelleyeceğimiz object tipi ve attribute'ları bildirilir. Aynı tip object'i almak için subscribeObjectClassAttributes() çağrısı yapılır.