ArduPilot 中的 MAVLink 路由器¶
ArduPilot(在飞行控制器上运行)可将一个遥测端口上接收到的 MAVLink 信息路由到所有其他遥测端口。在飞行器上有多个启用 MAVLink 的组件(如飞行控制器和配套计算机),但飞行器和地面站之间只有一个遥测连接的情况下,这一点非常重要。本页描述了 ArduPilot 如何决定哪些信息应被路由到哪些遥测端口。
正如 MAVLink 基础知识 页面 MAVLink 网络由以下部分组成 系统 (载具、全球控制系 统、天线跟踪器等),它们本身由 部件 (飞行控制器、摄像系统等)。
每条信息都包含一个 系统 身份证
和 组件 身份证
字段来指定信息的来源。此外 一些消息 (包括 set_position_target_global_int) 包括 目标系统
和 目标组件
字段,以便指定应由哪个系统/组件执行命令。
的值为 0。 目标系统
或 目标组件
被视为广播 ID,将发送给网络中的所有系统/目标系统上的所有组件。
ArduPilot 系统的路由工作原理如下:
所有接收到的 MAVLink 信息都会由 MAVLink_routing 类。
该类提取源系统 ID(又名 系统码)和组件 id(又名 贮藏库) 并建立路由阵列,将通道(即 USB 端口、Telem1、Telem2)映射到 <sysid,compid>; 一对
该类还能提取目标系统 ID (
目标系统
)和组件 ID (目标组件
),如果它们与载具的 <sysid,compid>; 使用上述数组将信息转发到相应的通道。没有目标的信息 <sysid,compid>; 由载具处理,然后转发给每个已知系统/组件。
MAVLink 路由的详细理论¶
以下信息摘自路由代码源代码注释 (/libraries/GCS_MAVLink/MAVLink_routing.cpp)
当飞行控制器接收到信息时,如果其中任何一个条件成立,则应在本地进行处理:
它没有
目标系统
领域它有一个
目标系统
的零它拥有飞行控制器目标系统,没有
目标组件
领域它拥有飞行控制器目标系统和飞行控制器
目标组件
它有飞行控制器的目标系统,而飞行控制器在其任何链接上都没有看到来自有信息的系统的任何信息
目标系统
/目标组件
组合
当飞行控制器接收到信息时,如果该链路符合上述任何条件,则应将其转发到另一条不同的链路上:
它没有
目标系统
领域它有一个
目标系统
的零它没有飞行控制器
目标系统
而飞行控制器已经看到了来自报文的信息目标系统
链接上它有飞行控制器
目标系统
并有一个目标组件
场,飞行控制员看到了来自目标系统
/目标组件
链接组合
备注
本建议假定,地面站在通过链路收到至少一个来自非广播目的地(sysid/compid 组合)的数据包之前,不会向该目的地发送指令数据包。这对于防止飞行控制器执行非针对它的信息至关重要。例如,一个 参数设置
不能发送到特定的 <sysid/compid>; 组合,直到 GCS 看到来自该组合的数据包为止。 <sysid/compid>; 链接上的组合。
全球监控系统还必须重新设置<sysid/compid>; 当它看到 SYSTEM_TIME 报文中的 time_boot_ms 从某个特定的 <sysid/compid>;.这对检测飞行控制器的重置至关重要,重置意味着路由表的重置。