Saya telah melakukan banyak membaca akhir-akhir ini tentang Subsumption Architecture dan ada beberapa cara yang berbeda untuk mengadvokasi orang.
Misalnya beberapa orang menggunakan variabel "bendera" global untuk mengontrol tugas. Yang lain menggunakan endTimeSlice()
dan memungkinkan arbiter untuk benar-benar memilih. Dan saya pikir ini benar.
Saya memiliki bagian kecil ini dari kode RobotC yang sedang saya kerjakan untuk robot yang mengikuti garis tetapi saya tidak yakin saya melakukannya dengan benar karena saat ini metode lintasan akan selalu mengambil alih metode pencarian. Aliran yang benar adalah bahwa find harus memandu robot ke garis menggunakan jalur spiral untuk menemukan garis. Setelah garis ditemukan trek harus mengambil alih.
task evade(){
if(SensorValue(forwardSonarSensor) > threshold){
//box the obstruction
}
}
task find(){
if(SensorValue(lightSensor) > threshold){
//spiral the robot
}
}
task track(){
if(SensorValue(lightSensor) < threshold){
//go straight
}else{
//execute turns to follow the line
}
}
task main(){
while(true){
StartTask(evade,9);
StartTask(track,8);
StartTask(find,7);
wait1Msec(250);
}
}
Saya baru saja menggunakan beberapa komentar di sini daripada kode yang sebenarnya untuk membuatnya singkat. Apakah pernyataan if saya tidak cukup baik sebagai syarat karena ketika robot mati, track()
mengambil alih. Apakah ini karena pernyataan lain dalam jalur? Jika demikian, bagaimana cara track()
melakukan belokan ketika kehilangan garis tanpa mengambil alih dari hijauan pada awal program?
sumber
StartTask
, apakah itu prioritas tugas? Apakah 9 akan menjadi prioritas tertinggi? Dalam hal itu, bukankah seharusnyafind
memiliki prioritas lebih daritrack
? Padahal, kondisifind
danelse
kondisinyatrack
sama. Jadi, sebagai manusia, jika nilai sensor lebih besar dari ambang, apa yang akan Anda lakukan? Terus spiral atau putar untuk menyesuaikan garis?Jawaban:
Dengan Subsumption Architecture, Anda harus merancang perilaku dengan hati-hati sedemikian rupa sehingga jika Anda menetapkan
T
prioritas tugasn
, makaT
seharusnya apa yang harus dilakukan robot jika semua tugas dengan prioritas lebih tinggi daripadan
diabaikan.Mari kita memesan contoh tugas Anda, lalu mencari cara untuk mengimplementasikannya. Tugas Anda adalah
evade
,find
dantrack
.Secara umum Anda ingin robot melacak garis. Namun, jika tidak dapat mendeteksi garis, maka ia harus mencoba menemukannya. Di atas semua itu, ia harus menghindari rintangan. Ini memberi kami pemesanan berikut:
evade
find
track
Alasannya
find
memiliki prioritas lebih tinggi daripadatrack
itu, seperti yang saya sebutkan di atas, Andatrack
hanya akan jikaevade
danfind
tidak perlu. Jika Anda letakkan difind
bawah initrack
, itu berarti Anda mulai melacak jika tidak ada halangan, bahkan jika Anda tidak terhubung.Sekarang mari kita lihat implementasi Anda:
Ingatlah bahwa kami memberikan
find
prioritas yang lebih tinggi. Oleh karena itu, jika robot tidak dapat merasakannyalightSensor
, ia akan berputar mencoba menemukan garis. Setelah itu terjadi,track
tendangan masuk. Seperti yang Anda lihat,else
kondisitrack
tidak pernah terjadi.Sementara ini berhasil, robot akan bergerak sangat canggung. Sebenarnya tidak banyak yang bisa Anda lakukan tentang hal itu, mengingat bentuk robot Anda saat ini.
Meskipun saya sudah menjawab pertanyaan Anda, tetapi berikut ini adalah peningkatan sederhana untuk pelacakan garis Anda:
Alih-alih satu sensor cahaya, gunakan dua;
ls_left
danls_right
. Dengan menggunakan (setidaknya) dua sensor, Anda dapat memahami apakah Anda benar-benar keluar dari trek, atau akan keluar dari trek. Dalam kasus kedua, Anda dapat dengan mudah beralih ke arah yang tepat dan kembali ke jalurnya.find
Tugas Anda serupa:Yaitu, Anda melakukan spiral hanya jika Anda tidak merasakan apa-apa sama sekali
track
Tugas Anda sekarang menjadi lebih efisien:Jelas, dengan matriks sensor cahaya, Anda dapat lebih baik menilai seberapa buruk Anda keluar dari jalur (yaitu dengan sudut apa) dan lebih baik memutuskan bagaimana untuk kembali ke jalur (yaitu dengan kecepatan sudut apa).
sumber
Jawaban singkat; tidak, Anda benar-benar perlu melakukan sesuatu yang sedikit berbeda.
jawaban panjang yang tidak lengkap; Biarkan saya memberi Anda beberapa kode psuedo yang sesuai untuk robotC, yang menempatkan Anda di jalur yang lebih baik. Pertama, jangan gunakan tugas - ini BUKAN tugas robotC. Mereka dapat dibuat bekerja, mungkin, mungkin tidak (dan Anda perlu beberapa perubahan untuk mencoba).
ada beberapa hal di sini; prioritas menjadi tidak relevan. Sebagus tampaknya memiliki tugas dalam robotC dengan prioritas, mereka bukan pilihan yang baik untuk implementasi subsumption dalam pengalaman saya. Untuk alasan seperti, prioritas tidak selalu dihormati, tugas tidak dapat terganggu (kadang-kadang) sehingga ketika acara prioritas yang lebih tinggi terjadi, itu tidak akan bereaksi seperti yang Anda harapkan, robotC hanya baru-baru ini menjadi peserta kembali, sehingga hal-hal seperti mengakses sensor dari lebih dari 1 tugas mungkin berisiko (masalah waktu I2C), dan dalam beberapa kasus tidak (sensor yang disurvei secara otomatis).
Anda dapat menambahkan implementasi prioritas Anda sendiri ke loop di atas saat Anda menyelesaikan pekerjaan, tetapi itu benar-benar tidak diperlukan untuk memulai.
Komentar Anda "// kotak penghalang" menggambarkan perilaku balistik. Itu agak sulit untuk diterapkan menggunakan multi-tasking. Loop sederhana yang saya gunakan membuatnya jauh lebih mudah, dan lebih baik untuk pemula / belajar.
Hal lain yang akan saya tinggalkan untuk Anda, adalah bahwa pelunasan sementara rapi dan sesuai untuk banyak hal, bukanlah cara yang baik untuk menerapkan apa yang lebih baik dilakukan secara tradisional. Memang bagian 'hindari' mungkin merupakan kandidat yang baik untuk disubsidi, tetapi sejujurnya tugas Anda yang lain harus disebut 'GoOnAboutYourBusiness'. Saya mengatakan ini karena Anda mungkin tidak ingin mengubah dari pencarian ke mengikuti dengan subsumption. Tangani mereka dengan loop pemrograman tradisional. Dengan sensor tunggal, - apakah cahaya yang dirasakan lebih gelap atau lebih terang dari pada putaran terakhir? jika semakin gelap (dengan asumsi garis hitam) terus berputar ke arah yang sama, jika semakin terang berbelok ke arah lain, jika tetap sama, lurus. Anda mungkin perlu menambahkan beberapa PID dan menggunakan kurva kemudi alih-alih hanya belok kiri dan kanan agar lebih halus.
Dan ya, banyak sensor membantu. http://www.mindsensors.com/ - yeah, itu saya dalam film saat ini (11/10/2012)
Perbarui: kode aktual
Saya akan mencoba ini sebentar lagi, tetapi ini mengkompilasi dan menggambarkan apa yang saya tulis di atas:
sumber