Оглавление:

Настройка последователя линии GiggleBot - продвинутый уровень: 7 шагов
Настройка последователя линии GiggleBot - продвинутый уровень: 7 шагов

Видео: Настройка последователя линии GiggleBot - продвинутый уровень: 7 шагов

Видео: Настройка последователя линии GiggleBot - продвинутый уровень: 7 шагов
Видео: [Устарело] Как убрать выпирающие углы? Настройка Linear advance для вашего 3D принтера 2024, Ноябрь
Anonim
Настройка последователя линии GiggleBot - Дополнительно
Настройка последователя линии GiggleBot - Дополнительно

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

В этом уроке мы показываем вам 2 скрипта, которые могут быть загружены на разные BBC micro: биты, так что один из них помещается в GiggleBot, а с другим 2 кнопки используются для перехода по меню и настройки различных параметры. Отправка этих обновленных параметров осуществляется по радио.

Шаг 1. Необходимые компоненты

Вам понадобится следующее:

  1. Робот GiggleBot для micro: bit.
  2. x3 батарейки типа АА
  3. x2 BBC micro: bits - один для GiggleBot, а другой действует как пульт для настройки параметров.
  4. Батарея для BBC micro: bit - вроде той, что входит в комплект BBC micro: bit.

Получите робота GiggleBot для BBC micro: bit здесь

Шаг 2: Настройка треков и окружения

Настройка треков и окружения
Настройка треков и окружения
Настройка треков и окружения
Настройка треков и окружения

Вы также должны создать свои треки (загрузить, распечатать, вырезать и записать плитки), а затем настроить среду (IDE и среду выполнения).

Поскольку это руководство очень похоже на другое руководство под названием GiggleBot Line Follower, просто перейдите туда и выполните шаги 2 и 3, а затем вернитесь сюда.

Что касается IDE, вы можете использовать редактор Mu, а для среды выполнения вам необходимо загрузить GiggleBot MicroPython Runtime. Среду выполнения можно загрузить из документации по этой ссылке. Перейдите к главе документации "Начало работы" и следуйте этим инструкциям по настройке среды. На данный момент используется версия v0.4.0 среды выполнения.

Шаг 3. Настройка GiggleBot

Перед прошивкой среды выполнения на GiggleBot убедитесь, что вы выбрали желаемую скорость и частоту обновления для GiggleBot: по умолчанию скорость установлена на 100 (переменная base_speed), а частота обновления установлена на 70 (переменная update_rate).

Учитывая текущую реализацию, наивысшая частота обновления, которая может быть достигнута, составляет 70, и если run_neopixels установлено в True, то достижимо только 50. Таким образом, можно сказать, что частота обновления по умолчанию находится на грани возможностей BBC micro: bit.

Для справки: датчик слежения за линией может возвращать обновления 100 раз в секунду.

Примечание. В следующем скрипте могут отсутствовать пробелы, и это, по-видимому, связано с некоторой проблемой при отображении GitHub Gists. Нажмите на суть, чтобы перейти на страницу GitHub, где вы можете скопировать и вставить код.

GiggleBot PID Line Follower Tuner (для настройки требуется пульт) - xjfls23

