# Материалы дистанционных Учебно-Тренировочных сборов 2020/21. Задание 2
## Чтение ArTag метки
### Описание поля:
Робот, собранный по дифференциальной схеме, оснащен камерой и расположен на полигоне размером в $1$ сектор. Сектор --- квадрат шириной $600$ мм.
На стене полигона прямо перед роботом располагается ArTag метка размером $50 \times 50$ мм на подложке $600 \times 200$ мм.
Слева от ArTag метки располагаются тонкие вертикальные зеленые линии высотой на всю подложку. Справа от ArTag метки располагаются аналогичные линии синего цвета.
Частота размещения линий увеличивается по мере приближения к ArTag метке и уменьшается по мере удаления от неё.
### Формат ArTag метки:
ArTag метка состоит из $6 \times 6$ квадратов кодирующих биты. Черный квадрат считается $1$, белый квадрат считается $0$. Биты читаются слева направо сверху вниз. Картинка с подробным описанием приведена ниже.
Для кодирования информации используется код с детекцией и коррекцией ошибок -- код [Хэмминга](https://en.wikipedia.org/wiki/Hamming_code). Для кода Хэмминга используются $12$ бит.
После декодирования кода Хэмминга первые $3$ бита — координата $X$ в little endian, следующие $3$ бита — координата $Y$ в little endian, последние два бита равены $0$.

Картинка показывающая расположение битов на ArTag
Описание соответствия битов их значению:
1. Первый контрольный бит
2. Второй контрольный бит
3. Младший бит координаты X
4. Третий контрольный бит
5. Второй бит координаты X
6. Старший бит координаты X
7. Младший бит координаты Y
8. Четвертый контрольный бит
9. Второй бит координаты Y
10. Старший бит координаты Y
11. 0
12. 0

Пример изображения с камеры

Общий вид тестового полигона
### Функции робота
Робот, расположенный на полигоне, управляется при помощи Python-скриптов.Для обеспечения работы робототехническое устройство использует библиотеку "robot", имеющей следующие команды:
1. **sleep(_sec_)** - пауза в sec секунд, возможно использование дробных чисел.
2. **getDirection()** - возвращает направление робота в радианах.
3. **getEncoders()** - возвращает показания экнодеров в радианах в формате dict.
4. **getLaser()** - возвращает показания лазера, включая время кадра, угол лазера, изменение угла между соседними показаниями и сами показания в формате dict.
5. **setVelosities(_linear, angular_)** - подасть заданные угловые и линейные скорости на робота.
6. **getImage()** - возвращает изображение с камеры робота в формате OpenCV image (RGB).
Для демострации работы с робототехническим устройством в `scripts\` расположены примеры Python-скриптов.
### Формат выходных данных
Необходимо считать ArTag метку и вывести координаты $X$ и $Y$ закодированные в метке через пробел в stdout.
### Примеры
В вашем репозитории расположенно три тестовых примера, имеющие следующие правильные ответы:
0. тест. x = 0, y = 0
1. тест. x = 6, y = 4
2. тест. x = 4, y = 2
### Инструкция по загрузке и запуску внутри VM
1. Установить Oracle VM VirtualBox
2. Скачать образ системы по данным ссылкам: [mega.nz](https://mega.nz/file/9ew1SQgL#K9XLZno0XrSyYvQWyociWEXtWjyDAL-nRCfKKqRgtF4), [google drive](https://drive.google.com/file/d/18OmuQ7Ne3LZoU4_G7vuAWI54sVzmr36-/view?usp=sharing)
3. Запустить его.
4. Скачать ваш репозиторий в любую дирректорию:
```git clone https://gitlab.com/onti-irs/onti-2021-irs/<<номер вашей группы>>/artag-detection```
Где <<ваш номер группы>> номер группы, присвоенный вам после передачи информации про ваши гитлаб аккаунты. Он имеет вид: ```irs202100```.
2. ``cd artag-detection``
3. Для запуска тестов используется следующая команда:
```./sh/run_simulation.sh N```
Где вместо N указан номер теста.
4. Для сброса состояния мира в Gazebo можно воспользоваться следующей командой:
```./sh/reset.sh```
5. Весь код, необходимо сохранять в данном репозитории. Название основного файла: `main.py`.
6. Для вашего удобства в образе уже установлен PyCharm.
### Полезные материалы по git
* https://git-scm.com/book/ru/v2
* https://stepik.org/course/3145/promo
* https://habr.com/ru/post/437000/