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

1 Ağustos 2021 Pazar

HLA Engine

Giriş
Bu yazıda bir HLA Engine tasarımının özeti var. Tasarımı ben yapmadım. Sadece gördüklerimi not almak istedim.

Finite State Machine
Engine aslında bir Finite State Machine. Şu state'lerden oluşuyor.
1. BeginState
2. JoinSynchronizationState
3. LoadState
4. RunState
5. LeaveSynchronizationState
6. EndState
7. FailState

Eğer herhangi bir yerde hata olursa FailState'e geçilir.

Slave Engine İçin State Geçişi
BeginState -> otomatik olarak JoinSynchronizationState -> 
LoadState -> RunState -> LeaveSynchronizationState -> EndState

Commander Engine İçin State Geçişi
BeginState -> GUI'den loadScenario olunca JoinSynchronizationState -> 
LoadState -> RunState -> LeaveSynchronizationState -> EndState

Tüm engine'ler JoinSynchronizationState içindeki aynı noktaya gelince hep aynı anda başlar.

HLA Management Commands
Engine içinde bir kuyruk bulunur ve kuyruğa benim ismine Management Command dediğim nesneler eklenir. Amaç HLA thread'i ile Engine thread'ini birbirinden bağımsız hale getirmektir.

Örneğin HLA SaveFederation emri gelince HLA thread'i bloke olmadan Engine thread'i save işlemini yerine getirir.

Örneğin HLA RestoreFederation emri gelince HLA thread'i bloke olmadan Engine thread'i restore işlemini yerine getirir.

Tüm engine'ler belli bir frame içinde çeşitli işleri yapıp en son TimeAdvanceGrant komutunu beklerler.

Data Reconstruction Layer
HLA verisini saklamak ve bu verinin geldiğini üst katmanlara bildirmek gerekir. Bunun için belki adına Data Reconstruction Layer diyebileceğimiz bir katman bulunur. Bu katman gelen veriyi deserialize edip event'lere çevirir.

Bu katman da iki tane kuyruk bulunur
1. Engine Thread kuyruğu
2. HLA Thread Kuyruğu

Aslında daha kolay anlamak için iki tane federe düşünelim. Birinci federe viewer olsun. İkinci federe ise bir araba olsun. Her iki federe için time frame 0 olsun.

Birinci federe hemen time advance request yapar ve ben artık birinci frame'e geçmek istiyorum der.
İkinci federe arabanın yeni konumunu hesaplar ve birinci frame'de benim yeni konumum X der gönderir. Sonra time advance request yapar.

HLA her iki federeye de time advance granted gönderir ve birinci federeye X mesajını HLA thread'i üzerinden verir. Birinci federe bu mesajı HLA kuyruğuna ekler. Birinci federe Engine kuyruğu boş olduğu için hemen time advance request yapar.

İkinci federe yeni konumunu Y olarak hesaplar ve ikinci frame'deki konumum Y diye gönderir.

HLA her iki federeye de time advance granted gönderir ve birinci federeye Y mesajını HLA thread'i üzerinden verir. Birinci federe bu mesajı HLA kuyruğuna ekler. Birinci federe Engine kuyruğundaki  X mesajını işler hemen time advance request yapar.

Frame Başında
1. Her frame'in başında Engine Thread thread kuyruğunda bekleyen veri gerçek verinin üzerine yazılır. Daha sonra yeni veri hakkında ilgili observer'lara notificaiton gönderilir.

2. Kendi uygulamam tarafından veriyi değiştirmek üzere verilen asenkron komutlar işlenir ve yeni veri hakkında ilgili observer'lara notificaiton gönderilir.

Frame Sonunda
HLA kuyruğunda bekleyen nesneler Engine Thread kuyruğuna aktarılır. Örneğin benim frame sayım 1 olsun. İkinci frame'e geçmeden önce birinci frame'de HLA tarafından gönderilen tüm veriyi alır Engine kuyruğuna aktarırım. Bu nesneler ben ikinci frame'e başlarken işlenir.

Engine Tipleri
İki çeşit engine tipi var.
1. Commander Engine
2. Slave Engine

Commander engine synchronization point'leri yaratır ve tüm slave engine'lerin gelmesini bekler.

SynchronizationPoint
Basti bir CountDownLatch wrapper sınıfı yeterli. HLA tüm syncronization point'lere isim verdiği için wrapper sınıf isim bilgisi + CountDownLatch nesnesini saklar.

