Решение
Требуется понять формат команд, а именно:
id – commandCode – commandParam
Все части команды записаны в шестнадцатеричном формате.
id – во всех командах одинаковый и равен 01AC.
Сопоставляя маршрут движения и отправленные команды из журнала, можно выделить следующие команды:
Проанализируем журнал команд, отправленных пользователем.
полный тестовый путь беспилотника был следующий:
00: 01AC BA 000C – ВВЕРХ 12 м (B)
12: 01AC 2D 000C – ВПЕРЕД 12 м (C)
24: 01AC 18 005A – ПОВОРОТ на 90 градусов (C)
25: 01AC 2D 0006 – ВПЕРЕД 6 м (D)
31: 01AC 18 005A – ПОВОРОТ на 90 градусов (D)
32: 01AC 2D 000C – ВПЕРЕД 12 м (E)
44: 01AC BA 000C – ВВЕРХ 12 м (F)
56: 01AC E7 010E – ПОВОРОТ* на 270 градусов (F)
57: 01AC 2D 0004 – ВПЕРЕД 4 м (G)
61: 01AC E7 005A – ПОВОРОТ* на 90 градусов (G)
62: 01AC 2D 0003 – ВПЕРЕД 3 м (H)
65: 01AC E7 007E – ПОВОРОТ* на 126 градусов (H)
66: 01AC 2D 0005 – ВПЕРЕД 5 м (F)
71: 01AC 45 000C – ВНИЗ 12 м (E)
83: 01AC E7 0090 – ПОВОРОТ* на 220 градусов (E)
84: 01AC 2D 0006 – ВПЕРЕД 6 м (B)
90: 01AC 45 000C – ВНИЗ 12 м (A)
Теперь необходимо вычислить координаты, в которых будет находиться беспилотник после каждой команды и угол его поворота, поскольку движение вперед зависит от угла поворота беспилотника относительно своей оси. Допустим, после последней команды дрон оказался в координатах (x1, y1, z1) и «смотрит» под углом b. Тогда дрону требуется развернуться на угол a + b:
где угол a = arctg(y1/x1).
Угол b изначально равен 90 градусам (поскольку при первом же движении дрона прямо, увеличивается только координата x) и далее вычисляется по ходу приема команд.
Итоговый путь беспилотника был следующий:
Таким образом ответ будет состоять из команд:
1. Повернуть направо на 49 градусов (E7 31);
2. Двигаться прямо 19 с (2D 13);
3. Спуститься вниз 36 с (45 24).
П.3 может быть как на первом, так и на втором месте.