Автопилот на ардуино для катера

Самодельный автопилот на одноплатном компьютере (SBC) Tinker board и Arduino DUE

Идея постройки автопилота появилась примерно 2 года назад. Хотелось создать полностью автономный аппарат способный добраться из точки А в точку Б с возможностью ухода от столкновений и облёта преград, способного преодолевать зоны глушения или отсутствия спутникового сигнала. Также хотелось иметь удобное и простое управление с помощью мышки как это реализовано в играх (стратегии) управляя движением ЛА с помощью точек. Начинать всё пришлось с нуля, как и эту статью поэтому если есть ошибки напишите об этом в комментариях. Начну по порядку.

Аппаратное обеспечение

Изначально я не знал какое железо лучше использовать для этого проекта, но в итоге пришёл к выводу, что оптимальным вариантом будет связка микроконтроллер (МК) + одноплатный компьютер. Где МК решает задачу стабилизации летательного аппарата (ЛА), его движению по заданному курсу и высоте, а одноплатный компьютер решает задачу навигации и движения по маршруту. Поскольку в планах был уход от столкновений компьютер должен был быть достаточно мощным чтобы обрабатывать информацию от датчиков обнаружения препятствий, компактным и не слишком дорогим на том момент под это описание наиболее подходил TinkerBoard, Raspbery тогда это была 3B+ и сильно уступала по характеристикам. В качестве МК хотелось иметь arduino совместимый контроллер т.к. на arduino имелась огромная база готовых скетчей и поэтому выбор пал на DUE 84 МГц, 32bit ARM Cortex-M3 т.к. он был наиболее мощным и должен был компенсировать прямоту моих рук)).

В качестве датчиков ориентации изначально я планировал использовать MPU 9250 с фильтром Маджевика, результаты его работы были отличными. Главным преимуществом этого варианта было то, что все расчёты, включая калибровки датчиков (акселерометра, гироскопа и магнитометра), находились на МК. Но возникла проблема, фильтр плохо компенсировал линейное ускорение, которое постоянно возникает при толчках или резкой смене курса. Выражается это в показаниях тангажа и крена, в момент ускорения они начинают уплывать, а проходя через пропорционально дифференциальный (ПД) регулятор и особенно дифференциальную часть, уплывание создавало проблемы. Поэтому пришлось использовать датчик с уже реализованным фильтром BNO 055.

BNO в отличии MPU 9250 имеет на борту встроенный МК Cortex M0 который сразу рассчитывает ориентацию в углах Эйлера, кватернине абсолютной ориентации и рассчитывает линейное ускорение хотя этот датчик тоже имеет ряд недостатков. Основной проблемой данного датчика является автокалибровка а точнее то что её нельзя выключить это такая «фитча» этого датчика и есть у этой калибровки неприятное свойство пропадать, иногда абсолютно внезапно даже просто находясь на одном месте без движения. Отражается это в основном на рысканье которое в данном датчике привязано к магнитометру и должно показывать направление на магнитный северный полюс (курс) но иногда оно показывает на 100 градусов в строну, а потом ещё покалибровавшись может вернутся обратно))). В прочем проблему курса ещё можно решить с помощью синхронизации с GPS. В остальном датчик работает отлично, тангаж и крен он всегда определяет правильно, и линейные ускорения не сильно сказываются на его работе, если, конечно, ускорение не превышает 2G, т.к. этот порог используется для измерения вектора гравитации и компенсации дрейфа гироскопов.

Остальной набор железа выглядит следующим образом: GPS Ublox Neo M8N с USB выходом,
барометр BMP 280, сонар HSCR 04 для получении данных о наличии земли и более точной вертикальной скорости, EEPROM 24c16 для хранения данных калибровки и настроек ПИД, GSM модуль Neoway M509E для отправки сообщений о координатах ЛА на случай аварии.

Функциональная схема показана на рисунке 1:


Рисунок 1 — Функциональная схема Автопилота.

Программное обеспечение

