İçindekiler:

Kendi Kendine Öğrenen Kaotik Robot: 3 Adım
Kendi Kendine Öğrenen Kaotik Robot: 3 Adım

Video: Kendi Kendine Öğrenen Kaotik Robot: 3 Adım

Video: Kendi Kendine Öğrenen Kaotik Robot: 3 Adım
Video: Öğrenen Yapay Zeka Yaptık! Python Neat PyGame ile Öğrenen Jenerasyonlar 2024, Kasım
Anonim
Kendi Kendine Öğrenen Kaotik Robot
Kendi Kendine Öğrenen Kaotik Robot

Makine öğrenimi, yapay zeka robotları ile ilgileniyor musunuz? Süslü bir üniversitede çalışmana gerek yok. Bu benim kaotik robotumun bir açıklaması. Kendi kendine öğrenme kodunun nasıl kullanılacağını ve bunun bir arduino platformuna nasıl uygulanacağını göstermek çok basit bir robottur, bu durumda bir Arduino nedeniyle. Çok ucuz bir platform!

Kod robotu geliştirir, böylece robot taramayı öğrenir. Geriye sürüklenen fareden geri bildirim alır. Kod "genetik"tir. Bu, bir dizi bireyin test edildiği ve en iyilerinin tutulduğu ve bebek sahibi olacağı anlamına gelir. Bu, kodun evrimsel bir şekilde geliştiği anlamına gelir.

Adım 1: Donanım AKA Robot

Donanım AKA Robot
Donanım AKA Robot
Donanım AKA Robot
Donanım AKA Robot
Donanım AKA Robot
Donanım AKA Robot

Şunlara ihtiyacınız var:

- 1 Arduino Ödeneği

- 8 mikroservo

- 1 PS/2 fare

- 1 seviye değiştirici

- bir sensör kalkanının veya benzerinin bir çeşidi, sensör kalkanından bıktım ve kendiminkini kaynakladım.

-teller

-servolar için harici 5V güç kaynağı

- biraz hurda metal parçası, biraz tutkal ve biraz çelik iplik. Ve bant!

Öyleyse Due'yi yere koyun. Servoları etrafındaki bir halkaya koyun. Bunları hurda metal, yapıştırıcı ve iplikle bir araya getirin. Bu kaos kısmı! Tasarımında kaotik olduğu için, onu süründürmek için nasıl hareket edeceğini belirlemek tahmin edilemez. Bu yüzden kendi kendine öğrenme kodu gitmenin yoludur!

İpuçları: Oldukça ağır metal parçalar kullanın, robotun hareket etmesini kolaylaştırır.

Servoları vadeye bağlayın, benim durumumda D39, 41, 43, 45, 47, 49, 51, 53'e bağlılar.

Servoları harici 5V güç kaynağına bağlayın. Bunun için bir çeşit kalkan oluşturun veya bir sensör kalkanı veya benzeri kullanın. Aidat 5V pininden servoları beslemeyin, yeterli değil, Due yanacaktır. 5 V'u tüm servolara dağıtmak için küçük bir prototip kartı kullandım. Bu kart aynı zamanda PS/2 fare saati ve veri hatları için seviye değiştiriciyi de barındırır. Kart ayrıca fareyi 5V ile besliyor. Topraklama nedeniyle harici güçten Arduino'ya topraklamayı unutmayın! şemalar hepsini nasıl bağlayacağınızı gösterir.

PS/2'yi güce (5V) ve toprağa bağlayın. PS/2'nin saatini ve veri hattını bir seviye değiştirici aracılığıyla Due'a bağlayın. (nedeni 3,3V, PS/2 5V'a gider). Saati D12'ye ve verileri D13'e bağlayın.

PS/2 protokolüyle ilgili ayrıntılar için bu çok iyi bir talimattır:

www.instructables.com/id/Optical-Mouse-Od…

Jazzycamel'in kullandığım PS/2 kütüphanesi:

2. Adım: Kod

kod
kod

İlk başta şunu söyleyeyim: Ben bir programcı DEĞİLİM. Bazı parçalar çok kapsamlıdır, yetenekli bir programcı elbette kısaltabilir ve saire.

Kod kendi kendine öğrenmedir ve bu projenin özüdür. Bu işin eğlenceli kısmı! Demek ki robot gelişiyor ve gitgide daha iyi oluyor, bu durumda emeklemede daha iyi oluyor. Bununla ilgili şaşırtıcı olan şey, robotun onu geri beslediğiniz şeye göre gelişecek olmasıdır. Bu durumda bir PS/2 fareyi sürükler ve fare ne kadar uzun süre sürüklenirse o kadar yüksek puan alır.

