Lua документация по API

Описание API функций взаимодействия с автопилотом

time()

Возвращает время с момента включения коптера.

deltaTime()

Возвращает разницу в секундах между временем коптера, которое можно получить функцией time(), и глобальным временем системы навигации.

launchTime()

Возвращает время запуска для системы навигации.

sleep(seconds)

Останавливает выполнение скрипта на заданное время, допустимы дробные значения аргумента. Рекомендуется использовать Timer , так как sleep блокирует дальнейшее выполнение скрипта.

Параметры:seconds – время сна в секундах.
boardNumber

Получение идентификационного номера борта - доступно через переменную.

Пример

local boardNumber = boardNumber
ap.push(Event)

Добавить событие автопилоту (см. События, отправляемые автопилоту).

Параметры:Event – номер события или название (например, Ev.COPTER_LANDED).

Пример

Ev.MCE_PREFLIGHT
ap.push(Ev.MCE_PREFLIGHT)
ap.goToPoint(latitude, longitude, altitude)
Для полёта с использованием GPS.
Параметры:
  • latitude – задается широта в градусах, умноженных на \(10^{-7}\);
  • longitude – задается долгота в градусах, умноженных на \(10^{-7}\);
  • altitude – задается высота в метрах.

Пример ap.goToPoint(60.0859810, 30.4206500, 50)

ap.goToLocalPoint(x, y, z, time)

Для полёта с использованием локальной системы координат.

Параметры:
  • x – задается координата точки по оси x, в метрах;
  • y – задается координата точки по оси y, в метрах;
  • z – задается координата точки по оси z, в метрах;
  • time – время, за которое коптер перейдет в следующую точку, в секундах. Если значение не указано, коптер стремится к точке с максимальной скоростью.

Пример ap.goToLocalPoint(1, 1, 1.2) или ap.goToLocalPoint(1, 1, 1.2, 10)

ap.updateYaw(angle)

Установить рыскание.

Параметры:angle – угол в радианах.

RGB светодиоды

class Ledbar
new(Count)

Cоздать новый Ledbar с заданным количеством светодиодов.

Параметры:Count – количество светодиодов.
set(self, num, r, g, b)

Установить цвет на конкретный светодиод.

Параметры:
  • num – номер светодиода, нумеруются с 0 по 3 на плате, далее последовательно по подключенным модулям;
  • r – интенсивность красной компоненты цвета в интервале от [0;1];
  • g – интенсивность зеленой компоненты цвета в интервале от [0;1];
  • b – интенсивность синей компоненты цвета в интервале от [0;1].

Смотри также fromHSV()

Пример

К коптеру дополнительно подключен модуль с магнитом, на котором 4 RGB светодиода.

local leds = Ledbar.new(8)
for i = 0, 3, 1 do
    leds:set(i, 1, 0, 0)
end

for i = 4, 7, 1 do
    leds:set(i, 0, 0.5, 0)
end
fromHSV(hue, saturation, value)

Конвертирует представление цвета из HSV в RGB. Можно использовать для задания цвета светодиода.

Параметры:
  • hue – задает цветовой тон. Варьируется в пределах [0;360];
  • saturation – задает насыщенность. Варьируется в пределах [0;100];
  • value – задает значение цвета. Варьируется в пределах [0;100];
Результат:

Возвращает три компонеты цвета r, g, b.

GPIO

class Gpio
new(Port, Pin, Mode)

Cоздать GPIO на порте с настройками.

Параметры:
  • Port – Gpio.A; Gpio.B; … Gpio.E;
  • Pin – номер пина на порте;
  • Mode – Gpio.INPUT, Gpio.Output, Gpio.ALTFU.
read(self)

Получить значение.

set(self)

Установить значение в 1.

reset(self)

Установить значение в 0.

write(self, value)
Параметры:value – установить значение.
setFunction(self, num)

Задать номер альтернативной функции.

Пример

local pin_name = Gpio.new(Gpio.A, 1, Gpio.OUTPUT)
pin_name:read() -- получить значение
pin_name:set() -- установить значение 1
pin_name:reset() -- установить значение 0
pin_name:write(true) -- установить значение true
pin_name:setFunction(1) -- задать номер альтернативной функции

UART

class Uart
new(num, rate, parity, stopBits)

Cоздать Uart на порте с настройками.

Параметры:
  • num – номер UART;
  • rate – скорость;
  • parity – Uart.PARITY_NONE, Uart.PARITY_EVEN, Uart.PARITY_ODD, необязательный параметр, по умолчанию Uart.PARITY_NONE;
  • stopBits – Uart.ONE_STOP, Uart.TWO_STOP, необязательный параметр, по умолчанию Uart.ONE_STOP.
