Использую ли я предоставленное время или предоставленный пользователем тег при обработке отражения атрибута заказа на прием от федерации с управлением по времени?
В симуляции с использованием RPR-FOM, если я получу reflectAttributeValues
с LogicalTime
отметка времени (время моделирования) и OrderType
получить заказ в моем FederateAmbassador
, Для алгоритмов бездействующего расчета я использую метку времени, предоставленную RTI, или метку времени, закодированную в userSuppliedTag
? С использованием userSuppliedTag
было бы декодированное значение, если абсолютные и системные часы, если относительные.
Чтобы уточнить, я получаю атрибуты, отражающие указанный порядок получения от федерации, управляемой временем, в этом вызове в FederateAmbassador
из РТИ:
void reflectAttributeValues(ObjectInstanceHandle theObject,
AttributeHandleValueMap theAttributes,
byte[] userSuppliedTag,
OrderType sentOrdering,
TransportationTypeHandle theTransport,
LogicalTime theTime,
OrderType receivedOrdering,
MessageRetractionHandle retractionHandle,
SupplementalReflectInfo reflectInfo)
2 ответа
Для атрибутов, которые были обновлены Порядок меток времени, я использовал time
параметр, чтобы узнать, когда атрибут был последний раз обновлен, и рассчитать время симуляции до смерти.
public void reflectAttributeValues(
ObjectInstanceHandle objectHandle,
AttributeHandleValueMap attributes,
byte[] userSuppliedTag,
OrderType sentOrdering,
TransportationTypeHandle theTransport,
LogicalTime time,
OrderType receivedOrdering,
MessageRetractionHandle retractionHandle,
SupplementalReflectInfo reflectInfo) {
attributes.forEach((attributeHandle, value) -> {
lastUpdated.put(attributeHandle, time));
timeManaged.add(attributeHandle);
// decode value into your object
...
}
}
Для атрибутов, в которых был обновлен порядок получения без отметки времени, я использовал userSuppliedTag
чтобы узнать, когда был приписан последний атрибут (значение в теге для абсолютных и системных часов на момент получения атрибута для относительного), а затем использовать системные часы, чтобы считаться мертвыми.
public void reflectAttributeValues(
ObjectInstanceHandle objectHandle,
AttributeHandleValueMap attributes,
byte[] userSuppliedTag,
OrderType sentOrdering,
TransportationTypeHandle theTransport,
SupplementalReflectInfo reflectInfo) {
LogicalTime time;
if (isRelativeTag(userSuppliedTag)) {
time = factory.createSystemLogicalTime(System.currentTimeMillis());
} else {
time = decodeTag(userSuppliedTag);
}
attributes.forEach((attributeHandle, value)-> {
lastUpdated.put(attributeHandle, time);
timeManaged.remove(attributeHandle); // attributes might switch
// decode value into your objects
...
}
}
Тогда до смерти считай:
private Vector3D getDeadReckonedWorldLocation(LogicalTime time) {
LogicalTime lastUpdatedSpatial = lastUpdated.get(spatialAttributeHandle);
if (!timeManaged.contains(spatialAttributeHandle)) {
time = factory.createSystemLogicalTime(System.currentTimeMillis());
}
LogicalTimeInterval timeToDeadReckon = time.distance(lastUpdatedSpatial);
return deadReckon(timeToDeadReckon);
}
Код здесь - упрощенные примеры, которые могут не компилироваться, но они отражают решение, которое мне удалось найти.
Большинство пользователей RPR FOM используют только время в теге User Supplied.
Сервисы HLA Time Management обычно не используются, если вы никогда не получите LogicalTime или сообщения в порядке меток времени (TSO).
См. Соглашение о федерации для RPR FOM, "SISO-STD-001-2015: Стандарт для руководящих указаний, обоснований и методов взаимодействия (GRIM) для эталонной объектной модели федерации платформы в реальном времени (RPR FOM)", для получения дополнительной информации: https://www.sisostds.org/DigitalLibrary.aspx?Command=Core_Download&EntryId=30822