from gym_duckietown.tasks.task_solution import TaskSolution
-- импорт базового класса для всех gym_duckietown решений
import numpy as np
-- импорт библиотеки компьютерной математики
import cv2
-- импорт библиотеки для компьютерного зрения
Инициализация класса-решения:
class DontCrushDuckieTaskSolution(TaskSolution):
def __init__(self, generated_task):
super().__init__(generated_task)
def solve(self):
- именно метод solve
и содержит код, который будет выполнен на роботе
env = self.generated_task['env']
- получение окружения. Именно через этот объект решение может взаимодействовать с внешним миром
obs, _, _, _ = env.step([0,0])
-- метод step
принимает линейную и угловую скорость робота и возвращает ответ от окружения на это действие. Нас интересует первый элемент obs
(observation), содержащий картинку с камеры робота.
img = cv2.cvtColor(np.ascontiguousarray(obs), cv2.COLOR_BGR2RGB)
-- конвертация изображения в формат RGB для более удобной работы. После этого с изображением можно работать. Например, найти на изображении уточек.
Условие, истинность которого обозначает продолжение движения прямо:
condition = True
while condition:
obs, _, _, _ = env.step([1, 0])
-- даем команду роботу ехать прямо. Действие выполняется квант времени и метод возвращает новое изображение с камеры робота
Тут может быть код, например, выполняющий поиск на изображении уточек и определяющий пора ли остановиться:
# add here some image processing
condition = True
env.render()
-- метод симулятора, который решение вызывает после каждой итерации обработки очередного кадра.