AnyMath 文档

MAVLink软件管理

此页面显示了所有可用的MAVLink软件管理功能 AnyMath .

使用MAVLink软件管理功能 AnyMath ,按照在给出的说明 文章. 之后,执行:

using Main.EngeeDeviceManager.Devices.MAVLINK

接下来,您需要创建一个Mavlink对象,该对象将用于与MAVLink设备进行交互。:

mavlink = MAVLINK.Mavlink()

构造函数可以使用现有连接的句柄调用。 然后对象将使用此连接而不创建新连接。:

mavlink = MAVLINK.Mavlink(desc)

描述符由函数返回 mavlink。接(。..),它也由块输出 MAVLINK Setup.

方法 马夫林克

mavlink.close()

关闭 MAVLink 连接并停止自动发送 HEARTBEAT 消息。

示例

mavlink = MAVLINK.Mavlink()
desc = mavlink.connect("udp", "127.0.0.1", 14551, 255, 190)
# ... 消息交流 ...
mavlink.close()
mavlink.connect(conn_type, host, port, source_system, source_component)

建立基于 TCP 或 UDP 的 MAVLink 连接,启动 HEARTBEAT 消息的自动发送,并返回连接描述符。

参数

  • conn_type::String :传输类型----"tcp" 或"udp" 。

  • host::String: MAVLink 设备的 IP 地址或主机名。

  • port::Int64: 设备的网络端口。

  • source_system::Int64: 代表该节点的系统标识符(system ID)。有效范围为1 至255 。

  • source_component::Int64 :用于标识节点的组件标识符(component ID)。有效范围为1 至255 。

返回值

desc::Int64 :连接描述符。 将其传递给MAVLINK.Mavlink(desc) 的构造函数,以便从另一个对象中使用同一连接。

示例

using Main.EngeeDeviceManager.Devices.MAVLINK

mavlink = MAVLINK.Mavlink()
desc = mavlink.connect("udp", "127.0.0.1", 14551, 255, 190)
println("Дескриптор соединения: ", desc)
mavlink.get_latest_message(message_type)

返回指定类型的最新接收消息:该函数始终返回该类型的最新消息,而非按接收顺序的下一条消息(如recv 所示)。如果尚未收到该类型的消息,则返回空字典。

参数

message_type::String :消息类型的名称,例如"SIMSTATE" 。

返回值

Dict{String, ...} :"字段名 → 值" 形式的字典,例如Dict("lat" => -353632610, "lng" => 1491652370) 。 如果该类型的消息尚未到达,则返回空字典。

示例

hb = mavlink.get_latest_message("HEARTBEAT")
if !isempty(hb)
    println("Тип аппарата: ", hb["type"])
end
mavlink.get_latest_messages()

返回接收缓冲区中累积的所有类型的最新接收消息:对于每种类型,返回该类型最近接收的一条消息。

返回值

Dict{String, Dict{String, ...}} :字典"`消息类型名称 → 字段字典`",例如Dict("SIMSTATE" => Dict("lat" => ..., "lng" => ...), ...) 。 如果尚未接收任何消息,则返回空字典。

示例

msgs = mavlink.get_latest_messages()
println("Типы принятых сообщений: ", collect(keys(msgs)))
mavlink.recv(timeout)
mavlink.recv(timeout, async_rpc)

从接收缓冲区中等待下一条MAVLink消息,并返回元组(message_type, fields_json) ----包含消息类型的名称及其字段(JSON格式)。消息按到达顺序(FIFO)返回: 每次调用都会从缓冲区中取出最早的尚未读取的消息。如果在等待期间未收到消息,元组的两个元素均为空:返回("", "") 。

参数

  • timeout::Float64 :等待消息的最大时间(单位:秒)。

  • async_rpc::Bool = false :当设置为true 时,函数不会等待请求完成,而是立即返回控制权。

返回值

(message_type::String, fields_json::String) :消息类型的名称及其字段(JSON格式)。可通过JSON3.read 方便地解析这些字段。如果在timeout 内未收到消息,则返回("", "") 。

示例

using JSON3

msg_type, fields_json = mavlink.recv(1.0)
if !isempty(msg_type)
    println("Принято сообщение: ", msg_type)
    fields = JSON3.read(fields_json, Dict{String, Any})
    println("Поля: ", fields)
end
mavlink.send(message_type, fields)
mavlink.send(message_type, fields, async_rpc)

发送指定类型的MAVLink消息。消息发送后不等待响应:该函数不会等待接收方的确认。

参数

  • message_type::String: 消息名称,例如"GPS_INPUT" (不区分大小写)。

  • fields::Dict{String, ...}: 消息字段,采用"`名称 → 值`"的字典形式。未传入的字段将使用默认值填充。

  • async_rpc::Bool = false :发送模式。当设置为true 时,该函数不会等待请求完成,而是立即返回控制权。

允许的值类型fields

Union{
    Int64, Int32, UInt64, UInt32, Float64, Bool, String,
    Vector{Int64}, Vector{Int32}, Vector{UInt64}, Vector{UInt32},
    Vector{Float64}, Vector{Bool}, Vector{String},
}

每条消息的字段名称和类型详见 此页面。

示例:

MavlinkField = Union{
    Int64, Int32, UInt64, UInt32, Float64, Bool, String,
    Vector{Int64}, Vector{Int32}, Vector{UInt64}, Vector{UInt32},
    Vector{Float64}, Vector{Bool}, Vector{String},
}

mavlink.send("HEARTBEAT", Dict{String, MavlinkField}(
    "type"            => 6,    # MAV_TYPE_GCS
    "autopilot"       => 8,    # MAV_AUTOPILOT_INVALID
    "base_mode"       => 0,
    "custom_mode"     => 0,
    "system_status"   => 4,    # MAV_STATE_ACTIVE
    "mavlink_version" => 3,    # MAVLink 2
))