Авторулевой своими руками
#278
Отправлено 04 июля 2018 - 02:09
Можно подключить режим компенсации ухода с курса,Cross Track error из RMB (попробую в следующей раз).
я полагал, что Ози уже учитывает величину XTE в своем геодезическом алгоритме (у меня на экране XTE в километрах и знак отклонения) и стремится уменьшить по возможности XTE до нуля, задавая определённым образом курс регулятору автопилота.
#280
Отправлено 07 июля 2018 - 11:34
Решил коротко обсудить упрощенную модель АП-катер, которая позволяет прикинуть коэффициенты ПИД-регулятора и протекание переходных процессов по управляющему и возмущающему воздействию.
При полном повороте штурвала от нулевого положения (те на 25 уе длины штуртроса) на 25 град. за 1 сек.
Пусть момент поворота линейно зависит от поворота штурвала (длины штуртроса – х ),
М=Кх ,
где К – коэффициент пропорциональности. Тогда угол поворота катера ф можно получить из выражения
ф=(К/Н)*х/р*р ,
где 1/р – оператор итегрирования по времени. Пусть известно (из практики), что при полном отклонении штурвала 25 уе катер за время t=1 сек. Катер поворачивает на 25 град., тогда,
25=(К/Н)*25*t*t=(К/Н)*25*1,
или,
(К/Н)=25/25=1 .
С точки зрения САУ имеем звено с передаточной функцией (изменение длины штуртроса в угол поворота катера)
W=0.4/p*p
Тк электропривод позиционируется, как показало ручное управление, практически мгновенно. Представим его апериодическим звеном с постоянной времени равной обороту петли в работе микроконтроллера
W=1/(0.2p+1)
Получается ПИД-регулятор, апериодическое звено и два звена интегрирующих.
#281
Отправлено 07 июля 2018 - 15:41
Я же писал, что у меня получилось угадать коэффициенты, а это непросто - система склонна к автоколебаниям (как оказалась при моделировании).Поэтому я решил пока не заниматься синтезом регулятора, а поиграться с имеющимся. Оказалось, что только Кд следует существенно увеличить от 1 до 4 - уменьшится время переходного процесса, Кп=2, Ки=0.8 трогать не стоит - начинаются автоколебания. После возни с коэффициентами интересно посмотреть задающие и возмущающие воздействия, как малые, так и большие (с насыщением контура регулирования).
#282
Отправлено 07 июля 2018 - 16:05
Все оказалось замечательно, ведь контур имеет астатизм 1го порядка по задающему и 2ого по возмущающему воздействию. Будут интересны кривые - я их приведу. Для примера - на 1 сек задание 20 град в отсутствии Возмущающего Воздействия и при наличии случайного ВВ с постоянной составляющей -10 уе штуртроса. (в уе перемещения штуртроса),
#286
Отправлено 08 июля 2018 - 07:42
Конечно зависят - будет меняться К, как функция от квадрата скорости, но, мне, естественно, важна именно крейсерская, тк АП может понадобиться только на ней. Но, не трудно прикинуть переходные процессы и по краям диапазона, если это для 12.3 км/час, то для 10 и 14, я думаю мало будет отличаться. Мало того, К еще зависит нелинейно от длины штуртроса, тк там присутствует sin угла поворота руля (в моем случае +_20 град) и куча еще. Однако, важный итог исследований - я "почувствовал" коэффициенты. И модель адекватная. Можно еще поиграться.
#287
Отправлено 08 июля 2018 - 08:20
Глянул и синус, и разные скорости - практически мало отличается переходные процессы от, но, естественно при малых скоростях ( при 10 км/час, К=0.66 вместо 1) допустимая амплитуда отрабатываемых ВВ упала. И колебательность больше.
Кстати, модель то непрерывная, а надо бы дискретную.
#289
Отправлено 26 июля 2018 - 02:03
Потихоньку переползаю на STM32 (Nucleo).
Написал парсер компорта под GPS на голом Си (как сумел, я не настоящий сварщик). Фишка, в том , что мой парсер не заглатывает целиком строку после чего происходит анализ, а парсит её на подстроки (разделитель - запятая) прямо в процессе приема байт из порта. Не совсем понимаю почему, но матерые программисты железа любят такой способ. Можно парсер допилить, и он не будет ждать символа окончания строки, а приняв последнюю нужную подстроку, завершит свою работу. Этим повышается помехоустойчивость, т.к. из GPS иногда лезут строки с диковатым содержанием.
https://os.mbed.com/...119d3/main.cpp/
в терминале выдаст, например, для строки $GPGSV -
#290
Отправлено 26 июля 2018 - 12:17
что то сайт тормозит вставлю код напрямую (он хоть и работает, но вдруг в нем есть очевидная лажа ?)-
/* Parse of string for COM-port. As examle - COM from GPS. Program for step to step read bytes from port (file) and separating stream of bytes on substrings in real time. Separator is a comma. Разбор строки для COM-порта. В качестве примера - COM из GPS. Программа для пошагового чтения байтов из порта (файла) и разделения потока байтов на подстроки в реальном времени. Разделитель - запятая. */ #include "mbed.h" #include "stdio.h" #define maxnstr 20 // maximum nbr of params(sybstrings) used to hold the data fields #define maxnsym 20 // maximum nbr of symbols char arg$[maxnstr][maxnsym]={""}; // int nstr=0; //номер подстроки (number of substring) int nsym=0; //и номер символа строки в двумерном массиве строк arg$[][] char x$; //байтовый символ полученный из порта (или файла) Serial pc(USBTX, USBRX); // tx, rx for F411RE out port diagnostica Serial gps(PA_9, PA_10); // tx, rx for F411RE in port nmea //Serial pc(PA_9,PA_10); // tx, rx for F091RC out port diagnostica //Serial gps(PC_10,PC_11); // tx, rx for F091RC in port nmea int GetGPSData() { do{ do{x$ = gps.getc(); } while(x$!='$'); //ждем $ -символ начала строки (first symbol of new string) for ( nstr = 0; nstr< maxnstr; nstr++) {nsym=0; //обнуление индекса символа, подготовка для создания новой строки do{ x$ = gps.getc(); if (x$ == ','){arg$[nstr][nsym] ='\0';break;} //вставка окончания строки и выход из цикла if (x$ == '\n'){return 0;} //символ окончания сообщения - команда на выход (symbol of end string) arg$[nstr][nsym] = x$ ; //побайтовое создание новой строки в массиве строк nsym=nsym+1; } while(1); } } while(1); } int main() { pc.baud(115200); gps.baud(9600); pc.printf("***********************Device Starting**************\r\n"); while(1) //main cycle { GetGPSData(); //ловим очередную строку сообщения и разбиваем на подстроки for (int i=0; i<nstr; i++) {pc.printf("arg$[%d]=%s\r\n",i, arg$[i]);} //поcтрочный вывод из массива } }
Сообщение отредактировал Aleksk: 26 июля 2018 - 12:20
#291
Отправлено 15 августа 2018 - 01:20
Приехала сегодня новая плата, завтра продолжу свои эксперименты.
А откуда вы брали алгоритмы, как должен работать автопилот? К примеру, отклонился я на один градус от курса, на чколько двигать руль? Увелиивать ли движение руля, если на курс, скажем, за секунду не встал? Как выходить на трек, если включил автопилот далеко от трека (raymarin, к примеру, просто рулит на ближайшую маршрутную точку, ну и т.д.)? Ну и да, в отличие от Михаила, мне желательно точное следование треку, ибо бОльшая часть движения у меня по каналам.
#292
Отправлено 15 августа 2018 - 02:15
1. Алгоритмы мне интереснее самому придумывать, чем разбираться в чужих .
2. Посмотрите как работает ПИД-регулятор, ну или хотя бы простой пропорциональный регулятор (на нем уже можно ездить). Игра идёт на максимально-возможное уменьшение ошибки.(ошибки тоже могут быть разные, например ошибка отклонения от курса (градусы) и ошибка отклонения от геодезической дуги заданного трека (метры) )
3. Мой автопилот возвращается обратно на трек двигаясь перпендикулярно (в первом приближении) к нему.
4. Точное перемещение по треку невозможно. Всегда будут отклонения или медленные колебания, но их можно уменьшить до нескольких метров (или меньше когда волны и ветра нет), настроив коэффициенты ПИД-регулятора (но и этого на самом деле мало, например при развороте на очередной точке на 150...180 градусов, желательно в нужный момент отключить а потом включить интегратор, предварительно его обнулив, иначе будет большая по диаметру петля разворота и потом затухающие колебания при выходе на трек).
5. Не знаю как делается правильно в промышленных автопилотах, но у меня при следовании по треку алгоритм ослика и морковки. Морковка от ослика всегда на расстоянии 60 метров. Т.е. в главном цикле каждый 1 раз в секунду вычисляется по формулам Боуринга точка трека на расстоянии 60 метров впереди лодки и азимут на неё. Одновременно для компенсации сноса от бокового ветра (течения) вычисляется кросс трак еррор XTE расстояние отклонения от трека в метрах (со знаком). XTE умножается на коэффициент 0.005 (подобран под мои условия) и входит в интегральную составляющую регулятора.
6. Если будете использовать OpenCPN или Ozi , которые сами всю геодезию для трека считают и выдают азимут, то пункты 3, 4 ,5 не актуальны. Но вы будете связаны возможностями и багами этих программ.
Сообщение отредактировал Aleksk: 15 августа 2018 - 02:29
#293
Отправлено 16 августа 2018 - 12:26
Обычно ДУ делаю на шнуре и кнопках стеклоподъемника,тут добавил китайский радио пульт.А у него задержка на выключение.
Может возможно что то подрегулировать в приемнике,чтобы все происходило мгновенно,как с кнопками на шнуре?
#295
Отправлено 16 августа 2018 - 12:50
Типа такого https://ru.aliexpres...9999.324.78xVwhчто за пульт? Полное название.
Только второй маленький брелок.
Вот для ясности по запаздыванию https://youtu.be/O4DiTVU_hJg
#296
Отправлено 16 августа 2018 - 13:11
1. Алгоритмы мне интереснее самому придумывать, чем разбираться в чужих .
2. Посмотрите как работает ПИД-регулятор, ну или хотя бы простой пропорциональный регулятор (на нем уже можно ездить). Игра идёт на максимально-возможное уменьшение ошибки.(ошибки тоже могут быть разные, например ошибка отклонения от курса (градусы) и ошибка отклонения от геодезической дуги заданного трека (метры) )
3. Мой автопилот возвращается обратно на трек двигаясь перпендикулярно (в первом приближении) к нему.
4. Точное перемещение по треку невозможно. Всегда будут отклонения или медленные колебания, но их можно уменьшить до нескольких метров (или меньше когда волны и ветра нет), настроив коэффициенты ПИД-регулятора (но и этого на самом деле мало, например при развороте на очередной точке на 150...180 градусов, желательно в нужный момент отключить а потом включить интегратор, предварительно его обнулив, иначе будет большая по диаметру петля разворота и потом затухающие колебания при выходе на трек).
5. Не знаю как делается правильно в промышленных автопилотах, но у меня при следовании по треку алгоритм ослика и морковки. Морковка от ослика всегда на расстоянии 60 метров. Т.е. в главном цикле каждый 1 раз в секунду вычисляется по формулам Боуринга точка трека на расстоянии 60 метров впереди лодки и азимут на неё. Одновременно для компенсации сноса от бокового ветра (течения) вычисляется кросс трак еррор XTE расстояние отклонения от трека в метрах (со знаком). XTE умножается на коэффициент 0.005 (подобран под мои условия) и входит в интегральную составляющую регулятора.
6. Если будете использовать OpenCPN или Ozi , которые сами всю геодезию для трека считают и выдают азимут, то пункты 3, 4 ,5 не актуальны. Но вы будете связаны возможностями и багами этих программ.
Может быть стоит в целевую функцию "морковки" добавить еще параметр оптимизации жужжания сервомоторчиком? Подобрать весовой коэффициентик. Ну чтоб и по курсу идти с приемлемой точностью и за пол часа батарею не высосать.
Имея данные прокладки, можно весовой коэффициент как-то посчитать. Например, от предстоящей длинны маршрута. Ну чтоб батареи хватило на переход от пункта А до пункта Б.
Еще одна "мысль". Ну это нужен датчик крена. Вот, например, идем в штилевом режиме (волны нет) и тут мимо проносится моторный и волочит за собой злющую волну. Раймарин у меня в этом случае с ума сходит - начинает дико вертеть румпель туда-сюда. Если я рулю сам, есть два варианта, либо я тоже так-же верчу румпелем не сопротивляясь потребностям рулевого пера, а могу его просто удерживать не давая ворочаться туда-сюда. Жесткое удержание руля, конечно, затормозит ход, но в условиях интенсивного неожиданного волнообразования позволит сэкономить ампер-часы.
Ну это так. Мысли вслух.
#297
Отправлено 16 августа 2018 - 13:57
3. Я думал над этим. Но я использую Гармин, он на экране рисует плавный выход на трек, вот что-то подобное мечтается изобразить.
5. Читал я тут диссертации по автопилотам для барж -- но там гироскоп, итупая механическая схема -- чем сильнее отклонение от курса, там сильнее отклоняется руль. Правда там не было возвращения на трек. Если использовать алгоритм ослика и морковки, то мне, в моих условиях, придется морковку привязывать метрах в 3-х, 60 метров может быть уже за поворотом.
6. Как я уже писал, использую Гармин. Он дает и направление с расстоянием до следующей точки поворота, и отклонение от трека. Надо б понять, как это все обработать.
Вообще, мне видится 2 использование автопилота -- первое -- просто попросить лодку идти прямо, дабы, к примеру, собрать или навесить кранцы. Не привязываясь к картографии, ну и второе -- по треку. Типа нажал кнопку, и лодка привезла меня из пункта а в пункт б. Мне только следить за встречными судами. Пока хочу реализовать хотя бы первый пункт.
#298
Отправлено 16 августа 2018 - 14:11
Типа такого https://ru.aliexpres...9999.324.78xVwh
Только второй маленький брелок.
Вот для ясности по запаздыванию https://youtu.be/O4DiTVU_hJg
короткое нажатие на кнопку фактически приводит к длительному воздействию. Импульс удлиняется во времени. Если эта добавка по времени постоянна, независимо от длительности нажатия, то в принципе её можно вычесть вот такой схемой на выходе приемника. Лишнее время вырезается постоянной времени RC цепи (t=R*C (секунд)). Конечно надо решить проблему согласований уровней напряжения на входе и умощнить выход.
Сообщение отредактировал Aleksk: 16 августа 2018 - 14:14
#299
Отправлено 16 августа 2018 - 15:07
3. Я думал над этим. Но я использую Гармин, он на экране рисует плавный выход на трек, вот что-то подобное мечтается изобразить.
5. Читал я тут диссертации по автопилотам для барж -- но там гироскоп, итупая механическая схема -- чем сильнее отклонение от курса, там сильнее отклоняется руль. Правда там не было возвращения на трек. Если использовать алгоритм ослика и морковки, то мне, в моих условиях, придется морковку привязывать метрах в 3-х, 60 метров может быть уже за поворотом.
6. Как я уже писал, использую Гармин. Он дает и направление с расстоянием до следующей точки поворота, и отклонение от трека. Надо б понять, как это все обработать.
Вообще, мне видится 2 использование автопилота -- первое -- просто попросить лодку идти прямо, дабы, к примеру, собрать или навесить кранцы. Не привязываясь к картографии, ну и второе -- по треку. Типа нажал кнопку, и лодка привезла меня из пункта а в пункт б. Мне только следить за встречными судами. Пока хочу реализовать хотя бы первый пункт.
3. А зачем думать, если чартплоттер Гармин сам выдает азимут сервоприводу при движении по треку ? Это ведь не азимут на одну из точек трека (маршрута), а постоянно изменяющаяся величина для поддержания лодки на треке.
5. В простом случае это и для электроники справедливо. Первый макет пилота я так и сделал - азимут из магнитного компаса (а можно и из GPS из GPRMC строки извлекать) по линейной формуле преобразовывал в длительность импульса для сервомашинки. Работало на ура , т..е. можно было идти по прямой с некоторым отклонением от заданного курса (пока не добавил ошибку разницы заданного курса и реального в программный интегратор, тогда разница практически исчезла).
Расстояние зависит от реализации. У меня очень большая редукция поэтому время перемещения румпеля большое. При более шустром приводе расстояние будет существенно меньше без риска возникновения автоколебаний.
6. Я предполагал, что Гармин работает в режиме непосредственного управления сервоприводом, как в пункте три (выше). Но если он тупо выдает азимут на введенную лодочником точку маршрута, и отдельно XTE -отклонение от курса, этого в принципе достаточно для обработки. Образуется функциональный блок, на входе которого азимут и XTE, а на выходе может быть что угодно, начиная от копеечной сервомашинки из наборов для Ардуино поделок и заканчивая шаговыми двигателелями , промышленными сервами или колхозными контакторами.
XTE имеет знак, он крайне важен для управления, т.к. показывает с какой стороны от трека мы находимся. В простом случае к азимуту прибавляем интеграл ошибки отклонения от курса (Ki-коэффициент интегрирования, например 0.005. Азимут в градусах).
ERRAZ1=Ki*XTE //-интегрирование ошибки отклонения ERRAZ2=ERRAZ2+ERRAZ1 //-------------------------------- If ERRAZ2>40 Then ERRAZ2=40 //- ограничение насыщения интегратора сверху If ERRAZ2<-40 Then ERRAZ2=-40 // - и снизу AZ=AZ+ERRAZ2 //-новое значение азимута с учетом ошибки If AZ>=225 Then AZ=225 //- ограничение поворота сервомашинки сверху If AZ<=135 Then AZ=135 //- и снизу AZF=180*(1+Cos(1.7453E-2*(270+2*AZ))) //- косинус нужен для плавного скругления функции по краям у 225 и 135 градусов Tservo=0.7+4.7222E-3*AZF //- длительность ШИМ импульса в мс (функция преобразования азимута в длительность импульса) PWM 50, 5*Tservo //- функция включающая 50 Гц ШИМ
Нюанс в том, что при курсе 0 градусов азимут будет скакать от 0 до 360. Этого можно избежать применением условных операторов , но у меня сделано по другому - нормальное положение , когда ошибка равно нулю, это 180 градусов, поэтому скачков нет.
Еще можно добавить дифференциальную составляющую ошибки и получить полноценный ПИД-регулятор.
-----------------------------------------
Я тоже сделал два режима - первый чисто по компасу, второй по GPS треку.
Сообщение отредактировал Aleksk: 16 августа 2018 - 15:44
#300
Отправлено 16 августа 2018 - 16:39
Там без разницы время удержания кнопки,там задержка идет после отпускания(не сразу размыкается)короткое нажатие на кнопку фактически приводит к длительному воздействию. Импульс удлиняется во времени. Если эта добавка по времени постоянна, независимо от длительности нажатия, то в принципе её можно вычесть вот такой схемой на выходе приемника. Лишнее время вырезается постоянной времени RC цепи (t=R*C (секунд)). Конечно надо решить проблему согласований уровней напряжения на входе и умощнить выход.
Спрашивал у форумчан,один откликнулся-говорит нет у него задержки.Приемник такой же.
Смотрел без подключения к реле-задержка прослушивается(щелкает в приемнике)
Формулы мне ничего не говорят-я далек от этого.
Спасибо.
Ответить
Количество пользователей, читающих эту тему: 0
0 пользователей, 0 гостей, 0 скрытых пользователей