Какой является наилучший способ контролировать персонажа?

Я планирую создать бота, который сможет перемещаться по карте из одной точки в другую. В игре отсутствуют координаты, но имеется карта с отображением стрелки персонажа. В связи с этим, я предпринял следующие шаги: 

1) Преобразовал карту в черно-белую, где красный обозначает непроходимую зону, а зеленый - проходимую.
2) С помощью OpenCV определяю текущее местоположение персонажа на оригинальной карте.
3) Генерирую маршрут от текущей позиции до целевой точки на основе черно-белой карты, используя алгоритм A*.
4) Запускаю бота, который регулярно анализирует местоположение персонажа и следит за его движением по запланированному маршруту, состоящему из отдельных пикселей.

Проблема заключается в том, что хотя карта и показывает препятствия, они могут быть больше реальных объектов или содержать преграды, отсутствующие на карте (например, деревья). В результате бот иногда застревает. 

Я пытался решить эту проблему несколькими способами: 

1) Заставлял бота отходить назад, затем в сторону и продолжать движение.
2) Генерировал новый маршрут, стартуя от текущей позиции.
3) Увеличивал размеры обозначенных препятствий на черно-белой карте, чтобы бот не проходил слишком близко к ним.
4) Сокращал количество точек маршрута, чтобы бот двигался напрямую между ними (например, через каждые 10 пикселей).

Однако, все попытки оказались безрезультатными. Бот движется по карте с небольшим допустимым отклонением; если его уменьшить или убрать, он теряет ориентацию, начинает кружиться на месте и, пройдя определенный отрезок, возвращается назад, чтобы корректировать свой маршрут.
  • 15 ноября 2024 г. 1:13
Ответы на вопрос 2
Управление персонажем в условиях непредсказуемой среды, такой как игра, действительно может быть сложной задачей. Вот несколько дополнительных методов и техник, которые вы можете рассмотреть для улучшения поведения вашего бота:

1. **Динамическая адаптация маршрута**:
   - Используйте более частую перегенерацию маршрута, но с некоторыми остановками. Например, бот может проложить маршрут до ближайшей цели, а после достижения определенной точки обновлять маршрут, основываясь на текущих условиях.

2. **Использование сенсоров**:
   - Если это возможно, добавьте «сенсоры» для обнаружения препятствий в реальном времени. Например, если у вашего бота есть возможность определять расстояние до объектов (например, используя цвета, текстуры или другие визуальные подсказки), это может помочь избежать застревания.

3. **Система состояний**:
   - Реализуйте систему состояний, которая отслеживает текущее состояние бота (например, движение, застревание, необходимость корректировки). Это позволит вам более гибко адаптировать поведение в зависимости от ситуации.

4. **Гибкое управление**:
   - Вместо того чтобы двигаться строго по заданному маршруту, используйте более «гибкие» параметры, такие как следование курсу с некоторым допуском. Это обеспечит большую устойчивость в случае отклонения от курса.

5. **Учет угла поворота**:
   - При использовании подхода с A* добавьте проверку не только на наличие препятствий, но и на угол, под которым бот движется. Если угол большой, это может быть признаком того, что бот может столкнуться с препятствием.

6. **Сглаживание пути**:
   - Чтобы избежать резких поворотов, вы можете сгладить маршрут, используя алгоритмы интерполяции, такие как B-spline или неопределенные сплайны, которые позволят боту более естественно планировать движение.

7. **Более интеллектуальный выбор маршрута**:
   - Вместо того, чтобы двигаться напрямую к цели, рассмотрите возможность использования множества «целевых точек» на маршруте, которые позволят боту маневрировать вокруг препятствий более эффективно.

8. **Реакция на заднее вхождение**:
   - Если бот застревает, внедрите логику, которая будет использовать его последние движения для возврата к более удачной точке предыдущего маршрута или для поворота в сторону (вперед/назад) для повторного определения маршрута.

9. **Оптимизация проверки коллизий**:
   - Если у вас есть доступ к дополнительным техникам, таким как Ray Casting или использование сетки (grid-based methods), это может улучшить точность определения коллизий.

Эти подходы помогут вам улучшить маршрутизацию и предотвратить застревание вашего бота. Однако важно помнить, что сложные сценарии могут потребовать нескольких итераций и тестирования, чтобы достичь наилучшего результата.
В результате решил обучить yolo11 модель, так как других универсальных вариантов не нашел. При застревании персонажа запускаю определение препятствий, вывожу персонажа в сторону от него и перестраиваю маршрут.
Похожие вопросы