Создание собственной системы стабилизации
Если нужна будет консультация я помогу. Если уже есть какой-то протокол общения с контроллером
Пока я пойму: что такое “скриптовый движок” и “гимблы” уверен пройдет немало времени, а может и вечность…(когда эти термины появились, я уже давно закончил свое образование в институте 😃)…
Тут очень умные дядьки 😃). А никто в винде с COM портом не воевал? Сейчас событие “datareceived”
msdn.microsoft.com/…/system.io.ports.serialport.da…
винда дергает раз в 15 байт в буфере или ~7 миллисекунд, скорость(19200). А низзя винапи пнуть чтобы на каждый байт вызывала? Или в мультизадачной системе это анрыл и не выпендриваясь сделать на микро контроллере? Как на тойже ардуине мега с этим никто не проверял? Совсем нет время на изучение мат части 😦
ЗЫ задача максимально синхронизировать 4 COM порта… как можно точнее… Сори что не про коптеры…
Тут очень умные дядьки ). А никто в винде с COM портом не воевал? Сейчас событие “datareceived” msdn.microsoft.com/ru-ru/libr...vs.110).aspx винда дергает раз в 15 байт в буфере или ~7 миллисекунд, скорость(19200). А низзя винапи пнуть чтобы на каждый байт вызывала? Или в мультизадачной системе это анрыл и не выпендриваясь сделать на микро контроллере? Как на тойже ардуине мега с этим никто не проверял? Совсем нет время на изучение мат части ЗЫ задача максимально синхронизировать 4 COM порта… как можно точнее… Сори что не про коптеры…
Посмотрите в сторону размера буфера FIFO в настройках драйвера COM порта (кнопка “дополнительно”). Если драйвер FTDI, то там еще есть настройка времени Latency timer. instructables.com/…/Reducing-FTDI-Serial-Latency/
Суть Latecy timer - Это время, через которое вы получите событие о новых данных, не зависимо от того, заполнился буфер или нет.
Посмотрите в сторону размера буфера FIFO в настройках драйвера COM порта
Тут я не вьехал. В C# в SerialPort есть размер буфера чтения, но она его игнорирует. Ставлю скорость 115200 и буфер 1000, а по факту буфер вообще 4 килобайта и боюсь что винда просто не успевает(на каждый вызов события или в петле если синхронно читать). Спасибо, в дровах попробую. COM порт железный, там мамка т.н. встраиваемая у нее 8 железных COM 😃.
Да и попробую ftdi хрен с ними с железными, в них-то такой настройки я не видел…
Тут я не вьехал. В C# в SerialPort есть размер буфера чтения но она его игнорирует. Ставлю скорость 115200 и буфер 1000 а по факту буфер вообще 4 килобайта и боюсь что винда просто не успевает(на каждый вызов события или в петле если синхронно читать). Спасибо в дровах попробую. COM порт железный, там мамка т.н. встраиваемая у нее 8 железных COM .
c# для этого использовать наверное жестоко. Попробуйте реализовать на C или другом языке.
c# для этого использовать наверное жестоко. Попробуйте реализовать на C или другом языке.
Там проект весь на C# хотя ничто не мешает DLL ку сделать на С. Это хотел в первую очередь проверить, просто мне кажеться все же особенности винды а не .NET
Алексей а как на тех же “ардуинах”(плату разводить времяни тоже нет 😃) там можно каждый байт считать? не пробовали случайно? Если можно это правильнее чем С на винде…
И еще раз спасибо за отклик 😃
Алексей а как на тех же “ардуинах”(плату разводить времяни тоже нет ) там можно каждый байт считать? не пробовали случайно? Если можно это правильнее чем С на винде… И еще раз спасибо за отклик
Можете хоть каждый бит ловить )))
Можете хоть каждый бит ловить )))
Вот не сомневался что где-где а тут опытные умные дядьки помогут 😃)
я просто по базам и гуям, а тут пришлось 😃)
винда дергает раз в 15 байт в буфере или ~7 миллисекунд, скорость(19200). А низзя винапи пнуть чтобы на каждый байт вызывала? Или в мультизадачной системе это анрыл
Можно надо только самому реализовать чтение с ком порта со своим блэк джеком и шлюхами со своими событиям, в отдельных потоках. В котом будет крутиться ReadFile с нужным размером буфера. Получили данные послали события об этом главному потоку.
Открывать ком порт и читать из него:
::CreateFile(_T("\\\\.\\COM1"), GENERIC_READ | GENERIC_WRITE, NULL, 0, OPEN_EXISTING, NULL, NULL);
Открывать ком порт и читать из него:
угу, погуглю спасибо
влезу и я…
в винде (я про делфи) можно ловить хоть каждый байт, это проблем не создает - в том случае если ты ждеш, но тогда сама программа висит.
намного удобнее загонять все в буфер нужного размера, который потом просто парсить.
//Чтение данных из порта
function TMainForm.PortReadStr(DataSize:integer):string;
var BufStr:string;
begin
BufStr:='';
try
//Если есть соединение с портом читаем данные
if PortConnect_ then ComPort.ReadStr(BufStr,DataSize);
except
end;
PortReadStr:=BufStr;
end;
//Запись команды Command в порт, и чтение ответа по истечению TimeOut
//Запись команды и чтение будет производится до тех пор, пока не
//будет получен ответ, или количество циклов будет болше SendCount
//Результатом функции является ответ
Function TMainForm.WriteComand(Command:string;SendCount:Integer;TimeOut:Integer):string;
var i:byte;
AnswStr:string;
begin
WriteComand:='';
//Пишем данные
PortWriteStr(Command);
Delay(TimeOut);
//читаем
AnswStr:=PortReadStr(1024);
i:=1;
//если нет ответа и количество попыток не истекло
while (SendCount>i) and (length(AnswStr)=0) do
begin
//Пишем данные
PortWriteStr(Command);
Delay(TimeOut);
//читаем
AnswStr:=PortReadStr(1024);
inc(i);
end;
WriteComand:=AnswStr;
end;
в данном случае - отсылаем запрос и ждем определенное время на ответ и читаем буфер.
в винде (я про делфи) можно ловить хоть каждый байт, это проблем не создает
Я вот тоже так думал, но C# чета не хочет. ComPort это какой unit в Delphi? сколько лет ее юзал но не приходилось 😃)
А с 4 мя ком полюбому многопоточно надо общаца, либо оно само асинхронно на событиях, либо руками многопоточно(что коряво КМК)… Com можно открывать/закрывать тока из основоного потока, иначе оно ругаецца 😃
Мысли над регулятором:
как известно повсеместно используется ПИД (думаю распространяться не стоит?)
а не заменить ли его на регулятор с одним параметром?
U = K*(angle + vel*dt1) только dt1 - не время цикла, а время между считыванием скорости с датчика и подачей данных в регулятор… грубо обнуляем dt1 при чтении и смотрим в него в момент расчёта регулятора…
дело в том, что D и I в ПИДе не что иное как коррекция ошибки пропорции, так как за время между считыванием данных с датчика и поступления их в расчёт ошибка накапливается - тупо на старых данных регулятор строим, а тут его слегка предсказали…
Что даёт? Офигенный плюс к карме Дринкеру с крутилками, их всего 3 ))) ну и как следствие меньше настроек?
U = K*(angle + vel*dt1)
Это аналог PI. С настройкой(К) вынесенной за скобки. Без D будет расколбас при прочиъ равных и не раздельно P и I настраивать тоже не очень. Как то так КМК…
ЗЫ PID и то слишком примитвный, там не упрощать а усложнять надо, но с этой гребанной работой все лень/некогда 😦(
Не согласен - D мы как раз берём от скорости, а для чего, а именно для того, что P с течением времени (то что я обозначил dt1) рассчитывается неправильно, в идеале P мы получаем чуть меньше чем должно быть ибо угол уже уплыл и с каждой интерацией это всё больше и больше. И делаем мы что? - Увеличиваем P (коэффициентом) - переруливает, плохо 😦 о - берём D и им тормозим P - опять попандос, опять недоруливаем - давайте I введём - дабы дожимало - 3 параметра для шаманства вместо вычисления правильного показателя один раз?
тут как бэ слов мало тут делать и смотреть надо 😃
Это аналог PI. С настройкой(К) вынесенной за скобки. Без D будет расколбас
КУК прекрасно переносит )))
берём D и им тормозим P - опять попандос
С D мат модель чуть ближе к физической. То что D тормозит P(когда скорость и ускорение в разные стороны направлены) наоборот хорошо. Но все равно далеко от иделала. На разные возмущающие воздействия(по переданному импульсу) нужны разные PD. Ну и PID при слабых воздействиях толком не работает(в т.ч. по описанной выше причине) от этого коптер так на подушке ерзает и в ветер раскачиваться…
вот на такой хрени
реакция нужна как у кошки что бы в дверной проем пролететь по ФПВ 😃. Ветер от собственных винтов…
ЗЫ c Вашим dt я если честно идею не уловил…
КУК прекрасно переносит )))
Если сравнивать с автомобильными подвесками то это начало прошлого века. Обычный амортизатор трения. А если посмотреть на WRC… то небо и земля. Причем сейчас на дорогих версиях серийных машин амортизаторы(типа бнв эмок, мерсов ML и прочих ауди РС и ипрез врыкс) по скожей технологии сделаны. Однотрубные с газом высокого давления 😃) Они позволяют юолее правильную регрессивную характеристику выдерживать.
ЗЫ c Вашим dt я если честно идею не уловил…
идея дожать пропорцию до реальной (в момент расчёта регулятора)
идея дожать пропорцию до реальной (в момент расчёта регулятора)
Ааа, перечитал еще раз - дошло 😃 Это все блохи не имеющие ни какого принципиального значения P и i то эмпирические были. И сами эти коэф. зависят от соотношения момента инерции к моменту от моторов грубо помноженное на приемистость моторов. Т.е. определяющем являеться не как скорость мерить, а физические параметры коптера. И вообще чем больше настроек тем лучше 😃) не ? 😃)
ComPort это какой unit в Delphi?
угу, могу поделится если надо
только dt1 - не время цикла, а время между считыванием скорости с датчика и подачей данных в регулятор…
А разве это не одно и тоже ?? (по другому то как ?)
Офигенный плюс к карме Дринкеру с крутилками, их всего 3
Для самолета вообще можно обойтись одной “П” - составляющей… (проверено), вполне сносно летает, но как и следовало ожидать угол крена/тангажа выдерживается с ошибкой, поэтому я все же “усложнил 😃” и добавил таки “И” “Д”.
А для коптера такое “кастрирование” выйдет боком однозначно…
Придумать бы метод оценки коэфициентов ПИДа в зависимости от реакции аппарата на возмущение (!)… т.е. как нибуть замерять их оптимальность… тогда можно было бы просто сделать “автокоррекцию” и вообще забыть про крутилки, но пока че то не могу…
Подскажите по ws2812…у меня есть 1 метр,есть ардуина мини…прошивка на апм 3,1,5
Чего я хочу? на каждый из четырех лучей прилепить по 8 диодов ws2812 и моргать предупреждениями АПМа и +свои эффекты.