Главная страница
Навигация по странице:

  • Отчёт по лабораторной работе №1 по дисциплине: «

  • Левый датчик Значение ошибки ( err = L - R )

  • Численное значение с датчика Внешний вид показаний визуального датчика

  • Алгоритм Знач. коэфф. Мощность моторов.

  • Факт прохождения полного круга (да/нет)

  • Название элемента, на котором возникает срыв с линии

  • новосибирский государственный технический университет


    Скачать 132.06 Kb.
    Названиеновосибирский государственный технический университет
    Дата14.08.2021
    Размер132.06 Kb.
    Формат файлаdocx
    Имя файлаARiMS_LR1.docx
    ТипОтчет
    #226914


    МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ
    ФЕДЕРАЛЬНОЕ государственное БЮДЖЕТНОЕ

    образовательное учреждение

    высшего образования

    «НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ»

    __________________________________________________________________



    Кафедра вычислительной техники


    Отчёт по лабораторной работе №1

    по дисциплине: «Автономные роботы и многоагентные системы»

    Выполнил:

    студент АВТФ, гр. АММ-20

    Таханов Эрмен Юрьевич
    ________________

    (подпись)
    «___» ________ 2021 г.

    Проверил:

    к.т.н. доцент

    Яковина Ирина Николаевна

    ________________

    (подпись)
    «___» ________ 2021 г.

    Новосибирск, 2021

    Содержание


    1.Цель работы: 3

    2.Задачи: 3

    3.Ход работы 4

    4.Выводы: 6

    Приложение А 8

    Приложение Б 9

    Приложение В 10


    1. Цель работы:


    Знакомство с симулятором CoppeliaSim и принципами автоматического управления движением мобильного робота по разметке с использованием алгоритмов теории автоматического управления.

    1. Задачи:


    1. Познакомиться с основными понятиями симулятора CoppeliaSim: сцена, примитивы, соединения, типы объектов.

    2. Загрузить модели робота и полигона (см. список ссылок на материалы).

    3. Освоить базовые приемы при работе на сцене в симуляторе CoppeliaSim

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

    5. Получить значения средней яркости по кадру с визуальных датчиков. Результаты занести в Таблицу 1

    6. Создать собственный полигон (см. требования).

    7. Составить алгоритм управления движением мобильного робота на основе:

    • переключателя

    • П-регулятора

    • ПД-регулятора

    1. Выполнить тестирование разработанных алгоритмов на сцене и занести результаты проведенных экспериментов в Табл.2

    2. ДОПОЛНИТЕЛЬНЫЕ БАЛЛЫ: ПИД и его реализация для движения по полю, на котором одновременно расположены черная линия на белом фоне и белая линия на черном поле.
    1. Ход работы


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



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

    Таблица 1. Численная оценка показаний визуальных датчиков.

    Левый датчик

    Значение ошибки (err = L - R)

    Правый датчик

    Внешний вид показаний визуального датчика

    Численное значение с датчика

    Численное значение с датчика

    Внешний вид показаний визуального датчика



    1

    0

    1





    1

    1

    0





    0

    -1

    1





    0

    0

    0





    0,69

    0,15

    0,54





    0,67

    0,23

    0,44




    После того, как на поле был выставлен транспорт, можно приступать к написанию алгоритмов, управляемых данным транспортным средством. Результат прохождения исходного полигона отражается в таблице 2, представленной ниже.

    Код написанных алгоритмов будет представлен в приложении к данному отчёту по лабораторной работе. Код алгоритма «переключатель» - приложение А, код алгоритма «П-регулятор» - приложение Б, код алгоритма «ПД-регулятор» - приложение В. Во всех приложениях представлен код, при котором моторы работают на 80%.

    Таблица 2. Результат экспериментов

    Алгоритм

    Знач. коэфф.

    Мощность моторов.

    (при макс. скорости = pi рад/с)

    Стабильность прохождения участка пути

    Факт прохождения полного круга (да/нет)

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

    Название элемента, на котором возникает срыв с линии

    Переключатель

    0.45 – ведущее колесо, (-0.1) – ведомое колесо

    20%

    Да

    39:25




    40%

    Да

    19:45




    60%

    Да

    13:17




    80%

    Да

    10:04




    100%

    Да

    08:08




    П-

    регулятор

    При повороте: Левое колесо – (err*5), правое – (-err*5)

    20%

    Да

    14:44




    40%

    Да

    06:42




    60%

    Да

    04:14




    80%

    Да

    03:03




    100%

    Да

    02:25




    ПД-

    регулятор

    Kp = 2 (Для поворотов и езды по прямой), Kd = 15 – для поворотов.

    20%

    Да

    09:05




    40%

    Да

    03:56




    60%

    Да

    02:32




    80%

    Да

    01:51




    100%

    Да

    01:35






    1. Выводы:


    В ходе выполнения лабораторной работы были написаны 3 алгоритма управления роботизированным транспортным средством. Первый алгоритм основан на принципе переключателя. Данный алгоритм оказался наиболее неэффективным. При этом минимальное время прохождения пути составило порядка 8 минут при 100% мощности двигателя, ограниченного pi рад/с.

    Следующим в списке был алгоритм «Пропорциональный регулятор». При тех же условиях транспортное средство преодолело путь за 2:25, что оказалось в 3 раза быстрее предыдущего алгоритма. В нашем случае был использован пропорциональный коэффициент Kp = 5.

    Последним алгоритмом был алгоритм «Пропорционально-дифференциальный регулятор». Самое быстрое время прохождения того же пути составило 1:35, что в 1,5 раза быстрее предыдущего алгоритма, однако при прохождении трассы на резких поворотах транспортное средство начинает колебаться. Были использованы следующие коэффициенты: Kp = 2, Kd = 15.

    Приложение А


    function sysCall_init()

    ---- 1. Get objects handler

    motor_L =sim.getObjectHandle("revJoint_wheelL")

    motor_R =sim.getObjectHandle("revJoint_wheelR")

    visSensor_L =sim.getObjectHandle("Vision_sensorL")

    visSensor_R =sim.getObjectHandle("Vision_sensorR")
    end

    function sysCall_actuation()

    ----2. Read vis sensor

    isErrL, visArr_L = sim.readVisionSensor(visSensor_L)

    isErrR, visArr_R = sim.readVisionSensor(visSensor_R)
    ---- 3. Check aviability visArr_R

    if visArr_L = nil and visArr_R = nil then

    -- 4. Calc err = L - R

    err = visArr_L[11] - visArr_R[11]

    print(" visArr L=", visArr_L[11], "; R =", visArr_R[11], "; err =", err)

    -- 5. Rule

    if err >= 0 then

    ---- if err=L-R > make RIGHT turn

    sim.setJointTargetVelocity(motor_L, 0.8*math.pi*0.45)

    sim.setJointTargetVelocity(motor_R, 0.8*math.pi*-0.1)

    else

    ---- if err=L-R > make LEFT turn

    sim.setJointTargetVelocity(motor_L, 0.8*math.pi*-0.1)

    sim.setJointTargetVelocity(motor_R, 0.8*math.pi*0.45)

    end


    end
    end

    function sysCall_sensing()

    --print("sysCall_sensing")

    end
    function sysCall_cleanup()

    -- do some clean-up here

    end

    Приложение Б


    function sysCall_init()

    ---- 1. Get objects handler

    motor_L =sim.getObjectHandle("revJoint_wheelL")

    motor_R =sim.getObjectHandle("revJoint_wheelR")

    visSensor_L =sim.getObjectHandle("Vision_sensorL")

    visSensor_R =sim.getObjectHandle("Vision_sensorR")
    end

    function sysCall_actuation()

    ----2. Read vis sensor

    isErrL, visArr_L = sim.readVisionSensor(visSensor_L)

    isErrR, visArr_R = sim.readVisionSensor(visSensor_R)
    ---- 3. Check aviability visArr_R

    if visArr_L = nil and visArr_R = nil then

    -- 4. Calc err = L - R

    err = visArr_L[11] - visArr_R[11]

    print(" visArr L=", visArr_L[11], "; R =", visArr_R[11], "; err =", err)

    -- 5. Rule

    if err <0.05 and err > -0.05 then

    ---- if GO STRAIGHT

    sim.setJointTargetVelocity(motor_L, 0.8*math.pi)

    sim.setJointTargetVelocity(motor_R, 0.8*math.pi)

    else

    ---- if TURN

    sim.setJointTargetVelocity(motor_L, 0.8*math.pi*err*5)

    sim.setJointTargetVelocity(motor_R, 0.8*math.pi*(-err*5))

    end


    end
    end

    function sysCall_sensing()

    --print("sysCall_sensing")

    end
    function sysCall_cleanup()

    -- do some clean-up here

    end

    Приложение В


    function sysCall_init()

    ---- 1. Get objects handler

    motor_L =sim.getObjectHandle("revJoint_wheelL")

    motor_R =sim.getObjectHandle("revJoint_wheelR")

    visSensor_L =sim.getObjectHandle("Vision_sensorL")

    visSensor_R =sim.getObjectHandle("Vision_sensorR")


    end

    function sysCall_actuation()

    delta = 0

    previousErr = 0
    ----2. Read vis sensor

    isErrL, visArr_L = sim.readVisionSensor(visSensor_L)

    isErrR, visArr_R = sim.readVisionSensor(visSensor_R)
    ---- 3. Check aviability visArr_R

    if visArr_L = nil and visArr_R = nil then

    -- 4. Calc err = L - R

    err = visArr_L[11] - visArr_R[11]

    print(" visArr L=", visArr_L[11], "; R =", visArr_R[11], "; err =", err)

    delta = err - previousErr

    previousErr = err

    if err < 0.04 and err > -0.04 then

    ---- if GO STRAIGHT

    sim.setJointTargetVelocity(motor_L,0.8*math.pi*2)

    sim.setJointTargetVelocity(motor_R,0.8*math.pi*2)

    else

    ---- if TURN

    sim.setJointTargetVelocity(motor_L,0.8*(math.pi*2*err+delta*15))

    sim.setJointTargetVelocity(motor_R,0.8*(math.pi*2*-err-delta*15))

    end
    end
    end

    function sysCall_sensing()

    --print("sysCall_sensing")

    end
    function sysCall_cleanup()

    -- do some clean-up here

    end


    написать администратору сайта