read(self, size)

Прочитать size байт.

write(self, data, size)

Записать данные (data) длиной (size).

bytesToRead(self)

Количество данных доступных для чтения.

setBaudRate(self, rate)

Установить скорость.

Параметры:rate – скорость uart.

Пример

local uart = Uart.new(1, 115200)
uart:read(10) -- прочитать 10 байт

SPI

class Spi
new(num, rate, seq, mode)

Cоздать Spi на порте с настройками.

Параметры:
  • num – номер Spi
  • rate – скорость
  • seq – Spi.MSB, Spi.LSB, Spi.MSB_16, Spi.LSB_16, необязательный параметр, по умолчанию Spi.MSB;
  • mode – Spi.MODE0, Spi.MODE1, Spi.MODE2, Spi.MODE3, необязательный параметр, по умолчанию Spi.MODE0.
read(self, size)

Прочитать size байт.

write(self, data, size)

Записать данные (data) длиной (size).

exchange(self, data, size)

Записать данные (data) длиной (size) и прочитать size.

Пример

local spi = Spi.new(2, 1000000)
spi:exchange("hello", 5) -- записать данные (data) длиной (size) и прочитать size

Таймеры

class Timer
new(sec, func)

Cоздать новый Timer.

Параметры:
  • sec – время интервала в секундах;
  • func – функция, которая будет вызываться с заданным интервалом.
start(self)

Запуcкает таймер.

stop(self)

Останавливает таймер. При этом остановка уже запущенного таймера произойдет после выполнения функции, стоящей в очереди на выполнение.

callAt(local_time, func)

Cоздает и запускает новый Timer с функцией, которая будет вызвана один раз.

Параметры:
  • local_time – локальное время (возвращаемое функцией time()), указывающее момент вызова функции;
  • func – функция, которая будет вызвана.
callLater(delay, func)

Cоздает и запускает новый Timer с функцией, которая будет вызвана один раз.

Параметры:
  • delay – время, через которое будет вызвана функция;
  • func – функция, которая будет вызвана.
callAtGlobal(global_time, func)

Cоздает и запускает новый Timer с функцией, которая будет вызвана один раз.

Параметры:
  • global_time – глобальное время (time() + deltaTime()), указывающее момент вызова функции;
  • func – функция, которая будет вызвана.

Примечание

При использовании функций callAt(), callLater(), callAtGlobal() следует обратить внимание, что может быть не более 16 одновременно ожидающих таймеров. Если количество одновременно ожидающих таймеров больше 16, то новый таймер не будет создан.

Пример

Смотри Пример скрипта

События, отправляемые автопилоту

События (events) представляются константами с префиксом «Ev.»

Название Описание
MCE_PREFLIGHT Запустить двигатели и провести подготовку
ENGINES_DISARM Отключить двигатели
MCE_LANDING Отправить на посадку
MCE_TAKEOFF Отправить на взлет
–устаревшие–  
ENGINES_ARM Завести двигатели

Получение данных от автопилота

Для получение данных от автопилота используется класс Sensors

class Sensors
lpsPosition()
Результат:x, y, z
lpsVelocity()
Результат:vx, vy, vz
lpsYaw()
Результат:yaw
orientation()

Данные положения.

Результат:roll, pitch, azimuth
altitude()

Данные высоты по барометру.

Результат:высота в метрах
range()

Данные c датчиков расстояния.

Результат:Возвращает значения с датчика расстояния. Возвращает несколько значений.
accel()

Данные c акселерометра.

Результат:ax, ay, az
gyro()

Данные c гироскопа.

Результат:gx, gy, gz
rc()

Данные c пульта управления.

Результат:channel1, channel2, channel3, channel4, channel5, channel6, channel7, channel8

Примеры

local lpsPosition = Sensors.lpsPosition
local lpsVelocity = Sensors.lpsVelocity
local lpsYaw = Sensors.lpsYaw
local orientation = Sensors.orientation
local range = Sensors.range
local accel = Sensors.accel
local gyro = Sensors.gyro
local rc = Sensors.rc

lpsX, lpsY, lpsZ = lpsPosition()
lpsVelX, lpsVelY, lpsVelZ = lpsVelocity()
yaw = lpsYaw()

roll, pitch, azimuth = orientation()

range1, range2, _,_, range3 = range()