Для разработки ПО я использую QT вместе с IDE QT Creator т.к. он наиболее мне знаком, а также благодаря кроссплатформенности я могу запускать свои программы как на одноплатном ПК с Debian так, и десктопе с Windows, что очень удобно. Для разработки ПО микроконтроллера используется Arduino IDE. Для наглядности постараюсь представить все разделы на рисунке 2.


Рисунок 2. — Архитектура АП (BNO 080 добавлен на будущее).

1) Графический интерфейс управления — представляет из-себя спутниковую карту с помощью которой осуществляется управление ЛА. Сама программа отображения спутниковых снимков не моя, она была украдена мной тут (её автор тоже пытался сделать что-то подобное).

Управлять ЛА можно с помощью точек (маркеров) либо кнопок WADS. Для управления по точкам, необходимо проложить маршрут полёта зелёными маркерами они ставятся мышью (ПКМ), и нажать загрузить маршрут, либо использовать (красный) маркер мгновенного перемещения (ЛКМ) и тогда ЛА с текущей позиции полетит к этой точке, для его работы необходимо установить галку в чекбокс «Ручное» от случайных нажатий.

Все параметры маркеров вводятся в соответствующие поля на форме, удалить маркеры можно двойным щелчком средней кнопки мыши, при этом они по-прежнему останутся в памяти ЛА, для удаления из памяти необходимо использовать кнопку удалить маршрут. По достижению точки, как и в стратегиях ЛА, будет вокруг неё вращаться. Управление кнопками WADS напрямую управляет рулями с помощью ПД регуляторов. При нажатии каждой кнопки на вход регулятора поступает значение, например, при нажатии S тангаж 30 а при отпускании 0. При нажатии W -30 и т.д. Включается WADS с помощью чекбоксов: «ручное», «кнопки». Данный режим помогает проверить работоспособность всех рулей пред стартом. Работает графический интерфейс на ноутбуке, команды управления от графического интерфейса с помощью TCP соккета предаются в ядро. Графический интерфейс управления представлен на рисунке 3:


Рисунок 3 — Графический интерфейс управления.

2) Ядро автопилота это та часть ПО которая вычисляется на одноплатном компьютере TinkerBoard. Ядро отвечает за навигацию и движение по маршруту. Для этого к компьютеру подключен датчик GPS. С его помощью можно получить текущее положение ЛА (широту и долготу) и сравнить это положение с тем, что имеется в маршруте полёта. В результате этой операции получается азимут на цель, который отправляется на микроконтроллер вместе с остальными параметрами полёта. В дальнейшем ядро можно оснастить своим IMU датчиком, чтобы реализовать ИНС. Например, можно использовать BNO 080 проинтегрировать, ускорение и получить скорость, а проинтегрировав скорость получить расстояние. Расстояние, полученное от ИНС, необходимо будет перевести в систему координат GPS (широту и долготу) для её использования в расчёте азимута.

Такую ИНС можно использовать в связке с GPS датчиком на случай временной потери связи со спутником, чтобы ЛА не пропустил «поворот» на точку. В момент работы от GPS ИНС будет постоянно корректироваться его показаниями и заполнять промежутки между периодами обновления GPS датчика. Таким же образом должен вносить поправки алгоритм машинного зрения или SLAM изменяя высоту точки и создавая смещения рассчитанного азимута. После окончания расчёта маршрута ядро отправляет по UART данные: азимут, высоту, угол атаки, тип точки, а также необходимо ли выполнять вращение вокруг этой точки.

