Für liebe Leser von GeekTimes ist der nächste (vierte)
lang erwartete Artikel darüber, was passieren wird, wenn Sie Arduino, ESP8266 und WI-FI erneut mischen, mit einem Android-Smartphone würzen und über die JAVA-Anwendung streuen.
Wir werden über die Roboter aus dem vorletzten
Artikel sprechen, der die Zeit hatte, zumindest ein bisschen schlauer zu werden.

Wen kümmert es, willkommen bei Katze.
Wenn Sie nicht sehr daran interessiert sind, alte Artikel zu lesen, dann war der Punkt, dass zur Steuerung des üblichen vierrädrigen Wagens auf der Arduino-Plattform eine von mir entwickelte drahtlose UART-Brücke hinzugefügt wurde, die auf dem bekannten ESP8266-Modul basiert. Aus praktischen Gründen (und im Allgemeinen war dies das Hauptziel) mit demselben ESP habe ich einen Programmierer für Arduinki geschrieben, mit dem Sie ihn selbst aus der Ferne flashen können.

Das heißt, der Wagen fährt irgendwo weit (aber innerhalb Ihres WI-FI-Netzwerks) (ja, ich schreibe dieses Wort gerne), sendet Daten und empfängt Befehle und kann bei Bedarf auf Bestellung auch das Programm im AVR-Mikrocontroller ändern. Dementsprechend wurde das Programm auf JAVA für den PC gestartet, mit dem Sie die Kontrolle genießen und primitive Telemetrie in Form der zurückgelegten Strecke (Reedschalter und Magnet am Rad) erhalten konnten.

Außerdem habe ich im nächsten
Artikel erfolgreich mit der Steuerung des Wagens mithilfe eines Smartphones experimentiert - Tasten, Neigungen und sogar Sprache. Aber als der Wagen in den nächsten Raum fuhr, konnte selbst die Stimme ihn nicht zurückgeben (im Gegensatz zur Katze). Sie ging dorthin, klopfte an Wände und Möbel, verfing sich in Drähten, schickte aber außer Informationen über die zurückgelegte Strecke nichts.
Daher entstand sofort die Idee, den zukünftigen Terminator mit Sinnesorganen auszustatten. Eine der einfachsten Möglichkeiten hierfür ist die Verwendung von Sonar.

Der Algorithmus der Arbeit zur Schande ist einfach, wir starten den Sensor von einer Front und gleichzeitig von einem Mikrocontroller-Zähler. HC-SR04 beginnt Ultraschall in die Ferne zu schießen. Das Antwortsignal vom Sensor über ein anderes Kabel signalisiert das Ende der Entfernungsmessung, und das Zeitintervall zwischen dem Start und der Antwort ist proportional zur gemessenen Entfernung. Dementsprechend verlangsamen wir in diesem Moment die Theke und sehen, wie viel darin enthalten ist.
Die Genauigkeit wird bis zu etwa einem Zentimeter und eine Reichweite von bis zu zwei Metern erreicht. Er mag keine flauschigen und Wolloberflächen (zum Beispiel eine Katze), auf denen Echosignale unwiderruflich ertrinken.
In dem betroffenen Bereich ist der Betrachtungswinkel des HC-SR04 klein. Um zu wissen, was im Rahmen eines Winkels von mindestens 90 Grad vor sich geht, ist Folgendes wünschenswert:
- Schrauben Sie den Sensor an die Servomaschine und schauen Sie in verschiedene Richtungen
- Setzen Sie einige Sensoren.
Zuerst implementierte ich die erste Option, indem ich das Sonar auf ein billiges Servo SG90 stellte und der Wagen in einen Rover verwandelte. Es war so viel Zeit erforderlich, um mindestens drei Messungen durchzuführen, dass der Wagen im Grunde genommen mit einem Servo rotierte, sich dann vorsichtig vorwärts bewegte, aber nicht sehr weit (und plötzlich erschien ein Hindernis an der Seite) und wieder den Raum vor sich spürte. Trotzdem ist der Ton nicht das Licht für dich.
Deshalb habe ich ohne weiteres drei Sonarsysteme gleichzeitig darauf gesetzt. Der Karren bekam das Aussehen einer chthonischen Spinne, blieb vor Hindernissen stumpf stehen und rollte sie unterwegs. Aber das Gehirn am Ende war gerade genug, um nicht in einer freundlichen Umgebung hängen zu bleiben. Wir mussten weitermachen - zu Autonomie und Fortschritt. Und hier, ohne andere Sinne, wird Ihnen sogar der Nematodenwurm sagen, dass Sie es nicht tun können.
Darüber hinaus beginnen Enthusiasten normalerweise, verschiedene neue Sensoren wie Gyroskope, Beschleunigungsmesser, Magnetometer und sogar FEUER-Sensoren (all diese namenlosen Chinesen produzieren in Millionen Mengen für Arduino) an ihren Kreationen zu formen. Und auch ich hätte beinahe diesen rutschigen Weg eingeschlagen, aber meine Meinung rechtzeitig geändert. Und ich habe es aus diesem Grund getan. In der weitesten Perspektive sollte der Roboterroboter eine Vision in Form einer Kamera erhalten und auch verstehen, was er sieht. Der AVR-Mikrocontroller vom Arduino-Board verabschiedet sich jedoch bereits beim Empfang des Videos von Ihnen, ganz zu schweigen von der Verarbeitung. Und plötzlich fiel mein Blick auf das ältere GALAXY S7-Smartphone, das bereits vom Leben geschlagen war.
Solche Rechenleistung, acht Kerne, 4 Gigabyte Speicher, zwei Kameras, Zugang zum Netzwerk, was braucht man noch, um aus einem Affen eine Person zu machen?
Wir brauchen aber nur ein kleines Design, damit unser Smartphone auf einem Wagen ruht und es einfach platziert und entfernt werden kann.

Dann bin ich auf die Android-Entwicklerseite geklettert, um herauszufinden, welche anderen Funktionen ein normales Smartphone uns bieten kann. Es stellte sich heraus, dass nicht klein. Theoretisch kannst du
Greifen Sie auf die folgenden Sensorsensoren zu.TYPE_ACCELEROMETER
TYPE_AMBIENT_TEMPERATURE
TYPE_GAME_ROTATION_VECTOR
GEOMAGNETIC_ROTATION_VECTOR
TYPE_GRAVITY
TYPE_GYROSCOPE
TYPE_GYROSCOPE_UNCALIBRATED
TYPE_HEART_BEAT
TYPE_HEART_RATE
TYPE_LIGHT
TYPE_LINEAR_ACCELERATION
TYPE_LOW_LATENCY_OFFBODY_DETECT
TYPE_MAGNETIC_FIELD
TYPE_MAGNETIC_FIELD_UNCALIBRATED
TYPE_MOTION_DETECT
TYPE_ORIENTATION
TYPE_POSE_6DOF
TYPE_PRESSURE
TYPE_PROXIMITY
TYPE_RELATIVE_HUMIDITY
TYPE_ROTATION_VECTOR
TYPE_SIGNIFICANT_MOTION
TYPE_STATIONARY_DETECT
TYPE_STEP_COUNTER
TYPE_STEP_DETECTOR
Wie sie sagen, was gibt es nur! Und tatsächlich gab es nicht viel, was für die GALAXY S7 spezifisch war. Zum Beispiel ein Feuchtigkeitssensor. Und die Umgebungstemperatur (obwohl ich verstanden habe, dass sich im Inneren des Gehäuses die Temperatur des Smartphones selbst anzeigt). Aber die Druck- und Lichtsensoren waren vorhanden. Ganz zu schweigen von den Gyroskopen und Beschleunigungsmessern, mit denen Sie Ihre Position im Weltraum leicht bestimmen können.
Infolgedessen ist eine Entscheidung ausgereift. Lassen Sie das Smartphone alle Informationen der obersten Ebene empfangen und verarbeiten - Video und all diese verschiedenen Sensoren. Und die Arduino-Plattform wird sozusagen für das Unbewusste verantwortlich sein - für alles, was bereits funktioniert und keine Nacharbeit erfordert, all diese Motoren, Sonare, Reed-Schalter und so weiter.
Da es selbst mit UDB schwierig ist, das Programm direkt auf dem Smartphone zu debuggen, habe ich beschlossen, das Ganze auf einen normalen PC zu übertragen und dort zu verarbeiten. Und dann, wenn es eine funktionierende Version geben wird, werden wir das Gehirn wieder in den Wagen zurückbringen. Wir müssen klein anfangen, und in der Tat ist es interessant, die Übertragung von Videos von einem hektischen Wagen zu betrachten.
Daten von Sensoren können in einer einfachen Zeile über einen primitiven Client-Server gesendet werden, es gibt überhaupt keine Probleme damit. Aber mit der Übertragung des Videos gab es sofort Schwierigkeiten. Im Allgemeinen benötigte ich eine Echtzeit-Streaming-Übertragung von der Smartphone-Kamera zum Anwendungsfenster auf dem Computer. Das ist für jetzt. In Zukunft könnten nicht nur ich, sondern auch eine Art Mustererkennungssystem auf dieses Bild im Fenster starren. Zum Beispiel JAVA OpenCV. Oder vielleicht sogar ein neuronales Netzwerk aus der Cloud: D. Ich weiß nicht, diese Etappe ist noch sehr weit weg. Aber ich möchte die Welt mit dem „Auge“ eines Roboter-Trucks sehen.
Jeder kennt zahlreiche Anwendungen wie eine "mobile Kamera" aus dem Google Store, bei der Sie einen Videostream von der Kamera eines Smartphones abrufen, indem Sie einen Browser mit der gewünschten IP auf dem Computer öffnen. Daher dachte ich zuerst, dass es nicht schwierig sein würde, von meinem GALAXY selbst zu übersetzen (was kein schwacher Fehler war), also müssen Sie zuerst überprüfen, wie es mit seinem Empfang auf dem Computer sein wird, da ich irgendwie nur auf JAVA schreiben kann.
Wie sich herausstellte, mit JAVA-Videowiedergabe, gelinde gesagt, nicht sehr gut. Es war einmal im Jahr 1997, als das sogenannte Java Media Framework veröffentlicht wurde - eine Bibliothek, die die Entwicklung von Programmen erleichtert, die mit Audio und Video von den Entwicklern von JAVA selbst arbeiten. Aber irgendwann nach 2003 wurde ein großer Bolzen draufgesetzt und seitdem sind es bereits 15 Jahre. Nach einigen Experimenten gelang es mir, eine Datei im Fenster auszuführen. Ich kann mich nicht erinnern, welche bereits (es scheint AVI zu sein), aber dieser Anblick sah ziemlich miserabel aus. Dateien mit anderen Erweiterungen wollten überhaupt nicht ausgeführt werden, im Extremfall gab es eine Audiospur.
Im Internet habe ich zwei weitere alternative Projekte für die Arbeit mit Videos gefunden: Xuggler und aprica VLCj. Das erste Projekt war attraktiv in seinen Fähigkeiten, starb aber auch vor langer Zeit, aber das zweite erwies sich als ziemlich lebhaft und interessant in seiner Idee. Die Jungs nahmen JAVA, den bekannten beliebten VLC-Mediaplayer, und befestigten ihn. Das heißt, aprica verwendet keine selbstgeschriebenen Codecs, sondern vorgefertigte Codecs. Damit verlieren Sie jede Datei. Eine kluge Entscheidung, aber Hauptsache, Sie haben diesen VLC-Player bereits auf Ihrem Computer installiert. Nun, wer hat es nicht? Die einzige Einschränkung ist jedoch, dass Sie die gleichen Bittiefen von Player und JAVA haben. Zum Beispiel stellte ich später mit Überraschung fest, dass ich im Gegensatz zu 64-Bit-JAVA immer noch einen 32-Bit-VLC auf meinem Computer hatte. Und ein halber Lebenstag war vergebens verloren.
Caprica-Entwickler versprechen den Nutzern auf ihrer Website viel. Und alle Dateiformate und Starten in mehreren Fenstern in einer JAVA-Anwendung, Abspielen von Videos von You-Tube, Aufnehmen eines "Live" -Videostreams usw. Aber die harte Realität hat alles an seinen Platz gebracht. Nein, sie haben nicht mit Dateien getäuscht - alles wird abgespielt. Aber jetzt will das Video von YouTube nicht mehr. Zuerst konnte ich nicht verstehen warum, aber dann sah ich eine Inschrift im Protokoll, dass es irgendwie unmöglich war, irgendwo ein bestimmtes Lua-Skript auszuführen, und erinnerte mich sofort daran:
Dieses "Screen-Scraping" der YouTube-Webseite ist spröde. Wenn YouTube die Struktur seiner Webseiten ändert, kann VLC die Streaming-URL manchmal nicht finden. In diesem Fall müssen Sie warten, bis ein Entwickler eine neue LUA bereitstellt Skript und warten Sie, bis eine neue Version von VLC veröffentlicht wird.
Kurz gesagt, anscheinend hat YouTube die Struktur seiner Webseite geändert und ich muss auf eine neue Version warten. Auf der anderen Seite benötige ich eine "Live" -Videosendung und spiele keine Datei von der Site ab. Das heißt, selbst wenn das Lua-Skript funktionieren würde, würde es mir nicht viel helfen.
Aber ich habe das versprochene Streaming überhaupt nicht gefunden, obwohl geschrieben stand:
Netzwerk-Streaming-Server (z. B. ein Netzwerkradiosender oder ein Video-on-Demand-Server);
Netzwerk-Streaming-Client;
Vielleicht ist es eine Wunschliste, oder vielleicht ist es in der kommerziellen Version, es ist schwer zu sagen.
Aber die Dateien werden ohne Beschwerden abgespielt, wiederhole ich. Zum Beispiel können Sie erstellen, hier ist eine solche Unanständigkeit
Die Installation des Pakets selbst ist nicht schwierig und wird beispielsweise
hier sogar ausführlich beschrieben. Zwar habe ich irgendwie ungeschickt Umgebungsvariablen vorgeschrieben, und jetzt startet mein VLC zum ersten Mal mit einer Verzögerung von zehn Sekunden, speichert dann aber das, was im Cache benötigt wird, und startet später in der aktuellen Sitzung ohne Pausen.
Anschließend schreiben Sie in Ihrem JAVA-Projekt die erforderlichen Abhängigkeiten vor und können
Media Player in JAVA-Fenstern für die Arbeit verwenden.
Nachdem ich den ungefähren Arbeitsplan auf der Seite des PCs markiert hatte, kehrte ich zur Quelle der Videodaten zurück, meinem ANDROID-Smartphone.
Aber hier hatte ich eine weitere ziemlich große Enttäuschung erwartet. Nachdem ich einige Websites und sogar das Online-ANDROID-Handbuch gescannt hatte, stellte ich fest, dass es unmöglich ist, Streaming in Echtzeit mit regulären Mitteln zu organisieren. Wie in Caprica können Sie nur bereits aufgezeichnete Dateien lesen. Das heißt, die Kamera ist eingeschaltet, MEDIA RECORDER hat mit der Aufnahme begonnen, als sie gestoppt werden musste. Und wir können erst nach einem Stopp auf Daten (und deren Übertragung) zugreifen.
Ich fand eine Bestätigung meiner Schlussfolgerungen in einem alten
Artikel . Es gab wirklich Hinweise darauf, dass es jemandem gelungen ist, Android zu täuschen, dass es in eine Datei schreibt, aber tatsächlich haben sie einen Puffer verschoben. Aber auf jeden Fall konnte ich, wie bereits zuvor erläutert, einen solchen Videostream auf der PC-Seite in der JAVA-Anwendung nicht abfangen.
Daher wurde eine einfache,
vorübergehende Entscheidung (ich möchte betonen) getroffen, einen Videostream von der Kamera in Teilen für zwei Sekunden zu senden. Natürlich kein Rover, aber der Rover ist schon ziemlich gut.
Nachdem ich mich für diese Entscheidung entschieden hatte, begann ich, die Klassen CAMERA und MEDIA RECORDER zu beherrschen. Es gibt im Netzwerk einige Codebeispiele zum Starten der Kamera und zum Aufzeichnen von Videodateien, aber aus irgendeinem Grund hat keines von ihnen für mich funktioniert. Weder auf dem Emulator noch auf einem realen Gerät. Es stellte sich heraus, dass der Grund in Berechtigungen liegt, dh in Berechtigungen. Es stellt sich heraus, dass Codebeispiele in jenen Tagen geschrieben wurden, als Android noch frei war und der Programmierer tun konnte, was er wollte, wenn er alle erforderlichen Berechtigungen in das Manifest schrieb. Aber meine aktuelle Version von OC hat dies nicht zugelassen. Zuerst mussten Sie dem Benutzer die Erlaubnis geben, die Datei zu schreiben und die Kamera sofort nach dem Start der Anwendung einzuschalten. Dies kostete mich zusätzliche Aktivität, dh Aktivität.
Klasse MainActivity.javaimport android.Manifest; import android.content.Intent; import android.content.pm.PackageManager; import android.hardware.Camera; import android.media.MediaRecorder; import android.os.AsyncTask; import android.support.v4.app.ActivityCompat; import android.support.v4.content.ContextCompat; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.Toast; import java.io.File; public class MainActivity extends AppCompatActivity { Camera camera; MediaRecorder mediaRecorder; public static MainActivity m; public static boolean Camera_granted; File videoFile; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if ((ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) ||(ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) )
Danach lief alles reibungslos und der folgende Arbeitscode erschien. Die zweite Aktivität der Camera_Activity-Klasse ist für die Arbeit mit der Kamera und die Aufzeichnung von Videodateien verantwortlich. Http_server-Klasse für die Weiterleitung (der Name ist natürlich falsch, hat sich aber historisch herausgestellt). Der Code ist einfach, wo immer es eine Erklärung gibt.

Alles liegt komplett auf dem Github.
LinkCamera_Activity import android.hardware.Camera; import android.media.MediaRecorder; import android.os.AsyncTask; import android.os.Bundle; import android.os.Environment; import android.support.annotation.Nullable; import android.support.v7.app.AppCompatActivity; import android.view.SurfaceHolder; import android.view.SurfaceView; import android.view.View; import android.widget.Button; import android.widget.TextView; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.net.ServerSocket; import android.hardware.SensorEvent; import android.hardware.SensorEventListener; import android.hardware.SensorManager; import android.content.Context; import android.hardware.Sensor; import static android.hardware.Camera.getNumberOfCameras; import java.io.BufferedOutputStream; import java.io.OutputStreamWriter; import java.io.PrintWriter; import java.net.Socket; public class CameraActivity extends AppCompatActivity implements SensorEventListener { SurfaceView surfaceView; TextView mTextView; Button mStart; Button mStop; Camera camera; MediaRecorder mediaRecorder; public static ServerSocket ss; public static ServerSocket ss2; public static MainActivity m; public static volatile boolean stopCamera=true; public static int count=1; public static File videoFile1; public static File videoFile2; public static File videoFile3; public static volatile byte[] data; public SensorManager mSensorManager; public Sensor mAxeleration, mLight,mRotation,mHumidity,mPressure,mTemperature; public int ax; public int ay; public int az; public double light; public int x; public int y; public int z; public double hum; public double press; public double tempr; public static String Sensors; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); mSensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
Das Wesentliche des Programms nach dem Starten und Einschalten der Kamera ist wie folgt:
schreibe ein Video für zwei Sekunden in die erste Datei,
Wir schreiben das Video zwei Sekunden lang in die zweite Datei und senden in der Zwischenzeit die erste Datei über TCP-IP über das lokale WIFI an den Computer
Schreiben Sie die erste Datei erneut und senden Sie in der Zwischenzeit die zweite.
usw.
Anschließend wird der Zyklus wiederholt, bis die Stopp-Taste gedrückt wird oder der Akku des Smartphones leer ist. Grundsätzlich ist es möglich, ein Analogon des Drückens von Tasten mit Befehlen von einem Computer auch über TCP zu implementieren, dies ist nicht schwierig.
Zuerst bestand der Videopuffer für alle Fälle aus drei Dateien im 3GP-Format (wir schreiben die erste, senden die dritte, wir schreiben die zweite, wir senden die erste, wir schreiben die dritte, wir senden die zweite), aber dann stellte sich heraus, dass die beiden Dateien völlig ausreichend sind (Aufzeichnen und Senden nicht stören).
Mit einer Kameraauflösung von 640 x 480 werden die Dateien irgendwo zwischen 200 und 300 kB erhalten, was für meinen Router ziemlich schwierig ist. Ich habe mich noch nicht um den Sound gekümmert, aber dort scheint alles einfach zu sein: Sie installieren die erforderlichen Audio-Encoder, Bitraten, die Anzahl der Kanäle und dergleichen.
Wenig später, als ich die Videoübertragung debuggte, ergänzte ich den Code auch durch die Übertragung von Informationen von den Sensoren des Smartphones. Alles wird trivial in einer Zeile übertragen, aber ich konnte es nicht über dieselbe Buchse wie das Video übertragen. Anscheinend verwenden die Klassen zum Übertragen einer PrintWriter-Zeichenfolge und zum Übertragen von Binärdaten BufferedOutputStream unterschiedliche Streams, aber dann haben sie einen Ausgabepuffer, in dem sie sich erfolgreich gegenseitig bescheißen. Infolgedessen beginnt das Video zu stören und zu bröckeln. Außerdem wird die Videodatei alle zwei Sekunden übertragen, und für Sensoren ist dieses Intervall zu groß. Daher wurde beschlossen, sie in verschiedenen Sockeln zu verteilen, damit sie sich nicht gegenseitig stören. Aus diesem Grund wurde eine neue Klasse Http_server_Sensors angezeigt.
Also haben wir den Versand organisiert, jetzt kehren wir wieder zur dunklen Empfangsseite zurück.
Wie wir bereits im ersten Beispiel gesehen haben, ist das Abspielen von Videodateien in einer JAVA-Anwendung mit einem VLC-Player jetzt kein Problem mehr. Die Hauptsache ist, diese Dateien zu bekommen.
Das folgende Demo-Programm ist dafür verantwortlich.
Videoplayer import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.SwingUtilities; import uk.co.caprica.vlcj.component.EmbeddedMediaPlayerComponent; import uk.co.caprica.vlcj.discovery.NativeDiscovery; import uk.co.caprica.vlcj.player.MediaPlayer; import uk.co.caprica.vlcj.player.MediaPlayerEventAdapter; import java.io.*; import java.net.Socket; public class VideoPlayer { public final JFrame frame; public static EmbeddedMediaPlayerComponent mediaPlayerComponent; public final JButton pauseButton; public final JButton rewindButton; public final JButton skipButton; public static String mr1, mr2; public static boolean playing_finished = false; public static boolean File_1_play_starting = false; public static boolean File_1_play_finished = false; public static boolean File_2_play_starting = false; public static boolean File_2_play_finished = false;
Sein Wesen ist einfach. Ein TCP-Client wird gestartet, der darauf wartet, dass der Server auf dem Smartphone bereit ist. Nach Erhalt der ersten Datei wird die Wiedergabe sofort gestartet und die zweite Datei wird parallel erwartet. Ferner wird entweder das Ende des Empfangs der zweiten Datei oder das Ende der Wiedergabe der ersten erwartet. Das Beste ist natürlich
drei Sterne , wenn die Datei schneller heruntergeladen als abgespielt wird. Wenn Sie die erste Datei verloren haben, aber die zweite noch nicht erhalten haben, wartet alles ... Wir zeigen einen schwarzen Bildschirm. Wenn nicht, starten Sie schnell die Wiedergabe der zweiten Datei und laden Sie gleichzeitig die erste erneut herunter.
Ich hatte eine vage Hoffnung, dass die Pause zwischen dem Wechseln der Wiedergabedateien kürzer als die Reaktionszeit des menschlichen Auges sein würde, aber sie kam nicht zustande. Gemütlich natürlich dieser VLC.
Als Ergebnis erhalten wir eine Art abscheuliches diskontinuierliches Video (der erste Trilobit hat anscheinend die Welt so gesehen), in dem die Schärfe ständig angepasst wird. Und wir müssen berücksichtigen, dass das Video auch zwei Sekunden zu spät ist. Kurz gesagt, in der Produktion empfehle ich nicht, es zu verbreiten. Aber ich habe einen Mangel an Fisch und Trilobiten, wie sie sagen ...
Zusammenfassend können wir das absolut sagen:
Das Senden von Videos in Teilen ist im Wesentlichen nicht funktionsfähig und kann nur dann nützlich sein, wenn das Video lang genug ist und Sie keine zweite Reaktion auf das Geschehen benötigen.
Die Videoübertragung über TCP-IP ist ebenfalls eine falsche Idee, was auch immer einige Persönlichkeiten auf Habr über die Datenübertragungsgeschwindigkeit mit diesem Protokoll sagen würden (das angeblich sogar schneller als UDP ist). Natürlich weisen moderne drahtlose Intranets gute Eigenschaften auf, um ein kontinuierliches Handshake von TCP-Servern und -Clients zu gewährleisten, und TCP selbst scheint für lange Daten aktualisiert worden zu sein, aber die Stecker zwischen dem Abspielen von Videofokussen erscheinen regelmäßig in der Demo.
Aber zumindest für die Zukunft tauchten folgende Gedanken auf:
- Frame für Frame (nicht Video, sondern Fotos) über UDP senden, aber Informationen über TCP steuern,
- Fahren Sie Fotorahmen über UDP, jedoch mit Synchronisierungssignalen im selben Kanal.
Natürlich gibt es bisher mehr Fragen als Antworten. Gibt es bei JAVA mit seinem Abstraktionsgrad genügend Empfangsgeschwindigkeit für die Arbeit mit dem Netzwerk und den Bildern? Ist es möglich, 30 normale Aufnahmen pro Sekunde auf dem Niveau zu machen, das mir in Android zugänglich ist? Muss ich sie vor dem Senden ernten, um die Bitrate zu verringern? Und reicht JAVA dann zum Ein- und Auspacken? Und wenn plötzlich etwas klappt, ist es dann möglich, den nächsten Schritt zu durchlaufen, um das JAVA OpenCV-Computer-Vision-System hier zu verschrauben? Selbst ist es natürlich immer interessant, Streaming-Videos vom Boden aus anzusehen, aber wir sollten das höchste Ziel nicht vergessen - einen Roboterroboter mit der Intelligenz einer Ameise!
Aber während wir das haben, was wir haben, kehren wir zum aktuellen Einkaufswagen zurück. Das alte Programm aus dem vorletzten Artikel für den AVR-Mikrocontroller auf der Arduino-Plattform hat sich nicht wesentlich geändert, nur die Wahl der Verzweigung wurde hinzugefügt - autonomes Fahren oder vom Bediener gesteuert. Die Daten, die der Wagen (Rückenmark) über WIFI überträgt, sind dieselben - die zurückgelegte Strecke. Wenig später habe ich auch die Temperaturübertragung eines kritischen Elements - des Motortreibers - angebracht. All dies wird zuerst von UART und bereits beim Eintritt in das Netzwerk über UDP gesendet und empfangen. Ich gebe nicht den Code, sondern die vollständige Analyse im vorletzten
Artikel.
Für zwei Motoren reicht es (Fahrer) immer noch mehr oder weniger aus, aber mit vier nach einer Weile überhitzt es sich zu einem funktionsunfähigen Zustand. Zuerst habe ich versucht, die einfachsten analogen Temperatursensoren zu verwenden, die auf Zenerdioden basieren, wie z. B. den LM335, aber es wurde nichts daraus. Ich hatte keine Referenzspannungsquelle, kurz ION. . , — - 14500, , ( «»). - L3G4200D. , , I2C.
, - — , ( , ), , ( ), , . , , , , .
, JAVA :

, , , .

, , — ! , , . !
.
, , 95% .
., (), ( ) , - ( — ). , , , .
- , . .