Создание собственной системы стабилизации

WETErok

Еще один проект “следящего” коптера.

youtu.be/G8aXIaVwynE

Из видео не понял видит ли он препятствия на своем пути.

SergDoc
WETErok:

Еще один проект

Pixhawk разобрали 😃 0.54

oleg70
SergDoc:

да-да… википедия чёт не вставляет…

тогда нужно чуть больше конкретики в вопросе… - применительно к чему именно: передатчики,приемники,антенны… все имеет значение…

Razek
oleg70:

Тут уже выбор будет, или дома настроил и поехал без компа, или с компом, но опять же без “ГУИ” можно обойтись…

По сути выбора то и нет, про запас кучу файликов не наконфигуришь с собой в поле.

Гуи под винды писать не долго когда инструменты MSVC да MSDN.

oleg70
Razek:

Гуи под винды писать не долго

“всё- ПРОСТО если знаешь- КАК” (китайская мудрость) 😃.

mataor

могу недоделанную но рабочую гуи для мультивия на делфи дать

Razek
oleg70:

китайская мудрость

Если нужна будет консультация я помогу. Если уже есть какой-то протокол общения с контроллером для которого нужно сделать простую обертку (прочитать/записать настойки, графики от датчиков показать ), без экзотически графических контролов, то там делов на неделю со всей отладкой.

Кто-нибудь ковырял сурцы мисион планера? Как в него можно заинтегрировать другой скриптовый движок? Накалякал я тут скриптовый движок для алексмосовских плат, который позволяет скриптово рулить гимблами. Но как отдельное приложение sites.google.com/site/rmotiongmb/ как-то не айс хочется большей автоматизации.

oleg70
Razek:

Если нужна будет консультация я помогу. Если уже есть какой-то протокол общения с контроллером

Пока я пойму: что такое “скриптовый движок” и “гимблы” уверен пройдет немало времени, а может и вечность…(когда эти термины появились, я уже давно закончил свое образование в институте 😃)…

16 days later
VitaliyRU

Тут очень умные дядьки 😃). А никто в винде с COM портом не воевал? Сейчас событие “datareceived”
msdn.microsoft.com/…/system.io.ports.serialport.da…
винда дергает раз в 15 байт в буфере или ~7 миллисекунд, скорость(19200). А низзя винапи пнуть чтобы на каждый байт вызывала? Или в мультизадачной системе это анрыл и не выпендриваясь сделать на микро контроллере? Как на тойже ардуине мега с этим никто не проверял? Совсем нет время на изучение мат части 😦
ЗЫ задача максимально синхронизировать 4 COM порта… как можно точнее… Сори что не про коптеры…

Sir_Alex
VitaliyRU:

Тут очень умные дядьки ). А никто в винде с 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 - Это время, через которое вы получите событие о новых данных, не зависимо от того, заполнился буфер или нет.

VitaliyRU
Sir_Alex:

Посмотрите в сторону размера буфера FIFO в настройках драйвера COM порта

Тут я не вьехал. В C# в SerialPort есть размер буфера чтения, но она его игнорирует. Ставлю скорость 115200 и буфер 1000, а по факту буфер вообще 4 килобайта и боюсь что винда просто не успевает(на каждый вызов события или в петле если синхронно читать). Спасибо, в дровах попробую. COM порт железный, там мамка т.н. встраиваемая у нее 8 железных COM 😃.
Да и попробую ftdi хрен с ними с железными, в них-то такой настройки я не видел…

Sir_Alex
VitaliyRU:

Тут я не вьехал. В C# в SerialPort есть размер буфера чтения но она его игнорирует. Ставлю скорость 115200 и буфер 1000 а по факту буфер вообще 4 килобайта и боюсь что винда просто не успевает(на каждый вызов события или в петле если синхронно читать). Спасибо в дровах попробую. COM порт железный, там мамка т.н. встраиваемая у нее 8 железных COM .