3) Команды ядра выполняет микроконтроллер, основная задача МК следовать по заданному курсу на заданной высоте. Для этого на МК установлен IMU датчик BNO 055, барометр bmp 280 и сонар. Для движения по курсу используется азимут полученный от ядра он, сравнивается с текущим курсом и полученное рассогласование передаётся в ПД регуляторы управления рысканьем и креном. Управление тангажом осуществляется 2мя ПД регуляторами: 1-й определяет рассогласование текущей и заданной высоты, которое поступает на вход 2-го регулятора, при этом выход регулятора высоты ограничен текущим углом атаки, чтобы контролировать её набор. В случае, если в графическом интерфейсе тип точки выбран взлёт или посадка, для определения высоты используется сонар. Его показания комплексируются с данными барометра, чтобы наиболее точно определить расстояние до земли и вертикальную скорость. Помимо основных функций МК также собирает телеметрию о работе IMU датчиков, текущем направлении и высоте, передаёт их в ядро, где эти данные дополняются данными от GPS и поступают в графический интерфейс.

Заключение

На данный момент автопилот ещё находится на стадии полётных испытаний и полностью не настроен. Впрочем я провёл только два запуска и пока не подобрал коэффициенты для регуляторов.

Вообще ПД регуляторы мне кажутся не стабильными и хочется заменить их чем-то более надёжным, тем более они уже устарели. Также необходимо заменить расчёты с углами Эйлера на расчёты в кватернионах, т.к. последние более стабильно себя ведут при развороте ЛА на углы больше 120 градусов и полётах во время ветра.

Источник

Arduino.ru

автопилот для корабля

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Лампочками помигал, хело ворлд в сериал вписал. Теперь я гуру :)

Суть вопроса в том что я пока не понимаю сути вопроса и прошу помощи пока сугубо теоретической, от чего вообще плясать, что искать, где копать. Когда пойму что к чему вообще и возникнут конкретные вопросы, буду задавать в конкретных темах.

— уно(в корабль) + мега(пульт).

— пара приемопередатчиков на чипах NRF A24L01 2.4 гГц

— LCD keypad shield

— пара компасов (в пульт и в корабль) еще не пришли.

— джойстик аналоговый ХУ+кнопка, провода(папа-папа, мама-мама), прототипка(тоже еще в пути), сд-слот.

Базовая идея состоит для начала в замене штатного пульта на «свой», потом поключить ЖПС, дальномер и компасы для автоматического управления. Доп. задача — отловить сигнал от поплавка эхолота (433 мГц) для возможности указания ЖПСу контрольных точек в интересующих местах.

Предполагаю что математикой и обработкой данных будет заниматся пульт. Корабль только собирает данные, отсылает, принимает команды и упрасляет исполнительными механизмами. Если не прав, то поправьте.

В общем готов к критике и наводкам на:

— работа с ЖПСом, получение данных.

— NRF A24L01 как поднять, проверить.

— формат принимаемых данных, передаваемых команд (ориентируюсь на 10-20 обновлений в секунду, 2400 бит/сек для макс.расстояний)

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

как править пост не понял, потому дописываю.

Может кто в курсе какой сигнал выдает приемник штатного пульта радиоуправления? Боюсь пока его отключать совсем, да и контроллеры движков штатные заменять неохота :), думаю свое управление поставить паралельно, с возможностью отключения питания штатным пультом. Что из компонентов не хватает для такого включения? Может есть ссылки на подобные проэкты?

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Я бы не стал полагаться на не надежный радиоканал. и все расчеты сделал бы на месте. Вспомни про посаженный в Иране беспилотник.

На самом деле не понимаю, что за корабль ты делаешь. Вопрос размера. Гпс дает очень не точные данные для того, что бы вести мелкий корабль. Только разве что яхту или контейнеровоз. Тебе в любом случае нужен магнитный компас или гироскоп, по которому осуществляется точная наводка. На каком расстоянии ты собираешься им управлять . Как-то оно не вяжется. Гпс точность -10метров, дальномер HC-SR04 — макс расстояние 2 метра. Тем более на воде. Он же вообще работать не будет, от волн звук тоже отражаться будет.

Автопилот? Или дистанционное управление? Это две взаимоисключающие вещи. В случае автопилота команда с пульта звучит: Курс 120, скорость 12. Пожалуйста пришли актуальный курс, сигнал «курс достигнут»./ Паника, потерял курс, не знаю что делать.