1. BeginState
Commander Engine şu çağrıları yapar.
1. rtiAmbassador.destroyFederationExecution()
 Tedbir amaçlı eğer eski federasyon varsa yok edilir.

2. rtiAmbassador.createFederationExecution()
 Yeni federasyon yaratılır

Bu state içinde Data Reconstruction Layer olaylarını işlemeye gerek yok.

2. JoinSynchronizationState

Yani bu state içinde belki Data Reconstruction Layer olaylarını işlemeye gerek olabilir.

Commander Engine şu çağrıları yapar.
2.1 rtiAmbassador.registerFederationSynchronizationPoint(pointName)
Burada 3 tane barrier kullanılır.
 - synchPointRegisteredBarrier
-  synchPointAnnouncedBarrier
- synchPointAchievedBarrier

 a. HLA synchronization point'i register etttim/yarattım deyinceya kadar synchPointRegisteredBarrier beklenir.
 b. HLA synchronization point'i anons ettim deyinceya kadar synchPointAnnouncedBarrier beklenir.
 c. rtiAmbassador.synchronizationPointAchieved() çağrısı yapılır. HLA tüm katılımcıların bu çağrıyı yapmasını bekler. Tüm katılımcılar yaptıktan sonra HLA federateAmbassador.federationSynchronized() callback'ini çağırır. Bu çağrı da geldikten sonra synchPointAchievedBarrier barrier de indirilir ve LoadState'e geçilir.

Slave Engine şu çağrıları yapar.
Burada 3 tane barrier kullanılır.
-  synchPointAnnouncedBarrier
- synchPointAchievedBarrier

2.1

a. HLA synchronization point'i anons ettim deyinceye kadar synchPointAnnouncedBarrier beklenir.
b. rtiAmbassador.synchronizationPointAchieved() çağrısı yapılır. HLA tüm katılımcıların bu çağrıyı yapmasını bekler. Tüm katılımcılar yaptıktan sonra HLA federateAmbassador.federationSynchronized() callback'ini çağırır. Bu çağrı da geldikten sonra synchPointAchievedBarrier barrier de indirilir ve LoadState'e geçilir.

3. LoadState
Bu state 3 frame boyunca çalışır.

Frame 1 
Commander engine paylaşmak istediği bilgileri paylaşır

Frame 2
Slave engine'ler bu bigileri okur ve işler

Frame 3
Tüm katılımcılar senaryoyu yüklerler. Senaryo ortak bir yerdeki dosya olabilir. Dosya okunur ve engine içinde her frame içinde çalışması gereken nesneler yaratılır.

Eğer senaryo bir engine tarafından dağıtılacaksa bu state içinde gelen HLA verisi deserialize edilir ve işlenir.

Yani bu state içinde belki Data Reconstruction Layer olaylarını işlemeye gerek olabilir.

4. RunState
Yani bu state içinde Data Reconstruction Layer olaylarını işlemeye gerek var.
Ayrıca bu state içinde HLA Management Commands olaylarını işlemeye gerek var.

rtiAmbassador.timeAdvanceRequest()
rtiAmbassador.setTimeToSent

Fixed Timestep Game Loop yazısına da bakılabilir.

5. LeaveSynchronizationState
Commander Engine şu çağrıları yapar.
rtiAmbassador.registerFederationSynchronizationPoint(pointName)
Burada
 1. HLA synchronization point'i yarattım deyinceya kadar beklenir.
 2. HLA synchronization point'i anons ettim deyinceya kadar beklenir.

3. rtiAmbassador.synchronizationPointAchieved() çağrısı yapılır ve EndState'e geçilir.

Slave Engine şu çağrıları yapar.
1. HLA synchronization point'i anons ettim deyinceya kadar beklenir. Daha sonra
rtiAmbassador.synchronizationPointAchieved() çağrısı yapılır ve EndState'e geçilir.

6. EndState
Her Engine şu çağrıları yapar.
rtiAmbassador.resignFederationExecution()
rtiAmbassador.destroyFederationExecution()

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.



19 Eylül 2019 Perşembe

HLA Frame Akışı

Giriş
HLA kullanırken RTI thread'ine bağımlı olmak yerine ayrı bir thread açmak en mantıklısı.

1. Frame Başında
Bir önceki frame'de gelen ve biriktirilen mesajlar işlenir. Örneği araba federesi en son konumunu göndermiştir ve bu mesaj işlenerek araba nesnesi güncellenir.

