Automatisierter Start eines SH-Skripts für Zeitraffer-Bilder

L I V E Stammtisch ab 20:30 Uhr im Chat
  • Hallo,

    ich bin ein bisschen am Verzweifeln. Habe die raspberry seit letzter Woche und möchte einen als Zeitraffer-Kamera nutzen. Da wo ich die aufstelle, habe ich keinen Netzzugriff auf die Kiste, so dass ich die Box nur an Strom schließen will, er dann startet und automatisch loslegt.

    Ich habe in mein User-Verzeichnis eine timelapse.sh gelegt, die folgenden Inhalt hat:

    Code
    !#/bin/sh
    raspistill -o ~pi/pics/$(date +"%F-%H-%M").jpg -tl 300000 -t 108000000

    Das Skript habe ich zudem mit

    Code
    chmod +x timelapse.sh

    lauffähig gemacht.

    Die rc.local in /etc/ habe ich erweitert. Sie sieht jetzt wie folgt aus:

    Aber irgendwie will das ganze nicht sauber laufen, ich habe eher das Gefühl, dass es irgendwie stockt. Er macht Bilder, aber irgendwie nur sporadisch.

    Hat jemand eine Idee? ich habemir das oben geschriebene, per Google- und Forenrecherche zusammen gebaut; bin noch absolut Newbie und bitte um Nachsicht :)

  • Automatisierter Start eines SH-Skripts für Zeitraffer-Bilder? Schau mal ob du hier fündig wirst!

    • Offizieller Beitrag

    Hey,

    ich denke ein Fehler wird es sein das du in der rc.lcoal dein Script so aufrufst:
    sh ~pi/timelapse.sh

    Alle Befehle in der rc.local werden von root ausgeführt und daher würde er versuchen /root/pi/timelapse.sh zu starten. Am besten du gibtst deine Script immer wie folgt an:
    sh /home/pi/timelapse.sh


    (Ich nehme mal an das der raspistill Befehl so in Ordnung ist, da ich die genaue Syntax nicht kenne ;) )

    Ich bin ein gefallener Engel namens Turael.

    Einst vor langer Zeit rebelierte ich im Himmel bis Gott mich auf die Erde verbannte.

    Doch meine taten werden kein ende finden....

    • Offizieller Beitrag

    ~pi funktioniert. Dann nimmt er das homeverzeichnis vom user Pi

    Code
    root@NAG-Mon:~# cd ~pi
    root@NAG-Mon:/home/pi#

    Um genau zu sein sollte man in der rc.local sogar überall mit absoluten Pfaden arbeiten

    Code
    /bin/sh /home/pi/timelapse.sh
  • Der Shebang (die aller erste Zeile in dem File) ist aber auch falsch

    Code
    !#/bin/sh

    Richtiger wäre:

    Bash
    #!/bin/sh

    Desweiteren würde das Script nur einmal ausgeführt werden, sobald "-t 108000000" (in ms) abgelaufen ist wars das aber - beabsichtigt?

    Und den Pfad wo die Bilder gespeichert werden sollen, sollte auch ein absoluter Pfad sein, also anstatt

    Code
    raspistill -o ~pi/pics/$(date +"%F-%H-%M").jpg -tl 300000 -t 108000000

    Wäre folgendes besser:

    Code
    raspistill -o /home/pi/pics/$(date +"%F-%H-%M").jpg -tl 300000 -t 108000000

    ..Da das Script als root ausgeführt wird und deshalb mit "~pi/pics" in "/root/pi/pics" landen würde (das Verzeichnis sollte auch existieren)

  • [font="Gill Sans MT"]Hallo zusammen,[/font]
    [font="Gill Sans MT"] [/font]
    [font="Gill Sans MT"]erst Mal herzlichen Dank für euren Tipps und sorry, dass ich jetzt erst dazu komme, darauf einzugehen, bzw. die nachzutesten und meine Konfiguration anzupassen.[/font]
    [font="Gill Sans MT"] [/font]
    [font="Gill Sans MT"]Ich habe jetzt mein Skript in der timelapse.sh (liegt im Homeverzeichnis von pi) angepasst:[/font]

    Bash
    #!/bin/sh
    raspistill -o /home/pi/pics/$(date +"%F-%H-%M").jpg -tl 108000000 -t 300000

    @meigrafd Auf diversen Seiten wird das eigenartigerweise anders dargestellt.

    so hier:

    Zitat


    Praktisch ist der Zeitraffer-Modus, in dem raspistill in frei definierbaren Intervallen automatisch auslöst. Das folgende Kommando erzeugt eine Stunde lang alle fünf Sekunden ein Foto und speichert es im Verzeichnis photos:


    Code
    $ raspistill -o photos/%04d.jpg -tl 5000 -t 3600000


    raspistill --help sagt:

    -tl, --timelapse : Timelapse mode. Takes a picture every <t>ms

    Demnach liegst du wohl richtig. Wobei mich das echt irritiert. Ich habe in einem "Online-Versuc" (also per Hand das Skript gestartet) mit dem in der heise dargestellten Syntax den gewünschten Effekt hinbekommen.


    Und die rc.local (im /etc/) :

    Weiterhin ohne Erfolg. Ich werde mich separat dazu mal mit dem Thema Crontab auseinander setzen.

  • @meigrafd Auf diversen Seiten wird das eigenartigerweise anders dargestellt.

    so hier:

    Das ist ja auch richtig, nur hört er nach 60 Minuten damit auf und macht dann keine Bilder mehr..
    Möchtest du auch nur für eine Stunde Bilder aufnehmen? Wenn ja dann is das so schon oke, aber wenn nicht dann brauchst du eine andere Lösung wo sich in dem Fall dann entweder ein entsprechendes Script oder ein crontab Eintrag für eignen würde

    Also zum Beispiel als Script:

    Bash
    #!/bin/sh
    EVERYsec=30
    while :; do
      raspistill -o /home/pi/pics/$(date +"%F-%H-%M-%S").jpg
      sleep $EVERYsec
    done


    Das würde bewirken dass das Script sich selber im Kreis dreht (while ist eine Schleife). Er macht also ein Foto und anschliesend wird die Schleife für 30 Sekunden pausiert, dann fängt die Schleife von vorne an und macht das nächste Foto, pausiert dann wieder für die Sekunden wie sie in EVERYsec hinterlegt sind usw usw usw

    Wichtig dabei ist aber auch der Zusatz %S im "date" Befehl, um die jeweilige Sekunde in den Dateinamen zu kriegen denn sonst überschreibt man bei einem Wert von "alle 30 sekunden" mindestens 1 Bild -> 13 Uhr 10 Minuten und zB Sekunde 10 .. nächstes Bild: 13 Uhr 10 Minuten und Sekunde 40 ... Würde man nur %H (Stunde) und %M (Minute) als Dateiname festlegen würde er also in der selben Minute 2 Bilder machen und das vorherige überschreiben
    Wenn du den EVERYsec auf >= 60 einstellst kann aber %S auch weggelassen werden..

    Das Script trägst du dann wie folgt in /etc/rc.local ein:

    Code
    /home/pi/timelapse.sh &


    Das & am Ende bewirkt dass das Script in den Hintergrund geht und /etc/rc.local nicht pausiert, da ansonsten gewartet werden würde bis das Script (oder ein Befehl) fertig wäre (evtl. wäre das für den ersten versuch auch eine Möglichkeit man testen könnte obs damit geht)


    Oder hier auch ein Beispiel für einen crontab Eintrag:
    (dann brauchst du keinen eintrag in /etc/rc.local mehr!)

    Code
    * * * * *  /home/pi/timelapse.sh

    Das würde das Script jede Minute ausführen, es würde also ein Foto pro Minute machen.. Das Script sollte dann auch nur

    Bash
    #!/bin/sh
    raspistill -o /home/pi/pics/$(date +"%F-%H-%M").jpg


    enthalten

    Crontab kann aber nur minimal jede Minute etwas ausführen, wenn du einen kleineren Zeitraum brauchst dann musst du das Script mit der while Schleife nutzen

    Du kannst aber über Crontab auch einen bestimmten Zeitraum festlegen, das er zB nur zu bestimmten Uhrzeiten das Script ausführt, oder nur an bestimmten Tagen in der Woche usw - Beispiele dafür und auch eine genauere Beschreibung findest du in folgendem Thread: https://www.forum-raspberrypi.de/Thread-tutorial-crontab-cron-jobs

  • Ich habe selbst so ein Script, was mit 2 Parametern auskommt. Diese werden jedoch nicht auf Korrektheit geprüft.

    Code
    /home/pi/TimeLapse.sh 12 30

    Erstellt Bilder für die nächsten 12 Stunden im Abstand von 30 Sekunden
    Im Script selbst ist die Zielpfad-Angabe selbst zu ändern (Variable SAVEDIR)
    Ausserdem erstellt das Script nach Abschluss der Bilderserie automatisch ein Video mit 24 fps im 16:9-Format mit dem Namen YYY-MM-DD_TimeLapse.avi

    Verbesserungsvorschläge werden gern entgegengenommen :)


  • Verbesserungsvorschläge werden gern entgegengenommen :)

    Da kann ich mich nicht zurückhalten :D

    Anstatt "let" die in sh und bash enthaltene Funktion zur Berechnung nutzen:

    Habe auch noch einen klitzekleinen Fehler entdeckt: Bei " #Die Bilder machen " fehlte ein $ für EveryXsec also zum Abrufen der Variable: $EveryXsec


    PS: Was bewirkt eigentlich %06d oder %04d beim raspistill output Parameter?

  • Danke Dir!

    [font="Tahoma, Verdana, Arial, sans-serif"]%06d oder %04d bewirkt, dass die Bilder 6 (bzw. 4)-Stellig durchnummeriert werden :)[/font]

    [font="Tahoma, Verdana, Arial, sans-serif"]Also in meinem Falle: image_000001.jpg bis image_999999.jpg :)[/font]

    [font="Tahoma, Verdana, Arial, sans-serif"]Greetz[/font]

  • Ihr seid echt fit und schnell! Vielen Dank für die Flut an Infos. Ich werde mich noch mal an das Thema setzen. Es ist schon verdammt lang her, dass ich Linux und die Shell als Lernthema hatte. Macht mir aber extrem viel Spaß.

    Zum Hintergrund: Ich wollte mit -tl 300000 -t 108000000 folgendes bewirken:

    In meinem Büro habe ich einen tollen Blick auf die Hafenanlagen und die Skyline von Hamburg. Den RaspBerry würde ich einfach mit ins Büro nehmen, die Kamera an das Fenster per Tesaband kleben, den Pi an den Strom schließen und dann soll er alle 5min über 30h jeweils ein Bild machen, welche ich dann später als Zeitraffervideo zusammenstellen würde. Perfekt wäre es natürlich, wenn er danach runterfährt, und ich nicht einfach das Kabel rausziehen muss, damit er Aus ist.
    Generell reizt mich diese Zeitraffergesichte schon sehr, so dass ich mir eben kurz nach dem ersten Pi gleich den zweiten gekauft habe, den ich dann nur für solche Experimente und kreativen Sachen nutzen würde, während der erste solch "sinnhaften" Geschichten wie AirPrint, AirPlay, etc. erledigt.
    Die nächsten Ideen sind schon am Start; den kleine würde ich mal im Wald aufhängen und dort eine Wiese über 24h jeweils alle 5min aufnehmen, etc.

  • Dann kannst Du gerne mein Script (mit den Fehlerkorrekturen von meigrafd) nehmen, den Speicherpfad anpassen und mit

    Code
    ./TimeLapse.sh 30 300

    das ganze starten
    (30 Stunden, alle 300 Sekunden ein Bild. Also alle 5 Minuten)

    Bedenke aber den Speicherplatz. Ein Bild ist ca. 3 MB groß und bei 30 Stunden a 5 Minuten macht das "nur" 360 Bilder, die ein Volumen von ca. 1,1 GB haben werden.
    Für ein Timelapse vom Hafen würde ich jedoch mehr Bilder machen als nur alle 5 Minuten. alle 2 Minuten ein Bild ist OK und dann lieber die Frame-Rate des Videos erhöhen. Das sieht einfach flüssiger aus.

    Dort, wo das Video erzeugt wird einfach ein

    Code
    sudo shutdown -h now


    rein und das Himbeertörtchen fährt herunter

    Sven

  • Auf dem Törtchen sind über 5GB Speicherplatz frei, da kann ich also die Taktrate dementsprechen optimieren. Werde mich heute abend mal ransetzen und dann berichten, ob es geklappt hat.

  • Bei mir startet das Script via crontab morgen um 05:30 Uhr. Mal gucken, was der Wolken-Gott so meint und mir evtl. einen Sonnenaufgang mit Alpenblick beschert :)

    Auch ich geb dann bescheid.

    Code
    # m h  dom mon dow   command
    30 5 * * * /home/pi/TimeLapse.sh 3 10

    Also 3 Stunden Laufzeit und alle 10 Sekunden 1 Bild = 1080 Bilder mit ca. 3,2 GB Roh-Material
    Macht bei einer Framerate von 24fps ein Video von 45 Sekunden Länge. Sollte reichen ;)

  • Ich bin wahrscheinlich zu dämlich!

    timelapse.sh


    dann mittels

    Code
    crontab -e

    einen neuen Cronjob eingerichtet:


    Resultat: Nach dem Reboot finden sich erst mal keine Bilder in dem angegebenen Verzeichnis. Plötzlich und ohne erkennbaren Zusammenhang war dort ein Bild mit einer ~ am Ende des Dateinamens, der über den VNC-Client im Dateiexplorer nicht zu sehen war.

    Ich habe dann das timelapse.sh noch ma neuangelegt. Muss ich mit chmod noch lauffähig machen o.ä.?


  • Ich bin wahrscheinlich zu dämlich!

    timelapse.sh


    Wie man am Code-block sieht stehen da sehr viele sachen drin die nicht zu dem Script gehören

    Code
    [font="Gill Sans MT"]

    usw

    Also mach das bitte wie folgt:

    Text im Code-Block mit der Maus markieren (oben rein klicken, linke maustaste gedrückt halten und mit der maus nach unten gehen bis alles markiert ist) dann STRG+c drücken oder rechts maustaste und auf kopieren

    Dann öffnest du zB über PuTTY das Script mit nano, also so: nano /home/pi/timelapse.sh
    und drückst dann die rechte maustaste zum einfügen (oder SHIFT+EINFG)

    Dann sollte eigentlich nur der Code da drin stehen wie es oben zu sehen ist, ohne diese Forum-BBcodes wie font o.ä.

  • Und noch was: Die crontab passt nicht!

    * * * * * /home/pi/timelapse.sh 1 100

    So würde er jede Minute das Script starten und die cam verträgt nur eine Anwendung zugleich

    Lieber:

    * 17 * * * /home/pi/timelapse.sh 1 100

    So wird das einmalig am Tag um 17 Uhr gestartet

    Sven


  • * 17 * * * /home/pi/timelapse.sh 1 100

    So wird das einmalig am Tag um 17 Uhr gestartet

    Fast richtig :D Aber gerade garnich drauf geachtet von daher: Good Point ;)

    So würde das Script jede Minute ab 17Uhr ausgeführt werden also um 17:01 , 17:02 , 17:03 ... bis 17:59

    Richtiger wäre:

    0 17 * * * /home/pi/timelapse.sh 1 100

    Dann wird es nur um 17:00 ausgeführt

  • Verdammt, mein Fehler. Das [font="Gill Sans MT"] kam durch Copy&Past über eine VNC-Verbindung. Im eigentlichen Skript steht das natürlich drin. Ich habe jetzt den Cron-Job angepasst.
    Keine Bilder :(

    Ich mache jetzt mal einen Cut. Wollte Neptun (name des dunklen Pis ;) ) sowieso noch mal neu aufsetzen. Beim Aufsetzen des VNC-servers habe ich wohl auch was falsch konfiguriert und ich mache das lieber noch mal alles von Grund auf sauber. Ich würde mich dann aber nach erfolgter Neuinstallation melden.

    Danke bis dahin!!!

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!