В случае дист. управления: руль +0.5, скорость 12, через секунду повтор. Скажи свой курс, положение руля и тп.

Наверное лучше предусмотреть оба варианта? Что бы переключать можно было.

И посмотри книжку по навигации: течения, снос ветром, ошибка магнитного компаса, курс и скорость по компасу «относительно воды», курс и скорость через ГПС (относильно землей). Ой там математики, вернее сказать Исправления ошибок приборов. Почитай как профи делают автопилот. Там не так все просто. Это я к тому, что человеку то с рулением не всегда можно справится.

И почитай про фильтр кальмана. Это очень важно, иначе ты просто повесишься. Качнуло лодочку, магнитный компас сбился чуть-чуть — все сьехало. А с фильтром будешь плыть дальше.

  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
  • Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии

Суть идеи катамаран 70*50 весом 7-12 кг завозит снасть и прикорм в заданую точку(одну из точек), сбрасывает груз и возвращается. Т.к. расстояние 300-400м и скорость 4-6 км/ч, то рулить 10-15 мин. туда-назад напрягает. Штатный пульт не всегда удобен в использовании, да и быстро садит свои батареи, если его гасить на некритичных маневрах, то хватит на дольше.

Я бы не стал полагаться на не надежный радиоканал. и все расчеты сделал бы на месте. Вспомни про посаженный в Иране беспилотник.

Этого я боюсь меньше всего :) Больше смущает постоянная прием-передача садящая батарею. Но я пока не представляю логики изменения управления на ручное. Получается всю автопилотную логику пихать в корабль, а на пульт только иногда сливать инфу что он делает + ожидать прерывания при переключении на ручное управление? Тогда уже и врубать паралельную логику откликов на управляющие команды.

Автопилот? Или дистанционное управление? Это две взаимоисключающие вещи. В случае автопилота команда с пульта звучит: Курс 120, скорость 12. Пожалуйста пришли актуальный курс, сигнал «курс достигнут»./ Паника, потерял курс, не знаю что делать.

В случае дист. управления: руль +0.5, скорость 12, через секунду повтор. Скажи свой курс, положение руля и тп.

Наверное лучше предусмотреть оба варианта? Что бы переключать можно было.

я вообще, в идеале, планировал 5 вариантов: 1. штатный пульт. 2. мой пульт(ручное). 3. мой пульт (авто). 4-5. Автовозврат на логике корабля при потере сигнала от пульта на 3-5 мин. (4 — при заданом «0» на жпс, 5 — без него по компасу), оба до появления сигнала от пульта. Приоритеты соотв. 1-2-3-4-5. Ручной пульт гасит мой одним из каналов механически переключая сервой управление каналами движка. 2-3 переключаются на моем пульте. 4-5 исходя из ситуации. Дальномер — прерывание для 2-3 во избежание: я рассчитываю курс, пока не получу данные GPS — разбейтесь об айсберг вдребезги, меня это мало волнует.

Некоторая перекличка есть с этой темой:

если вы имеете в виду готовые ардупилоты и т.д., то это несколько оверкил для данных задач. Да и, по хорошему, мне более интерен процесс, чем результат.

Пока потратив хдето 4-5 часов на чтение http://arduino.ru/forum/programmirovanie/nrf24l01 и походы по граблям удалось прилепить нрфл-ки к уне(10,11,12 ноги) и 2560(на SPI разьем) и заставить работать пинг из мирф библиотеки. Почему-то никто не сказал что клиента надо после открытия окна монитора ресетнуть :) иначе все было бы значительно проще. Шась лежат мигают весело лампочками. Пинг 11-12 :)

Теперь буду пробывать подключать к меге LCD шилд, для вывода этих пингов на экран.

Перекинул все на пины 48,49,50-52 т.к. шилд не одевался. Благо уже понял что раньше мешало их туда прилепить. Воткнул шилду, пробую понять как на экран вывести что-нибудь полезное.

Источник