2. Hesaplamalar Yapılır
Gelen mesajlara göre yeni hesaplamalar yapılır. Örneğin arabanın kalan yakıtıyle gidebileceği menzil hesaplanır.

3. Frame Sonunda
Command Örüntüsü kullanılarak Management Command'ler çalıştırılır.

2.1 Save Synchronization
HLASaveFederationCommand  emri varsa HLA thread'i bloke olmadan kendi thread'im save işlemini yerine getirir. Emrin tüm federeler tarafından başarıyla çalıştırması beklenir.

2.2 Restore Synchronization
HLARestoreFederationCommand emri varsa HLA thread'i bloke olmadan kendi thread'im restore işlemini yerine getirir. Emrin tüm federeler tarafından başarıyla çalıştırması beklenir.

2.3 Time Synchronization
Önce bir sonraki time frame'e geçmek için RTIAmbassador.timeAdvanceRequest() çağrısı yapılır.
Daha sonra GrantTimeCommand emri beklenir.  Bu komutun gelmesi tüm federelerin zamanlarını başrayla ilerlettikleri anlamına gelir.

Bu komutun gelmesi ile içinde bulunduğumuz frame sonlanır ve bir sonraki frame'e geçmek için döngünün en başına gidilir.

9 Eylül 2019 Pazartesi

HLA FederateAmbassador Arayüzü - Object Management

Giriş
Bu arayüzü gerçekleştiren sınıf NullFederateAmbassador. Kendi sınıfımızı bundan kalıtabiliriz.


discoverObjectInstance metodu - ObjectInstanceHandle + ObjectClassHandle + String

1. Birinci parametre instance için kullanılan handle nesnesidir.

2. İkinci parametre instance'ın ait olduğu class için kullanılan handle nesnesidir. Elimizde şöyle bir hiyerarşi olsun
Foo <- Bar
Karşı taraf Bar nesnesi yarattı ancak benim federem Bar (handle 20 olsun) sınıfı yerine Foo (handle 19 olsun) sınıfının dinliyor olsun. Bu durumda ObjectClass olarak Bar yani 19 alırız.

3. Üçüncü parametre objectName yani Foo'nun tam yolu ile belirtilen ismidir.

reflectAttributedValues metodu - ObjectInstanceHandle + AttributeHandleValueMap + byte [] userSuppliedFlag + OrderType sentOrdering + TransportationTypeHandle theTransport+ SupplemantaReflectInfo 

Aslında bu metodun 3 tane daha overload edilmiş hali var. En basit olanı bu.

Bu metodda bize bir nesne gelmiştir. Sadece ObjectInstanceHandle ve AttributeHandleMap önemli.
AttributeHandleValueMap aslında  şöyle tanımlı
public interface AttributeHandleValueMap extends Map<AttributeHandle,byte[]> {...}
Kod kabaca şöyle
Map<ObjectInstanceHandle,Object> objectMap = ...;
Map<AttributeHandle,Field> fieldMap = ...;
Object obj = objectMap.get(objectInstanceHandle);
for (Entry<AttributeHandle,byte[]> entry : attributeHandleValueMap){
  Field field = fieldMap .get(entry.key());
    //burada decode işlemi yapılır ve field'a atanır
}
removeObjectInstance metodu - ObjectInstanceHandle + byte [] userSuppliedFlag + OrderType sentOrdering + SupplementalRemoveInfo

Aslında bu metodun 3 tane daha overload edilmiş hali var. En basit olanı bu.

receiveInteraction metodu - InteractionClassHandle + ParameterHandleValueMap +  byte [] userSuppliedFlag + OrderType sentOrdering + TransportationTypeHandle theTransport+ SupplementalReceiveInfo

Aslında bu metodun 3 tane daha overload edilmiş hali var. En basit olanı bu. 
Bu metodda bize bir Interaction gelmiştir. Sadece InteractionClassHandle ve ParameterHandleValueMap önemli. ParameterHandleValueMap aslında  şöyle tanımlı
public interface ParameterHandleValueMap extends Map<ParameterHandle,byte[]> {...}
Kod kabaca şöyle
Map<InteractionClassHandle,Object> interactionMap = ...;
Map<ParameterHandle,Field> parameterMap = ...;
Object obj = interactionMap .get(interactionClassHandle);
for (Entry<ParameterHandle,byte[]> entry : parameterHandleValueMap){
  Field field = parameterMap.get(entry.key());
    //burada decode işlemi yapılır ve field'a atanır
}

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.

