Nasıl çalışılır?

  1. Görevleri sırayla yapın; her görev bir öncekinin üzerine bir şey ekler.
  2. Her görev için simülasyonun klasöründe, kütüphane dosyasının yanında yeni bir dosya açın (ör. c_room/gorev01.c veya py_room/gorev01.py) ve kütüphaneyi ekleyin.
  3. Önce simülasyonu başlatın, sonra programınızı çalıştırın. Sonsuz döngülü programları Ctrl+C ile durdurun.
  4. Takıldığınızda önce ipucuna bakın; cevabı en son açın.

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.

1 Başlangıç

Bağlanma, çıkışları açıp kapatma ve bekleme.
01

Bağlan ve ayrıl

Cevabı gör

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.

İpucu
sim_connect() başarılı olursa 0, olamazsa 1 döndürür. Bağlanamazsanız programı hemen bitirin.
sim_connect()sim_disconnect()printf / print
02

İleri git ve dur

Cevabı gör

Aracı 2 saniye ileri sürün ve durdurun. Araç pistte biraz yukarı gitmeli ve çizgilere çarpmadan durmalı.

İpucu
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.
drive()DRIVE_FORWARDDRIVE_STOPSleep
03

İleri, bekle, geri

Cevabı gör

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ı.

İpucu
Geri gitmek için DRIVE_BACKWARD kullanın. Geri giderken araç ileri giderken olduğu kadar hızlı gider.
drive()DRIVE_BACKWARDSleep
04

Direksiyonu çevir

Cevabı gör

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?

İpucu
steer() için artı açı sola, eksi açı sağa demektir: steer(30) sola, steer(-30) sağa.
steer()+ left / - right
05

Sola doğru kıvrıl

Cevabı gör

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ı.

İpucu
Görev 2 ve Görev 4'ü birleştirin: önce steer(), sonra drive().
steer()drive()Sleep
06

S şeklinde yol

Cevabı gör

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.

İpucu
Araç giderken direksiyonu değiştirebilirsiniz; drive(DRIVE_FORWARD) bir kez yazılması yeterlidir.
steer()drive()sequence

2 Temel

Sensör okuma, ekrana yazdırma ve if/else ile karar verme.
07

İlk lidar okuması

Cevabı gör

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?

İpucu
lidar_read(açı) bir sayı döndürür; bunu bir değişkende saklayıp yazdırın.
lidar_read()variableprintf / print
08

Dört yön ve şerit genişliği

Cevap sende

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.

İpucu
Açılar araca göredir ve saat yönünün tersine artar: 0 sağ, 90 ön, 180 sol, 270 arka.
lidar_read()+angles
09

Lidar taraması

Cevabı gör

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?

İpucu
Aynı satırı 19 kez yazmak yerine for döngüsü kullanın: açı 0'dan başlar, 180'e kadar 10'ar artar.
forlidar_read()
10

Komutları geri oku

Cevabı gör

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).

İpucu
drive_read() 0 = duruyor, 1 = ileri, -1 = geri döndürür.
drive_read()steer_read()
11

Hangi çizgi daha yakın?

Cevabı gö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.

İpucu
Üç durum için if, else if (Python'da elif) ve else kullanın.
if / elsecompare
12

0 tuzağı

Cevap sende

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?

İpucu
0, 50'den küçüktür! Bu yüzden 0 durumunu ilk sırada kontrol edin.
if / else if0 = nothing
13

Çarpışma sensörü

Cevabı gör

Ö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?

İpucu
Programınız aracı durdurmuyor; durduran başka biri var.
collision_read()drive_read()

3 Orta

Döngüler, sürekli kontrol ve durum takibi.
14

Çizgiyi görünce dur

Cevabı gör

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.

İpucu
Ne kadar bekleyeceğinizi bilmiyorsunuz; bu yüzden while döngüsü kullanın ve her turda mesafeyi yeniden okuyun. Döngüde 20 ms bekleyin.
whilelidar_read()&& / and
15

Süreyi say

Cevabı gör

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ı?

İpucu
Sayaç 0 ile başlayan bir tamsayıdır; döngünün içinde 1 artırılır.
counterwhile
16

Ortada kal (yan ışınlar)

Cevap sende

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.

İpucu
Hangi tarafta daha çok yer varsa o tarafa dönün. Sola dönmek artı açıdır.
whileif / elsebang-bangcollision_read()
17

İleriye bak

Cevabı gör

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.

İpucu
Çapraz ışın virajı araç oraya varmadan görür: viraj sola dönerken sol ön açılır, sağ ön kapanır.
look aheadlidar_read(45)lidar_read(135)
18

Ölü bölge ekle

Cevabı gör

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).