c# для этого использовать наверное жестоко. Попробуйте реализовать на C или другом языке.

VitaliyRU
Sir_Alex:

c# для этого использовать наверное жестоко. Попробуйте реализовать на C или другом языке.

Там проект весь на C# хотя ничто не мешает DLL ку сделать на С. Это хотел в первую очередь проверить, просто мне кажеться все же особенности винды а не .NET
Алексей а как на тех же “ардуинах”(плату разводить времяни тоже нет 😃) там можно каждый байт считать? не пробовали случайно? Если можно это правильнее чем С на винде…
И еще раз спасибо за отклик 😃

Sir_Alex
VitaliyRU:

Алексей а как на тех же “ардуинах”(плату разводить времяни тоже нет ) там можно каждый байт считать? не пробовали случайно? Если можно это правильнее чем С на винде… И еще раз спасибо за отклик

Можете хоть каждый бит ловить )))

VitaliyRU
Sir_Alex:

Можете хоть каждый бит ловить )))

Вот не сомневался что где-где а тут опытные умные дядьки помогут 😃)
я просто по базам и гуям, а тут пришлось 😃)

Razek
VitaliyRU:

винда дергает раз в 15 байт в буфере или ~7 миллисекунд, скорость(19200). А низзя винапи пнуть чтобы на каждый байт вызывала? Или в мультизадачной системе это анрыл

Можно надо только самому реализовать чтение с ком порта со своим блэк джеком и шлюхами со своими событиям, в отдельных потоках. В котом будет крутиться ReadFile с нужным размером буфера. Получили данные послали события об этом главному потоку.
Открывать ком порт и читать из него:

::CreateFile(_T("\\\\.\\COM1"), GENERIC_READ | GENERIC_WRITE, NULL, 0, OPEN_EXISTING, NULL, NULL);
VitaliyRU
Razek:

Открывать ком порт и читать из него:

угу, погуглю спасибо

mataor

влезу и я…
в винде (я про делфи) можно ловить хоть каждый байт, это проблем не создает - в том случае если ты ждеш, но тогда сама программа висит.
намного удобнее загонять все в буфер нужного размера, который потом просто парсить.

//Чтение данных из порта
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;

в данном случае - отсылаем запрос и ждем определенное время на ответ и читаем буфер.

VitaliyRU
mataor:

в винде (я про делфи) можно ловить хоть каждый байт, это проблем не создает

Я вот тоже так думал, но C# чета не хочет. ComPort это какой unit в Delphi? сколько лет ее юзал но не приходилось 😃)
А с 4 мя ком полюбому многопоточно надо общаца, либо оно само асинхронно на событиях, либо руками многопоточно(что коряво КМК)… Com можно открывать/закрывать тока из основоного потока, иначе оно ругаецца 😃

SergDoc

Мысли над регулятором:
как известно повсеместно используется ПИД (думаю распространяться не стоит?)
а не заменить ли его на регулятор с одним параметром?
U = K*(angle + vel*dt1) только dt1 - не время цикла, а время между считыванием скорости с датчика и подачей данных в регулятор… грубо обнуляем dt1 при чтении и смотрим в него в момент расчёта регулятора…
дело в том, что D и I в ПИДе не что иное как коррекция ошибки пропорции, так как за время между считыванием данных с датчика и поступления их в расчёт ошибка накапливается - тупо на старых данных регулятор строим, а тут его слегка предсказали…
Что даёт? Офигенный плюс к карме Дринкеру с крутилками, их всего 3 ))) ну и как следствие меньше настроек?

VitaliyRU
SergDoc:

U = K*(angle + vel*dt1)

Это аналог PI. С настройкой(К) вынесенной за скобки. Без D будет расколбас при прочиъ равных и не раздельно P и I настраивать тоже не очень. Как то так КМК…
ЗЫ PID и то слишком примитвный, там не упрощать а усложнять надо, но с этой гребанной работой все лень/некогда 😦(