Künstliche Intelligenz
Core Java: Parallel, aber richtig – Wie Java-Collectors unter Last bestehen
Manchmal reicht es nicht aus, dass Code funktioniert – er muss auch unter Last funktionieren. In modernen Anwendungen, die große Datenmengen verarbeiten, steht Entwicklerinnen und Entwicklern mit der Streams-API in Java ein elegantes, deklaratives Werkzeug zur Verfügung, um Daten in Pipelines zu transformieren, zu filtern und schließlich zu aggregieren. Die Vorstellung, mit wenigen Zeilen komplexe Datenoperationen zu beschreiben, ist nicht nur verführerisch, sondern tatsächlich realistisch. Doch was passiert, wenn diese Operationen auf Millionen von Einträgen treffen? Wenn die Ausführung in mehreren Threads parallel erfolgen soll, um Zeit zu sparen und Mehrkernsysteme effektiv zu nutzen?
Seit 1996 programmiert Sven Java in Industrieprojekten und seit über 15 Jahren weltweit in Branchen wie Automobil, Raumfahrt, Versicherungen, Banken, UN und Weltbank. Seit über 10 Jahren ist er von Amerika bis nach Neuseeland als Speaker auf Konferenzen und Community Events, arbeitete als Developer Advocate für JFrog und Vaadin und schreibt regelmäßig Beiträge für IT-Zeitschriften und Technologieportale.
Neben seinem Hauptthema Core Java beschäftigt er sich mit TDD und Secure Coding Practices.
Genau an dieser Stelle rückt ein Konzept in den Vordergrund, das oft zu wenig Beachtung findet: der Collector. Er ist das Element am Ende einer Stream-Pipeline, das bestimmt, was mit den verarbeiteten Daten geschehen soll. Und obwohl die API einfach erscheint – collect(Collectors.toList())
– verbirgt sich dahinter eine Architektur, die in paralleler Ausführung ganz eigene Herausforderungen mit sich bringt.
Im Folgenden geht es daher nicht nur um die Syntax oder die Mechanik von Collectoren, sondern um ein tiefes Verständnis für die Bedingungen, unter denen sie korrekt und effizient zum Einsatz kommen. Wir schauen auf Standardlösungen des JDK (Java Development Kit), diskutieren individuelle Implementierungen, zeigen typische Fehler – und kommen letztlich zu der Frage: Wie viel Parallelisierung verträgt ein Collector, ohne dass es gefährlich wird?
Grundlagen: Collector und Parallelität
Die Streams-API von Java vermittelt auf den ersten Blick den Eindruck, dass sich das Sammeln von Ergebnissen – das sogenannte terminale Aggregieren – problemlos parallelisieren lässt. Doch hinter der Methode collect(...)
verbirgt sich mehr als nur syntaktische Bequemlichkeit. Sie ist eine koordinierte Zusammenarbeit zwischen einem Datenstrom und einem Collector – einem Objekt, das aus Einzelteilen ein Ganzes formt.
Ein Collector besteht im Kern aus vier funktionalen Komponenten: dem supplier
, der für jeden Teilprozess einen neuen Zwischenspeicher bereitstellt; dem accumulator
, der Elemente in diesen Zwischenspeicher einspeist; dem combiner
, der mehrere Zwischenspeicher zu einem zusammenführt; und schließlich dem finisher
, der das Endergebnis produziert. Während supplier
und accumulator
auch in sequenziellen Streams essenziell sind, tritt der combiner
erst dann in Aktion, wenn mehrere Threads unabhängig voneinander gesammelt haben – also bei einem parallelStream()
.
Hier liegt der erste fundamentale Unterschied zwischen sequenzieller und paralleler Verarbeitung: In einem sequenziellen Stream genügt es, schrittweise in einen einzigen Speicher zu akkumulieren. In der parallelen Variante hingegen entstehen mehrere voneinander isolierte Zwischenspeicher, deren Inhalte später konfliktfrei zu einem Endergebnis verschmolzen werden müssen. Dieses Verschmelzen geschieht durch den combiner
– und genau an dieser Stelle entscheidet sich, ob ein Collector für parallele Verarbeitung tauglich ist oder nicht.
Die Tauglichkeit hängt von mehreren Eigenschaften ab: Die Operationen müssen assoziativ sein, also unabhängig von der Kombination der Zwischenergebnisse dasselbe Resultat liefern. Zudem darf kein geteilter Zustand ohne Synchronisierung vorliegen. Und nicht zuletzt müssen die einzelnen Schritte deterministisch und frei von Seiteneffekten bleiben – andernfalls wird aus einer Parallelisierung schnell eine Quelle subtiler Fehler.
Das Wissen um diese strukturellen Anforderungen ist der erste Schritt zu einem bewussten Einsatz paralleler Verarbeitung. Denn nur wer verstanden hat, wie Collector und Stream im Zusammenspiel funktionieren, kann abschätzen, wann ein Performancegewinn möglich ist – und wann man sich stattdessen instabile oder schlicht falsche Ergebnisse einhandelt.
Kriterien für parallelisierbare Collectoren
Stellen wir uns vor, ein Stream wird parallel ausgeführt – etwa über ein großes Dataset, das in mehrere Segmente aufgeteilt ist. Jedes dieser Segmente wird nun unabhängig verarbeitet. Was trivial klingt, hat tiefgreifende Implikationen: Sobald mehrere Threads gleichzeitig sammeln, dürfen sich deren Zwischenergebnisse nicht in die Quere kommen. Die Verantwortung für die Korrektheit liegt beim Collector – genauer: bei seiner strukturellen und funktionalen Ausgestaltung.
Die erste grundlegende Eigenschaft ist Assoziativität. Ein combiner
-Aufruf muss unabhängig von der Reihenfolge konsistente Ergebnisse liefern. combine(a, b)
und combine(b, a)
müssen äquivalente Resultate erzeugen. Das ist notwendig, weil die Reihenfolge der Kombination in einem parallelen Kontext vom Scheduler abhängt – und somit unvorhersagbar ist.
Der zweite Punkt betrifft den Zugriff auf Speicherstrukturen. Sobald ein Collector während der Akkumulation einen gemeinsamen, veränderbaren Zustand nutzt – etwa eine nicht synchronisierte Liste oder Map – entsteht ein potenzieller Hotspot für Race Conditions. Der Collector muss entweder ausschließlich mit lokalen, thread-isolierten Zwischenspeichern arbeiten oder sich auf nebenläufige Datenstrukturen stützen, wie etwa ConcurrentHashMap
, LongAdder
oder explizit synchronisierte Wrapper.
Darüber hinaus ist auch Determinismus ein wesentliches Kriterium: Eine parallele Ausführung darf nicht zu unterschiedlichen Ergebnissen führen – weder inhaltlich noch strukturell. Insbesondere bei ungeordneten Strukturen wie HashSet
oder HashMap
ist Vorsicht geboten, da die Iterationsreihenfolge variieren kann – was bei Collectors.joining()
oder Collectors.toMap()
problematisch wird, wenn die Anwendung auf Ordnung angewiesen ist.
Die drei Anforderungen Assoziativität, isolierter Zustand und Determinismus bilden den technischen Prüfstein für parallele Collectoren. Sie sind nicht optional, sondern grundlegend. Wer sie ignoriert, riskiert schwer zu reproduzierende Fehler, unvollständige Ergebnisse oder performante, aber semantisch falsche Ausgaben.
Parallelität in Java Streams ist mächtig, aber nicht trivial umzusetzen
Beispiele aus der Java-Standardbibliothek: Ein naheliegender Weg, um das abstrakte Konzept paralleler Collectoren greifbar zu machen, führt über die bereits in der Java-Standardbibliothek enthaltenen Collectors. Viele Entwickler nutzen Collectors.toList()
, toSet()
oder joining()
nahezu täglich – selten jedoch im Wissen darum, ob und wie sich diese Collectoren in einem parallelen Kontext verhalten.
Ein einfaches Beispiel: Der Collector Collectors.toList()
nutzt intern eine ArrayList
. Diese ist nicht thread-sicher. Folglich ist das Ergebnis bei paralleler Verwendung potenziell inkonsistent, sofern nicht intern für Isolation der Zwischenspeicher gesorgt ist.
public static
Collector> toList() {
return new CollectorImpl<>(ArrayList::new, List::add,
(left, right) -> { left.addAll(right); return left; },
CH_ID);
}
Tatsächlich funktioniert dieser Collector in parallelen Streams dennoch korrekt, weil die Streams-API jedem Thread seinen eigenen Akkumulationsbereich zuteilt und erst am Ende über einen kombinierten Merge-Prozess zusammenführt. Der entscheidende Punkt liegt also nicht in der Datenstruktur selbst, sondern in ihrer kontrollierten Isolierung.
Weniger robust zeigt sich Collectors.groupingBy(...)
. Diese Variante basiert auf einer HashMap
, die nicht für gleichzeitigen Zugriff ausgelegt ist. Wird dieser Collector ohne Schutzmaßnahmen in einem parallelStream()
eingesetzt, drohen Race Conditions. Die Standardlösung dafür lautet Collectors.groupingByConcurrent(...)
, die intern auf ConcurrentHashMap
setzt und somit für gleichzeitigen Zugriff konzipiert ist.
public static
Collector>>
groupingByConcurrent(Function super T, ? extends K> classifier) {
return groupingByConcurrent(classifier, ConcurrentHashMap::new, toList());
}
Ein Blick auf die Signatur dieser Methode zeigt bereits die Intention:
Map> result = namen.parallelStream()
.collect(Collectors.groupingByConcurrent(String::length));
In diesem Beispiel werden Strings nach ihrer Länge gruppiert – in einer parallel verarbeitbaren Weise. Entscheidend ist, dass sowohl die Map-Implementierung als auch der Akkumulationsprozess thread-safe sind.
Ebenso interessant ist Collectors.toConcurrentMap(...)
, der explizit dafür vorgesehen ist, große Mengen von Key-Value-Paaren parallel zu aggregieren. Hier ist die Kombination von Schlüsselkonflikten und der richtige Umgang mit Merge-Funktionen von besonderem Interesse.
Die Erkenntnis aus diesen Beispielen lautet: Nicht jeder Standard-Collector ist per se für Parallelität geeignet. Nur weil eine Methode aus dem Collectors-Baukasten stammt, bedeutet das nicht, dass sie in jeder Ausführungskonfiguration korrekt funktioniert. Der Kontext entscheidet – und mit ihm die verwendete Datenstruktur, das Verhalten des combiner
und die Art der Akkumulation.
Wer also aus einem Stream nicht nur ein beliebiges Ergebnis, sondern ein korrektes und performantes Ergebnis ziehen will, sollte die Wahl seines Collectors ebenso sorgfältig treffen wie das Filterkriterium am Anfang der Pipeline.
Eigene parallele Collector-Implementierungen
So mächtig die vorgefertigten Collectors der Java-Standardbibliothek auch sein mögen, manchmal reichen sie für spezifische Anforderungen nicht aus. Besonders wenn domänenspezifische Aggregationen, spezialisierte Datenstrukturen oder nicht-triviale Reduktionslogik benötigt werden, lohnt sich ein Blick auf die Möglichkeit, eigene Collector-Implementierungen zu erstellen.
In der Regel lässt sich ein eigener Collector mit der statischen Methode Collector.of(...)
erstellen. Diese Methode erwartet fünf Parameter: einen Supplier
, der einen neuen Akkumulator erzeugt; einen BiConsumer
, der ein Element in den Akkumulator einfügt; einen BinaryOperator
zum Kombinieren zweier Akkumulatoren; optional eine Function
zur Konvertierung des Ergebnisses; und schließlich ein Array Collector.Characteristics...
, das Metainformationen wie CONCURRENT
oder UNORDERED
bereitstellt.
Ein einfacher, aber aussagekräftiger Collector könnte etwa Zeichenketten parallel zu einer ConcurrentLinkedQueue
sammeln:
Collector> toConcurrentQueue() {
return Collector.of(
ConcurrentLinkedQueue::new,
Queue::add,
(left, right) -> { left.addAll(right); return left; },
Collector.Characteristics.CONCURRENT, Collector.Characteristics.UNORDERED
);
}
Dieser Collector ist sowohl CONCURRENT
als auch UNORDERED
, das bedeutet: Er kann von mehreren Threads gleichzeitig beschrieben werden, ohne dass die Einfügereihenfolge garantiert werden muss. Wichtig ist dabei, dass ConcurrentLinkedQueue
als thread-sichere Datenstruktur fungiert und die Operation addAll
ebenfalls nebenläufig unkritisch ist.
Doch auch komplexere Szenarien sind denkbar, etwa das parallele Ermitteln von statistischen Kennzahlen (Minimum, Maximum, Durchschnitt) über eine Datenmenge. In solchen Fällen kann ein record
als Akkumulatorstruktur dienen, der in sich bereits alle benötigten Teilzustände kapselt. Der combiner
muss dann lediglich diese Strukturen feldweise konsolidieren.
Eigene Collector-Implementierungen zwingen dazu, sich mit der Parallelisierbarkeit der genutzten Datenstrukturen und der Kombinierbarkeit der Aggregationslogik intensiv auseinanderzusetzen. Das ist kein Nachteil, sondern ein wertvoller Lerneffekt. Denn nur wer versteht, was ein Collector im Inneren macht, kann ihn bewusst und sicher einsetzen.
Best Practices für den produktiven Einsatz
Wer Collectoren im Parallelisierungskontext produktiv einsetzen möchte, sollte einige bewährte Strategien berücksichtigen – nicht als starre Regeln, sondern als Orientierungsrahmen für robuste und effiziente Implementierungen.
Ein erster Grundsatz lautet: Nur parallelisieren, wenn ein echter Nutzen zu erwarten ist. Kleine Datenmengen, triviale Transformationen oder IO-gebundene Prozesse profitieren in der Regel nicht von parallelStream()
. Im Gegenteil: Der Overhead des Thread-Managements kann den potenziellen Performancegewinn sogar übersteigen. Eine Parallelisierung lohnt sich erst dann, wenn die zu verarbeitenden Datenmengen hinreichend groß und die Operationen CPU-intensiv sind.
Zweitens: Nur thread-sichere oder isolierte Datenstrukturen verwenden. Das bedeutet entweder, dass jeder Thread seinen eigenen Akkumulator nutzt – was die Streams-API intern unterstützt – oder dass explizit nebenläufige Datenstrukturen wie ConcurrentHashMap
, ConcurrentLinkedQueue
oder atomare Wrapper eingesetzt werden.
Drittens: Collectors gezielt auswählen. Die Standardbibliothek bietet mit groupingByConcurrent
, toConcurrentMap
oder mapping
leistungsfähige Werkzeuge, die speziell für den parallelen Einsatz konzipiert wurden. Wer darüber hinaus eigene Lösungen entwickelt, sollte besonderes Augenmerk auf den combiner
und die Assoziativität der Logik legen.
Viertens: Ergebnisse validieren – insbesondere bei neuen oder komplexen Pipelines. Parallele Streams verhalten sich nicht deterministisch in der Ausführung, deshalb sind Tests in unterschiedlichen Auslastungsszenarien und unter variierender Last notwendig. Das gilt vor allem dann, wenn Entwicklerinnen oder Entwickler Collectoren selbst entwickeln oder anpassen.
Und nicht zuletzt: Messen statt vermuten. Tools wie JMH (Java Microbenchmark Harness), Flight Recorder oder async-profiler helfen dabei, realistische Aussagen über die Performancevorteile zu treffen. Parallelisierung ohne Metriken ist wie Blindflug mit Rückenwind – vielleicht schneller, aber womöglich in die falsche Richtung.
(Bild: Playful Creatives / Adobe Stock)
Künstliche Intelligenz
Vorstellung BYD Seal 6 DM-i Touring: Warum die Chinesen nun auf PHEV setzen
BYD, eine der weltweit führenden Firmen, wenn es um fortschrittliche Batterien geht, bringt in Europa einen Kombi mit Plug-in-Hybrid auf den Markt. Das mag auf den ersten Blick einigermaßen absurd erscheinen, zumal er sich technisch nicht an der Spitze einreiht. Doch BYD hat ausgezeichnete Gründe für seine Entscheidung, denn der Seal 6 DM-i Touring ist letztlich eine Reaktion auf die auch von der EU geschaffenen, aktuellen Marktbedingungen.
Zölle auf chinesische Elektroautos, nicht auf PHEV-Modelle
Im Sommer 2024 formulierte die EU-Kommission den Vorwurf, China würde mit Subventionen seine Autoindustrie wettbewerbswidrig unterstützen. Zölle auf Elektroautos aus China waren die Folge. Der Seal 6 DM-i Touring fällt nicht unter diese Regelung, denn er kommt als Plug-in-Hybrid auf den Markt. Entschieden hat sich BYD zudem, es mit dem Format Kombi zu versuchen. Der allgemeinen SUV-Nachfrage begegnen die Chinesen also mit der Form, die in West-Europa noch immer geschätzt wird. Selbstverständlich verlässt sich der Riese nicht allein auf den Kombi, sondern sieht diesen als Ergänzung zum Seal U DM-i – ein SUV.
Der Seal 6 DM-i Touring ist ein ausgewachsener Mittelklasse-Kombi, der mit 4,84 m Länge nur etwas kürzer als ein VW Passat ist. Der Radstand misst 2,79 m, was für großzügige Platzverhältnisse genügen sollte. Eher enttäuschen dürfte einige Interessenten der Kofferraum, der zwischen 500 und 1535 Liter fasst. Das ist für ein derart großes Auto kein Spitzenwert. Doch irgendwo muss die Batterie untergebracht werden, auch wenn der komplette Antriebsstrang vorn untergebracht ist.
Zwei Antriebe
BYD bietet hier zwei Plug-in-Hybride an, die mit Systemleistungen von 135 und 156 kW in diesem Punkt nicht allzu weit voneinander entfernt sind. Im ersten Datenblatt sind für den Verbrenner 72, für den E-Motor 145 kW hinterlegt. Wir gehen davon aus, dass diese Werte noch korrigiert werden, andernfalls läge schon die Leistung des E-Motors oberhalb dessen, was als Systemleistung für den gesamten Antriebsstrang des Basismodells suggeriert wird. Der Aufbau erlaubt offenbar einige Freiheitsgrade, denn der Hybridantrieb kann elektrisch, seriell und parallel betrieben werden.
Die versprochenen Fahrleistungen sind nahezu identisch, was nicht zuletzt auch daran liegen dürfte, dass das Basismodell mit 1710 kg fast 100 kg weniger schwer ist. Einen großen Unterschied macht BYD bei den Batterien. Das Einstiegsmodell „Boost“ bekommt einen Speicher mit 10,8 kWh, die sich ausschließlich einphasig an Wechselstrom mit bis zu 3,3 kW nachladen lassen. Die Ladedauer von 15 auf 100 Prozent ist mit drei Stunden, die maximale Reichweite mit 50 km angegeben.

