суббота, 23 июля 2016 г.

EV3 Параллельная парковка

В этом сезоне в одной из категорий Всероссийской Робототехнической Олимпиады "Роботраффик" нам запомнилась интересная задачка, "параллельная парковка". Мы подумали что было бы интересно решить ее с использованием платформы LEGO Mindstorms EV3.



Техническое задание звучало так: создать автономное роботизированное транспортное средство, способное самостоятельно провести процедуру парковки в случае наличия свободного места в зоне парковки. 



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


Для решения задачи мы решили воспользоваться распространенным робо-реквизитом: кругом для сумо (кегельринга) в качестве трассы, кеглями и банками - в качестве макетов ТС, стоящих на обочине.
Автономное роботизированное транспортное средство, которое мы собрали для решения данной задачи основано на шасси от бонусной модели RAC3 TRUCK из домашней версии EV3. Мы доработали рулевое управление модели для достижения больших углов разворота и установили датчики - пару датчиков освещенности для движения по линии и ИК-датчик расстояния для определения макетов транспортных средств на обочине.


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

Моторы и датчики подключены так:
  • Мотор А - рулевое управление, моторы B и С - ходовые
  • Порты 1 и 2 - датчики линии, порт 4 - ИК-дальномер
Программу для робота мы написали в среде EV3 Basic. Выглядит она следующим образом:

' инициализируем датчики
Sensor.SetMode(1,0)
Sensor.SetMode(2,0)
Sensor.SetMode(4,0)

' переменные - коэф-ты для регулятора
k = 2
Pk = 7
Dk = 10  
Popr = 12
Ug = 0
M = "A"
e_o = 0

' триггер для подсчета банок
trigger = "False"

' запускаем ходовые моторы
Motor.Start("B",-75)
Motor.Start("C",-75)

While "True"
  While "True"
    ' разница в показаниях датчиков с учетом поправки  
    r = Sensor.ReadPercent(1)-(Sensor.ReadPercent(2)+Popr)
    ' требуемый угол разворота колес
    Ug = r * k
    ' ошибка регулятора - разница требуемого угла и текущего
    e = Ug - Motor.GetCount("A")
    ' подаем управляющее воздействие на рулевой мотор  
    Motor.Start(M,e*Pk+Dk*(e-e_o))
    ' сохраняем ошибку для работы дифференциальной компоненты регулятора
    e_o = e
    
    ' определяем расстояние ИК-датчиком
    tmp = Sensor.ReadPercent(4)
    
    If tmp < 22 Then
      ' если банка "первая"
      If trigger = "False" Then
        ' сбрасываем энкодеры и запоминаем в триггере
        Motor.ResetCount("BC")
        trigger = "True"
      Else
        ' иначе проверяем - умещается ли ТС в промежутке
        if (Motor.GetCount("B") + Motor.GetCount("C")) / 2 < -979 Then
          ' если да - паркуемся
          Goto parkovka
          trigger = "False"
        Else
          ' если нет - считаем эту банку "первой"
          Motor.ResetCount("BC")
          trigger = "True"
        EndIf
      EndIf
    EndIf
       
  EndWhile    
  
  ' маневр парковки
  parkovka:
  
  Speaker.Note(100,"C4",500)
  
  Motor.ResetCount("BC")
  
  ' проезжаем вперед по линии "500 градусов"
  While (Motor.GetCount("B") + Motor.GetCount("C"))/2 > -500
    r = Sensor.ReadPercent(1)-(Sensor.ReadPercent(2)+Popr)
    Ug = r * k
    e = Ug - Motor.GetCount("A")  
    Motor.Start(M,e*Pk+Dk*(e-e_o))
    e_o = e
  EndWhile
  
  ' маневр заезда на парковочное место
  Motor.Schedule("A",30,0,90,0,"True")
  Motor.Schedule("BC",30,0,530,0,"True")
  Motor.Wait("ABC")
  Motor.Schedule("A",-30,0,115,0,"True")
  Motor.Schedule("BC",30,0,950,0,"True")
  Motor.Wait("ABC")
  
  Motor.Stop("BC","True")
  Program.Delay(1000)
  
  ' маневр выезда из парковочного места
  Motor.Schedule("A",50,0,15,0,"False")
  Motor.Schedule("BC",-30,0,730,0,"True")
  Motor.Wait("ABC")
  Motor.Schedule("A",30,0,65,0,"True")
  Motor.Schedule("BC",-30,0,250,0,"True")
  Motor.Wait("ABC")
  
  Motor.Start("B",-75)
  Motor.Start("C",-75)

EndWhile

воскресенье, 10 июля 2016 г.

Большой железный робот. Часть 4. Добавим еще железа

Давненько не было вестей от нашего большого железного робота. Не смотря на плотный график подготовки к соревнованиям (ВРО) работы по проекту все же двигались, хотя и не так быстро, как нам хотелось бы. Вот так вот наш робот выглядит в данный момент:


Первым делом мы установили П-образный каркас, из того же алюминиевого профиля 25x25x2, из которого ранее собирали раму. Крепление каркаса выполнено Г-образными мебельными уголками и болтами М6. В высоту каркас от уровня пола в верхней точке - 65 см.



На каркас смонтировали сервоподвес с двумя степенями свободы, это будущая "шея" робота, этот механизм будет двигать головой. Голову планируем собирать в следующий раз, хотим смонтировать на ней камеру, микрофон, динамик-твиттер и антенны wi-fi.




Сервоприводы использовали с металлическими редукторами, MG995.


Электронные компоненты решили разделить на группы, разместив их в разных отсеках. Наш робот - учебный, поэтому важно чтобы все в нем было наглядным. Исходя из этого мы выделили следующие 4 группы компонентов:

1) "Силовой отсек" содержит драйверы двигателей, усилитель мощности звука. Об этих штуковинах мы писали в предыдущих частях статьи.





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


2) "Отсек питания" содержит разводку силового питания, кнопку включения робота, предохранитель.



3) "Мозговой центр" содержит Raspberry Pi 2 и Arduino Mega 2560, соединенные по USB. В Raspberry Pi 2 вставлен Wi-Fi адаптер. Кроме этого здесь мы разместили датчики напряжения и силы тока. 




Дял получения стабильных 5В используем преобразователь DC-DC на 5А
Датчик напряжения позволит контролировать заряд батареи, чтобы не допустить слишком сильного ее разряда. 
Датчик силы тока ACS712 ACS712ELC-30A позволит контролировать потребление энергии роботом, на основании этих данных можно прогнозировать время, которое он еще сможет проработать, программно снижать токи потребления (замедлять моторы в режим экономии при низком заряде аккумулятора).


4) "Отсек управления сервоприводами". Здесь будут сосредоточены компоненты для управления сервоприводами "шеи" и, возможно, "рук" робота (манипуляторов). Кроме этого здесь планируется разместить электронный компас. Питание сервоприводам будет обеспечивать отдельный DC-DC преобразователь.




Монтажные отсеки соединены гофрированными трубками для проводов (сливной шланг для стиральной машины).


Каркас собран с использованием металлопластиковых труб, болтов и шпилек М6.




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



Самое популярное