सीधे अंतर रोबोट ड्राइविंग प्राप्त करने के लिए PID का उपयोग करने का दृष्टिकोण


13

एक अंतर ड्राइव रोबोट पर विचार करें जिसमें प्रतिक्रिया के लिए प्रत्येक के साथ संलग्न एक एनकोडर के साथ दो मोटर चालित पहिए हैं। माना जाता है कि प्रत्येक डीसी मोटर के लिए एक फ़ंक्शन है जो -1 से 1 तक फ्लोट लेता है और उस मोटर को आनुपातिक मात्रा प्रदान करने के लिए पीडब्लूएम सिग्नल सेट करता है। दुर्भाग्य से, सभी मोटर्स समान नहीं बनाए जाते हैं, इसलिए प्रत्येक मोटर को उसी पीडब्लूएम सिग्नल को भेजने से रोबोट वीर को बाएं या दाएं बनाता है। मैं सोचने का प्रयास कर रहा हूं कि पीआईडी ​​लूप के इनपुट के रूप में प्रत्येक मोटर से जुड़े एन्कोडर का उपयोग करके रोबोट को कैसे सीधे ड्राइव किया जाए।

यहां बताया गया है कि मैं यह कैसे करूंगा: मैं बाएं और दाएं एन्कोडर के बीच अंतर को ले जाऊंगा, कुछ सीमा के बीच त्रुटि को बाध्य करूंगा, इसे सामान्य से [-1, 1] तक सीमित कर दूंगा और फिर इसे मोटर शक्तियों 0 से 1 तक मैप करूंगा। इसलिए यदि मैं और डी शून्य थे, और हमें 1 की त्रुटि मिलती है (इसलिए बाएं मोटर दाएं मोटर की तुलना में बहुत अधिक हो गई है), तो बाएं मोटर को 0 पर सेट किया जाएगा, और दाएं मोटर को 1 पर सेट किया जाएगा (हार्ड पैदा करना) बाएं)।

क्या इसमें कोई समस्या है? एक बेहतर तरीका क्या है?

जवाबों:


5

क्या इसमें कोई समस्या है?

इसके साथ मुख्य मुद्दा यह है कि जबकि आपका प्रस्तावित समाधान मोटर्स के प्रदर्शन के बीच एक बेमेल के लिए तुरंत सही होगा, यह संचित त्रुटि के लिए सही नहीं होगा, अकेले स्थिति में और अधिक जटिल त्रुटियों जैसे कि एबे त्रुटि (बाद में देखें) दें।

एक बेहतर तरीका क्या है?

ऐसी कई चीजें हैं जो आप कर सकते हैं, इस पर निर्भर करता है कि त्रुटियों के लिए आपकी सहिष्णुता क्या है और आप उन्हें सुधारने में कितना प्रयास करना चाहते हैं।

पहला कदम पीआईडी ​​छोरों की एक जोड़ी स्थापित करना होगा, प्रत्येक पहिया के लिए एक, दोनों को एक ही मांग की स्थिति देगा। जैसा कि मैंने एक समान प्रश्न के उत्तर में सुझाव दिया है , यदि आप दोनों पहियों को बहुत तंग त्रुटि के दायरे में रखते हैं, जहां आप उन्हें होने के लिए कहते हैं, तो ध्यान देने योग्य वीर पैदा करने के लिए पर्याप्त त्रुटि संचित करने में कुछ समय लगेगा।

एकल जटिल, अन्योन्याश्रित संयुक्त प्रणाली की तुलना में दो नाममात्र स्वतंत्र मोटर स्तर पीआईडी ​​लूप को ट्यून करना बहुत आसान होगा। काम कर रहे उच्च स्तर के नियंत्रण के किसी भी बदलाव को खड़ा करने के लिए आपको वास्तव में प्रत्येक मोटर की आवश्यकता होती है ताकि जितना संभव हो उतना समय के लिए अन्य मोटर के समान व्यवहार किया जा सके और इसके लिए वास्तव में अलग सर्वो लूप की आवश्यकता होती है।

हालाँकि और भी कई जटिलताएँ हैं, और यह निर्भर करता है कि आपको किस सटीकता की आवश्यकता है और आप उनके लिए सही करने के लिए कितना प्रयास करने के लिए तैयार हैं। यह हो सकता है कि डेड रेकिंग पर्याप्त है, या आपको अपने रोबोट में सापेक्ष या निरपेक्ष स्थिति निर्धारण को जोड़ने की आवश्यकता हो सकती है।

एक समस्या यह है कि भले ही आपके बाएं और दाएं दोनों पहिए 1000 एनकोडर की संख्या को आगे बढ़ाते हैं, फिर भी आप दो अलग-अलग रनों पर एक अलग स्थिति में समाप्त हो सकते हैं

उदाहरण के लिए, मान लें कि आपके पास 10 एनकोडर काउंट्स की अधिकतम त्रुटि है, और आपकी मोटरें पीआईडी ​​लूप पुनरावृत्ति के अनुसार 10 एनकोडर काउंट्स की गति से चल रही हैं। आपकी बाईं मोटर ५,१०,१०,१० ... १०,५ आगे बढ़ सकती है, जबकि आपकी दाहिनी मोटर में ४,११,१०,१० ... १०,५ की प्रोफाइल हो सकती है और शुरू में त्वरण में मामूली अंतर भी। इस कदम के कारण रोबोट थोड़ी सी गलत दिशा में जा सकता है। केवल इतना ही नहीं बल्कि आप जिस दिशा में आगे बढ़ेंगे, त्रुटि उतनी ही बड़ी हो जाएगी। जब हम अब्बे त्रुटि की बात करते हैं , और एक जटिल गतिज मॉडल या किसी प्रकार के बाहरी संदर्भ के बिना हम इस बारे में बात कर रहे हैं, तो आप कभी भी इसके लिए सही नहीं हो पाएंगे।

अधिक जानकारी के लिए, एक समान लेकिन बिल्कुल डुप्लिकेट प्रश्न के समान मेरा उत्तर देखें : मैं एक सीधी रेखा में रोबोट को चलाने के लिए Arduino PID लाइब्रेरी का उपयोग कैसे कर सकता हूं? और संबंधित लाइन अनुयायी अनुकूलन के लिए मेरा जवाब


2

मेरे पास 2 स्वतंत्र रूप से संचालित पहियों के साथ एक बॉट है।

मैंने इसे इच्छित दिशा में शीर्ष रखने के लिए एक गाइरो का उपयोग करने के लिए चुना, धक्कों को उछालता है और यहां तक ​​कि इसे उठाता है और इसे चारों ओर मोड़ता है, इसके लिए बहुत कम परिणाम होते हैं क्योंकि यह सही होगा।

मैं एक एकल पीआईडी ​​का उपयोग करता हूं, जो कि गायरो द्वारा निर्धारित वर्तमान हेडिंग (दिशा) में त्रुटि के अनुसार 2 मोटर्स में से प्रत्येक के लिए वांछित वर्तमान गति में सुधार / जोड़ / घटाता है।

उदाहरण के लिए मैंने गति को 50% और शीर्ष को 20 डिग्री पर सेट किया। यह आम तौर पर 50% की शक्ति पर दोनों मोटर्स को चलाएगा। लेकिन जैसे-जैसे हेडिंग भटकती है, पीआईडी ​​समायोजन को एक मोटर में कुछ शक्ति जोड़कर और दूसरी से कुछ शक्ति निकालता है, इसलिए आप मोटर्स के बीच 45% / 55% पावर विभाजन के साथ समाप्त हो सकते हैं क्योंकि पीआईडी ​​हेडिंग को सही करता है।

Gyros की अपनी समस्याएं हैं, हालांकि कुछ समय बीतने के बाद भी मुझे लग रहा है कि मेरी ग्रियो में लगभग 1 डिग्री प्रति मिनट का बहाव है। यह हो सकता है क्योंकि पृथ्वी प्रति घंटे 15 डिग्री घूमती है, यह भी लंबे समय में विचार किया जाना चाहिए।

जैसा कि पहले कहा गया है कि पहिए पर एनकोडर वास्तव में यह जानने के लिए एक महान विचार है कि आपने कितनी दूर की यात्रा की है।


मुझे इसके लिए आपका कोड देखना अच्छा लगेगा। मैं gyro / एक्सेलेरोमीटर / मैग्नेटोमीटर के साथ एक ही रास्ता नीचे शुरू कर रहा हूं, लेकिन मैं अभी भी इन सेंसर से रीडिंग से समझ बनाने की कोशिश कर रहा हूं।
रॉन स्मिथ

यहाँ मेरे कोड का लिंक दिया गया है, मुझे डर है कि इसे समझना आसान नहीं होगा। github.com/rlsutton1/piBot/blob/master/src/main/java/au/com/…
रॉबर्ट सटन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.