这段文字描述了如何使用数据分发服务(DDS)在航空交通管理中实现飞机位置的实时跟踪和信息共享。下面是对文本内容的逐步解释:
背景
空域与空中交通管理:
- 空域(airspace)及其中的空中交通通常由空中交通管制员(air traffic controllers)管理。
- 管制员负责组织空中交通、预防碰撞并提供相关信息。
责任区域:
- 每个空中交通管制中心负责特定的飞行区域,并将数据传送到统一的空域交通管理系统,以整合飞行信息。
DDS 的应用
信息流通:
- 当一个控制中心发现进入其控制飞行区的飞机时,它会通知空域交通管理中心关于该航班的跟踪信息。
- 这种信息流可以通过 DDS 实现,创建一个特定主题(Topic),其中发布有关航班位置的信息。
主题实例:
- 在更智能的实现方案中,可以利用主题实例(topic instances)来转发来自地方航空管制中心的信息到空域交通管理中心。
- 主题实例可以使用航司名称和航班号作为实例键进行识别(例如:IBERIA 1234)。
数据模型定义
- IDL 定义:
struct FlightPosition { @key string<256> airline_name; // 航空公司名称 @key short flight_number; // 航班号 double latitude; // 纬度 double longitude; // 经度 double altitude; // 海拔高度 };
FlightPosition
是用于描述飞机位置信息的数据结构,其中包含航空公司名称、航班号及其坐标信息。
实例注册与更新
新航班发现后注册实例:
FlightPosition first_flight_position; first_flight_position.airline_name("IBERIA"); first_flight_position.flight_number(1234); eprosima::fastdds::rtps::InstanceHandle_t first_flight_handle = data_writer->register_instance(&first_flight_position);
- 一旦发现新航班,控制中心会创建对应的数据样本,并为其注册一个实例,这样可以方便后续操作,如写入、处置或注销实例等。
更新位置信息并写入数据:
first_flight_position.latitude(39.08); first_flight_position.longitude(-84.21); first_flight_position.altitude(1500); data_writer->write(&first_flight_position, first_flight_handle);
- 控制中心更新飞机的位置,并将新的位置信息写入 DDS 系统,使用之前注册的实例句柄以提高效率。
直接调用 DataWriter 操作:
- 用户应用程序也可以直接用 NIL 实例句柄调用 DataWriter 实例操作,而不需先注册。这种方法可能会导致性能下降,因为每次操作都需要重新计算实例句柄。
新数据样本与未注册的新实例:
FlightPosition second_flight_position; second_flight_position.airline_name("RYANAIR"); second_flight_position.flight_number(4321); second_flight_position.latitude(40.02); second_flight_position.longitude(-84.32); second_flight_position.altitude(5000); data_writer->write(&second_flight_position);
- 对于第二个新航班,可以直接创建新的数据样本并写入,无需先注册该实例。在这种情况下,虽然方便但效率较低,因为没有使用优化过的句柄。
总结
整体而言,这段文字详细介绍了如何利用 DDS 在航空领域实施有效的数据通信和追踪,强调了通过主题和主题实例来高效地处理飞行位置数据的重要性。
内容由零声教学AI助手提供,问题来源于学员提问