You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
dummy_simulation/README.md

209 lines
12 KiB
Markdown

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

## Структура проекта
```
gesture_rec/
├── config.py # Главный файл настроек
├── main.py # Точка входа
├── geom_controll
│ └── arm_control.py # Преобразование позы в скорости
├── robot/
│ ├── debug_robot.py # Робот-заглушка (вывод в консоль)
│ └── simulated_robot.py # Симулятор с Pygame
├── submodules/
│ ├── gesture_detection/ # Распознавание скелета, жестов, ML
│ └── robot_controller_base/ # Базовый класс робота
├── requirements.txt
├── robot.png # Картинка робота для симуляции
└── README.md
```
## Установка
### 1. Клонирование репозитория
git clone https://git.robofob.ru/sirius/dummy_simulation.git
cd dummy_simulation
### 2. Инициализация подмодулей
Проект использует два внешних подмодуля:
- `robot_controller_base` базовый класс для робота
- `gesture_detection` модуль распознавания жестов (скелет, ML-детекторы)
Обновите их:
git submodule update --init --remote --recursive
В будущем, чтобы подтянуть в сабмодулях изменения последнего коммита:
git submodule update --remote --recursive
### 3. Создание и активация виртуального окружения
python3.11 -m venv venv
source venv/bin/activate
Если у вас не скачен питон этой версии, сначала выполните:
```
sudo apt install python3.11 python3.11-venv
```
Если у нас не устанавливается питон 3.11, то это потому что он отсутствует в официальных репозиториях по умолчанию, надо добавить репозиторий перед скачиванием:
```
sudo apt update && sudo apt install -y software-properties-common
sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt update
```
### 4. Установка зависимостей
#### 4.1. Способ 1
Сделайте bash скрипт исполняемым и запустите последовательность установки:
chmod +x install_deps.sh
./install_deps.sh
#### 4.2. Способ 2
Вручную:
pip install --upgrade pip
pip install numpy==1.24.3
pip install pandas==2.0.3
pip install opencv-python==4.12.0.88
pip install opencv-python-headless==4.12.0.88
pip install matplotlib==3.7.5
pip install protobuf==3.20.3
pip install torch torchvision --index-url https://download.pytorch.org/whl/cpu
pip install --no-deps mediapipe==0.10.11
pip install attrs
pip install scikit-learn==1.3.2
pip install joblib==1.4.2
pip install depthai==2.28.0
pip install --no-deps tensorflow==2.13.1
pip install \
absl-py \
astunparse \
flatbuffers \
gast \
google-pasta \
grpcio \
h5py \
keras==2.13.1 \
libclang \
opt-einsum \
tensorboard==2.13.0 \
tensorflow-estimator==2.13.0 \
termcolor \
wrapt \
requests
pip install numpy==1.24.3
pip install scipy==1.11.0
pip install pygame==2.6.1
#### Типичные проблемы во время установки:
Важно: красные предупреждения о нехватке зависимостей для tensorflow будут, но можно их игнорировать, т.к. эти модули не используются в данном проекте, а их установка мешает зависимостям MediaPipe.
1. Если будет ошибка с `"AttributeError: google..."` но это потому что `tensorflow` подменяет версию библиотеки `protobuf`, выполните:
```
pip uninstall protobuf google protobuf
pip install protobuf==3.20.3
```
Примечание: если у вас слабая видеокарта или нет CUDA, используйте `tensorflow-cpu` вместо `tensorflow`.
2. Если будет проблема с функцией cv2.imshow() то, переустановите cv2 без заголовков:
```
pip uninstall opencv-python pip install opencv-python-headless
pip install opencv-python==4.12.0.88
```
3. Если будет ошибка с PIL, попробуйте обновить библиотеку:
```
pip upgrage pillow
```
4. **Внимание:** если вам пришлось делать после основной установки какие-то дополнительные, обязательно зафиксируйте еще раз версию numpy!
```
pip install numpy==1.24.3
```
## Настройка
Все основные параметры находятся в классе `Config`. Перед запуском обязательно отредактируйте их под вашу конфигурацию.
### Камера
- `CAMERA_ID` ID устройства (только для CAMERA_TYPE = 'web')
- `CAMERA_TYPE` 'web' (обычная USB-камера) или 'oak' (OAKD)
- `MIRROR_CAMERA` зеркалировать изображение (обычно True для естественного отображения)
### Детектор скелета
- `POSE_DETECTOR` 'mediapipe' или 'oak' (только при CAMERA_TYPE='oak')
- `OAK_MODEL_TYPE` модель для OAK (например 'efficienthrnet1')
- `OAK_DETECTION_THRESHOLD` порог уверенности (0.01.0)
- `OAK_SHAVES` число SHAVE-ядер для OAK
### Преобразование позы в скорости
- `ARM_CONTROL` словарь:
- `linear_arm` рука для линейной скорости ('left' или 'right')
- `angular_arm` рука для угловой скорости
- `max_speed_linear` макс. линейная скорость (м/с)
- `max_speed_angular` макс. угловая скорость (рад/с)
- `dead_zone` зона нечувствительности (0.01.0)
- `debug` выводить отладочную информацию в консоль
### Статические жесты
- `SPECIAL_GESTURE_MODE` 'ml' (использует модель для предсказания) или 'geometric' (геометрический)
- `ML_GESTURE_MODEL` путь к обученной модели .pkl
- `ML_GESTURE_CLASSES` список классов (например ['dome', 'cross', 'none'])
### Динамические жесты
- `DYNAMIC_GESTURE` ['enabled'] включить/выключить
- `model_path` путь к модели .h5
- `classes_path` путь к файлу с классами (pickle)
- `window_size` размер окна (число кадров)
- `threshold` порог уверенности
### Симуляция:
- `MAP_WIDTH`, `MAP_HEIGHT` размеры поля
- `BORDER_THICKNESS` толщина стен
- `MAP_OBSTACLES` список прямоугольных препятствий (x, y, w, h)
- `START_POS`, `FINISH_POS` позиции старта и финиша
- `ROBOT_RADIUS` радиус робота (пиксели)
- `ROBOT_IMAGE_PATH` путь к PNG-изображению робота (или None - тогда будет треугольник)
- `INITIAL_HP`, `INITIAL_FIRE_CHARGE` начальные HP и заряд для тушения
- `COLLISION_DAMAGE` урон при столкновении с препятствием
- `EXTINGUISH_RADIUS`, `EXTINGUISH_ANGLE` параметры конуса тушения (радиус и угол в градусах)
- `NUM_FIRES`, `FIRE_RADIUS`, `SCORE_PER_FIRE` количество очагов, их радиус и очки за тушение
- `ROBOT_MODE` 'simulator' (запуск игры с Pygame) или 'debug' (вывод команд в консоль)
### Пути к моделям:
Требуется указать свои абсолютные пути к используемым моделям, предобученные можно скачать [отсюда](https://git.robofob.ru/sirius/gesture_rec.git), пролистайте в конец.
## Запуск
Активируйте виртуальное окружение и выполните:
python main.py
## Управление
Симулятор поле с препятствиями, стартом и финишем. Робот движется согласно командам. При врезании в препятствия - получает урон. Некоторое время после урона (во время мигания) неуязвим, чтобы у вас было время вырулить.
1. Управление скоростями
- Линейная скорость (вперёд) горизонтальное положение правой руки (рука вдоль тела 0, вытянута в сторону максимум).
- Угловая скорость вертикальное положение левой руки (рука на уровне плеча 0, вверх поворот вправо, вниз поворот влево).
![Схема управления скоростями](images/arm_control.png)
2. Управление действиями
- Включение/выключение управления скоростями жест `cross` (скрещённые руки). При выключении робот останавливается.
- Тушение пожара жест `dome` (руки над головой). Если огонь попадает в конус перед роботом, он тушится. Заряд тушения тратится в любом случае.
![Схема управления жестами](images/gesture_control.png)
Закрытие окна игры или нажатие `q` в окне камеры выход. При завершении игры (неважно выигрыш или проигрыш) нажмите `r` чтобы перезапустить симулятор.
## Создание собственного контроллера скоростей
По умолчанию преобразование позы в скорости реализовано в классе `ArmController` (файл `arm_control.py`).
Чтобы изменить логику управления, выполните одно из действий:
1. Изменить метод `compute_speeds` в `arm_control.py` он должен принимать аргумент landmarks (список из 33 точек MediaPipe) и возвращать кортеж (linear, angular) числа с плавающей точкой.
2. Создать свой класс-наследник от `ArmController` и переопределить `compute_speeds`. Затем в `main.py` заменить создание экземпляра на свой класс.
После этого не забудьте изменить параметры словаря `ARM_CONTROL` в `Config` вы можете добавлять туда свои поля и читать их в методе.
## Добавление своих жестов
Подмодуль `gesture_detection` содержит всё необходимое для обучения собственных моделей жестов.