Это продолжение статьи “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))
Как это работает на практике?
Дрон взлетает → включается трекинг.
Камера фиксирует стартовую точку — первая ступенька лестницы.
При движении вперёд — добавляются новые ступеньки.
При возврате — если видит старую точку, удаляет хвост, сбрасывает дрейф.
При возвращении к старту — отправляет
(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. А пока — система уже работает, стабильна и готова к тестам в реальных условиях.