из микробитового импорта *
из импорта gigglebot *
из utime импортировать sleep_ms, ticks_us
импортное радио
импортное устройство
# инициализировать радио и неопиксели GB
radio.on ()
neo = init ()
# тайминги
update_rate = 70
# значения усиления по умолчанию
Kp = 0,0
Ki = 0,0
Kd = 0,0
уставка = 0,5
trigger_point = 0,0
min_speed_percent = 0,2
base_speed = 100
last_position = заданное значение
интеграл = 0,0
run_neopixels = Ложь
center_pixel = 5 # где центральный пиксель улыбки расположен на ГБ
# turquoise = tuple (map (lambda x: int (x / 5), (64, 224, 208))) # цвет для отображения ошибки с помощью неопикселей
# turquoise = (12, 44, 41) # это именно та бирюза, которая прокомментирована выше
error_width_per_pixel = 0.5 / 3 # максимальная ошибка, деленная на количество сегментов между каждым неопикселем
defupper_bound_linear_speed_reducer (abs_error, trigger_point, upper_bound, smallest_motor_power, high_motor_power):
глобальная base_speed
если abs_error> = точка_пуска:
# x0 = 0,0
# y0 = 0,0
# x1 = upper_bound - точка_пуска
# y1 = 1.0
# x = abs_error - точка_пуска
# y = y0 + (x - x0) * (y1 - y0) / (x1 - x0)
# такой же как
y = (abs_error - точка_пуска) / (верхняя граница - точка_пуска)
мощность_двигателя = базовая_скорость * (наименьшая_мощность_двигателя + (1- год) * (наибольшая_мощность_двигателя - наименьшая_мощность_двигателя))
вернуть motor_power
еще:
вернуть base_speed * high_motor_power
run = False
previous_error = 0
total_time = 0,0
total_counts = 0
whileTrue:
# если нажата кнопка a, то начинаем подписку
если button_a.is_pressed ():
run = True
# но если кнопка b нажата, останавливает следящий за строкой
если button_b.is_pressed ():
run = False
интеграл = 0,0
previous_error = 0,0
display.scroll ('{} - {}'. format (total_time, total_counts), delay = 100, wait = False)
total_time = 0,0
total_counts = 0
Pixel_off ()
останавливаться()
sleep_ms (500)
если запустить isTrue:
# считываем линейные датчики
start_time = ticks_us ()
# проверьте, обновили ли мы прирост Kp / Kd с помощью пульта дистанционного управления
пытаться:
Kp, Ki, Kd, точка_пуска, min_speed_percent = ustruct.unpack ('fffff', radio.receive_bytes ())
set_eyes ()
exceptTypeError:
проходить
справа, слева = read_sensor (LINE_SENSOR, BOTH)
# строка слева при позиции <0,5
# строка справа при позиции> 0,5
# строка находится посередине, когда position = 0.5
# это взвешенное среднее арифметическое
пытаться:
позиция = вправо / плавающее (влево + вправо)
exceptZeroDivisionError:
позиция = 0,5
если позиция == 0: позиция = 0,001
если позиция == 1: позиция = 0,999
# использовать контроллер PD
error = position - уставка
интеграл + = ошибка
исправление = Kp * ошибка + Ki * интеграл + Kd * (error - previous_error)
previous_error = ошибка
# вычислить скорости двигателя
motor_speed = upper_bound_linear_speed_reducer (абс (ошибка), заданное значение * значение триггера, заданное значение, min_speed_percent, 1.0)
leftMotorSpeed = motor_speed + коррекция
rightMotorSpeed = motor_speed - коррекция
# подсвечиваем неопиксели, чтобы показать, в каком направлении должен идти GiggleBot
если run_neopixels истинно и total_counts% 3 == 0:
для i inb '\ x00 / x01 / x02 / x03 / x04 / x05 / x06 / x07 / x08':
neo = (0, 0, 0)
для i inb '\ x00 / x01 / x02 / x03':
ifabs (ошибка)> error_width_per_pixel * i:
если ошибка <0:
neo [center_pixel + i] = (12, 44, 41)
еще:
neo [center_pixel - i] = (12, 44, 41)
еще:
процент = 1- (error_width_per_pixel * i -abs (error)) / error_width_per_pixel
# загораем текущий пиксель
если ошибка <0:
# neo [center_pixel + i] = кортеж (map (lambda x: int (x * процент), бирюзовый))
neo [center_pixel + i] = (int (12 * процентов), int (44 * процентов), int (41 * процентов))
еще:
# neo [center_pixel - i] = tuple (map (lambda x: int (x * процент), бирюзовый))
neo [center_pixel - i] = (int (12 * процентов), int (44 * процентов), int (41 * процентов))
перерыв
neo.show ()
пытаться:
# закрепить моторы
если leftMotorSpeed> 100:
leftMotorSpeed = 100
rightMotorSpeed = rightMotorSpeed - leftMotorSpeed +100
если rightMotorSpeed> 100:
rightMotorSpeed = 100
leftMotorSpeed = leftMotorSpeed - rightMotorSpeed +100
если leftMotorSpeed <-100:
leftMotorSpeed = -100
если rightMotorSpeed <-100:
rightMotorSpeed = -100
# запустить моторы
set_speed (leftMotorSpeed, rightMotorSpeed)
водить машину()
# print ((ошибка, скорость_двигателя))
Кроме:
# на случай, если мы столкнемся с какой-то неустранимой проблемой
проходить
# и поддерживать частоту контура
end_time = ticks_us ()
delay_diff = (end_time - start_time) / 1000
total_time + = delay_diff
total_counts + = 1
if1.0 / update_rate - delay_diff> 0:
сон (1.0 / update_rate - delay_diff)

