Это продолжение статьи “Rope-Ladder Tracker: визуальный возврат без GPS” , где я представил концепцию структурированного позиционирования по принципу “верёвочной лестницы”. Тогда это была идея, прототип и первые кадры. Сегодня — полноценная, стабильная система, готовая к интеграции в реальный дрон.

Что изменилось за это время?

Первая версия rope-ladder-tracker работала, но была хрупкой:

  • Чувствительна к освещению.

  • Сыровато обрабатывала потерю точек.

  • Не учитывала смену состояния трекинга.

  • Могла “зависнуть” при плохом кадре.

  • Визуализация мешала производительности.

Сейчас я представлю обновлённую, стабильную версию, в которой:

✅ Добавлена адаптивная детекция точек
✅ Реализован плавный контроль состояния трекинга
✅ Улучшена обработка ошибок и потерь
✅ Добавлен флаг-контроль активности
✅ Убраны “магические” числа — всё настраивается
✅ Код стал промышленно устойчивым

Новые ключевые улучшения

? 1. Адаптивная детекция ключевых точек: adaptive_good_features()

Проблема: в тени или при пересвете cv2.goodFeaturesToTrack возвращает мало точек → система теряет ориентацию.

Решение: адаптивная настройка параметров:

def adaptive_good_features(gray):
    clahe = cv2.createCLAHE(clipLimit=2.5, tileGridSize=(8, 8))  # Улучшаем контраст
    enhanced = clahe.apply(gray)
    
    mean_val, std_val = cv2.meanStdDev(gray)
    std_scalar = std_val[0, 0]
    
    # Динамический qualityLevel: меньше при низком контрасте
    quality_level = max(0.01, 0.1 * (1 - std_scalar / 50))
    
    h, w = gray.shape
    area = h * w
    num_features = max(50, min(1000, area // 200))  # Гибкое число точек
    min_distance = max(5, int(np.sqrt(area / num_features)))
    
    return cv2.goodFeaturesToTrack(
        enhanced,
        maxCorners=num_features,
        qualityLevel=float(quality_level),
        minDistance=min_distance,
        blockSize=7
    )

Результат: система работает при изменении освещения, на гладких поверхностях и в условиях низкого контраста.

?️ 2. Обработка ошибок и защита от пустых данных

В старой версии ошибка в calcOpticalFlowPyrLK могла вывести систему из строя.

Сейчас:

  • Проверка new_points и status.

  • Фильтрация только активных точек (status == 1).

  • Защита от None и пустых массивов.

  • При потере точек — сохраняется (0,0) и логируется предупреждение.

if tracked_points is None or len(tracked_points) == 0:
    save_offset(0, 0)
    logging.warning("⚠️ Нет точек — сохраняем (0, 0)")
    continue

⚙️ 3. Улучшенное управление "лестницей"

Функция rope_ladder_waypoint_management() теперь:

  • Учитывает расстояние от текущей точки до старта.

  • Добавляет новую точку только при устойчивом удалении (с запасом BACKTRACK_MARGIN).

  • При возврате — обрезает хвост истории, сбрасывая дрейф.

  • Проверяет, вернулись ли к старту — и если да, отправляет (0,0).

if dist_to_start < DISTANCE_THRESHOLD:
    save_offset(0, 0)
    logging.info("? ВОЗВРАТ В СТАРТ!")
else:
    dx_px = anchor_center[0] - current_center[0]
    dy_px = anchor_center[1] - current_center[1]
    save_offset(int(dx_px), int(dy_px))

Как это работает на практике?

  1. Дрон взлетает → включается трекинг.

  2. Камера фиксирует стартовую точку — первая ступенька лестницы.

  3. При движении вперёд — добавляются новые ступеньки.

  4. При возврате — если видит старую точку, удаляет хвост, сбрасывает дрейф.

  5. При возвращении к старту — отправляет (0,0) → контроллер знает: я дома.

Плюсы новой версии

Стабильная работа даже при изменении освещения
Гибкость — легко настроить под разные камеры и поверхности
Простота — всего один скрипт, OpenCV и Python
Надёжность — защита от сбоев, атомарная запись, управление состоянием
Готова к интеграции — контроллер читает JSON, как обычный сенсор

Код: чистый, понятный, готов к работе

Полный код доступен в репозитории:
? github.com/VohminV/rope-ladder-tracker

Основные функции:

  • adaptive_good_features() — умная детекция

  • rope_ladder_waypoint_management() — логика лестницы

  • save_offset() — безопасная запись

  • is_tracking_enabled() — внешнее управление

Заключение

Rope-Ladder Tracker перешёл от концепта к рабочей системе. Это не просто “ещё один optical flow”, а новая парадигма визуального позиционирования:

Не накапливать ошибку — а структурировать путь и сбрасывать дрейф при возврате.

Следующий шаг — добавить поворот, масштаб и интеграцию с PX4/ArduPilot. А пока — система уже работает, стабильна и готова к тестам в реальных условиях.

Комментарии (0)