- PVSM.RU - https://www.pvsm.ru -
Это продолжение статьи “Rope-Ladder Tracker: визуальный возврат без GPS” [1], где я представил концепцию структурированного позиционирования по принципу “верёвочной лестницы”. Тогда это была идея, прототип и первые кадры. Сегодня — полноценная, стабильная система, готовая к интеграции в реальный дрон.
Первая версия rope-ladder-tracker работала, но была хрупкой:
Чувствительна к освещению.
Сыровато обрабатывала потерю точек.
Не учитывала смену состояния трекинга.
Могла “зависнуть” при плохом кадре.
Визуализация мешала производительности.
Сейчас я представлю обновлённую, стабильную версию, в которой:
✅ Добавлена адаптивная детекция точек
✅ Реализован плавный контроль состояния трекинга
✅ Улучшена обработка ошибок и потерь
✅ Добавлен флаг-контроль активности
✅ Убраны “магические” числа — всё настраивается
✅ Код стал промышленно устойчивым
Проблема: в тени или при пересвете 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
)
Результат: система работает при изменении освещения, на гладких поверхностях и в условиях низкого контраста.
В старой версии ошибка в 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
Функция 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))
Дрон взлетает → включается трекинг.
Камера фиксирует стартовую точку — первая ступенька лестницы.
При движении вперёд — добавляются новые ступеньки.
При возврате — если видит старую точку, удаляет хвост, сбрасывает дрейф.
При возвращении к старту — отправляет (0,0) → контроллер знает: я дома.
✅ Стабильная работа даже при изменении освещения
✅ Гибкость — легко настроить под разные камеры и поверхности
✅ Простота — всего один скрипт, OpenCV и Python
✅ Надёжность — защита от сбоев, атомарная запись, управление состоянием
✅ Готова к интеграции — контроллер читает JSON, как обычный сенсор
Полный код доступен в репозитории:
👉 github.com/VohminV/rope-ladder-tracker [2]
Основные функции:
adaptive_good_features() — умная детекция
rope_ladder_waypoint_management() — логика лестницы
save_offset() — безопасная запись
is_tracking_enabled() — внешнее управление
Rope-Ladder Tracker перешёл от концепта к рабочей системе. Это не просто “ещё один optical flow”, а новая парадигма визуального позиционирования:
Не накапливать ошибку — а структурировать путь и сбрасывать дрейф при возврате.
Следующий шаг — добавить поворот, масштаб и интеграцию с PX4/ArduPilot. А пока — система уже работает, стабильна и готова к тестам в реальных условиях.
Автор: vohmin
Источник [3]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/python/426902
Ссылки в тексте:
[1] “Rope-Ladder Tracker: визуальный возврат без GPS” : https://habr.com/ru/articles/932254/
[2] github.com/VohminV/rope-ladder-tracker : https://github.com/VohminV/rope-ladder-tracker
[3] Источник: https://habr.com/ru/articles/933046/?utm_campaign=933046&utm_source=habrahabr&utm_medium=rss
Нажмите здесь для печати.