просмотреть rawgigglebot_line_follower_tuner.py, размещенный на ❤ на GitHub

Шаг 4: Настройка тюнера (удаленная)

Следующее, что нам нужно сделать, это прошить runtime + скрипт на второй бит BBC micro: bit. Этот второй micro: bit будет действовать как удаленный для GiggleBot, который будет использоваться для настройки следующих параметров:

  1. Kp = пропорциональное усиление для ПИД-регулятора.
  2. Ki = интегральное усиление для ПИД-регулятора.
  3. Kd = производное усиление для ПИД-регулятора.
  4. trigger_point = точка, выраженная в процентах между минимальной и максимальной скоростью GiggleBot, где скорость начинает линейно снижаться, пока не достигнет минимальной скорости.
  5. min_speed_percent = минимальная скорость, выраженная в процентах от максимальной скорости.

Две другие оставшиеся переменные, которые можно настроить, напрямую жестко запрограммированы в скрипте, который находится на GiggleBot: update_rate и base_speed, которые представляют максимальную скорость. Как описано в документации, максимальная скорость, которую можно установить для GiggleBot, составляет 100, что также является значением по умолчанию для нашего GiggleBot.

Примечание. В следующем скрипте могут отсутствовать пробелы, и это, по-видимому, связано с некоторой проблемой при отображении GitHub Gists. Нажмите на суть, чтобы перейти на страницу GitHub, где вы можете скопировать и вставить код.

GiggleBot Remote PID Line Follower Tuner (требуется другая часть) - xjfls23

из микробитового импорта *
из utime импорта sleep_ms
импортное радио
импортное устройство
# 1-й элемент - коэффициент усиления Kp
# 2-й элемент - коэффициент усиления Ki
# 3-й элемент - коэффициент усиления Kd
# 4-й элемент - это точка запуска для двигателей, чтобы снизить скорость (0 -> 1)
# 5-й элемент - это минимальная скорость двигателей, выраженная в процентах (0 -> 1).
прирост = [0,0, 0,0, 0,0, 1,0, 0,0]
stepSize = 0,1
# 0 и 1 для 1-го элемента
# 2 и 3 для 2-го элемента
currentSetting = 0
defshowMenu ():
display.scroll ('{} - {}'. format (currentSetting, gains [int (currentSetting / 2)]), delay = 100, wait = False)
radio.on ()
showMenu ()
whileTrue:
updated = False
если button_a.is_pressed ():
currentSetting = (currentSetting +1)% (2 * 5)
updated = True
если button_b.is_pressed ():
если currentSetting% 2 == 0:
# увеличить усиление, если currentSetting равен 0 или 2 или..
ifint (currentSetting / 2) в [0, 2]:
выигрыши [int (currentSetting / 2)] + = 10 * stepSize
еще:
выигрыши [int (currentSetting / 2)] + = stepSize
еще:
# увеличить усиление, если currentSetting равен 1 или 3 или..
ifint (currentSetting / 2) в [0, 2]:
выигрыши [int (currentSetting / 2)] - = 10 * stepSize
еще:
выигрыши [int (currentSetting / 2)] - = stepSize
radio.send_bytes (ustruct.pack ('fffff', * прирост))
updated = True
если обновлено:
showMenu ()
sleep_ms (200)

просмотреть rawgigglebot_line_follower_configurator.py, размещенный на ❤ на GitHub

Шаг 5: настройка GiggleBot

Настройка GiggleBot
Настройка GiggleBot

Поместите GiggleBot на дорожку, включите и дайте ему поработать. Тем временем вам постоянно придется возвращать его на дорожку и настраивать коэффициенты усиления / параметры с помощью другого микробита BBC, который вы держите в руке.

Чтобы запустить GiggleBot, нажмите кнопку A на BBC micro: bit GiggleBot, а чтобы остановить его и, таким образом, сбросить его состояние, нажмите кнопку B.

На удаленном BBC micro: bit нажатие кнопки A проведет вас по каждому параметру в его меню, а кнопка B увеличивает / уменьшает соответствующее значение. Это как установить часы на приборной панели старой машины. Варианты такие:

  1. Варианты 0-1 предназначены для усиления Kp.
  2. 2–3 варианта предназначены для усиления Ki.
  3. 4-5 вариантов для усиления Kd.
  4. 6-7 вариантов предназначены для установки уставки на момент начала замедления двигателей.
  5. 8-9 вариантов предназначены для установки минимальной скорости.

Имейте в виду, что четные числа в меню предназначены для увеличения соответствующих значений, а для нечетных - наоборот.

Кроме того, при нажатии кнопки B на BBC micro: bit GiggleBot вы увидите на его экране, созданном с помощью Neopixel, количество миллисекунд, прошедших с момента последнего сброса, и количество циклов, которые прошел робот - с помощью этих 2 вы можете вычислить частота обновления робота.

Наконец, что наиболее важно, я придумал 2 настройки для GiggleBot. Один из них - когда светодиоды Neopixel выключены, а другой - когда это не так. Светодиоды Neopixel показывают, в каком направлении накопилась ошибка.

1-й набор настройки параметров (при выключенных светодиодах NeoPixel)

  1. Кр = 32,0
  2. Ki = 0,5
  3. Kd = 80,0
  4. trigger_setpoint = 0,3 (что составляет 30%)
  5. min_speed_percent = 0,2 (что составляет 20%)
  6. base_speed = 100 (также известная как максимальная скорость)
  7. update_rate = 70 (работает при 70 Гц)

2-й набор настройки параметров (при включенных светодиодах NeoPixel)

  1. Kp = 25,0
  2. Ki = 0,5
  3. Kd = 35,0
  4. trigger_setpoint = 0,3 (что составляет 30%)
  5. min_speed_percent = 0,3 (что составляет 30%)
  6. base_speed = 70 (также известная как максимальная скорость)
  7. update_rate = 50 (работает при 50 Гц)
  8. Кроме того, для переменной run_neopixels необходимо установить значение True в скрипте, который загружается в бит micro: bit BBC GiggleBot. Это заставит светодиоды NeoPixel мигать таким образом, чтобы они указывали, в каком направлении накапливается ошибка.

Шаг 6: GiggleBot работает с выключенным NeoPixels

Это пример запуска GiggleBot с первыми параметрами настройки, найденными на предыдущем шаге. В этом примере светодиоды NeoPixel выключены.

Шаг 7. GiggleBot работает с включенными неопикселями

Это пример запуска GiggleBot со вторым набором параметров настройки, найденных на шаге 5. В этом примере включены светодиоды NeoPixel.

Обратите внимание, как в этом примере GiggleBot сложнее следовать за линией - это потому, что светодиоды Neopixel «съедают» процессорное время BBC micro: bit. Поэтому пришлось снизить частоту обновления с 70 до 50.

Рекомендуемые: