Документация Engee

Программное управление MAVLink

На этой странице представлены все доступные функции программного управления MAVLink в Engee.

Чтобы работать с функциями программного управления MAVLink в Engee, следуйте инструкциям, указанным в статье. После выполните:

using Main.EngeeDeviceManager.Devices.MAVLINK

Далее необходимо создать объект Mavlink, который будет использоваться для взаимодействия с устройствами MAVLink:

mavlink = MAVLINK.Mavlink()

Конструктор можно вызвать с дескриптором уже существующего соединения — тогда объект будет работать с этим соединением, не создавая новое:

mavlink = MAVLINK.Mavlink(desc)

Дескриптор возвращает функция mavlink.connect(…​), его же выдает на выход блок 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)

Открывает соединение MAVLink по TCP или UDP, запускает автоматическую отправку сообщений HEARTBEAT и возвращает дескриптор соединения.

Аргументы

  • conn_type::String: тип транспорта — "tcp" или "udp".

  • host::String: IP-адрес или имя хоста устройства MAVLink.

  • 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
))