Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » CodeBlock ohne unterbrechung (durch Scheduler) ausführen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
24.05.2018, 11:19 Uhr
94mike94



Hallo,

ich programmiere momentan für meine Bachelorarbeit ein kleines Programm,
das mit OpenCV stereooptische Distanzmessung durchführt.

Hierfür muss ich im Idealfall Bilder von zwei Kameras gleichzeitig holen.
Leider ist das meine erste Arbeit in C++, da ich eigentlich Java gelernt habe und daher meine Frage:

Gibt es eine Möglichkeit in C++, dass mein Codeblock, der ungefähr so aussieht:

{
Kamera1.grabPicture(); //Pseudocode, die original Syntax ist anders
Kamera2.grabPicture();
}

sicher am Stück ausgeführt wird, ohne dass z.B der Cpu-Scheduler des Betriebssystems zwischenzeitlich die Cpu für einen anderen Prozess freigibt?

Ich habe leider durch die Suche nichts gefunden, vielleicht fehlt mir aber auch nur der richtige Suchbegriff.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
24.05.2018, 12:32 Uhr
ao

(Operator)



Zitat von 94mike94:
ohne dass z.B der Cpu-Scheduler des Betriebssystems zwischenzeitlich die Cpu für einen anderen Prozess freigibt?

Warum darf das nicht passieren? Weil die Bilder zum gleichen Zeitpunkt gemacht werden müssen?

Was nacheinander programmiert ist, wird grundsätzlich nicht wirklich gleichzeitig ausgeführt. Einen kleinen Zeitversatz gibt es immer. Die Frage ist, kannst du mit Zeitversatz umgehen, ihn evtl. sogar messen und kompensieren?

Absolut gleichzeitiges Messen ist nur mit synchronisierten Kameras möglich.

Evtl. kannst du die Kameras zuerst beide anweisen, die Bilder aufzunehmen, und danach die Bilddaten abholen?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
24.05.2018, 12:42 Uhr
94mike94



Danke für die Antwort.
Mir ist natürlich bewusst, dass es kein echtes "gleichzeitig" gibt.

Und ja die Bilder sollen möglichst zeitnah gemacht werden, da sich Gegenstände im Sichtbereich der Kameras, oder auch die Kameras selbst bewegen können. Wenn man dann einen großen zeitlichen Versatz zwischen den Aufnahmen hat führt das natürlich zu sehr schlechten Ergebnissen.

Und ja, der befehl den ich möglichst gleichzeitig abschicken möchte ist nur der, die Kameras anzuweisen die Bilder aufzunehmen.


Das ganze System läuft bisher auch schon ganz okay. Ich bin mir nichtmal sicher ob es nötig ist. Aber es wäre halt doch eine Verbesserung (zumindest auf dem Papier und ich könnte in der Arbeit halt schreiben, dass ich das bedacht habe und einigermaßen umgesetzt habe)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
24.05.2018, 13:08 Uhr
ao

(Operator)



Zitat von 94mike94:
Gibt es eine Möglichkeit in C++ ...

Eine Standard-C++-Lösung, die nicht hardware- oder BS-abhängig ist, gibt es dafür nicht, nein.

Auf welchem System läuft das Ganze?

Und wie hart sind die Echtzeitbedingungen? Geht es um autonomes Fahren (wenn Fehlmessung, dann Unfall), oder eher um unkritische Sachen (wenn Fehlmessung, dann nochmal probieren)? Danach richtet es sich, welche Maßnahmen man treffen muss.

Dieser Post wurde am 24.05.2018 um 13:09 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
24.05.2018, 13:17 Uhr
94mike94



Hmn, das ist schade.

Das System läuft momentan auf einem Ubuntu-Rechner (64 Bit, Ubuntu 18.04).
Es soll aber letzendlich auf einer Drohne laufen und dort bereits existierende Sensorik unterstützen und Entfernungen Messen, wodurch autonomes Fliegen verbessert werden soll.

Aber eine Lösung für den Rechner wäre erstmal ausreichend, damit ich in der Evaluierung meiner Arbeit zumindest möglichst zuverlässige und reproduzierbare Messwerte unter "Laborbedingungen" habe.

Während dem Flug gibt es dann sowieso viele Probleme die das System beeinträchtigen, da fällt das wahrscheinlich gar nicht ins Gewicht. (Bewegungsunschärfe in den Bildern, schnell wechselnde Lichtbedingungen usw.)

Dieser Post wurde am 24.05.2018 um 13:18 Uhr von 94mike94 editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
24.05.2018, 13:42 Uhr
ao

(Operator)



Zitat von 94mike94:
Das System läuft momentan auf einem Ubuntu-Rechner (64 Bit, Ubuntu 18.04).

Dann versuch dich doch mal an einem Prozess mit Realtime-Priority (erfordert root-Rechte).

Auf jeden Fall solltest du erstmal die Zeit für die beiden Aufrufe messen und überwachen, ob es Ausreißer nach oben gibt.


Zitat:
Es soll aber letzendlich auf einer Drohne laufen ...

Zivile Drohne, hoffe ich.

Wie auch immer, den Scheduler vorübergehend abzuschalten ist so ungefähr der heftigste Eingriff ins System, der überhaupt denkbar ist. Hast du eine Vorstellung davon, was du damit alles unterdrückst? Die Flugregelung zum Beispiel?

Und bist du sicher, dass die Kommunikation mit den Kameras überhaupt möglich ist, während der Scheduler stillsteht? Sind das USB-Kameras? Was denkst du, wie viele interne Prozesse ungehindert laufen müssen, damit USB geht?

Ich glaube nicht, dass es eine gute Idee ist, sowas allein mit Software lösen zu wollen. Entweder muss man mit einem gewissen Jitter leben, oder es muss eine Hardwarelösung her.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
24.05.2018, 17:09 Uhr
94mike94



Das ist eine gute Idee.
Ich werde mir mal anschauen wie das funktioniert.


Natürlich Zivil. Wäre es eine militärische, würde ich wohl kaum mit low-budget Hardware arbeiten müssen :'D

Die Flugregelung selbst läuft getrennt auf einem Mikrocontroller, daher wäre das relativ ungefährlich. Aber klar, die Folgen für andere Systeme wären relativ unabsehbar. Wobei die Unterbrechung vermutlich auch wirklich extrem kurz wäre. Es müssten ja nur zwei Befehle an die Kamera übertragen werden.

Ja es sind USB-Kameras.. Daher nein, keine Ahnung ob das klappt.
Ich hatte mir das auch eher etwas leichter vorgestellt. Aber da war ich wohl in Java etwas verwöhnt. Wobei da natürlich auch nur die JVM die CPU Zeit für die Threads einteilt und nicht ins Betriebssystem eingreift.

Ich danke dir auf jedenfall für deine Antworten. Du hast mir sehr geholfen und das mit der Priorisierung ist bestimmt ein guter und einfacher Kompromiss.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: