Модуль навигации GPS Глонасс

../_images/gps_module.png

Модуль позволяет квадрокоптеру отслеживать свое текущее положение и скорость. Для большей точности позиционирования антенне модуля необходим обзор неба, не используйте режим GPS в помещении.

Модуль GPS/Глонасс устанавливается непосредственно на главную плату квадрокоптера сверху и крепится к ней винтами М3. При подключении дополнительных модулей на нижнюю плату расширения их шлейфы стыкуются с разъемами на верхней части модуля GPS, таким образом подключаясь к основной плате «сквозь» модуль GPS.

Модуль также оснащен компасом для точной ориентации в пространстве. Показания компаса могут искажаться вблизи массивных металлических объектов и зданий.

При подключении к Pioneer Station (Загрузка программы в «Пионер») убедитесь, что в «параметрах автопилота» выбран режим позиционирования по GPS, в противном случае активируйте его нажатем на кнопку. В стандартном режиме подключения работу компаса можно наблюдать на панели авиагоризонта.

Примечание

При первом подключении рекомендуется убедиться в правильной работе компаса. Сориентируйте Пионер по оси «север-юг» и убедитесь, что показания в Pioneer Station соответствуют сторонам света при повороте квадрокоптера на 90 градусов. Если погрешность превышает 10 градусов, выберите «калибровка - компаса» в меню Pioneer Station и следуйте указаниям помощника.

Также в реальном времени отображается количество спутников, доступных для работы. Чем больше спутников «видит» модуль, тем выше точность позиционирования. При холодном старте (первом включении модуля в новой точке) синхронизация занимает от одной до трех минут. При успешной синхронизации зеленый светодиод на модуле горит постоянно. Теперь, если выключить питание «Пионера» и через некоторое время снова включить в той же точке, синхронизация произойдет значительно быстрее.

LED индикация состояние что делать
горят красный и зеленый неверные параметры переключить параметры на GPS
горит красный поиск спутников ждать 1-3 минуты, перезагрузить
горит зеленый спутники найдены можно лететь

Управляя квадрокоптером с пульта, выберите режим работы с системой навигации (тумблер SwB в среднем положении), и «Пионер» будет использовать подключенный модуль GPS, что сделает полет более стабильным.

При программировании полёта используется команда ap.goToLocalPoint(x, y, z). При этом ось x направлена на восток, ось y - на север. Значение z определяет высоту относительно точки старта. Все значения указываются в метрах.

../_images/gpsaxes.png

Также можно использовать команду ap.goToPoint(x, y, z). Здесь x, y это географические координаты (широта, долгота) точки, в которую полетит Пионер. Z - высота в этой точке относительно точки старта.

Примечание

Если указанная точка старта будет дальше, чем в 500 метрах от фактического местоположения, квадрокоптер откажется взлетать. Также, параметры Flight_com_flyAreaSize и Flight_com_maxAltitude ограничивают расстояние и высоту, на которую коптер может улететь от точки старта. Подробнее - в описании параметров в Pioneer Station.

Пример

Ниже приведен пример программы, использующий модуль GPS. Загрузите программу на Пионер, найдите подходящую площадку и подключите аккумулятор. Когда светодиод на модуле перестанет мигать, переключите SwB в нижнее положение и запустите выполнение программы, нажав кнопку «Старт» на базовой плате квадрокоптера. Через 5 секунд Пионер взлетит, пролетит на 10 метров на восток и вернется на точку старта.

Пионер определяет свое местоположение в момент запуска моторов. Эта точка принимается за начало координат при выполнении команды ap.goToLocalPoint.

Неточность позиционирования с GPS и ошибка определения высоты могут достигать 3 метров. Учитывайте это при составлении своих полетных программ.

-- Упрощение вызова функции распаковки таблиц из модуля table
local unpack = table.unpack

-- Количество светодиодов на базовой плате
local ledNumber = 4
-- Создание порта управления светодиодами
local leds = Ledbar.new(ledNumber)

-- Функция смены цвета светодиодов
local function changeColor(color)
    -- Поочередное изменение цвета каждого из 4-х светодиодов
    for i=0, ledNumber - 1, 1 do
        leds:set(i, unpack(color))
    end
end

-- Таблица цветов в формате RGB для передачи в функцию changeColor
local colors = {
        {1, 0, 0}, -- красный
        {0, 1, 0}, -- зеленый
        {0, 0, 1}, -- синий
        {1, 1, 0}, -- желтый
        {1, 0, 1}, -- фиолетовый
        {0, 1, 1}, -- бирюзовый
        {1, 1, 1}, -- белый
        {0, 0, 0}  -- черный/отключение светодиодов
}

-- Таблица точек полетного задания в формате {x,y,z}
local points = {
        {0, 0, 0.7},
        {0, 1, 0.7},
        {0.5, 1, 0.7},
        {0.5, 0, 0.7}
}
-- Счетчик точек
local curr_point = 1

-- Функция, изменяющая цвет светодиодов и выполняющая полет к   следующей точке
local function nextPoint()
    -- Текущий цвет. % - остаток от деления, # - размер таблицы. Такая  конструкция использована,
    -- чтобы цвета продолжали меняться, даже если точек больше, чем     цветов в таблице
    curr_color = ((curr_point - 1) % (#colors - 2)) + 1
    -- Изменение цвета светодиодов
    changeColor(colors[curr_color])
    -- Полет к текущей точке, если её номер не больше количества        заданных точек
    if(curr_point <= #points) then
        Timer.callLater(1, function()
            -- Команда полета к точке в системе позиционирования
            ap.goToLocalPoint(unpack(points[curr_point]))
            -- Инкрементация переменной текущей точки
            curr_point = curr_point + 1
        end)
    -- Посадка, если номер текущей точки больше количества заданных     точек
    else
        Timer.callLater(1, function()
            -- Команда на посадку
            ap.push(Ev.MCE_LANDING)
        end)
    end
end

-- Функция обработки событий, автоматически вызывается автопилотом
function callback(event)
    -- Когда коптер поднялся на высоту взлета Flight_com_takeoffAlt,    переходим к полету по точкам
    if(event == Ev.TAKEOFF_COMPLETE) then
        nextPoint()
    end
    -- Когда коптер достиг текущей точки, переходим к следующей
    if(event == Ev.POINT_REACHED) then
        nextPoint()
    end
    -- Когда коптер приземлился, выключаем светодиоды
    if (event == Ev.COPTER_LANDED) then
        changeColor(colors[8])
    end
end



-- Предстартовая подготовка
ap.push(Ev.MCE_PREFLIGHT)
-- Зажигание светодиодов белым цветом
changeColor(colors[7])
-- Таймер, через 2 секунды вызывающий функцию взлета
Timer.callLater(2, function() ap.push(Ev.MCE_TAKEOFF) end)