Имеется в виду тот алгоритм навигатора, который сейчас реализован. Там, к примеру, решение поворачивать роботу влево или вправо принимается на основании превышения порогового значения расстояния, которое рассчитывается как разность позиции распознанного объекта от центра по горизонтали.
- Код: Выделить всё • Развернуть
// Вычисляем величину отклонения цента объекта от центра входного изображения
int cXs = apGray->width>>1;
int cXo = apRcgObj->ObjRect->x + (apRcgObj->ObjRect->width>>1);
int cXd = cXs - cXo;
//...
// Объект находится слева от робота?
if(cXd > 40) {// Да
// Один раз (импульсом) повернуть корпус робота влево
if(!MvLft && gNvg.TurretBalance > 0) { gpCmdArray->Cmd[cmLEFT] = true; }
// Поворот башней влево
if(!TrLft) {
gpCmdArray->Cmd[cmTURRET_LEFT] = true;
gNvg.TurretBalance++;
}
}
// Объект находится справа от робота?
if(cXd < -40) {
// Один раз (импульсом) повернуть корпус робота вправо
if(!MvRht && gNvg.TurretBalance < 0) { gpCmdArray->Cmd[cmRIGHT] = true; }
// Поворот башней вправо
if(!TrRht) {
gpCmdArray->Cmd[cmTURRET_RIGHT] = true;
gNvg.TurretBalance--;
}
}
Так вот, на таком мелком разрешении (320x240) если даже робот импульсом повернёт на одну позицию, то объект просто может потеряться из поля зрения, да и вообще сложно принять решение о повороте, если в вашем распоряжении всего +- 160 пикселей минус размер распознанного объекта и минус гистерезис. Что бы исключить колебательный процесс (робот начинает самопроизвольно дергается влево - вправо) нужно задать некий гистерезис (в нашем случае +- 40 пикселей).
Вот по этой причине разрешение 320x240 плохо сосчитается с задачей навигации (точности маловато).