कोड में लाइन फॉलोअर
एक घुमावदार काली लाइन पर चलने के लिए दो छोटे लाइट सेंसर और कुछ if-statements ही काफी हैं। क्लासिक लाइन-फॉलोअर बनाएं और सीखें कि रोबोट के लाइन से भटक जाने पर क्या करना चाहिए।
60 सेकंड में
कोड में लाइन फॉलोअर
एक घुमावदार काली लाइन पर चलने के लिए दो छोटे लाइट सेंसर और कुछ if-statements ही काफी हैं। क्लासिक लाइन-फॉलोअर बनाएं और सीखें कि रोबोट के लाइन से भटक जाने पर क्या करना चाहिए।
दो सेंसर का नियम
| बायां सेंसर | दायां सेंसर | इसका क्या मतलब है | क्या करना है |
|---|---|---|---|
| 1 (टेप) | 1 (टेप) | लाइन के बिल्कुल बीच में | सीधे चलें |
| 1 (टेप) | 0 (फर्श) | टेप बाईं ओर है | बाएं मुड़ें: बाएं पहिए की गति धीमी करें |
| 0 (फर्श) | 1 (टेप) | टेप दाईं ओर है | दाएं मुड़ें: दाएं पहिए की गति धीमी करें |
| 0 (फर्श) | 0 (फर्श) | लाइन छूट गई | जिस तरफ आखिरी बार मुड़े थे, उसी तरफ मुड़ते रहें |
पिछला मोड़ याद रखना
last_turn = "left" # memory: which way we turned last
def line_rule(left, right):
global last_turn
if left and right:
return "straight"
if left:
last_turn = "left"
return "left"
if right:
last_turn = "right"
return "right"
return "search " + last_turn
for l, r in [(1, 1), (0, 1), (0, 0), (1, 1), (1, 0), (0, 0)]:
print(l, r, "->", line_rule(l, r))गति चुनना
- हर जगह पूरी गति: रोबोट मोड़ों से बाहर छिटक जाता है
- हर बार पहिए को पूरी तरह रोककर मुड़ना: झटकेदार, धीमी चाल
- लाइन छूट जाने पर सीधे चलना
- सिर्फ सीधी लाइन पर टेस्ट करना
- एक मध्यम बेस स्पीड, जैसे 0.6
- छोटे सुधारों के लिए एक पहिए को धीमा करें, पूरी तरह रोकें नहीं
- पिछला मोड़ याद रखें और उसी तरफ खोजें
- मोड़ों पर टेस्ट करें, और दूसरी दिशा में जाने वाले मोड़ पर भी टेस्ट करें
और देखें और पढ़ें
लैब
दो सेंसर वाला लाइन फॉलोअर जो पूरे ट्रैक पर घुमावदार टेप पर ही बना रहता है।
समस्या
यह आपके ब्राउज़र में चलता है। टेप पहले सीधी है और फिर ऊपर-नीचे मुड़ती है। आपका रोबोट टेप पर शुरू होता है, और उसी की दिशा में मुंह करके खड़ा है।
- स्टार्टर कोड चलाएं। रोबोट सीधे चलता है और पहले मोड़ पर ही टेप से बाहर हो जाता है।
decideको केवलs["left"]औरs["right"]का उपयोग करने के लिए बदलें (चेक अन्य रीडिंग को छिपा देता है)। पाठ में दिए गए नियम टेबल का पालन करें।- जब दोनों सेंसर फर्श को देखें, तो पिछला मोड़ याद रखने के लिए एक global variable जोड़ें।
- लक्ष्य: 150 स्टेप्स के बाद, बिना क्रैश हुए, रोबोट कम से कम x = 140 सेमी तक पहुँच जाए, और उसका बीच का हिस्सा कभी भी टेप से 5 सेमी से अधिक दूर न गया हो।
- 0.4, 0.6 और 0.8 की बेस स्पीड आज़माएं और लिखें कि क्या बदलाव आता है।
प्रैक्टिस लैब
कोड में बदलाव करें और इसे रन करें। Python आपके ब्राउज़र में चलता है — हमारे सर्वर पर कुछ नहीं भेजा जाता।
कोई आउटपुट नहीं। वैल्यूज़ देखने के लिए print(...) जोड़ें।
आपका काम तब पूरा होगा जब
कठिन सवाल
उत्तर देखने से पहले ख़ुद जवाब देने की कोशिश करें। अगर आप इनके जवाब दे सकते हैं, तो आप पाठ समझ गए हैं।
Q1आपका लाइन फॉलोअर सिम्युलेटर में 0.6 की स्पीड पर पास हो जाता है। वही लॉजिक उसी स्पीड पर असली रोबोट में फेल क्यों हो सकता है?दिखाएं
सिम्युलेटर एकदम सटीक सेंसर और मोटरों के साथ हर 0.1 सेकंड में प्रतिक्रिया देता है। एक असली रोबोट में मोटरें धीरे-धीरे तेज़ और धीमी होती हैं, सेंसरों को सही ऊंचाई और थ्रेशोल्ड की ज़रूरत होती है, फर्श चमकदार या उबड़-खाबड़ हो सकता है, और एक मोटर अक्सर दूसरी से थोड़ी अधिक ताकतवर होती है। ये सभी देरी या गलतियाँ बढ़ाते हैं, जिससे रोबोट लाइन से आगे निकल जाता है। असली रोबोट पर धीमी गति से शुरुआत करें और फिर गति बढ़ाएं।
Q2ट्रैक पर एक बिल्कुल सीधा (90 डिग्री का) मोड़ है। वहाँ "पिछला मोड़ याद रखें" नियम अभी भी क्यों फेल हो सकता है, और क्या चीज़ मदद कर सकती है?दिखाएं
सीधे समकोण (90 डिग्री के मोड़) पर हो सकता है कि रोबोट तब भी सीधे ही चल रहा हो जब दोनों सेंसर टेप से बाहर निकलें, इसलिए उसका पिछला मोड़ गलत दिशा में हो सकता है, या मोड़ इतना धीमा हो सकता है कि वह समय रहते लाइन न ढूंढ पाए। काम आने वाले विचार: जैसे ही कोई सेंसर पहली बार टेप खोए, गति धीमी करें, खोजते समय एक ही जगह पर घूमें (एक पहिया पीछे, एक आगे), या बीच में या किनारों पर एक तीसरा सेंसर जोड़ें।
अक्सर पूछे जाने वाले सवाल
दो सेंसर ही क्यों इस्तेमाल करें? क्या एक काफी नहीं होगा?
एक सेंसर लाइन के किनारे को फॉलो कर सकता है: जब उसे काला दिखे तो एक तरफ मुड़े, और जब सफेद दिखे तो दूसरी तरफ मुड़े। यह काम तो करता है, लेकिन ज्यादा डगमगाता है और आसानी से भटक जाता है। दो सेंसर बताते हैं कि लाइन किस तरफ है। गति के लिए बनाए गए रोबोट अक्सर पांच या उससे ज्यादा सेंसर की कतार का उपयोग करते हैं।
असली ट्रैक पर मुझे किस चौड़ाई की टेप इस्तेमाल करनी चाहिए?
टेप को अपने सेंसर की दूरी के हिसाब से चुनें। अगर बीच में होने पर दोनों सेंसर को टेप दिखनी चाहिए, तो टेप उनके बीच की दूरी से थोड़ी चौड़ी होनी चाहिए। पहले अपनी टेप को आज़माएं और सेंसर की स्थिति को एडजस्ट करें।
मुझे global variable की ज़रूरत क्यों है?
decide फ़ंक्शन हर स्टेप पर नए सिरे से कॉल होता है। स्टेप्स के बीच जो कुछ भी याद रखना है, जैसे कि पिछला मोड़, उसे फ़ंक्शन के बाहर रहना होगा: एक global variable, dictionary या class में। किसी असली बोर्ड पर C++ में, आप loop() के बाहर डिक्लेयर किए गए वेरिएबल का इस्तेमाल करेंगे।
मेरा रोबोट लाइन पर तो चल रहा है लेकिन बहुत धीमे। मुझे सबसे पहले क्या बदलना चाहिए?
बेस स्पीड को धीरे-धीरे थोड़ा बढ़ाएं, और मोड़ों को धीमा बनाएं (अंदरूनी पहिए को पूरी तरह रोकने के बजाय धीमा करें)। हर बदलाव के बाद टेस्ट करें। सबसे तेज़ सेटिंग्स आमतौर पर उस बिंदु से ठीक नीचे होती हैं जहाँ रोबोट सबसे तीखे मोड़ पर लाइन खोने लगता है।
पाठ का टेस्ट
5 सवाल। पास होने और इस पाठ को पूरा करने के लिए 3 सही होने चाहिए (60%)।