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

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

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

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

using Main.EngeeDeviceManager.Devices.ARDUPILOT

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

ap = ARDUPILOT.Ardupilot()

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

ap = ARDUPILOT.Ardupilot(desc)

Дескриптор возвращает функция ap.connect(…​).

Методы Ardupilot

ap.close()

Закрывает UDP-мост с ArduPilot SITL и освобождает UDP-сокет.

Аргументы

Отсутствуют (метод вызывается от объекта Ardupilot).

Примеры

ap = ARDUPILOT.Ardupilot()
desc = ap.connect()
# ... обмен данными ...
ap.close()
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)
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
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)
)