Привет, подскажите решение проблемы пожалуйста: У меня 2 сервы одна по вертикали, другая по горизонтали. Управляют положением камеры. Проблема: Серва по горизонтали едет вправо, когда должна влево и наоборот По вертикали работает хорошо. Если в программе поменять направление то по вертикали едет не в ту сторону То есть в идеале поменять полярность на серве по оси x и всë будет работать как нужно, но как это сделать не разбирая серву?

Комментарии: 6

  1. Nikita

    Очень плохое ТЗ В программе не трогать вертикаль, только горизонталь.

    • Romzbe

      Там нет этой регулировки на сколько я понял once // указать количество осей и тип данных координат template class BrezPlanner { public: // подключить функцию-обработчик шагов вида f(uint8_t idx) void attach(void (*handler)(uint8_t idx)) { cb = *handler; } // установить текущую позицию массивом void setCurrent(T* cur) { for (uint8_t i = 0; i < AXES; i++) { _pos[i] = cur[i]; } } // установить текущую позицию списком void setCurrent(T cur, ...) { _pos[0] = cur; va_list valist; va_start(valist, cur); for (uint8_t i = 1; i < AXES; i++) { _pos[i] = (T)va_arg(valist, int); } va_end(valist); } // установить целевую позицию массивом и начать движение void setTarget(T* tar) { _dist = 0; for (uint8_t i = 0; i < AXES; i++) { _ds[i] = abs((int32_t)tar[i] - (int32_t)_pos[i]); _dir[i] = (_pos[i] < tar[i]) ? 1 : -1; if (_ds[i] > _dist) _dist = _ds[i]; } for (uint8_t i = 0; i < AXES; i++) _nd[i] = _dist / 2; _step = 0; _state = 1; _ready = 0; } // установить целевую позицию списком и начать движение void setTarget(T tar, ...) { T arr[AXES] = {tar}; va_list valist; va_start(valist, tar); for (uint8_t i = 1; i < AXES; i++) { arr[i] = (T)va_arg(valist, int); } va_end(valist); setTarget(arr); } // установить скорость (шагов в секунду) void setSpeed(uint16_t stepSec) { if (stepSec > 1000) setPeriodUs(1000000ul / stepSec); else setPeriodMs(1000 / stepSec); } // установить скорость (период в мс) void setPeriodMs(uint16_t prd) { _prd = prd; _usMode = false; } // установить скорость (период в мкс) void setPeriodUs(uint16_t prd) { _prd = prd; _usMode = true; } // установить масштаб - шагов за период (умолч. 1) void setScale(uint8_t scale) { _scale = scale; } // продолжить движение void resume() { _state = 1; } // остановить движение void stop() { _state = 0; } // статус (true - движется) bool state() { return _state; } // однократно вернёт true при достижении цели bool ready() { return _ready ? (_ready = 0, true) : false; } // тикер, вызывать в loop. Вернёт true при следующем шаге bool tick() { if (!_state) return false; uint16_t time = _usMode ? micros() : millis(); if ((uint16_t)(time - _tmr) >= _prd) { _tmr = time; if (_scale > 1) { for (uint8_t i = 0; i < _scale; i++) { if (tickManual()) break; } } else { tickManual(); } return true; } return false; } // сделать один шаг вручную, вернёт true если это был последний шаг bool tickManual() { _step++; if (_step == _dist) { _state = 0; _ready = 1; } for (uint8_t i = 0; i < AXES; i++) { if (_nd[i] < _ds[i]) { _nd[i] += _dist - _ds[i]; _pos[i] += _dir[i]; if (cb) cb(i); } else { _nd[i] -= _ds[i]; } } return _step == _dist; } // получить текущую координату по оси T getPos(uint8_t idx) { return _pos[idx]; } // получить текущее направление по оси int8_t getDir(uint8_t idx) { return _dir[idx]; } // получить оставшееся количество шагов T getLeft() { return _dist - _step; } // получить длину траектории в количестве шагов T getTotal() { return _dist; } private: void (*cb)(uint8_t idx) = nullptr; uint16_t _prd = 10, _tmr = 0; bool _state = 0, _ready = 0; uint8_t _scale = 1; bool _usMode = false; Если этот знак поменять на > то х работает хорошо, а У постоянно едет вниз до упора

      • Anonim

        зачем что-то в классе менять? Меняй в проге

      • Maks

        В основной программе должен создаваться объект класса где ты инициализирует ось Х и ось У, вот в созданных объектах и управляй направлением движения, сам класс трогать не нужно

        • Romzbe

          if (!results.size()) return 0; std::list::iterator prediction = results.begin(); x = (int)prediction->box[0]; y = (int)prediction->box[1]; w = (int)prediction->box[2] - x + 1; h = (int)prediction->box[3] - y + 1; if ((x + w) > width) w = width - x; if ((y + h) > height) h = height - y; results.end(); } Вот это нашел, я выяснил методом переворота сервы что проблема не в ней, а в вычислении координат, камера ОТЪЕЗЖАЕТ от цели, а не двигается к ней, где могут храниться эти вычисления по оси х в этом проекте не понятно, ГИТХАБ: https://github.com/AlexGyver/Aim-Fan

Не нашли ответ?

Вам также может быть интересно