Программное управление MAVLink
На этой странице представлены все доступные функции программного управления MAVLink в Engee.
|
Чтобы работать с функциями программного управления MAVLink в Engee, следуйте инструкциям, указанным в статье. После выполните:
Далее необходимо создать объект Mavlink, который будет использоваться для взаимодействия с устройствами MAVLink:
Конструктор можно вызвать с дескриптором уже существующего соединения — тогда объект будет работать с этим соединением, не создавая новое:
Дескриптор возвращает функция |
Методы MAVLink
#
Main.EngeeDeviceManager.Devices.MAVLINK.close — Method
mavlink.close()
Закрывает соединение MAVLink и останавливает автоматическую отправку сообщений HEARTBEAT.
Примеры
mavlink = MAVLINK.Mavlink()
desc = mavlink.connect("udp", "127.0.0.1", 14551, 255, 190)
# ... обмен сообщениями ...
mavlink.close()
#
Main.EngeeDeviceManager.Devices.MAVLINK.connect — Method
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)
#
Main.EngeeDeviceManager.Devices.MAVLINK.get_latest_message — Method
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
#
Main.EngeeDeviceManager.Devices.MAVLINK.get_latest_messages — Method
mavlink.get_latest_messages()
Возвращает последние принятые сообщения всех типов, накопленные в буфере приема: для каждого типа — самое последнее полученное сообщение этого типа.
Возвращаемое значение
Dict{String, Dict{String, ...}}: словарь «имя типа сообщения → словарь полей», например Dict("SIMSTATE" => Dict("lat" => ..., "lng" => ...), ...). Пустой словарь, если ни одного сообщения еще не было получено.
Примеры
msgs = mavlink.get_latest_messages()
println("Типы принятых сообщений: ", collect(keys(msgs)))
#
Main.EngeeDeviceManager.Devices.MAVLINK.recv — Method
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
#
Main.EngeeDeviceManager.Devices.MAVLINK.send — Method
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
))