Программное управление Ardupilot
На этой странице представлены все доступные функции программного управления Ardupilot в Engee.
|
Чтобы работать с функциями программного управления Ardupilot в Engee, следуйте инструкциям, указанным в статье. После выполните:
Далее необходимо создать объект Ardupilot, который будет использоваться для взаимодействия с автопилотом:
Конструктор можно вызвать с дескриптором уже существующего соединения — тогда объект будет работать с этим соединением, не создавая новое:
Дескриптор возвращает функция |
Методы Ardupilot
#
Main.EngeeDeviceManager.Devices.ARDUPILOT.close — Method
ap.close()
Закрывает UDP-мост с ArduPilot SITL и освобождает UDP-сокет.
Аргументы
Отсутствуют (метод вызывается от объекта Ardupilot).
Примеры
ap = ARDUPILOT.Ardupilot()
desc = ap.connect()
# ... обмен данными ...
ap.close()
#
Main.EngeeDeviceManager.Devices.ARDUPILOT.connect — Method
ap.connect()
ap.connect(host, port_out, port_in, visualize_port, visual_ok)
Открывает UDP-мост с ArduPilot SITL: создает UDP-сокет на порту port_in, начинает слушать ШИМ-кадры автопилота и возвращает дескриптор соединения. В ответ на ШИМ-кадры мост отправляет автопилоту кадры сенсоров, передаваемые функцией ap.send(...).
Аргументы
-
host::String = "127.0.0.1": адрес, на котором открывается UDP-сокет. -
port_out::Int64 = 9002: зарезервировано для совместимости, не используется. -
port_in::Int64 = 9002: UDP-порт, на котором мост ожидает ШИМ-кадры ArduPilot. -
visualize_port::Int64 = 14600: UDP-порт для отправки данных визуализации (позиции аппарата). -
visual_ok::Bool = false: приtrueмост дополнительно отправляет позицию аппарата наvisualize_port.
Возвращаемое значение
desc::Int64: дескриптор соединения. Передайте его в конструктор ARDUPILOT.Ardupilot(desc), чтобы использовать это же соединение из другого объекта.
Примеры
using Main.EngeeDeviceManager.Devices.ARDUPILOT
ap = ARDUPILOT.Ardupilot()
desc = ap.connect("127.0.0.1", 9002, 9002, 5040, true)
println("Дескриптор соединения: ", desc)
#
Main.EngeeDeviceManager.Devices.ARDUPILOT.receive — Method
ap.receive()
ap.receive(timeout)
ap.receive(timeout, async_rpc)
Возвращает ШИМ-сигналы из последнего кадра ArduPilot. Кадр содержит 16 или 32 ШИМ-значения; функция возвращает их все.
Аргументы
-
timeout::Float64 = 0.01: максимальное время ожидания кадра в секундах. -
async_rpc::Bool = false: приtrueфункция не дожидается завершения запроса и сразу возвращает управление.
Возвращаемое значение
Vector{Float64}: ШИМ-значения кадра (в микросекундах длительности импульса). Если кадр не пришел за timeout — пустой вектор.
Примеры
servos = ap.receive(0.05)
if !isempty(servos)
println("ШИМ: ", servos[1:4])
end
#
Main.EngeeDeviceManager.Devices.ARDUPILOT.send — Method
ap.send(timestamp, gyro, accel, position, attitude, velocity)
ap.send(timestamp, gyro, accel, position, attitude, velocity, async_rpc)
Передает автопилоту очередной кадр данных сенсоров. Кадр отправляется в ответ на ШИМ-кадр ArduPilot (lockstep): следующий ШИМ-кадр автопилот пришлет только после получения этого кадра сенсоров.
Аргументы
-
timestamp::Float64: время модели в секундах. -
gyro::Vector{Float64}: угловые скорости, рад/с (ровно 3 компоненты). -
accel::Vector{Float64}: ускорения в связанной системе координат, м/с² (ровно 3 компоненты). -
position::Vector{Float64}: положение в системе координат NED, м (ровно 3 компоненты). -
attitude::Vector{Float64}: углы ориентации, рад (ровно 3 компоненты). -
velocity::Vector{Float64}: скорость в системе координат NED, м/с (ровно 3 компоненты). -
async_rpc::Bool = false: приtrueфункция не дожидается завершения запроса и сразу возвращает управление.
Примеры
ap.send(
0.05, # timestamp, с
[0.0, 0.0, 0.1], # gyro, рад/с
[0.0, 0.0, -9.81], # accel, м/с² (связанная система координат)
[0.0, 0.0, 10.0], # position, м (NED)
[0.0, 0.1, 0.0], # attitude, рад
[0.0, 0.0, 0.0], # velocity, м/с (NED)
)