В современном мире, где робот пылесос является обыденностью, а статьи про новые автопилотируемые автомобили публикуются регулярно, давно не секрет, что для своих задач эти чудо машины строят карту движения, чтобы знать куда ехать.

Проблема современных автопилотируемых систем

Современным машинам с полным (или почти полным) автопилотом приходится работать с огромным потоком данных, чтобы не "заблудиться". Посмотрите, сколько различных датчиков/сенсоров находятся в автомобилях компании Tesla и беспилотных автомобилях Яндекса.

Естественно, для таких дел нужны большие вычислительные мощности, что повышает цену продукта.

Автопилот в промышленности

Мы живём в эпоху четвёртой промышленной революции - когда производство становится полностью цифровым и самоуправляемым. Но громоздить небольшие погрузчики и другую технику десятками камер и лидарами слишком дорого в промышленном масштабе.

Построение карты движения робота по данным двух энкодеров, применяя одометрию

Одометрия — использование данных о движении приводов для оценки перемещения.

Энкодер — устройство для замеров тех или иных параметров цифровыми методами. К таковым могут относиться параметры передвижения деталей, углы их поворота, направление перемещения, скорость. Два энкодера стоят гораздо меньше датчиков и дают меньше данных, которые нужно обработать. Энкодеры можно комбинировать с камерой для более точного результата

Я работал с уткоботом (duckiebot) из интересного проекта MIT — Duckietown. Алгоритм построения карты движения робота будет основан на формуле, предложенной MIT. Данные с энкодеров были получены с помощью ROS.

Разберём код:

import numpy as np
import matplotlib.pyplot as plt


class Odometry: # создаём класс
    """
        Creates a map based on file input.
    """

функция getInfo возвращает сортированные данные из файла

 def __init__(self):
        self.file = "Test.txt"  # путь к файлу сюда
        self.robotLength = 0.1

    def getInfo(self):
        encoderL = []
        encoderR = []
        time = []
        with open(self.file) as f:
            content = f.readlines()
        for line in content:
            lineCut = line.split(" ")
            encoderL.append(float(lineCut[0]))
            encoderR.append(float(lineCut[1]))
            time.append(float(lineCut[2]) / 10 ** 9)
        time_diff = np.diff(time)
        return encoderL, encoderR, time_diff

Магическая формула расчёта движения относительно координат и времени прошлого "тика". Подробное объяснение на 8 слайде

def odometry(self, x, y, date, theta, left, right):
        d = (left + right) / 2
        fi = (right - left) / (2 * self.robotLength)
        x1 = x + (date * d * np.cos(theta))
        y1 = y + (date * d * np.sin(theta))

        theta1 = theta + fi * date

        return x1, y1, theta1

функция, создающая карту

def createMap(self):
        x = [0]
        y = [0]
        theta = [0]
        encoderL, encoderR, time_diff = self.getInfo()

        for i in range(len(encoderL) - 1):
            x1, y1, theta1 = self.odometry(x[i], y[i], time_diff[i], theta[i], encoderL[i], encoderR[i])
            x.append(x1)
            y.append(y1)
            theta.append(theta1)

        plt.plot(x, y)
        plt.show()

напрямую вывести карту нельзя, нужно передать данные в другую переменную

output = Odometry()
output.createMap()

Вывод программы, используя тестовые данные, такой: (это норма)

Вывод

Энкодеры могут заменить дорогие датчики/камеры в некоторых задачах, но могут давать серьёзную погрешность (скользкий пол, или плохо работающий в данных условиях алгоритм) как здесь. Для простого погрузчика, которому нужна карта склада, чтобы знать, куда надо погрузить какой либо предмет, хватит.

Комментарии (4)


  1. AigizK
    20.06.2022 08:26
    +3

    Конкретно для машин такие энкодеры не подойдут. Так как со временем ошибок будет набираться все больше и больше. Но такие энкодеры используются в роборуках. Там как раз можно контролировать угол одного плеча относительно другого. Причем добиться точности можно очень хорошую, если использовать фототранзистор как light sensor. Так как в этом случае можно понять, насколько щель открыта. Соответсвенно если у тебя щелей скажем 36 и имеешь 50 состояний открытости щели, то у тебя точность уже 360/(50*36)=0.2 градуса будет.


  1. lab412
    20.06.2022 08:50

    в руках робота (больших, а не самоделках) используются шестеренки и зубчатые ремни которые исключают проскальзывания и пропуск шагов. так что если двигатель повернулся, то и рука сдвинулась. так же можно использовать решения из мелких сервоприводов когда не энкодер ставится а резистор и вы по сопротивлению точно знаете угол поворота.

    но вообще мне интересно - а почему не использовать принцип и датчики из обычных мышей? они работают на высоких частотах что позволяет двигать быстро, плюс лазерные мыши отлично ездят по любым поверхностям. чем не датчик для одометрии?


  1. Javian
    20.06.2022 09:34
    +1

    Если у робота колеса "надувные", а не цельнолитые, то есть еще один нюанс, известный по автомобилям. Разное давление в колесах - это немного разный диаметр, откуда набежит ошибка измеряемого пути.


  1. Boris_92
    20.06.2022 12:51
    +2

    Для простого погрузчика, которому нужна карта склада, чтобы знать, куда надо погрузить какой либо предмет, хватит.

    Страный выводы, почему хватит? что значит хватит?
    В большинстве случаев для таких задач используют робота с движением по линии.
    И как связана первая и вторая части статьи? Помимо всего прочего камеры и лидары используются для предотвращения ДТП, а понимать где находится в настоящий момент машина можно и по системам GNSS.