BYD
)
Große Batterie mit DC-Ladeoption
In den beiden Ausstattungslinien „Comfort Lite“ und „Comfort“ ist eine Batterie mit 19 kWh eingebaut, die sich an Wechselstrom mit 6,6 kW und an Gleichstrom mit bis zu 26 kW laden lässt. Eigenwillig ist die Angabe der DC-Ladezeit, die BYD für das Fenster von 30 auf 80 Prozent macht. Für das Nachladen von 9,5 kWh netto werden unter idealen Umständen 23 Minuten benötigt. Das entspricht umgerechnet im Schnitt 24,8 kW. Wer nun die Ladeverluste mit in die Rechnung aufnimmt, dürfte den versprochenen 26 kW recht nahe kommen – und zwar im Durchschnitt.
Praktischer wäre es dennoch, wenn BYD eine Angabe von 10 auf 80 Prozent machen würde. Wenn man mal unterstellt, dass zwischen 10 und 30 Prozent kaum langsamer geladen wird als danach, würde sich eine Zeit von rund 32 Minuten ergeben. Kein Spitzenwert, gewiss, aber nichts, für das man sich im Umfeld eines Plug-in-Hybriden aktuell schämen müsste. Unbenommen davon laden einige Plug-in-Hybride, darunter von Mercedes und Volkswagen, sowohl an Wechsel- als auch an Gleichstrom schneller. Andererseits sind rund 100 km E-Reichweite, die BYD mit der größeren Batterie verspricht, ein vergleichsweise ordentlicher Wert.
Die ersten BYD Seal 6 DM-i Touring sollen noch in diesem Jahr ausgeliefert werden.
(Bild: BYD)
Ab Ende des Jahres im Handel
Der Rest des Autos ist recht konventionell gehalten, sieht man einmal davon ab, dass sich das Glasdach öffnen lässt, was nicht mehr selbstverständlich ist, und die Ambientebeleuchtung im Takt der Musik blinken kann. Dazu reicht der Hersteller eine sechsjährige Garantie, für Antrieb und Batterie gilt die sogar acht Jahre lang. Die ersten Auslieferungen sollen noch in diesem Jahr starten, Preise nennt BYD aktuell bis jetzt nicht.
Mehr zur Marke BYD
Künstliche Intelligenz
Klarna will an die Börse: Von „Buy now, pay later“ zur Neobank
Der Bezahldienst Klarna will mit seinem Börsengang in New York bis zu 1,27 Milliarden Dollar einnehmen. Der Großteil davon soll an bestehende Investoren gehen. Nur etwa 205 Millionen Dollar sollen direkt dem schwedischen Fintech verbleiben. Das geht aus den Unterlagen hervor, in denen Klarna die Einzelheiten des Börsengangs an der Wall Street veröffentlicht hat.
Klarna war unter anderem mit dem Angebot gestartet, das Bezahlen im Online-Handel durch den Kauf auf Rechnung zu vereinfachen. Die Firma war auch ein Vorreiter des Modells „Kaufe jetzt, zahle später“. Geld macht Klarna zum Beispiel mit Zinsen bei verzögerten Zahlungen. Ende vergangenen Jahres kam Klarna auf 93 Millionen aktive Kunden.
Auf dem Weg zur Neobank
Das Prinzip des Einkaufens auf Pump boomt auch in Deutschland. 2024 wurde laut der Auskunftei Schufa erstmals die Marke von zehn Millionen neu aufgenommene Ratenkredite innerhalb eines Jahres erreicht – und das liege vor allem Kleinkredite unter 1000 Euro, die inzwischen die Hälfte des Aufkommens ausmachten. „Dieser starke Anstieg der laufenden Kleinkredite unterstreicht das potenzielle Überschuldungsrisiko durch zu viele Kleinkredite wie etwa von Buy-Now-Pay-Later“, sagt Schufa-Vorstandsmitglied Ole Schröder.
Klarna versucht inzwischen aber, nicht nur Bezahldienstleister und Kleinkreditgeber zu sein – man will sich mehr und mehr als vollwertige Neobank positionieren, die mit Anbietern wie Revolut oder N26 im Wettbewerb steht. So hat Klarna am Dienstag auch die Einführung einer eigenen Debitkarte angekündigt.
Diese Debitkarte basiert auf Visas Kartenprodukt Flexible Credential. Sie soll Kunden die Entscheidungsmöglichkeit bieten, mit ihr entweder direkt per Debit oder in Raten zu zahlen. Entsprechende Einstellungen lassen sich in der Klarna-App vornehmen. Die Karte soll an rund 150 Millionen Visa-Akzeptanzstellen weltweit nutzbar sein. In Europa werde sie in zehn Ländern auf den Markt kommen, wobei sich Deutschland noch gedulden muss.
Milliardenbewertung in Aussicht
Für seinen Börsengang strebt das schwedische Unternehmen die Milliardenbewertung an. Klarna und einige seiner Investoren bieten laut der bei der US-Börsenaufsichtsbehörde SEC eingereichten Meldung 34,3 Millionen Aktien für 35 bis 37 Dollar pro Stück an. Sollte Klarna die obere Spanne erreichen, wäre der schwedische Finanzdienstleister an der Börse rund 14 Milliarden Dollar wert. Die Klarna-Aktie wurde für den Handel an der New Yorker Börse unter dem Kürzel „KLAR“ zugelassen
Klarna hatte bereits im März einen Antrag auf Börsengang bei der SEC gestellt, die Pläne jedoch auf Eis gelegt, nachdem US-Präsident Donald Trump mit seinem Handelskrieg die Finanzmärkte verunsichert hatte.
(axk)
Künstliche Intelligenz
DevBoard: Ultra-Wideband für Position und Tracking
Ultrabreitband (UWB) ist keine neue Technologie – aber erst in den vergangenen Jahren hat sie richtig Fahrt aufgenommen und den Sprung in den Massenmarkt geschafft. Inzwischen steckt UWB in immer mehr Geräten, darunter zahlreiche Top-Smartphones und sogar Apples AirTags.
Bei UWB handelt es sich um eine energiesparende Funktechnik für kurze Distanzen, die Daten über ein besonders breites Frequenzspektrum von rund 500 MHz überträgt. Das macht sie vielseitig einsetzbar – von der Datenübertragung über Radarsensorik bis hin zur exakten Abstandsmessung. Vor allem Letzteres gilt derzeit als einer der spannendsten und am schnellsten wachsenden Anwendungsbereiche, mit den inzwischen recht günstigen AI Thinker UB03 Modulen können wir Maker nun auch mitspielen.
(Bild: ai-thinker.com)
Die Sensoren (an sich sind es Funkgeräte) arbeiten mit Frequenzen zwischen 6,25 und 8,28 GHz und einem 500 MHz breiten Funkspektrum. Die Funkwellen werden praktisch (von Antenne und Montage dieser abhängig) rundum ausgestrahlt und durchdringen auch viele Hindernisse und Menschen. Auch die Ausrichtung der einzelnen UWB-Geräte ist daher nicht entscheidend für die Qualität der Messung.
Bei zwei Geräten kann man den Abstand messen, bei mindestens drei Geräten auch schon eine absolute Position. Ein Gerät sendet einen kurzen Impuls aus, das andere (oder die anderen) antworten und das sendende Gerät kann aus der vergangenen Zeit (Laufzeit, Time of Flight, ToF) den Abstand errechnen. Dabei geht es um Milliardstel Sekunden, daher sind auch die genauesten Uhren auf den Boards erforderlich. So sind aktuell etwa 10 cm Genauigkeit erreichbar.
(Bild: Core Electronics)
Das „AI Thinker UB03 Kit“-Board kostet etwa 25 Euro (auf Breakoutboard mit ST-Mikrocontroller, es gibt sie auch einzeln) und man benötigt zwei davon. Beides sind praktisch Funk-Modems und werden mit AT-Kommandos gesteuert. Für den Einstieg muss man allerdings einiges an halb garen Websites und eventuellen Datenblättern auf Chinesisch wälzen. Jetzt gibt es aber eine gute Videoeinführung von Core Electronics auf YouTube. Auch die Tutorials auf deren Seiten sind für einen Einstieg geeignet. Es gibt dort auch den Code für MicroPython und C++.
(caw)
-
Datenschutz & Sicherheitvor 3 Monaten
Geschichten aus dem DSC-Beirat: Einreisebeschränkungen und Zugriffsschranken
-
UX/UI & Webdesignvor 2 Wochen
Der ultimative Guide für eine unvergessliche Customer Experience
-
Apps & Mobile Entwicklungvor 3 Monaten
Metal Gear Solid Δ: Snake Eater: Ein Multiplayer-Modus für Fans von Versteckenspielen
-
Online Marketing & SEOvor 3 Monaten
TikTok trackt CO₂ von Ads – und Mitarbeitende intern mit Ratings
-
UX/UI & Webdesignvor 4 Tagen
Adobe Firefly Boards › PAGE online
-
Social Mediavor 2 Wochen
Relatable, relevant, viral? Wer heute auf Social Media zum Vorbild wird – und warum das für Marken (k)eine gute Nachricht ist
-
Entwicklung & Codevor 2 Wochen
Posit stellt Positron vor: Neue IDE für Data Science mit Python und R
-
Digital Business & Startupsvor 2 Monaten
10.000 Euro Tickets? Kann man machen – aber nur mit diesem Trick