новосибирский государственный технический университет
Скачать 132.06 Kb.
|
МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ ФЕДЕРАЛЬНОЕ государственное БЮДЖЕТНОЕ образовательное учреждение высшего образования «НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ» __________________________________________________________________ Кафедра вычислительной техники Отчёт по лабораторной работе №1 по дисциплине: «Автономные роботы и многоагентные системы»
Новосибирск, 2021 Содержание1.Цель работы: 3 2.Задачи: 3 3.Ход работы 4 4.Выводы: 6 Приложение А 8 Приложение Б 9 Приложение В 10 Цель работы:Знакомство с симулятором CoppeliaSim и принципами автоматического управления движением мобильного робота по разметке с использованием алгоритмов теории автоматического управления. Задачи:Познакомиться с основными понятиями симулятора CoppeliaSim: сцена, примитивы, соединения, типы объектов. Загрузить модели робота и полигона (см. список ссылок на материалы). Освоить базовые приемы при работе на сцене в симуляторе CoppeliaSim Познакомиться с приемами и способами управления движением модели мобильного робота с двумя моторами и двумя визуальными датчиками Получить значения средней яркости по кадру с визуальных датчиков. Результаты занести в Таблицу 1 Создать собственный полигон (см. требования). Составить алгоритм управления движением мобильного робота на основе: переключателя П-регулятора ПД-регулятора Выполнить тестирование разработанных алгоритмов на сцене и занести результаты проведенных экспериментов в Табл.2 ДОПОЛНИТЕЛЬНЫЕ БАЛЛЫ: ПИД и его реализация для движения по полю, на котором одновременно расположены черная линия на белом фоне и белая линия на черном поле. Ход работыВ первую очередь будет составлен собственный полигон из элементов, представленных в исходных материалах. Вид сверху на составленный полигон представлен на рисунке 1. Рисунок 1 - Испытательный полигон Затем была заполнена таблица 1, содержащая численную оценку показаний визуальных датчиков. Таблица 1. Численная оценка показаний визуальных датчиков.
После того, как на поле был выставлен транспорт, можно приступать к написанию алгоритмов, управляемых данным транспортным средством. Результат прохождения исходного полигона отражается в таблице 2, представленной ниже. Код написанных алгоритмов будет представлен в приложении к данному отчёту по лабораторной работе. Код алгоритма «переключатель» - приложение А, код алгоритма «П-регулятор» - приложение Б, код алгоритма «ПД-регулятор» - приложение В. Во всех приложениях представлен код, при котором моторы работают на 80%. Таблица 2. Результат экспериментов
Выводы:В ходе выполнения лабораторной работы были написаны 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 |