İpucu
Görev 16'daki üç durumlu yapıyı Görev 17'nin ışınlarıyla kullanın.
dead zoneif / else if / else
19

Sağ, sol, düz: say

Cevabı gör

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?

İpucu
Üç sayaç tanımlayın ve her steer() çağrısının yanında ilgili sayacı artırın. Tur sayısı belli olduğu için for uygun.
forcounters

4 İleri

Fonksiyonlar, zamanlama, durum makineleri ve hataya dayanıklılık.
20

Fonksiyonlarla düzenle

Cevabı gör

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.

İpucu
C'de fonksiyonları main'den önce yazın: int distance(int angle) ve void follow_lane(void).
functionreturn
21

En yakın çizgiyi bul

Cevabı gör

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.

İpucu
Dizinin i. elemanı 2 * i derecedir. En küçüğü ararken başlangıç değeri olarak 101 gibi hiçbir ölçümün ulaşamayacağı bir sayı kullanın.
arrayminimumfor
22

Tek ışın yerine ortalama

Cevap sende

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ı.

İpucu
Toplamı ve okuma sayısını ayrı ayrı tutun; sonda toplam / sayı.
functionparametersaverage
23

Orantılı direksiyon (P kontrol)

Cevabı gör

Ş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ı.

İpucu
Hata büyükse çok, küçükse az dönülür; hata 0 ise düz gidilir. Ondalıklı sonucu tamsayıya çevirin (C'de (int), Python'da int()).
P controllergainlimit
24

Hatayı yumuşat

Cevap sende

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).

İpucu
Yazılacak yer için bir sıra numarası tutun: index = (index + 1) % 4. Bu sayede 3'ten sonra yeniden 0'a döner.
arraymoving average%
25

Çarpınca kurtul

Cevabı gör

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?

İpucu
Geri giderken direksiyon ters etki yapar: sağa çevrili direksiyonla geri giden aracın burnu sola döner. Pistteki bütün virajlar sola döner.
collision_read()DRIVE_BACKWARDrecovery
26

Viraj dedektörü

Cevabı gör

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.

İpucu
İki değişken tutun: 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.
statechange detectiondebounce

5 Proje

Her şeyi birleştiren tam sistemler.
27

Bir tur at ve dur

Cevap sende

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ı.

İpucu
Girilen virajları sayın. Başlangıçtaki ilk STRAIGHT bir viraj girişi olmadığı için sayılmaz. Sonsuz döngüden break ile çıkın.
statecounterbreak
28

Daha hızlı tur

Cevap sende

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.

İpucu
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.
GetTickCount / time.timeconstanttuning
29

Dayanıklı sürücü: 3 tur

Cevap sende

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.

İpucu
Her tur bittiğinde turun başlangıç zamanını yenileyin ve viraj sayacını sıfırlayın. Turları ayrı bir sayaçla sayın.
lapsrecoverytiming
30

Proje: otonom yarış görevi

Cevap sende

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.

İpucu
Tur sürelerini bir dizide saklayın (en fazla 5). Durum satırı için son yazdırma zamanını tutun ve şimdiki zaman 1 saniyeden fazla ilerlemişse yeniden yazdırın. C'de sayı okumak için scanf("%d", &laps), Python'da int(input()).
scanf / inputarrayfunctionsstatetiming