Raspberry PI 3 + OpenCV + Arduino UNO + ......(поледнее решение и вопрос в последнем сообщении)

Тема в разделе "Флудилка", создана пользователем Igor68, 21 ноя 2016.

  1. Igor68

    Igor68 Гуру

    Плюсы понятны... а методика использования нет. Курю, пью, решаю...
     
    Mitrandir нравится это.
  2. Mitrandir

    Mitrandir Гуру

    Методик работы с гитом куча))
     
  3. Igor68

    Igor68 Гуру

    Доброго времени суток!
    ...вот тихо-тихо работаем с программой sonar:
    в цикле main:
    Код (C++):
    ...
    if(fshm > 0)
            {
                sem_wait(sem);
                switch (addr->scntrl)    //источник управления
                {
                    case _scntrl_free:    //нет источника управления
                    case _scntrl_wsbot:    //источник wsbot через веб интерфейс
                        scntrl.rspL        = addr->wrmotors[0];
                        scntrl.rspR        = addr->wrmotors[1];
                    case _scntrl_sonar:    //источник управления sonar
                        scntrl.spL        = addr->wrmotors[0];
                        scntrl.spR        = addr->wrmotors[1];
                        if(disctLimCntrl())    //функция пересчёта и режима
                        {    //проиошло изменение задания и оно персчитано пропорционально расстоянию
                            addr->wrmotors[0]     = scntrl.spL;
                            addr->wrmotors[1]    = scntrl.spR;
                            addr->scntrl        = _scntrl_sonar;    //захватываем управление
                        }
                        else
                        {
                            if(addr->scntrl == _scntrl_sonar)
                                addr->scntrl = _scntrl_free;    //отпускаем управление
                        }
                        break;
                    default:
                        break;
                }
                //
                //
                addr->sonardistance    = dist;
                addr->sonarradius    = radius.radius;
                addr->timeSonar        = timeSonar;
                sem_post(sem);
            }
    ...
    и функция пересчёта:
    Код (C++):
    //приближение к препятствию - пересчёт
    uint8_t disctLimCntrl(void)
    {
        float    prcDist;
        //
        if(!(dist > _dist_Hcntrl))
        {
            prcDist    = (float)(dist - _dist_Lcntrl) / (float)(_dist_Hcntrl - _dist_Lcntrl);
            if(prcDist < 0.0)
                prcDist = 0;
            scntrl.spL = (int16_t)((float)(scntrl.rspL) * prcDist);
            scntrl.spR = (int16_t)((float)(scntrl.rspR) * prcDist);
            printf("dist=%i  prcDist=%0.2f\n", dist, prcDist);
            return 0xFF;
        }
        else
            return 0;
    }
    А в чём смысл? Есть некий источник управления ну wsbot... кстати servoANDmotor умеет ограничивать всё сам. И вдруг при управлении через браузер мы приближаемся к препятствию и исходя из:
    Код (C++):
    //параметры для управления от сонара
    #define    _dist_Hcntrl    105    //максимальная дистанция контроля
    #define _dist_Lcntrl    35    //минимальная дистанция контроля
    на дистанции менее 105 см мы фиксируем задание, реагируем, и пересчитываем исходя из того что за 0% дистанции взято 35 см, а за 100% взято 105 см. Ну и по процентам изменяем задание для правых и левых колёс индивидуально исходя из зафиксированного ранее задания.
    Это попытка снизить скорость пропорционально, даже если движение не по линии, а по радиусу. Правда совсем забыл, если разворот на месте, когда одни колёса вперёд, другие назад с одинаковой величиной. Когда первичный источник управления заменяется программой sonar... а потом сам сонар отпускает управление, то задание остаётся прежним и требуется другой программе захватить управление. Иначе servoANDmotor при критическом приближении (менее 35 см) захватит управление и остановит движение...
     
  4. Igor68

    Igor68 Гуру

    Когда первичный источник управления заменяется программой sonar(sonar перехватывает управление меняя задание в разделяемой памяти в ней же и выставляет параметр addr->scntrl =_scntrl_sonar, при этом servoANDmotor определяя приоритет источника решает реагировать ли на этот параметр имея своё "мнение") ... а потом сам сонар отпускает управление(выставляя параметр addr->scntrl=_scntrl_free, сто означает "управление свободно" и любой источник управления(программа) может захватить его), то задание остаётся прежним и требуется другой программе захватить управление. Иначе servoANDmotor при критическом приближении (менее 35 см) захватит управление(установив параметр addr->scntrl на своё имя) и остановит движение. После чего вновь освободит управление.
    Каждая из программ анализирует параметр addr->scntrl в разделяемой памяти и так же анализирует приоритеты. Пример:
    1) servoANDmotor собственно сам управляет приводами, но при этом имеет узкую специализацию. Он так же принимает управление от захватившего его источника. И если любой из источников не противоречит заданным правилам, то выставит задание для приводов по ModbusRTU от него. servoANDmotor принимает дистанцию до препятствия и сам определяет действия. Правила для servoANDmotors:
    - нельзя ехать если сонар смотрит не вперёд
    - нельзя ехать вперёд при достижении <35 см до препятствия
    - можно делать разворот на месте
    В других случаях имя источника задания=СВОБОДНО, если другими не занято

    2) sonar - если управление свободно или его захватил wsbot(командами от браузера), но при этом дистанция имеет ограничения по своим (sonar)правилам... то он меняет задание(ранее читая его из разделяемой памяти) и выставляет источником управления своё имя. Пока что он замедляет движение колёс по мере приближения к препятствию (рассматривалось ранее). Но предполагается что он будет выставляя задание для приводов поворачивать и наклонять сонар для построения участка пространства, разумеется остановив движение вперёд. Правила:
    - нельзя менять задание если оно занято servoANDmotor

    3) wsbod - собственно ручное управление через браузер на ПК по websocket. Если источник задания не занят, то имеется возможность управлять по веб интерфейсу. Так же он организует сервер для доступа по websocket, читает глобальную картинку, накладывает на неё индикацию и элементы управления... после чего всё это передаёт клиенту (браузеру). От браузера он принимает клик мышкой и координаты этого клика на картинке(холсте), после чего анализирует это исходя из элементов управления... ну и изменяет задания(для слайдеров) либо выполняет некую функцию(для кнопок). А потом елси он захватил управление (прочитав имя источника) выставляет задания для servoANDmotor, сопровождая своим именем.
    wsbot так же имеет правила:
    - разрешено захватить управление указав своё имя если источник СВОБОДЕН(не занят)
    - если источником является он сам(wsbot) можно так же как и СВОБОДЕН выставлять задания для servoANDmotors

    4) camwork - принимает данные из USB камеры, формирует картинку в формате BMP и выкладывает её в разделяемую память. Пока этим всё ограничивается, но предполагается сохранять ещё и массив, который ещё до BMP сформирован средствами OpenCV для предоставления данных ещё и другим программам... и не обязательно на этой именно малине. Интервал(время сна) в цикле съёмки кадров 50000мкС. Реально же мерить частоту кадров не довелось. Пока не время.
     
  5. Igor68

    Igor68 Гуру

    Доброго времени суток!
    Сонар... ох уж этот сонар. Устройство имел ввиду. Думал что, по другому... но вот:
    Код (Text):
    www-data@pi02:~/ramdisk/mainwork_13_10_2018/sonar/work$ ./sonar
    MB1242 - Testing... (use "--help" for info in new starting)
    Input mode for 5V:
    1 = diagremm A
    2 = diagremm B
    3 = diagremm C
    4 = diagremm D
    ?1
    distance:222
    distance:222
    distance:-32546
    distance:222
    distance:222
    distance:-32546
    distance:222
    distance:222
    distance:222
    distance:222
    distance:222
    distance:222
    distance:-32546
    distance:222
    distance:222
    distance:-32546
    distance:-32546
    distance:222
    distance:-32546
    Видите значение -32546 отрицательое число... да это старший байт имеет значение 0x80, а младший соответственно значение в сантиметрах. И если сделать не так:
    Код (C++):
    dist    = ((dat[0] << 8) | dat[1]);
    а так:
    Код (C++):
    dist    = ((dat[0] << 8) | dat[1]) & 0x7FFF;
    то будет 222. Крутил, читал, искал и видел тут:


    и тут:


    Особенно первый просмотр и не увидел что бы было большее значение. Выходит не та модель. Ну да ладно... есть ещё и камера. Но какого ляда надо читать именно два байта? А данные только в первом. А знак я так понимаю недосягаемость. Ну тогда хоть в милиметрах были данные, ну и минимальная дистанция менее 20 см. Либо делаю что не так... либо слаб сонар. К сожалению на Али в продаже нашёл только одну модель... и то далеко не копейки.
     
  6. Igor68

    Igor68 Гуру

    Вот тут:
    http://forum.amperka.ru/threads/Монитор-питания-по-usb.16566/page-3#post-186152
    попытка регистрации просадки напряжения питания на малине... к сожалению пока без успеха:(. Но... Но управление подачи питания на USB устройство от малины... чисто программно... РЕШЕНО:). Респект... РЕСПЕКТ РЕСПЕКТ АВТОРУ(АВТОРАМ) темы питания по USB от малины. :):):):):):):):):):):):):):):):):):):):):):):):):):):)