Bu aynı zamanda, ölçüldüğü ve robota geri beslendiği sürece, robotunuzu başka bir şey yapmak için eğitmek için bu kodu kullanabileceğiniz anlamına gelir!

Görsellerde de göreceğiniz üzere mouse ince bir ip üzerinde sürükleniyor. İlk başta fare kablosunda sürüklendi. Ancak kablo biraz sert olduğundan robot fareyi sürüklemek yerine sallamayı öğrendi. Sallayarak yüksek puanlar üretti…

Kod 50 birey kullanır. Bunun çekirdeği 50x50 baytlık bir dizidir.

Bir individ, bir bayt dizisidir. Kişi robotu çalıştırmak için kullanıldığında, bu birey "tolken" adlı koddaki bir işleve gönderilir.

Bir çalışmanın başlangıcında m1, m2, m3, m4, m5, m6, m7 ve m8 (her servo için bir tane) olmak üzere 8 değişken vardır. Bu robotta hepsinin sabit başlangıç değerleri vardır. "Tolken"de mś, bireyin değerlerine bağlı olarak bir case/swich döngüsüne dönüştürülür. örneğin "1" değeri aşağıdakileri yürütür: m1 = m1 + m2.

Bir birey: 1, 2, 3, 0, 0, 0, 0….. ise mś şu şekilde dönüştürülür:

m1 = m1 + m2;

m1 = m1 + m3;

m1 = m1 + m4;

Tolken, 256 farklı matematiksel işlemin bir listesidir, bu nedenle individs dizisinin olası her değeri, m değerlerinin matematiksel değişimini temsil eder.

Tolken işlemi, her tur arasında okuma ile 4 kez yapılır ve her "m" için dört farklı motor kodu üretilir. Motor kodları daha sonra servolara gönderilen değerlerdir.

Evrimin her adımında, 4 birey emeklemede rekabet eder. En iyi iki birey iki bebeğe ebeveyn olacak, bebekler en kötü iki bireyin yerini alacak. Bebekler yapıldığında, bir ebeveynden gelen bir "genetik kod" eki, diğer ebeveynden bir dilim için takas edilir, bu iki yeni birey yaratır.

Hiçbir birey hiç performans göstermezse, bireylerin mutasyonu yenilerini oluşturmak için gerçekleşecektir.

Kodu GitHub'da bulabilirsiniz:

Adım 3: Nasıl Eğitilir?

Bu zor kısım. Düzgün antrenman yapmak için her koşudan sonra "sıfırlamanız" gerekir. Bu, her seferinde aynı konuma koymanız gerektiği anlamına gelir.

Robotun başlangıç konumunda olduğundan emin olmak için kodun içine birkaç kontrol noktası koydum.

Bu yüzden robotu hizalayın ve çalışmasına izin verin.

4 bireyi test eder ve ardından ebeveyn olmak için en iyi 2 kişiyi seçer. En kötüsünü bebeklerle değiştirdikten sonra, bireylerin performansı hakkında bazı veriler yazdırır. Ayrıca 50x50 dizisini yazdırır. Bunu bir excel sayfasına veya benzerine kopyalamak akıllıca olacaktır. (veya işlem sırasında bazı ihtiyaç kodlarını yazın) Vadesi sıfırlanırsa (bu çeşitli nedenlerle gerçekleşir) eğitim çalışmanızı kaybetmezsiniz. Diziyi koda kopyalayabilir/yapıştırabilir ve kaldıysanız eğitime devam edebilirsiniz.

Robotum birkaç saat sonra emeklemeyi öğrendi. Taramasını görmek için videoyu indirin. Düşündüğüm yöne gitmedi!

Ayrıca farklı katları deneyin! Robotum en iyi performansı naylon halı üzerinde gösterdi.

Olası iyileştirmeler:

1. PS/2 fareyi okumak ve seri üzerinden taşınan işlenmiş mesafeyi nano'ya göndermek için ayrı bir nano'ya sahip olmak daha iyi olurdu. PS/2 faremin okuması biraz titriyor. Farenin kodun bölümlerini okumasının/temizlemesinin nedeni budur.

2. Robotu başlangıç pozisyonuna geri çeken bir çeşit test donanımı, eğitimi hızlandıracaktır.

3. Onu benden biraz daha yavaş çalıştırmanın akıllıca olduğunu düşünüyorum. Daha yavaş eğitim, "doğru yönde" eğitildiğini garanti eder. Birkaç test çalışmasının ortalama performansı olası bir yol olabilir.

Önerilen: