2011-10-02 13 views
5

मेरे पास एक इन्फ्रारेड कैमरा/ट्रैकर है जिसके साथ मैं सीरियल पोर्ट के माध्यम से संचार कर रहा हूं। मैं इस समय ऐसा करने के लिए pyserial मॉड्यूल का उपयोग कर रहा हूँ। कैमरा 60 हर्ट्ज की दर से ट्रैक किए गए ऑब्जेक्ट की स्थिति अपडेट करता है। ट्रैक किए गए ऑब्जेक्ट की स्थिति प्राप्त करने के लिए मैं एक pyserial.write() निष्पादित करता हूं और फिर pyserial.read (serialObj.inWaiting()) के साथ आने वाले उत्तर को सुनता हूं। एक बार जवाब/स्थिति प्राप्त हो जाने के बाद, जबकि लूप को फिर से चालू किया जाता है और इसी तरह। मेरा प्रश्न इस दृष्टिकोण की विश्वसनीयता और गति के साथ करना है। मुझे कंप्यूटर द्वारा कम से कम 60 हर्ट्ज की दर से प्राप्त होने की स्थिति की आवश्यकता है (और फिर स्थिति को यूडीपी के माध्यम से रीयल-टाइम ओएस में भेजा जाएगा)। क्या ऐसा कुछ है जो पाइसरियल/पायथन सक्षम सी-आधारित दृष्टिकोणों में सक्षम है या नहीं?पाइसरियल/पायथन और वास्तविक समय डेटा अधिग्रहण

धन्यवाद, ल्यूक

+1

यह कैसे निकला? आप पाइथन के साथ किस प्रकार की नमूना दरों को प्राप्त करने में सक्षम थे? मैंने आरएस 232 पर ओहॉस स्केल से कुछ सरल डेटा अधिग्रहण किया है, लेकिन केवल 5hz (स्केल हो सकता है) प्राप्त करने में सक्षम था – Chris

उत्तर

0

पायथन ठीक रहना चाहिए, लेकिन करने के लिए सबसे अच्छी बात यह सुनिश्चित करती है कि आप प्रति सेकेंड कितने पढ़ रहे हैं, इसकी निगरानी करें। गणना करें कि प्रत्येक सेकेंड कितनी बार पढ़ा जाता है, और यदि यह संख्या बहुत कम है, तो प्रदर्शन लॉग या इसी तरह लिखें। आपको अपने बाकी अजगर कार्यक्रम (अगर कोई है) से आई/ओ भाग को डीकॉप्लिंग करने पर भी विचार करना चाहिए क्योंकि पाइसरियल रीड कॉल अवरुद्ध हो रहे हैं।

+1

सभी उत्तरों के लिए धन्यवाद। मुझे लगता है कि इससे पहले कि मैं किसी और चीज पर जाने पर विचार करता हूं, मैं पढ़ने/लिखने के पिसारी कार्यों के प्रदर्शन का परीक्षण करूंगा। लेकिन क्या आप अवरुद्ध सीरियल कॉल की व्याख्या कर सकते हैं और उन्हें शायद शेष कार्यक्रम को डीकॉप्लिंग करने की आवश्यकता क्यों है (आप सही हैं, पढ़ना/लेखन आवश्यक कार्यक्षमता का केवल एक छोटा हिस्सा है)। – dataman

+0

पिसरलियल रीड कॉल पर डिफ़ॉल्ट ब्लॉक से होगा (आप इसे कॉन्फ़िगर कर सकते हैं ताकि यह ऐसा न करे)। इसका अर्थ यह है कि जब आप 'पढ़ा' कहते हैं, तो पूरा कार्यक्रम बैठता है और कुछ लिखने की प्रतीक्षा करता है, फिर इसे पढ़ता है, फिर आपका प्रोग्राम जारी रख सकता है। गैर-अवरुद्ध कॉल ('रीड रिटर्न तुरंत, लेकिन शायद कुछ भी नहीं) का उपयोग करके, इसके आसपास कुछ तरीके हैं, ईवेंट संचालित फ्रेमवर्क जैसे मुड़ते हुए (मुड़ते हुए जानते हैं कि आप प्रतीक्षा कर रहे हैं और इस दौरान अन्य चीजें करते हैं) या प्रक्रियाओं/थ्रेडिंग का उपयोग करके (हालांकि आपको प्रक्रिया से आने वाले संदेशों के लिए एक ही समस्या है)। – jozzas

+1

हाँ, मैंने टाइमआउट = 0 सेट किया है और फिर एक समय में एक char प्राप्त करना समाप्त कर दिया है। यानी, मैं थोड़ी देर के भीतर serial.read (1) निष्पादित करता हूं और '\ r' की जांच करता हूं जो रिटर्न कमांड के अंत को इंगित करता है और जब वह स्थिति पूरी हो जाती है तो मैं एक नया प्राप्त स्थिति अनुरोध जारी करता हूं। कुछ संक्षिप्त प्रयोगों से, ऐसा प्रतीत नहीं होता है कि मैंने कैमरे सिस्टम में किसी भी फ्रेम को याद किया है, जो कि बहुत अच्छा है, हालांकि मैं किसी भी तरह से यह सुनिश्चित करना चाहता हूं कि यह हमेशा मामला है। जैसे कि प्रोग्राम निष्पादित करते समय मैं ब्राउज़र खोलता हूं, क्या स्क्रिप्ट को सर्वोच्च प्राथमिकता देने के लिए मजबूर करने का कोई तरीका है? – dataman

1

इस गति की तुलना में विलंबता के और अधिक एक मामला है।

पायथन हमेशा स्मृति आवंटन और रिलीज करता है, लेकिन यदि डेटा का पुन: उपयोग किया जाता है, तो उसी स्मृति को सी लाइब्रेरी द्वारा पुन: उपयोग किया जाएगा। तो ओएस (सी लाइब्रेरी/यूडीपी/आईपी स्टैक) का पाइथन से अधिक प्रभाव होगा।

मुझे सच में लगता है कि आपको अपनी आरटीओएस मशीन पर एक सीरियल पोर्ट का उपयोग करना चाहिए और सी कोड और प्री-आवंटित बफर का उपयोग करना चाहिए।

0

मुझे संदेह होगा कि पायथन डेटा को ठीक से बनाए रखेगा। मेरी सलाह यह कोशिश करने के लिए होगा, और अजगर अंतराल के लिए प्रकट होता है, तो PyPy बजाय कोशिश - अजगर का कार्यान्वयन और इतने करीब गति के लिए नीचे अपने भीतर के छोरों का सबसे संकलित मशीन कोड के लिए सी

की कि

http://pypy.org/

संबंधित मुद्दे