İçindekiler:

GiggleBot Çizgi Takipçisini Ayarlama - Gelişmiş: 7 Adım
GiggleBot Çizgi Takipçisini Ayarlama - Gelişmiş: 7 Adım

Video: GiggleBot Çizgi Takipçisini Ayarlama - Gelişmiş: 7 Adım

Video: GiggleBot Çizgi Takipçisini Ayarlama - Gelişmiş: 7 Adım
Video: Big hero 6 2024, Kasım
Anonim
GiggleBot Çizgi Takipçisini Ayarlama - Gelişmiş
GiggleBot Çizgi Takipçisini Ayarlama - Gelişmiş

Bu çok kısa Instructables'ta kendi GiggleBot'unuzu siyah bir çizgiyi takip edecek şekilde ayarlayacaksınız. Bu diğer öğreticide GiggleBot Line Follower, bu senaryoya göre çalışmak için ayar değerlerini sabit kodladık. Başka kazançlar elde ederek daha iyi davranmasını sağlamak isteyebilirsiniz.

Bu eğitimde size, biri GiggleBot'a yerleştirilecek şekilde farklı BBC mikro:bitlerine yüklenebilen ve diğeriyle birlikte 2 düğme bir menüde gezinmek ve farklı ayarları yapmak için kullanılan 2 komut dosyası gösteriyoruz. parametreler. Bu güncellenen parametrelerin gönderimi telsiz üzerinden yapılır.

Adım 1: Gerekli Bileşenler

Aşağıdakilere ihtiyacınız olacak:

  1. micro:bit için bir GiggleBot robotu.
  2. x3 AA Piller
  3. x2 BBC micro:bits - biri GiggleBot için, diğeri ise parametreleri ayarlamak için uzaktan kumanda görevi görür.
  4. BBC micro:bit için bir pil - BBC micro:bit paketiyle gelene benzer.

BBC micro:bit için GiggleBot Robot'u buradan edinin

2. Adım: Yolları ve Ortamı Ayarlama

Parkurları ve Ortamı Ayarlama
Parkurları ve Ortamı Ayarlama
Parkurları ve Ortamı Ayarlama
Parkurları ve Ortamı Ayarlama

Ayrıca parçalarınızı gerçekten oluşturmanız (indirme, yazdırma, kesme ve bant döşemeleri) ve ardından ortamı (IDE ve çalışma zamanı) ayarlamanız gerekir.

Bu öğretici, GiggleBot Line Follower başlıklı diğer öğreticiyle çok ilgili olduğundan, oraya gidin ve 2. ve 3. adımları izleyin ve ardından buraya geri dönün.

IDE'ye gelince, Mu editörünü kullanabilirsiniz ve çalışma zamanı için GiggleBot MicroPython Runtime'ı indirmeniz gerekir. Çalışma zamanı, buradaki belgelerinden indirilebilir. Belgelerin Başlarken bölümüne gidin ve ortamın kurulumuyla ilgili talimatları izleyin. Bu andan itibaren, çalışma zamanının v0.4.0 sürümü kullanılmaktadır.

Adım 3: GiggleBot'u Ayarlama

Çalışma zamanını GiggleBot'a göndermeden önce, GiggleBot için istediğiniz hızı ve güncelleme oranını seçtiğinizden emin olun: varsayılan olarak hız 100'e (temel_hız değişkeni) ve güncelleme hızı 70'e (update_rate değişkeni) ayarlanmıştır.

Mevcut uygulama göz önüne alındığında, elde edilebilecek en yüksek güncelleme hızı 70'tir ve run_neopixels True olarak ayarlanırsa, yalnızca 50 elde edilebilir. Yani bir bakıma, varsayılan güncelleme hızının BBC micro:bit'in yapabileceklerinin hemen yanında olduğunu söyleyebilirsiniz.

Bilginize, çizgi izleyen sensör, saniyede 100 kez güncelleme döndürebilir.

Not: Aşağıdaki komut dosyasında boşluklar eksik olabilir ve bu, GitHub Gists'in görüntülenmesindeki bazı sorunlardan kaynaklanıyor gibi görünüyor. Sizi kodu kopyalayıp yapıştırabileceğiniz GitHub sayfasına götürmek için özü tıklayın.

GiggleBot PID Line Follower Tuner (ayarlamak için uzaktan kumanda gerekir) - xjfls23

mikrobit içe aktarmadan*
gigglebot içe aktarmadan*
utime import sleep_ms, ticks_us
ithal radyo
ithalat yapısı
# radyo ve GB neopiksellerini başlat
radyo.on()
neo = init()
# zamanlama
güncelleme oranı =70
# varsayılan kazanç değerleri
Kp =0.0
Ki =0.0
Kd =0.0
ayar noktası = 0,5
tetikleyici_nokta =0.0
min_speed_percent = 0,2
temel_hız =100
last_position = ayar noktası
integral =0.0
run_neopixels =Yanlış
center_pixel =5# gülümsemenin merkez pikselinin GB'de bulunduğu yer
# turquoise = tuple(map(lambda x: int(x / 5), (64, 224, 208))) # neopiksellerle hatayı çizmek için kullanılacak renk
# turkuaz = (12, 44, 41) # tam olarak yukarıdaki turkuaz bunun üstüne yorum yaptı
error_width_per_pixel =0.5/3# maksimum hata bölü her neopiksel arasındaki segment sayısı
defupper_bound_linear_speed_reducer(abs_error, tetikleme_noktası, üst_sınır, en küçük_motor_gücü, en yüksek_motor_gücü):
küresel base_speed
abs_error >= trigger_point ise:
# x0 = 0.0
# y0 = 0.0
# x1 = üst sınır - tetikleyici_nokta
# y1 = 1.0
# x = abs_error - tetikleyici_nokta
# y = y0 + (x - x0) * (y1 - y0) / (x1 - x0)
# ile aynı
y = (abs_error - tetikleme_noktası) / (üst_sınır - tetikleme_noktası)
motor_power = temel_hız * (en küçük_motor_gücü + (1- y) * (en yüksek_motor_gücü - en küçük_motor_gücü))
dönüş motor_power
Başka:
dönüş base_speed * en yüksek_motor_power
çalıştır =Yanlış
önceki_hata =0
toplam_zaman =0.0
total_counts =0
whileTrue:
# a düğmesine basılırsa takip etmeye başlayın
button_a.is_pressed() ise:
çalıştır =Doğru
# ancak b düğmesine basılırsa çizgi izleyeni durdurun
button_b.is_pressed() ise:
çalıştır =Yanlış
integral =0.0
önceki_hata =0.0
display.scroll('{} - {}'.format(total_time, total_counts), delay=100, wait=Yanlış)
toplam_zaman =0.0
total_counts =0
piksel_kapalı()
Dur()
uyku_ms(500)
isTrue çalıştırılırsa:
# hat sensörlerini oku
start_time = ticks_us()
# uzaktan kumanda ile Kp/Kd kazançlarını güncelleyip güncellemediğimizi kontrol edin
denemek:
Kp, Ki, Kd, trigger_point, min_speed_percent = ustruct.unpack('fffff', radio.receive_bytes())
set_eyes()
hariçTypeError:
geçmek
sağ, sol = read_sensor(LINE_SENSOR, BOTH)
# satır, konum < 0,5 olduğunda soldadır
# satır, konum > 0,5 olduğunda sağdadır
# konum = 0,5 olduğunda satır ortadadır
# ağırlıklı bir aritmetik ortalama
denemek:
pozisyon = sağ /float(sol + sağ)
hariçZeroDivisionError:
konum = 0,5
konum ==0 ise: konum =0,001
konum ==1 ise: konum =0.999
# bir PD denetleyicisi kullanın
hata = konum - ayar noktası
integral += hata
düzeltme = Kp * hata + Ki * integral + Kd * (hata - önceki_hata)
önceki_hata = hata
# motor hızlarını hesapla
motor_speed = high_bound_linear_speed_reducer(abs(hata), ayar noktası * tetikleme_noktası, ayar noktası, min_speed_percent, 1.0)
leftMotorSpeed = motor_speed + düzeltme
rightMotorSpeed = motor_speed - düzeltme
# GiggleBot'un hangi yöne gitmesi gerektiğini göstermek için neopikselleri aydınlatın
run_neopixels isTrueand total_counts ise %3==0:
i inb'\x00\x01\x02\x03\x04\x05\x06\x07\x08' için:
neo = (0, 0, 0)
i inb'\x00\x01\x02\x03' için:
ifabs(hata) > error_width_per_pixel * i:
hata <0 ise:
neo[center_pixel + i] = (12, 44, 41)
Başka:
neo[center_pixel - i] = (12, 44, 41)
Başka:
yüzde =1- (error_width_per_pixel * i -abs(error)) / error_width_per_pixel
# mevcut pikseli aydınlat
hata <0 ise:
# neo[center_pixel + i] = demet(harita(lambda x: int(x * yüzde), turkuaz))
neo[center_pixel + i] = (int(yüzde 12*), int(yüzde 44*), int(yüzde 41*))
Başka:
# neo[center_pixel - i] = demet(harita(lambda x: int(x * yüzde), turkuaz))
neo[center_pixel - i] = (int(yüzde 12*), int(44* yüzde), int(yüzde 41*))
kırmak
neo.göster()
denemek:
# motorları klipsle
sol Motor Hızı >100 ise:
solMotorHızı =100
rightMotorSpeed = rightMotorSpeed - leftMotorSpeed +100
sağ Motor Hızı >100 ise:
sağMotorHızı =100
leftMotorSpeed = leftMotorSpeed - rightMotorSpeed +100
Motor Hızı <-100 ise:
solMotorHızı =-100
doğruysaMotor Hızı <-100:
sağMotorHızı =-100
# motorları çalıştır
set_speed(leftMotorSpeed, rightMotorSpeed)
sürmek()
# print((hata, motor_hızı))
hariç:
# çözülemez bir sorunla karşılaşırsak diye
geçmek
# ve döngü frekansını koru
end_time = ticks_us()
delay_diff = (bitiş_zamanı - başlangıç_zamanı) /1000
total_time += delay_diff
total_counts +=1
if1.0/ update_rate - delay_diff >0:
uyku(1.0/ update_rate - delay_diff)