ax, ay, az = accel()
gx, gy, gz = gyro()
aileron, _, _, _, _, _, _, ch8, = rc()

Описание необходимых служебных функций скрипта

function callback(event) -- Вызывается, когда приходят события от автопилота.
end

Доступны следующие события, приходящие от автопилота:

Название Описание
ENGINES_STARTED Двигатели запущены
COPTER_LANDED Коптер совершил посадку
TAKEOFF_COMPLETE Коптер достиг высоты взлета
POINT_REACHED Коптер достиг точки
POINT_DECELERATION Коптер начал тормозить при подлёте к точке
LOW_VOLTAGE1 Низкое напряжение аккумулятора, для возвращения домой
LOW_VOLTAGE2 Низкое напряжение аккумулятора, переходит в режим посадки
SYNC_START Получен сигнал синхронного старта от системы навигации
SHOCK Столкновение или слишком сильные вибрации
CONTROL_FAIL Угол наклона коптера превысил допустимый
ENGINE_FAIL Отказ двигателя
  • событие Ev.ALTITUDE_REACHED ( коптер достиг высоты взлёта) начиная с версии АП 1.5.6173 более не используется.

Пример скрипта

local boardNumber = boardNumber
local unpack = table.unpack
local points = {
        {-0.6, 0.3, 0.2},
        {0.6, 0.3,  0.2},
        {0, 0, 0.5},
        {0.6, -0.3, 0.2}
}

local curr_point = 1

local function nextPoint()
    if(#points >= curr_point) then
        ap.goToLocalPoint(unpack(points[curr_point]))
        curr_point = curr_point + 1
    else
        ap.push(Ev.MCE_LANDING)
    end
end

function callback(event)
    if(event == Ev.TAKEOFF_COMPLETE) then
        nextPoint()
    end
    if(event == Ev.POINT_REACHED) then
        nextPoint()
    end
end


local leds = Ledbar.new(1)
local blink = 0
leds:set(0,1,1,1)
timerBlink = Timer.new(1, function ()
        if(blink == 1) then
            blink = 0
        else
            blink = 1
        end
        leds:set(0, blink, 0, 0)
end)
timerBlink:start()
ap.push(Ev.MCE_PREFLIGHT)
Timer.callLater(1, function() ap.push(Ev.MCE_TAKEOFF) end)

Описание пинов разъемов модулей

Пины МК АП на Pioneer_Base_v.1.0-v.1.1, выведенные на внешние разъемы:

Разъем X1 (пин МК) Функция Описание
1 Питание 5 В (только с АКБ) Максимум 2 А
2 Питание 3.3 В Максимум 2 А
3 (PA12) USART1_RTS  
4 (PA11) USART1_CTS, TIM1_CH4 Module_OpenMV
5 (PA10) USART1_RX, TIM1_CH3 Module_GPS, Module_USNav
6 (PA9) USART1_TX, TIM1_CH2 Module_GPS, Module_USNav
7 (PA15) SPI3_NSS, TIM2_CH1 Module_GPS, Module_OpenMV
8 (PC10) SPI3_SCK Module_GPS, Module_OpenMV
9 (PC11) SPI3_MISO Module_GPS, Module_OpenMV
10 (PB5) SPI3_MOSI, TIM3_CH2 Module_GPS, Module_OpenMV
11 Земля  
12 Земля  

Разъем X2 (пин МК) Функция Описание
1 Питание 5 В (только с АКБ) Максимум 2 А
2 Питание 3.3 В Максимум 2 А
3 (PC2) ADCx_IN12  
4 (PC3) ADCx_IN13  
5 (PA1) ADCx_IN1, TIM2_CH2, TIM5_CH2 Module_Cargo (упр. магнитом)
6 (PB7) I2C1_SDA, TIM4_CH2 Module_ToF, Module_OpenMV
7 (PB6) I2C1_SCL, TIM4_CH1 Module_ToF, Module_OpenMV
8 (PA0) DATA WS2812B Уровень 5 В. Module_LED
9 Земля  
10 Земля  

Для Pioneer_Base_v.1.2:

Разъем X2 (пин МК) Функция Описание
3 (PA0) USART4_TX, ADCx_IN0, TIM2_CH1, TIM5_CH1 Module_OpenMV
4 (PA1) USART4_RX, ADCx_IN1, TIM2_CH2, TIM5_CH2 Module_OpenMV
5 (PС3) ADCx_IN13, SPI2_MOSI Module_Cargo (упр. магнитом)
8 (PC12) DATA WS2812B Уровень 5 В. Module_LED