11 Mart 2019 Pazartesi

High Level Architecture - Management Object Model (MOM)

Federasyona katılan federeleri keşfetmek için HLAobjectRoot.HLAmanager.HLAfederate object kullanılır. Açıklaması şöyle.
You can use the Management Object Model (MOM) to query the joined federates in a federation.

Subscribe to the object class HLAobjectRoot.HLAmanager.HLAfederate and you will be updated with all the federates in the federation, including your own.
Bu yapının şu alanları önemli

HLAfederateType :  Federe ismidir
HLAfederateName : Federe ismidir


27 Aralık 2018 Perşembe

High Level Architecture - HLA

Giriş
Simülasyon dünyasında kullanılan arakatman. 1998 yılında DoD standardı haline geldi. 2000 yılında IEEE (IEEE Std 1516 veya HLA1516 olarak anılıyor) standardı haline geldi.

Ayrıca  "Stanag 4603" ile NATO standardı oldu.

Atası
HLA'nın atası Distributed Interactive Simulation (DIS)

RTI
Run Time Infrastructure anlamına gelir. Türkçesi Çalışma Zamanı Altyapısı. HLA mimarisindeki merkezi sunucudur. Servis sağlayıcı olarak düşünülebilir.

Pitch RTI, MÄK RTI gibi paralı  ve Portico, OpenRTI, Open HLA gibi açık kaynak RTI gerçekleştirimleri vardır.

Windows'ta Pitch RTI servisini kontrol etmek için şu komutlar kullanılır.
sc \\servername start prti1515
sc \\servername stop prti1515
sc \\servername query prti1515

Federation
Bir ismi olan ve Federate'lerin (federasyonun üyesi) çalıştığı simülasyon ortamı. Federate örneğin bir platformu temsil edebilir.

Federasyonun Kurulması ve Başlaması
Federasyonu oluşturan bir federe bulunur. Her federe simülasyon açılırken bazı safhalardan geçer.
Bunlar
1. Açılma - Initialization
2. Koşma - Run
3. Bitiş - End
olabilir.
İlgili safha geçişlerini duyuran bir federe olabilir.

Servisler
Şunlar bulunur
1. Federation Management
2. Declaration Management
3. Object Management
4. Data Distribution Management
5. Ownership Management
  Attrbiute sahipliğini değiştirebilmek hakkı anlamına gelir.
6. Time Management
  2 tip mesaj sırası vardır. Reception Order FIFO gibi çalışır. TSO ise heap gibi çalışır.

Federation Object Model
Federation Object Model (FOM) yazısına taşıdım.

Object Class
Object kalıcı veri tipini temsil eder. Her sınıfın (class) bir sahibi bulunur. Sadece sınıfı yaratan federate bu sınıfın nesnelerini (instance) yaratabilir ve silebilir. Class içinde alanlara "attribute" denilir.

Object'ler arasında kalıtım olabilir. HLAobjectRoot tüm object'lerin atasıdır.

Her alanın da sahibi vardır. Bir nesnenin farklı alanlarının farklı sahipleri olabilir. Sahiplik federasyon üyeleri arasında değişebilir. Alanı sanırım sadece sahip günceller.

Interaction Class
Anlık veri tipini temsil eder. İsmi interaction yerine event olabilirdi. Tek seferlik olayları temsil eder. Örneğin bir patlama olması interaction'dır. Interaction içindeki alanlara attribute yerine "parameter" denilir. HLAinteractionRoot tüm interaction'ların atasıdır. Interaction'da içinde zaman etiketi (time tag) bilgisi bulunur.

Attribute Tag
Şu alanlar mutlaka olmalı
1. name
2. transportation
3. order
4. dimensions

Performans
İlgi duyulan attribute ve DDM (İlgi gruplarına) abone olmak gerekir.

Handle
RTI tarafından verilen numara gibi düşünülebilir.

Zaman - TimeConstrained
Açıklaması şöyle.
A TimeConstrained federate cannot advance its internal time until RTI allows it. This is used for simulators that should advance time almost simulataneously
FederateAmbassador Arayüzü
FederateAmbassador Arayüzü yazısına taşıdım.

NullAmbassador Sınıfı
FederarateAmbassador arayüzünden kalıtır. Override edilmesi gereken metodları boş olarak sağlar. Kendi sınıfım bu sınıftan kalıtır.