GitHub tarafından ❤ ile barındırılan rawgigglebot_line_follower_tuner.py dosyasını görüntüleyin

Adım 4: Ayarlayıcıyı Ayarlama (Uzaktan)

Yapmamız gereken bir sonraki şey, çalışma zamanı + komut dosyasını 2. BBC micro:bit'e flash yapmak. Bu ikinci mikro:bit, aşağıdaki parametreleri ayarlamak için kullanılacak olan GiggleBot için bir uzaktan kumanda görevi görecektir:

  1. Kp = PID kontrolörü için oransal kazanç.
  2. Ki = PID denetleyicisi için integral kazanç.
  3. Kd = PID kontrolörü için türev kazancı.
  4. trigger_point = GiggleBot'un minimum ve maksimum hızları arasındaki yüzde olarak ifade edilen, hızın minimum hıza ulaşana kadar doğrusal olarak azalmaya başladığı nokta.
  5. min_speed_percent = maksimum hızın yüzdesi olarak ifade edilen minimum hız.

Ayarlanabilen diğer 2 değişken, GiggleBot'ta bulunan komut dosyasında doğrudan sabit kodlanmıştır: update_rate ve maksimum hızı temsil eden base_speed. Belgelerde açıklandığı gibi, GiggleBot için ayarlanabilecek maksimum hız 100'dür ve bu aynı zamanda GiggleBot'umuz için de varsayılan değerdir.

Not: Aşağıdaki komut dosyasında boşluklar eksik olabilir ve bu, GitHub Gists'in görüntülenmesindeki bazı sorunlardan kaynaklanıyor gibi görünüyor. Sizi kodu kopyalayıp yapıştırabileceğiniz GitHub sayfasına götürmek için özü tıklayın.

GiggleBot Remote PID Line Follower Tuner (diğer parçayı gerektirir) - xjfls23

mikrobit içe aktarmadan*
utime'dan uyku_ms'sini içe aktar
ithal radyo
ithalat yapısı
# 1. eleman Kp kazancıdır
# 2. eleman Ki kazancıdır
# 3. eleman Kd kazancıdır
# 4. eleman, motorların hızı düşürmesi için tetikleme noktasıdır (0 -> 1)
# 5. öğe, yüzde (0 -> 1) olarak ifade edilen motorlar için minimum hızdır.
kazançlar = [0.0, 0.0, 0.0, 1.0, 0.0]
adımBoyutu = 0.1
# 1. eleman için 0 ve 1
2. eleman için # 2 ve 3
geçerliAyar =0
defshowMenu():
display.scroll('{} - {}'.format(currentSetting, gains[int(currentSetting/2)]), delay=100, wait=Yanlış)
radyo.on()
menüyü göster()
whileTrue:
güncellendi =Yanlış
button_a.is_pressed() ise:
currentSetting = (currentSetting +1) % (2*5)
güncellenmiş =Doğru
button_b.is_pressed() ise:
geçerliAyar %2==0 ise:
# currentSetting 0 veya 2 veya.. olduğunda kazancı artırın
ifint(currentSetting/2) [0, 2]:
kazançlar[int(currentSetting/2)] +=10* stepSize
Başka:
kazançlar[int(currentSetting/2)] += stepSize
Başka:
# currentSetting 1 veya 3 veya.. olduğunda kazancı artırın
ifint(currentSetting/2) [0, 2]:
kazançlar[int(currentSetting/2)] -=10* stepSize
Başka:
kazançlar[int(currentSetting/2)] -= stepSize
radio.send_bytes(ustruct.pack('fffff', *kazançlar))
güncellenmiş =Doğru
güncellenirse:
menüyü göster()
uyku_ms(200)

GitHub tarafından ❤ ile barındırılan rawgigglebot_line_follower_configurator.py dosyasını görüntüleyin

Adım 5: GiggleBot'u Ayarlama

GiggleBot'u Ayarlama
GiggleBot'u Ayarlama

GiggleBot'u raya yerleştirin, açın ve çalışmasına izin verin. Bu arada, sürekli olarak onu tekrar yola koymanız ve elinizde tuttuğunuz diğer BBC micro:bit ile kazançları/parametreleri ayarlamanız gerekecek.

GiggleBot'u başlatmak için, GiggleBot'un BBC micro:bit'indeki A düğmesine basın ve onu durdurmak ve böylece durumunu sıfırlamak için B düğmesine basın.

Uzak BBC micro:bit'te, A düğmesine basmak sizi menüsündeki tüm seçeneklere götürür ve B düğmesi karşılık gelen değeri artırır/azaltır. Eski bir arabanın gösterge panelinde saati ayarlamak gibi. Seçenekler şöyle:

  1. 0-1 seçenekleri Kp kazancı içindir.
  2. 2-3 seçenek Ki kazancı içindir.
  3. 4-5 seçenek Kd kazancı içindir.
  4. 6-7 seçenekler, motorların yavaşlamaya başladığı an için ayar noktasının ayarlanması içindir.
  5. 8-9 seçenekler minimum hızı ayarlamak içindir.

Menüdeki çift sayıların karşılık gelen değerleri artırmak için olduğunu ve tek sayılar için bunun tam tersi olduğunu unutmayın.

Ayrıca, GiggleBot'un BBC micro:bit'indeki B düğmesine bastığınızda, Neopiksel yapımı ekranında son sıfırlamadan bu yana geçen milisaniye sayısını ve robotun geçtiği döngü sayısını göreceksiniz - bu 2 ile hesaplayabilirsiniz robotun güncelleme hızı.

Son olarak ve en önemlisi, GiggleBot için 2 ayar buldum. Bunlardan biri Neopixel LED'ler kapatıldığında, diğeri ise aksi durumdayken. Neopiksel LED'ler, hatanın hangi yöne biriktiğini göstermek için kullanılır.

1. parametre ayarlama seti (NeoPixel LED'leri kapalıyken)

  1. Kp = 32,0
  2. Ki = 0,5
  3. Kd = 80.0
  4. trigger_setpoint = 0,3 (%30'dur)
  5. min_speed_percent = 0,2 (%20'dir)
  6. base_speed = 100 (maksimum hız olarak da bilinir)
  7. update_rate = 70 (70Hz'de çalışıyor)

2. parametre ayarlama seti (NeoPixel LED'leri açıkken)

  1. Kp = 25.0
  2. Ki = 0,5
  3. Kd = 35.0
  4. trigger_setpoint = 0,3 (%30'dur)
  5. min_speed_percent = 0,3 (%30'dur)
  6. base_speed = 70 (maksimum hız olarak da bilinir)
  7. update_rate = 50 (50Hz'de çalışıyor)
  8. Ayrıca, GiggleBot'un BBC micro:bit'ine yüklenen komut dosyasında değişken run_neopixels True olarak ayarlanmalıdır. Bu, NeoPixel LED'lerinin, hatanın hangi yöne doğru biriktiğini gösterecek şekilde yanıp sönmesini sağlayacaktır.

Adım 6: NeoPixels Kapalıyken GiggleBot Çalışıyor

Bu, GiggleBot'u önceki adımda bulunan 1. ayar parametreleriyle çalıştırmanın bir örneğidir. Bu örnekte NeoPixel LED'leri kapalıdır.

7. Adım: GiggleBot Neopikseller Açıkken Çalışıyor

Bu, GiggleBot'u 5. adımda bulunan 2. ayar parametreleriyle çalıştırmanın bir örneğidir. Bu örnekte NeoPixel LED'leri açıktır.

Bu örnekte GiggleBot'un çizgiyi takip etmekte nasıl daha zorlandığına dikkat edin - bunun nedeni Neopiksel LED'lerin BBC micro:bit'in CPU zamanını "yemesi". Bu yüzden güncelleme oranını 70'ten 50'ye düşürmek zorunda kaldık.

Önerilen: