ट्रिगर करने के लिए धीमी गति से रास्पिस्टिल?


18

मैं "कई" रसभरी को एक साथ ट्रिगर करने की कोशिश कर रहा हूं, जबकि रास्पिस्टिल का उपयोग केवल परीक्षण के लिए होता है, मैं सोच रहा हूं कि तस्वीर लेना इतना धीमा क्यों है, मैंने एक परीक्षण किया और, उसी समय जब मैंने इस कमांड पर एंट्री मारा:

raspistill -o /home/pi/test55.jpg -ex sports --nopreview

मैं कैमरे के सामने एक iPhone क्रोनोमीटर शुरू करता हूं। परिणाम? 7 सेकंड, 09 (लेकिन तेज, इतनी शटर गति आदि ठीक थी, मुझे धुंधला नंबर नहीं मिल रहा था)। चित्र लेने से पहले एक्स सेकंड लेने के लिए मैं इसके लिए क्या कर सकता हूं? मैं आरपीआई के सैकड़ों को सिंक करने जा रहा हूं और मैं नहीं चाहता कि उनमें से कुछ तस्वीर 4 पर और कुछ 10 सेकंड में लें ताकि मैं समझ पाऊं कि वहां क्या हो रहा है।

जवाबों:


5

आपको हर समय कैमरा प्रक्रिया चलाने की आवश्यकता है।

यह एकमात्र तरीका है जिससे मैं 50ms (औसतन) परिणाम प्राप्त कर सकता हूं। मैंने हर जगह समाधान के लिए देखा। 1 सेकंड मेरी गति सेंसर परियोजना के लिए बहुत धीमी थी।

@Dave जोन्स की परियोजना ने मुझे यह पता लगाने में मदद की कि यह कैसे करना है।

सिर्फ 2 फाइलें:

एक डेमन, हर समय और एक ग्राहक चल रहा है।

डेमॉन वह जगह है जहां आप सभी कैमरा सेटिंग्स सेट करते हैं।

picam-daemon.py

picam-client.py

पाइथन पिकम-daemon.py

import threading
import os, io, base64, time, socket, picamera, daemon
import daemon.runner

MAX_LENGTH = 50 # max length of any possible entry from "client"
serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # setup socket
PORT = 10000 # port 10000
HOST = '127.0.0.1' # runs on local host
serversocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) # this allows us to override port, prevents error
serversocket.bind((HOST, PORT)) # lock server to this port and host
serversocket.listen(10) # max 10 clients


# Waits for commands, such as "snap" and "ack"
# Runs over "sockets"
def handle(clientsocket):
    while 1:
        buf = clientsocket.recv(MAX_LENGTH)

        # Receive the SNAP command. Take a picture with PiCam.
        if buf == 'snap':
            start = time.time()
            camera.capture('/home/pi/ir/picam-latest-snap.jpg')
            finish = start - time.time()
            print finish
            print 'Picture Taken!'

        if buf == 'ack':
            print 'Ping: Hello!'

        if len(buf) == 0: break

# Camera is always loaded here
# The "magic" is in the camThread, this allows a picture to be captured, then it gracefully closed the camera connection and reopens it. This produces very fast captures (54ms vs 1.5s!)
while 1:
    # setup camera
    camera = picamera.PiCamera()
    camera.resolution = (640, 480)
    #camera.zoom = (0.2, 0.2, 1.0, 1.0)
    camera.exposure_mode = 'sports'
    print('Camera server running')

    # accept connections from outside, in order to receive commands
    (clientsocket, address) = serversocket.accept()
    ct = threading.Thread(target=handle, args=(clientsocket,))
    ct.run() # this can be run(), because it can be scaled.

    print 'Camera thread starting.'
    camThread = threading.Thread()
    while camThread.is_alive():
        camThread.join(1)
    camThread.run() # this must be start(), otherwise PiCam will crash. This is because PiCam cannot receive more than 1 connection.
    print 'Camera thread ended'
    camera.close() # Gracefully close PiCam if client disconnects

(दूसरे टर्मिनल में) अजगर पिकम-client.py

import socket
import sys


HOST = '127.0.0.1'
PORT = 10000
s = socket.socket()
s.connect((HOST, PORT))

print s

while 1:
    msg = raw_input("Command To Send: ")
    if msg == "close":
       s.close()
       sys.exit(0)
    s.send(msg)

मैं यह उत्तर पोस्ट कर रहा हूं क्योंकि मुझे यह Google में मिला है, मैं स्वयं इसका उत्तर खोजने का प्रयास कर रहा हूं। मुझे एक नहीं मिला, इसलिए मुझे कुछ परियोजनाओं के आसपास खुदाई करनी पड़ी और खुद के साथ कुछ करना पड़ा।


उसी समस्या का सामना करते समय, मैं उसी समाधान के साथ आया था, लेकिन कोड लिखने के पास कहीं भी नहीं गया था। मुझे खुशी है कि किसी और ने मुझे इसे हरा दिया!
निक कॉन्स

6

आपको 0 का टाइमआउट निर्दिष्ट करने की आवश्यकता है।

रास्पिस्टिल मदद से

-timeout "Time (in ms) before takes picture and shuts down (if not specified, set to 5s)

यह परीक्षण करने के लिए कि आपको "समय" का उपयोग करने में कितनी देर लगती है

time raspistill -o /home/pi/test55.jpg -ex sports --nopreview --timeout 0

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

8
मेरे रास्पबेरी में, 0 के निर्दिष्ट समय को "अनंत" लगता है, जबकि "1" के एक समय
निर्धारण

4
इसके अलावा, इस तरह के कम समय का उपयोग करने से कैमरे को कलेक्टरों को उजागर करने के लिए पर्याप्त समय नहीं मिलता है, जिसके परिणामस्वरूप एक अंधेरे छवि होती है। मुझे लगता है कि छवि के अंधेरे और धुंधली होने से पहले मैं लगभग 300 से कम नहीं जा सकता।
सेरिन

2
यदि गंभीर रूप से आवश्यक नहीं है तो -tविकल्प को छोड़ दें । @Cerin के अनुसार यह किसी भी तरह छवि को नष्ट कर देता है यदि बहुत कम सेट किया जाता है। सच कहूं तो रास्पबेरी पाई के प्रलेखन में इस विकल्प के बारे में बहुत कम जानकारी है और यह गलत धारणा है कि टाइमआउट एक सरल "देरी" / "समय ट्रिगर" है, जो स्पष्ट रूप से नहीं है।
फ्लैट्रोन

4

मैंने अपने .bash_profile में निम्नलिखित उपनामों को निर्दिष्ट किया है ताकि आसान और तेज़ कैमरा शॉट्स प्राप्त कर सकें:

alias shot='SHOTTIME=$(date +"%Y-%m-%d_%H%M") && raspistill -o shot-$SHOTTIME.jpg --nopreview --exposure sports --timeout 1

जब भी मैं shotकमांड लाइन पर टाइप करता हूं , तो टाइम स्टैम्प वाली एक छवि बच जाती है, उदाहरण के लिए shot-2016-02-27_0934.jpg


1
रास्पबेरी पाई स्टैक एक्सचेंज समुदाय में आपका स्वागत है! इस --timeout 1तर्क के साथ भी () मुझे आश्चर्य होगा कि अगर यह जल्दी था - लेकिन जैसा कि मैंने (अभी तक) अपने सिस्टम को ऐसी स्थिति में नहीं मिला है कि यह एक स्नैप-शॉट लेता है जो कभी भी मेरे सामने को अनलॉक करने की कोशिश करता है- दरवाजा मैं वास्तव में उठा नहीं सकता! -) कमांड लाइन का अच्छा उपयोग हालांकि (घड़ी को मान लिया गया है) - जिसमें सबसे महत्वपूर्ण मूल्यों के साथ डेटाइम स्टैम्प लगाना शामिल है, इसलिए अल्फा-न्यूमेरिक सॉर्ट-ऑर्डर डेट सॉर्ट-ऑर्डर के समान है!
19

1
~ $ समय ने वास्तविक 0m0.040s उपयोगकर्ता को गोली मारी 0m0.010s sys 0m0.020s qed;)
NDB

1
0.040 सेकंड दुर्भाग्य से सत्य होने के लिए उपवास करने के लिए बहुत दूर है .. ऊपर दिए गए समय कमांड का उपयोग त्रुटिपूर्ण है, यह वास्तव में केवल SHOTTIME चर को असाइन करने के लिए लिया गया समय मापेगा, छवि को कैप्चर नहीं करेगा। वास्तविक समय ~ 1 सेकंड है
स्लैकहैकर

आपकी टिप्पणी के लिए धन्यवाद, आप सही हैं। मैंने अपने मूल पाठ से लगने वाले समय को हटा दिया है।
NDB

2

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

मैं यह नहीं कह सकता कि यह 100 पाई के साथ परीक्षण किया गया है - इस समय इसका उपयोग करने वाले सबसे बड़े सेटअप में 20 शामिल हैं, लेकिन मैं बड़े पैमाने पर शामिल किसी भी मुद्दे के बारे में सुनना चाहूंगा।

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


मैं udp भाग के बारे में बहुत चिंतित नहीं हूं और न ही ग्राहक (मैं उन्हें हाथ से नियंत्रित नहीं करना चाहता, वे एक बहुत बड़ी परियोजना द्वारा नियंत्रित होते हैं) लेकिन क्या कंपाउंडपीआई किसी ऐसी चीज का उपयोग करता है जो तत्काल कब्जा कर लेता है या उसके पास भी है रास्पिस्टिल जैसी देरी?
रॉनन थिबुडौ

डेव, ऐसा लगता है कि आप उन परियोजनाओं के लेखक हैं जो मुझे आवश्यकता के इर्द-गिर्द घूमते हैं, क्या कोई मौका है कि हम स्काइप या ईमेल चर्चा कर सकते हैं?
रोनन थिबुडौ

निश्चित रूप से - मुझे सीधे ईमेल करने के लिए स्वतंत्र महसूस करें (मेरा ई-मेल पता मेरे GitHub प्रोफाइल पर दिखाई देना चाहिए )
डेव जोन्स

1
ओह, और आपके अन्य प्रश्न पर: यह तत्काल के पास है। जब कंपाउंडि डेमॉन शुरू किया जाता है तो यह कैमरे को इनिशियलाइज़ और कॉन्फ़िगर करता है (जो कि रास्पिस्टिल में बहुत देरी से आता है) तब कैप्चर कमांड का इंतजार करता है। कैप्चर कमांड या तो तुरंत कैप्चर का कारण बन सकता है या कैप्चर करने से पहले निर्दिष्ट टाइमस्टैम्प तक प्रतीक्षा कर सकता है। तत्काल मामले में, कमांड और कैप्चर की प्राप्ति के बीच की देरी मिलीसेकंड होनी चाहिए।
डेव जोन्स

डेव जोन्स, कब्जा लेने से पहले कैमरे को शुरू करने का यह विचार, क्या आप अधिक जानकारी दे सकते हैं? क्या हम कमांडलाइन से ऐसा कर सकते हैं?
ओली
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.