## state_machine
### Controller
Занимается взаимодействием с внешним миром, выключает состояния при необходимости (в конкуренции).
### WaterstriderStates
- Start (Ждёт от оператора команды начала миссии (через топик или через сервис));
- ObjectDetectedState (Ждёт обнаружения объекта);
- MoveToState (Движение к заданной точке (местоположение точки может уточняться во время движения, но нет никаких фильтров));
- MoveToClickedState (Движение по точкам заданным оператором через rviz2);
- MoveAroundState (Движение вокруг заданной точки (местоположение точки может уточняться во время движения, но нет никаких фильтров));
- FinishState (Выключает двигатели).
### state_machine
Простая реализация state_machine с визуализацией, Controller запускается в отдельном потоке, есть конкуренции.
## Остальные ноды
### MotionController
Отвечает за управление в автоматическом режиме. Использует PID по скорости и по курсу.
- moveTo;
- moveAround;
- moveStop.
### pid_node
Нода с пидом.
### PositionManager
Обрабатывает получаемое положение из rviz в будущем туда можно добавить режим локального положения (xy=0 0 heading=0) или позиционирование через mrmr+compass или по инерциалке.
### SimpleComputerVision
Отвечает за поиск объекта (красного круга на дне). Выделяет контуры по HSV маске, среди контуров ищет подходящий по условию минимального размера, среди них оставляет только один контур максимального размера. Считает положение относительно катамара по упращённым формулам.
### TwistController
Нужен для возможности ручного управления катамараном во время выполнения мисии.
Так же обеспечивает безопасность - если не поступают команды, то он выключает движители.
Реализует хотфикс "При движении с рулением линейная скорость больше" для полученя ожидаемой сокрости при движения по окружности.