c_room/gorev01.c veya py_room/gorev01.py) ve kütüphaneyi ekleyin.Bu simülasyonda araç sabit hızla gider (düz yolda saniyede yaklaşık 32 birim). Hızı ayarlayan bir fonksiyon yoktur; drive() ile sadece ileri, geri veya dur komutu verilir, yön steer() ile (-60…+60 derece) değiştirilir. Lidar aracın çevresini 2 derecede bir ölçer: lidar_read(0) sağ, lidar_read(90) ön, lidar_read(180) sol, lidar_read(270) arka. Mesafe 1–100 birimdir; 100 birim içinde çizgi yoksa 0 döner.
Araç ileri giderken önündeki geniş bölgede (yaklaşık 66°–114°) bir çizgi 25 birimden yakına gelirse simülasyon aracı durdurur ve collision_read() 1 olur.
Her görevden önce menüden Yenile'ye basın: araç pistin sağ düzlüğünün alt kısmında, yukarı bakarak başlar (sağ çizgi yaklaşık 15, sol çizgi yaklaşık 52 birim uzakta). Ctrl+C programı durdurur ama aracı durdurmaz; aracı Elle Kontrol panelindeki Dur düğmesiyle ya da Yenile ile durdurun.
Simülasyonu başlatın. Simülasyona bağlanan, ekrana Hello car! yazan ve bağlantıyı kapatan bir program yazın.
Simülasyon kapalıyken programı bir kez daha çalıştırın ve ekranda ne yazdığına bakın.
sim_connect() başarılı olursa 0, olamazsa 1 döndürür. Bağlanamazsanız programı hemen bitirin.Aracı 2 saniye ileri sürün ve durdurun. Araç pistte biraz yukarı gitmeli ve çizgilere çarpmadan durmalı.
drive(DRIVE_FORWARD) aracı yürütür, drive(DRIVE_STOP) durdurur. Arada beklemek için C'de Sleep(milisaniye), Python'da time.sleep(saniye) kullanın.Aracı 2 saniye ileri sürün, 1 saniye durdurun, sonra 2 saniye geri sürün ve durdurun. Araç başladığı yere yakın bir yerde durmalı.
DRIVE_BACKWARD kullanın. Geri giderken araç ileri giderken olduğu kadar hızlı gider.Menüden Elle Kontrol panelini açın. Araç dururken direksiyonu 30° sola çevirin, 2 saniye bekleyin, 30° sağa çevirin, 2 saniye bekleyin ve düzeltin (0°).
Paneldeki direksiyon sürgüsünün ve açı değerinin değiştiğini görmelisiniz. Araç yerinden oynuyor mu?
steer() için artı açı sola, eksi açı sağa demektir: steer(30) sola, steer(-30) sağa.Direksiyonu 30° sola çevirin, sonra aracı 3 saniye ileri sürün ve durdurun. En sonda direksiyonu düzeltin.
Araç bir yay çizerek sola dönmeli ve çizgilere çarpmamalı.
steer(), sonra drive().Aracı bu sırayla sürün:
1 saniye düz, 2 saniye 20° sola, 2 saniye 20° sağa, 1 saniye düz, sonra dur.
Araç S harfine benzeyen bir yol çizmeli.
drive(DRIVE_FORWARD) bir kez yazılması yeterlidir.Yenile'ye basın. Lidarın ön (90°) ve sağ (0°) ölçümünü okuyup ekrana yazdırın:
Front: ... ve Right: ...
Sağ için yaklaşık 15, ön için 0 görmelisiniz. Önde 0 ne anlama geliyor?
lidar_read(açı) bir sayı döndürür; bunu bir değişkende saklayıp yazdırın.Sağ (0°), ön (90°), sol (180°) ve arka (270°) mesafeleri okuyup yazdırın. Sonra sağ ve sol mesafeyi toplayarak yolun genişliğini hesaplayın ve Lane width: ... olarak yazdırın.
Başlangıç konumunda yaklaşık 15, 0, 52, 0 ve genişlik olarak 67 görmelisiniz.
Aracın sağından soluna (0°'den 180°'ye) 10 derecede bir lidar mesafesini okuyup her satıra bir açı yazdırın, örneğin 40 deg: 19.
Hangi açılarda 0 görüyorsunuz? Bu açılar aracın neresine bakıyor?
for döngüsü kullanın: açı 0'dan başlar, 180'e kadar 10'ar artar.Direksiyonu 25° sola çevirin ve aracı ileri sürün. 1 saniye sonra drive_read() ve steer_read() değerlerini yazdırın (1 ve 25 görmelisiniz).
Sonra aracı durdurun, direksiyonu düzeltin ve iki değeri tekrar yazdırın (0 ve 0).
drive_read() 0 = duruyor, 1 = ileri, -1 = geri döndürür.Sağ (0°) ve sol (180°) mesafeyi okuyun. Sağ daha yakınsa Right line is closer, sol daha yakınsa Left line is closer, eşitse Centered yazdırın.
Başlangıçta sağ daha yakındır. Sonra Elle Kontrol paneliyle aracı biraz sola sürüp durdurun ve programı tekrar çalıştırın.
if, else if (Python'da elif) ve else kullanın.Aracı 9,5 saniye düz ileri sürüp durdurun. Sonra ön mesafeyi okuyun ve:
0 ise Nothing ahead (more than 100),
50'den küçükse Line ahead is close: ...,
değilse Line ahead: ... yazdırın.
Program önce 0 kontrolünü yapmazsa ne olurdu?
Önce collision_read() değerini yazdırın (0 olmalı). Sonra aracı düz ileri sürün ve 12 saniye bekleyin. Bekleme bitince collision_read() ve drive_read() değerlerini yazdırın.
Araç yaklaşık 10. saniyede üst virajın dış çizgisine çarpar. Ekranda hangi değerleri görüyorsunuz? Araç neden durdu?
Aracı düz ileri sürün. Ön mesafe 0'dan büyük ve 80'den küçük olana kadar bekleyin, sonra aracı durdurun ve son ön mesafeyi yazdırın.
Araç çarpmadan, yaklaşık 9,5 saniye sonra durmalı. Neden 25 değil de 80 kullandığımızı Görev 13'ü düşünerek açıklayın.
while döngüsü kullanın ve her turda mesafeyi yeniden okuyun. Döngüde 20 ms bekleyin.Görev 14'ü değiştirin: döngüde 100 ms bekleyin ve döngünün kaç kez döndüğünü sayın. Araç durunca Stopped after ... s yazdırın (sayaç × 0,1).
Yaklaşık 9,5 saniye görmelisiniz. Aynı programı birkaç kez çalıştırın (her seferinde Yenile): sonuç aynı mı?
Aracı ileri sürün ve bir döngüde sağ (0°) ve sol (180°) mesafeyi okuyun:
sol, sağdan 5'ten fazla büyükse 15° sola, sağ, soldan 5'ten fazla büyükse 15° sağa dönün, yoksa düz gidin.
Döngü collision_read() 1 olunca bitsin ve Crash! yazsın. Döngüde 50 ms bekleyin.
Araç düzlükte ortaya gelir. Peki virajda ne oluyor? Nerede çarptığına dikkat edin.
Görev 16'da 0° ve 180° yerine çapraz ışınları kullanın: sağ ön 45°, sol ön 135°.
Bu sefer sadece iki durum olsun: sol ön daha uzaksa 20° sola, değilse 20° sağa.
Araç zikzak çizerek virajları dönmeli ve turlamaya devam etmeli. Programı Ctrl+C ile durdurun, aracı Dur düğmesiyle durdurun.
Görev 17'ye üçüncü bir durum ekleyin: sol ön ile sağ ön arasındaki fark 5 veya daha azsa düz gidin (0°).
Araç düzlüklerde zikzak yapmadan gitmeli. Bir turu kronometreyle ölçün: yaklaşık 72 saniye olmalı (Görev 17'de yaklaşık 2 dakika).
Görev 18'deki sürücüyü sonsuz yerine 600 tur (yaklaşık 30 saniye) çalıştırın. Her turda hangi kararın verildiğini sayın: sola, sağa, düz.
Sonunda aracı durdurun ve üç sayıyı yazdırın. 30 saniyede araç düzlüğü ve üst virajın çoğunu geçer; hangi sayı en büyük çıkıyor, neden?
steer() çağrısının yanında ilgili sayacı artırın. Tur sayısı belli olduğu için for uygun.Görev 18'i iki fonksiyonla yeniden yazın:
distance(angle): lidarı okur, 0 gelirse 100 döndürür (0 = 100'den uzak).
follow_lane(): 45° ve 135° mesafelerini distance() ile alır ve direksiyonu Görev 18'deki gibi ayarlar.
Ana döngüde sadece follow_lane() ve bekleme kalsın. Araç Görev 18'deki gibi sürmeli.
main'den önce yazın: int distance(int angle) ve void follow_lane(void).Aracın sağından soluna (0°–180°) bütün ışınları (2 derecede bir, 91 değer) bir diziye okuyun. Dizide 0 olmayan en küçük mesafeyi ve açısını bulun, Closest: 0 deg, 15 gibi yazdırın ve açı 90'dan küçükse (right), büyükse (left) ekleyin.
Bunu yarım saniyede bir tekrarlayın. Program çalışırken aracı Elle Kontrol paneliyle sürün ve değerlerin nasıl değiştiğini izleyin.
2 * i derecedir. En küçüğü ararken başlangıç değeri olarak 101 gibi hiçbir ölçümün ulaşamayacağı bir sayı kullanın.Tek bir ışına güvenmek yerine birkaç ışının ortalamasını kullanın. average(from, to) fonksiyonu yazın: from ile to arasındaki açıları 2 derecede bir distance() ile okuyup ortalamasını döndürsün.
Görev 20'deki sürücüde sağ ön için average(30, 60), sol ön için average(120, 150) kullanın. Araç yine turlamalı.
Şimdiye kadar direksiyon sadece -20, 0 veya +20 oldu. Şimdi açıyı hataya orantılı yapın:
hata = sol ön (135°) − sağ ön (45°), açı = 0,5 × hata.
Açıyı -60…+60 arasında tutan bir limit() fonksiyonu yazın. Araç zikzak yapmadan, yumuşakça turlamalı.
(int), Python'da int()).Görev 23'te hatayı doğrudan kullanmak yerine son 4 hatanın ortalamasını kullanın. Son 4 hatayı 4 elemanlı bir dizide tutun; her turda en eski hatanın yerine yenisini yazın.
Direksiyon daha sakin değişmeli ve tur birkaç saniye kısalmalı (yaklaşık 105 yerine 95 saniye).
index = (index + 1) % 4. Bu sayede 3'ten sonra yeniden 0'a döner.Görev 16'daki yan ışınlı sürücü virajda çarpıyordu. Ona bir kurtarma davranışı ekleyin: collision_read() 1 olursa çarpışma sayısını artırın, direksiyonu 30° sağa (-30) çevirin, 1 saniye geri gidin ve sonra yeniden ileri sürmeye devam edin.
Program 60 saniye (1200 tur × 50 ms) çalışsın ya da 5 çarpışmada dursun; sonda aracı durdurup çarpışma sayısını yazdırın. Araç virajı çarpa çarpa da olsa geçebiliyor mu?
Aracın sağ önüne bakan 76° ışını düzlükte 0 okur (çizgi 100'den uzak), virajda ise dış çizgiyi görür.
Görev 20'deki sürücüyü çalıştırırken bu ışınla aracın virajda mı düzlükte mi olduğunu takip edin ve sadece durum değiştiğinde CURVE ya da STRAIGHT yazdırın.
Ani tek okumalara aldanmamak için: 76° > 0 olunca hemen CURVE, ama STRAIGHT için 76° art arda 20 okuma (yaklaşık 1 saniye) 0 olmalı.
Bir turda iki CURVE ve iki STRAIGHT görmelisiniz. Program başlar başlamaz bir STRAIGHT daha görünür, çünkü araç bir virajın hemen çıkışında başlar.
in_curve (şu anki durum, 0/1) ve quiet (art arda kaç kez 0 okundu). Başlangıçta in_curve'ü ışının ilk okumasından alın: araç bir virajın hemen çıkışında başlar.Görev 26'daki viraj dedektörünü kullanarak aracı tam bir tur sürün ve başladığı yere yakın bir yerde durdurun.
Araç başlangıçta sağ düzlüktedir; bir tur = üst viraj + sol düzlük + alt viraj. İkinci virajdan çıkıldığında (ikinci STRAIGHT) tur bitmiştir.
Durunca One lap done! yazdırın. Araç hiç çarpmamalı ve yaklaşık 72 saniyede durmalı.
STRAIGHT bir viraj girişi olmadığı için sayılmaz. Sonsuz döngüden break ile çıkın.Görev 27'ye süre ölçümü ekleyin: tur bitince Lap time: ... s yazdırın (C'de GetTickCount(), Python'da time.time()).
Dönüş açısını (20) programın başında TURN adlı bir sabite taşıyın ve 20, 30, 45 ve 60 için tur süresini ölçün.
Hedef: hiç çarpmadan 70 saniyenin altı. 20° ile yaklaşık 72 saniye, 45° ile yaklaşık 66 saniye görmelisiniz.
GetTickCount() bilgisayar açıldığından beri geçen milisaniyeyi verir; başlangıçtaki değeri saklayıp sondakinden çıkarın. Neden daha keskin dönüş daha hızlı olabilir? Görev 18'in cevabını hatırlayın.Görev 28'deki sürücüyle 3 tur atın ve her turun süresini ayrı yazdırın (Lap 1: ... s).
Sürücüye Görev 25'teki kurtarmayı ekleyin: çarpışma olursa sayın, 1 saniye -30° direksiyonla geri gidin ve devam edin. Sonda toplam süreyi ve çarpışma sayısını yazdırın.
İyi bir sürücüde çarpışma 0 olmalı; kurtarma sadece bir şeyler ters giderse (örneğin Elle Kontrol ile müdahale edilirse) devreye girer.
Her şeyi birleştiren son programı yazın:
1. Program kullanıcıdan tur sayısı istesin (1–5). Geçersiz bir sayı girilirse tekrar sorsun.
2. Araç Görev 29'daki gibi sürsün ve çarpışmadan kurtulsun.
3. Her saniye bir durum satırı yazdırsın: Lap 1/3 | CURVE | 23 s | crashes 0.
4. İstenen tur sayısı tamamlanınca aracı durdursun ve bir özet yazdırsın: her turun süresi, en hızlı tur ve toplam çarpışma.
scanf("%d", &laps), Python'da int(input()).