RTIambassador Arayüzü
RTIambassador Arayüzü yazısına taşıdım.

LogicalTime Arayüzü
LogicalTime Arayüzü yazısına taşıdım.

LogicalTimeFactory Arayüzü
LogicalTimeFactory Arayüzü yazısına taşıdım.

LogicalTimeFactoryFactory Sınıfı
getLogicalTimeFactory metodu
Şöyle yaparız.
HLAfloat64TimeFactory timeFactory = 
  (HLAfloat64TimeFactory)LogicalTimeFactoryFactory.getLogicalTimeFactory("HLAfloat64Time")



31 Ekim 2018 Çarşamba

HLA Federation Object Model XML (FOM)

Giriş
Federation Object Model (FOM) federasyondaki ortak bilgi modelini temsil eder. Tanımlama niteliklerin alt/üst sınırları, aralıkları, birimleri gibi özellikleri içermez.

Savunma sanayinde kullanılan FOM tiplerinden birisi "RPR Fom 3".

XML
XML olarak şöyledir. objectClass tag'leri iç içe olabilir ve kalıtımı temsil eder.
<objectModel>
  <modelIdentification>...</modelIdentification>
  <objects>
    <objectClass>...</objectClass>
  </objects>
  <interactions>
    <interactionClass>...</interactionClass>
  </interactions>
  <dimensions>
    <dimension>...</dimension>
    ...
  </dimensions>
  <time>
    <timeStamp>...</timeStamp>
    <lookahead>...</lookahead>
  </time>
  <tags>
    <deleteRemoveTag>...</deleteRemoveTag>
  </tags>
  <synchronizations>
    <synchronizationPoint>...</synchronizationPoint>
    ...
  </synchronizations>
  <transportations>
    <transportation>...</transportation>
  </transportations>
  <switches>...</switches>
  <updateRates>
    <updateRate>...</updateRate>
  </updateRates>
  <dataTypes>
    <basicDataRepresentations>...</basicDataRepresentations>
    <simpleDataTypes>...</simpleDataTypes>
    <enumeratedDataTypes>...</enumeratedDataTypes>
    <arrayDataTypes>...</arrayDataTypes>
    <fixedRecordDataTypes>...</fixedRecordDataTypes>
    <variantRecordDataTypes>...</variantRecordDataTypes>
  </dataTypes>
  <notes>
    <note>...</note>
    ...
  </notes>
</objectModel>
DataTypes

Burada kendi veri tiplerimi tanımlarım.

- basicDataRepresentations : HLAinteger gibi tipler tanımlı
- simpleDataTyped : IntergerAttribute, ByteAttribute gibi tipler tanımlı
- enumeratedDataTypes : Kendi enum tiplerim tanımlı
- arrayDataTypes : Kendi array tiplerim tanımlı
- fixedRecordDataTypes : Kendi record tiplerim tanımlı
- variantRecordDataTypes : Kendi variant record tiplerim tanımlı. Bu sanırım C++'taki union gibi. Bir sürü tipten sadece biri olabiliyor.
<variantRecordData name="..." discriminant="techniqueType" dataType="TechniqueEnum"
  encoding="HLAvariantRecord">

  <alternative enumerator="Frequency" name="Frequency" dataType="FloatAttribute"/>

  <alternative enumerator="Power" name="Power" dataType="FloatAttribute"/>
   ...

</variantRecordData>



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.



10 Eylül 2018 Pazartesi

HLA RTIambassador Arayüzü

Giriş
Şu satırı dahil ederiz.
import hla.rti1516.RTIambassador;
Bu arayüz RtiFactoryFactory tarafıdan yaratılır.

createFederationExecution metodu - String + URL
Çağrı sırası şöyle. İlk parametre federasyon ismi, ikinci parametre FOM dosyasıdır. Eğer federasyon mevcutsa hla.rti1561e.exceptions.FederationExecutionAlreadyExists fırlatılır.
createFederationExecution() -> joinFederationExecution()
Örnek
Şöyle yaparız.
String federationName = "...";
URL fomURL = "...";
try {
  rtiAmb.createFederationExecution (federationName, fomURL);
}
catch (FederationExecutionAlreadyExists e) {
 ...
}
destroyFederationExecution metodu
Parametre olarak federasyon ismini alır

disableTimeConstrained metodu
RTIambassador Arayüzü - Time Management yazısına taşıdım.

disableTimeRegulation metodu
RTIambassador Arayüzü - Time Management yazısına taşıdım.

enableTimeConstrained metodu
RTIambassador Arayüzü - Time Management yazısına taşıdım.

enableTimeRegulation metodu
RTIambassador Arayüzü - Time Management yazısına taşıdım.

getAttributeHandle metodu - hla.rti1516.ObjectClassHandle + string
RTIambassador Arayüzü - Declaration Management yazısına taşıdım.

getAttributeHandleSetMapFactory metodu
rtiAmb.publishObjectClassAttributes() veya
rtiAmb.subscribeObjectClassAttributes()

metodları ile sınıfın hangi alanlarını yayınlayacağımızı veya okuyacağımızı belirtirken bu factory trafından üretilen handle nesnelerini kullanarak doldurururz.

Örnek
Şöyle yaparız.
AttributeHandleSetFactory factory=  rtiAmb.getAttributeHandleSetFactory ();
Daha sonra şöyle yaparız.
AttributeHandleSet set=  factory.create ();
Elimizde bir attribute olsun.
AttributeHandle positionAttribute  rtiAmb.getAttributeHandle (...);
Bu attribute nesnesini set'e ekleriz.
set.add (positionAttribute);
Bu nesnenin alanlarını bildirmek için şöyle yaparız.
rtiAmb.publishObjectClassAttributes (set);
getAttributeHandleValueMapFactory metodu
rtiAmb.updateAttributeValues() metodu ile Object gönderirken parametreleri bu factory trafından üretilen handle nesnelerini kullanarak doldurururz.
Örnek
Şöyle yaparız.
AttributeHandleValueMapFactory factory=  rtiAmb.getAttributeHandleValueMapFactory ();
getParameterHandleValueMapFactory metodu
Interaction gönderirken parametreleri bu factory trafından üretilen handle nesnelerini kullanarak doldurururz.
Örnek
Şöyle yaparız.
ParameterHandleValueMapFactory factory=  rtiAmb.getParameterHandleValueMapFactory ();
getObjectClassHandle metodu - string
RTIambassador Arayüzü - Declaration Management yazısına taşıdım.

getTimeFactory metodu
Şöyle yaparız.
LogicalTime time =  rtiAmb.getTimeFactory().makeFinal();
joinFederationExecution metodu
İlk parametre federate ismi, ikinci parametre federation ismi, üçüncü parametre FederateAmbassador arayüzü. Bu arayüz RTI'dan callback almak içindir. Dördüncü parametreyi bilmiyorum ama sanırım  hep null.

publishInteractionClass metodu
RTIambassador Arayüzü - Declaration Management yazısına taşıdım.

publishObjectClassAttributes metodu
RTIambassador Arayüzü - Declaration Management yazısına taşıdım.

registerFederationSynchronizationPoint metodu
RTIambassador Arayüzü - Federation Synchronization yazısına taşıdım.

registerObjectInstance metodu
RTIambassador Arayüzü - Declaration Management yazısına taşıdım.

resignFederationExecution  metodu
RTIambassador Arayüzü - Federation Management yazısına taşıdım.

subscribeInteractionClass metodu
RTIambassador Arayüzü - Declaration Management yazısına taşıdım.

subscribeObjectClassAttributes metodu
RTIambassador Arayüzü - Declaration Management yazısına taşıdım.

synchronizationPointAchieved metodu - string
registerFederationSynchronizationPoint() çağrısı ile ismi belirtilen nokta yaratılır. Diğer federelere ismi belirtilen noktaya erişildiği bildirilir. Tüm federeler bu noktaya varınca FederateAmbassador.federationSynchronized() tetiklenir.
Örnek ver

tick metodu
Örnek ver

timeAdvanceRequest metodu
RTIambassador Arayüzü - Time Management yazısına taşıdım.

updateAttributeValues metodu

6 Eylül 2018 Perşembe

HLA ObjectInstanceHandle Arayüzü

Giriş
Bu arayüz Serializable arayüzünden kalıtmasına rağmen Java Object Serialization yapmak istemeyenler için encodedLength() ve encode() metodlarını sunuyor

encode metodu
Belirtilen byte[] alanına bu nesneyi yazar. Nesneyi tekrar okumak istersek ObjectInstanceHandleFactory arayüzünün decode() metodu çağrılır.

encodedLength metodu
encode() metoduna geçilecek byte[] büyüklüğünü ayarlamak için kullanılır.


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.