<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: vmodal_ai</title>
    <description>The latest articles on DEV Community by vmodal_ai (@vmodal_ai).</description>
    <link>https://dev.to/vmodal_ai</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4052446%2F2fcb63ba-7be8-4ffd-93ce-f4f00223ddfa.jpeg</url>
      <title>DEV Community: vmodal_ai</title>
      <link>https://dev.to/vmodal_ai</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/vmodal_ai"/>
    <language>en</language>
    <item>
      <title>Rise of the Jev Tools Ecosystem: Architecture, Primitives, and the Shift to System One AI</title>
      <dc:creator>vmodal_ai</dc:creator>
      <pubDate>Sat, 26 Sep 2026 12:35:04 +0000</pubDate>
      <link>https://dev.to/vmodal_ai/rise-of-the-jev-tools-ecosystem-architecture-primitives-and-the-shift-to-system-one-ai-1ha6</link>
      <guid>https://dev.to/vmodal_ai/rise-of-the-jev-tools-ecosystem-architecture-primitives-and-the-shift-to-system-one-ai-1ha6</guid>
      <description>&lt;h2&gt;
  
  
  The Rise of the Jev Tools Ecosystem: Architecture, Primitives, and the Shift to System One AI
&lt;/h2&gt;

&lt;p&gt;The landscape of artificial intelligence underwent a fundamental architectural shift in September 2026 with the release of Jev by TypeSafe AI. Founded by former OpenAI researcher Diogo Almeida, a co-inventor of reinforcement learning from human feedback (RLHF), TypeSafe AI introduced Jev not as another generative chatbot, but as the pioneer of a new class of artificial intelligence: "System One" decision models.&lt;/p&gt;

&lt;p&gt;Named after Daniel Kahneman’s cognitive framework of fast, intuitive, and non-deliberative thinking, Jev does not output text token-by-token. Instead, it evaluates an arbitrary state alongside a set of predefined natural-language questions and directly returns structured, typed decisions accompanied by calibrated confidence probabilities. By bypassing the heavy token-generation pipelines of traditional large language models (LLMs), Jev operates up to 200 times faster and 400 times cheaper than frontier generative models, maintaining sub-500-millisecond latencies at a fraction of the operational cost.&lt;br&gt;
This architectural departure has ignited an explosive software ecosystem. Developers quickly realized that running heavy generative models for basic classification, routing, and guardrailing was an expensive anti-pattern. In the weeks following Jev’s debut, the public developer ecosystem expanded exponentially, giving rise to hundreds of open-source libraries, database extensions, model routers, and agentic harnesses compiled within the community-driven &lt;a href="https://github.com/v-modal/awesome-jev-tools" rel="noopener noreferrer"&gt;GitHub awesome-jev list&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Core Primitives of Jev Software Engineering
&lt;/h2&gt;

&lt;p&gt;To understand the tools ecosystem built around Jev, one must first understand its structural outputs. Unlike generative LLMs that require strict JSON schemas, prompt engineering, and brittle regex parsing to guarantee structured text, Jev is natively constrained at the logit level. It exposes three core primitives:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Noul: A probabilistic truth evaluation. It answers how accurately a state matches a given natural-language condition, returning a boolean judgment paired with a confidence score.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Choice: A discrete selection engine. Given an unstructured state and a predefined dictionary of categorical options, Jev forces a single selection, completely eliminating the possibility of formatting hallucinations.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Score: A rubric-based grading mechanism. It ranks an input against an explicit criteria scale, providing an immediate numerical assessment.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Because these primitives deliver deterministic structures instantly, developers can use them as embedded, intelligent conditional statements within traditional codebases. The Jev tools ecosystem is fundamentally designed to operationalize these three primitives across modern software architectures.&lt;/p&gt;

&lt;h2&gt;
  
  
  Embedded Data: Database and SQL Extensions
&lt;/h2&gt;

&lt;p&gt;One of the most immediate expansions of the Jev ecosystem occurred at the data layer, where developers integrated non-autoregressive classification directly into database engines. Rather than pulling millions of rows out of a data warehouse to parse them through an external LLM pipeline, new extensions allow engineers to execute natural-language conditions directly inside SQL queries.&lt;br&gt;
The tool duckdb-jev, a native extension for DuckDB, applies Jev decisions straight to localized data rows. Benchmarks indicate that duckdb-jev can process up to 1,943 rows per second for complex Choice classifications under bounded concurrency. Similarly, sqlite-jev introduces a loadable C extension and Python package that exposes Noul, Choice, and Score as standard SQL functions, unlocking virtual-table queries capable of batch-filtering unstructured text data natively. At the enterprise scale, integrations like pg-jev and specialized architectures utilizing the Oracle AI Database have emerged to govern agentic memory, allowing databases to evaluate, prune, and sort transactional records using semantic criteria before heavy reasoning workloads are even triggered.&lt;/p&gt;

&lt;h2&gt;
  
  
  Intelligent Infrastructure: Model Routing and Cascades
&lt;/h2&gt;

&lt;p&gt;As frontier reasoning models become more powerful and computationally expensive, the cost of routing everyday inquiries grows unsustainable. Jev has become the default orchestration layer for managing multi-model cascades, ensuring that expensive cognitive compute is only deployed when strictly necessary.&lt;br&gt;
A prime example of this infrastructure is the &lt;a href="https://openrouter.ai/typesafe/jev-router" rel="noopener noreferrer"&gt;Jev Router documentation on OpenRouter&lt;/a&gt;. OpenRouter launched the Jev Router as a zero-cost utility endpoint that dynamically assesses incoming user requests. Using Jev’s Choice primitive, the router evaluates the implicit difficulty of an evolving conversation and routes the query to the lowest-cost model capable of completing the task.&lt;br&gt;
Within custom application stacks, open-source projects like Jev &lt;/p&gt;

&lt;p&gt;Codex Router and specialized evaluation codebases use Jev to analyze code complexity, user intent, and required tools. If Jev flags an incoming request as a simple lookup or basic text extraction, the application handles it locally or via a highly optimized small model. If Jev evaluates the state with low confidence or identifies an architectural ambiguity, it escalates the workload to a frontier reasoning engine.&lt;/p&gt;

&lt;h2&gt;
  
  
  Agentic Harnesses and the Model Context Protocol (MCP)
&lt;/h2&gt;

&lt;p&gt;Autonomous AI agents spend a massive percentage of their execution loops determining which tool to use, verifying if an action was successful, and checking if they have strayed off course. Generative models struggle with the latency demands of these micro-decisions. The Jev ecosystem addresses this bottleneck by providing a high-speed coprocessor for agent frameworks.&lt;/p&gt;

&lt;p&gt;Through the Model Context Protocol (MCP), tools like jev-mcp and the Jev MCP server  turn Jev into a first-class classifier tool that sits directly inside agent codebases like Claude Code, Cursor, or LangGraph. Instead of an agent writing a long explanation to justify a tool call, the agent hands the state over to Jev.&lt;br&gt;
This architecture allows for real-time loops across diverse workflows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Browser and Desktop Automation: Tools like jev-ultrafast pass raw DOM states to Jev to instantly select the next clickable element, avoiding the multi-second latency of full multimodal models.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Safety Gates: Before an agent executes a terminal script or modifies a database, Jev classifies the command as read-only, reversible, or destructive. High-confidence safe commands proceed instantly, while risky operations trigger human-in-the-loop interventions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Context Compaction: Tools like fast-jev-compaction and Winnow act as automated context garbage collectors, using Jev to scan an agent’s ballooning memory, strip out redundant logs, and preserve only critical operational details.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Open-Source Replication Wave
&lt;/h2&gt;

&lt;p&gt;While TypeSafe AI operates Jev as a highly optimized, closed API, the sheer utility of the System One paradigm triggered an immediate open-source replication wave. Engineers sought to build local, decoupled alternatives that could run entirely on commodity hardware or edge devices.&lt;/p&gt;

&lt;p&gt;The most notable open-source equivalent is Laya, an independent, 421-million-parameter non-autoregressive decision model released under the Apache 2.0 license. As outlined in the &lt;a href="https://wilsonwu.me/en/blog/2026/jev-vs-laya/" rel="noopener noreferrer"&gt;Jev vs Laya&lt;/a&gt;, Laya provides a completely local alternative that can be deployed on a single NVIDIA T4 GPU or an Apple Silicon MacBook, passing thousands of GitHub stars within days of its release. Concurrently, projects like Bespoke Nimble demonstrated how to fine-tune standard open weights (such as Qwen 3.5) using synthetic contrastive data curation and constrained decoding to replicate Jev's exact discriminative behaviors, achieving sub-100ms latencies on local hardware. For ultra-low-power applications, models like Kev-0.5B scale the architecture down further, allowing background applications to run continuous, near-zero-cost judgment layers for notifications and local UI adaptations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Future Horizons
&lt;/h2&gt;

&lt;p&gt;The rapid evolution of the Jev tools ecosystem proves that the future of artificial intelligence is not monolithically generative. &lt;/p&gt;

&lt;p&gt;By splitting the cognitive stack into a fast, probabilistic decision layer (System One) and a slower, expressive reasoning layer (System Two), developers are building software that is drastically cheaper, safer, and faster.&lt;/p&gt;

&lt;p&gt;The ecosystem is already moving beyond text. Recent developments highlighted in the JEV-Based Image Models Architecture Report detail the arrival of Visual Jev and PixelJev. These models bypass heavy multimodal decoding to achieve sub-20ms visual choice selections, filtering out defective generations in automated diffusion pipelines before a single pixel is fully rendered. As these toolsets continue to mature, the combination of embedded database classifiers, open-source local decision nodes, and lightning-fast agentic gates will firmly establish System One engines as an indispensable tier of the modern enterprise software stack.&lt;/p&gt;




&lt;p&gt;Provide by V-Modal AI Team&lt;br&gt;
Github: &lt;a href="https://github.com/v-modal" rel="noopener noreferrer"&gt;https://github.com/v-modal&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Building an Offline-First Robot Control App with Kotlin</title>
      <dc:creator>vmodal_ai</dc:creator>
      <pubDate>Fri, 25 Sep 2026 20:32:30 +0000</pubDate>
      <link>https://dev.to/vmodal_ai/building-an-offline-first-robot-control-app-with-kotlin-2m1b</link>
      <guid>https://dev.to/vmodal_ai/building-an-offline-first-robot-control-app-with-kotlin-2m1b</guid>
      <description>&lt;h1&gt;
  
  
  Building an Offline-First Robot Control App with Kotlin
&lt;/h1&gt;

&lt;h2&gt;
  
  
  What You Will Build
&lt;/h2&gt;

&lt;p&gt;In this tutorial, you will build a practical Kotlin/Android component for a robotics or Physical AI system. The design emphasizes asynchronous processing, lifecycle-aware state, real-time data handling, observability, and safe separation between the Android interface and physical robot control.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Android Kotlin + Jetpack Compose
             ↓
       ViewModel / Flow
             ↓
      Repository / API
             ↓
   ROS 2 / Jetson / AI Backend
             ↓
        Robot System
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 1 — Define local robot state
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;data class&lt;/span&gt; &lt;span class="nc"&gt;LocalRobotState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;connected&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Boolean&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;pendingCommands&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;emptyList&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 2 — Cache the latest known state
&lt;/h2&gt;

&lt;p&gt;Use a local persistence layer appropriate to your application so the UI can open without a network connection.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3 — Queue commands
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;data class&lt;/span&gt; &lt;span class="nc"&gt;PendingCommand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;command&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;createdAt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Long&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 4 — Sync when connected
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;connected&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;pendingCommands&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 5 — Make commands idempotent
&lt;/h2&gt;

&lt;p&gt;Use unique command IDs so a reconnect does not accidentally execute the same command twice.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 6 — Define offline limits
&lt;/h2&gt;

&lt;p&gt;Do not allow dangerous physical actions to queue indefinitely while disconnected. Some commands should be disabled entirely when the robot cannot be verified as connected.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 7 — Show connection state
&lt;/h2&gt;

&lt;p&gt;Make it obvious whether the user is operating the live robot, viewing cached information, or waiting for synchronization.&lt;/p&gt;

&lt;h2&gt;
  
  
  Performance Checklist
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Keep CPU-heavy work off the main thread.&lt;/li&gt;
&lt;li&gt;Use bounded buffers for high-rate streams.&lt;/li&gt;
&lt;li&gt;Prefer &lt;code&gt;StateFlow&lt;/code&gt; for observable UI state.&lt;/li&gt;
&lt;li&gt;Sample high-frequency telemetry before rendering.&lt;/li&gt;
&lt;li&gt;Measure end-to-end latency instead of only model latency.&lt;/li&gt;
&lt;li&gt;Handle reconnects and stale data explicitly.&lt;/li&gt;
&lt;li&gt;Keep emergency controls independent of high-bandwidth streams.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Testing Checklist
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Test with no network connection.&lt;/li&gt;
&lt;li&gt;Test reconnect and duplicate messages.&lt;/li&gt;
&lt;li&gt;Test high-rate telemetry.&lt;/li&gt;
&lt;li&gt;Test lifecycle cancellation.&lt;/li&gt;
&lt;li&gt;Test low battery and degraded network conditions.&lt;/li&gt;
&lt;li&gt;Test emergency-stop behavior.&lt;/li&gt;
&lt;li&gt;Verify that AI-generated instructions cannot bypass the deterministic safety layer.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The resulting Kotlin layer can be extended with real ROS 2 bridges, NVIDIA Jetson services, computer vision models, smart-glasses SDKs, or multimodal AI backends. Keep hardware-specific code behind interfaces so the Android application remains maintainable as the robotics stack evolves.&lt;/p&gt;

&lt;h2&gt;
  
  
  Useful Links
&lt;/h2&gt;

&lt;p&gt;Website: &lt;a href="http://www.v-modal.com" rel="noopener noreferrer"&gt;www.v-modal.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;SDK Flutter: &lt;a href="https://github.com/v-modal/vmodal_sdk_flutter" rel="noopener noreferrer"&gt;https://github.com/v-modal/vmodal_sdk_flutter&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;SDK Android: &lt;a href="https://github.com/v-modal/vmodal_sdk_android" rel="noopener noreferrer"&gt;https://github.com/v-modal/vmodal_sdk_android&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Discord: &lt;a href="https://discord.gg/K72z28KUx" rel="noopener noreferrer"&gt;https://discord.gg/K72z28KUx&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Reddit: &lt;a href="https://www.reddit.com/r/v_modal/" rel="noopener noreferrer"&gt;https://www.reddit.com/r/v_modal/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>kotlin</category>
      <category>android</category>
      <category>robotics</category>
      <category>ai</category>
    </item>
    <item>
      <title>Building a Robot Diagnostics Dashboard with Kotlin and Compose</title>
      <dc:creator>vmodal_ai</dc:creator>
      <pubDate>Fri, 25 Sep 2026 20:31:40 +0000</pubDate>
      <link>https://dev.to/vmodal_ai/building-a-robot-diagnostics-dashboard-with-kotlin-and-compose-2mlp</link>
      <guid>https://dev.to/vmodal_ai/building-a-robot-diagnostics-dashboard-with-kotlin-and-compose-2mlp</guid>
      <description>&lt;h1&gt;
  
  
  Building a Robot Diagnostics Dashboard with Kotlin and Compose
&lt;/h1&gt;

&lt;h2&gt;
  
  
  What You Will Build
&lt;/h2&gt;

&lt;p&gt;In this tutorial, you will build a practical Kotlin/Android component for a robotics or Physical AI system. The design emphasizes asynchronous processing, lifecycle-aware state, real-time data handling, observability, and safe separation between the Android interface and physical robot control.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Android Kotlin + Jetpack Compose
             ↓
       ViewModel / Flow
             ↓
      Repository / API
             ↓
   ROS 2 / Jetson / AI Backend
             ↓
        Robot System
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 1 — Define diagnostics
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;data class&lt;/span&gt; &lt;span class="nc"&gt;Diagnostics&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;connected&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Boolean&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;battery&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Float&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;temperature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Float&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;cpu&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Float&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;gpu&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Float&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;lastMessageMs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Long&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 2 — Expose diagnostics through StateFlow
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;_diagnostics&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
    &lt;span class="nc"&gt;MutableStateFlow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Diagnostics&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 3 — Create Compose metric cards
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Composable&lt;/span&gt;
&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;DiagnosticCard&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nc"&gt;Card&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;Column&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Modifier&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dp&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
            &lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 4 — Detect stale telemetry
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;stale&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
    &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;currentTimeMillis&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lastMessageMs&lt;/span&gt; &lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;3000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 5 — Add logs
&lt;/h2&gt;

&lt;p&gt;Store structured events such as connection changes, model failures, sensor errors, and watchdog activations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 6 — Add export
&lt;/h2&gt;

&lt;p&gt;For production systems, allow diagnostics to be exported for support and debugging, while avoiding sensitive information.&lt;/p&gt;

&lt;h2&gt;
  
  
  Performance Checklist
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Keep CPU-heavy work off the main thread.&lt;/li&gt;
&lt;li&gt;Use bounded buffers for high-rate streams.&lt;/li&gt;
&lt;li&gt;Prefer &lt;code&gt;StateFlow&lt;/code&gt; for observable UI state.&lt;/li&gt;
&lt;li&gt;Sample high-frequency telemetry before rendering.&lt;/li&gt;
&lt;li&gt;Measure end-to-end latency instead of only model latency.&lt;/li&gt;
&lt;li&gt;Handle reconnects and stale data explicitly.&lt;/li&gt;
&lt;li&gt;Keep emergency controls independent of high-bandwidth streams.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Testing Checklist
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Test with no network connection.&lt;/li&gt;
&lt;li&gt;Test reconnect and duplicate messages.&lt;/li&gt;
&lt;li&gt;Test high-rate telemetry.&lt;/li&gt;
&lt;li&gt;Test lifecycle cancellation.&lt;/li&gt;
&lt;li&gt;Test low battery and degraded network conditions.&lt;/li&gt;
&lt;li&gt;Test emergency-stop behavior.&lt;/li&gt;
&lt;li&gt;Verify that AI-generated instructions cannot bypass the deterministic safety layer.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The resulting Kotlin layer can be extended with real ROS 2 bridges, NVIDIA Jetson services, computer vision models, smart-glasses SDKs, or multimodal AI backends. Keep hardware-specific code behind interfaces so the Android application remains maintainable as the robotics stack evolves.&lt;/p&gt;

&lt;h2&gt;
  
  
  Useful Links
&lt;/h2&gt;

&lt;p&gt;Website: &lt;a href="http://www.v-modal.com" rel="noopener noreferrer"&gt;www.v-modal.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;SDK Flutter: &lt;a href="https://github.com/v-modal/vmodal_sdk_flutter" rel="noopener noreferrer"&gt;https://github.com/v-modal/vmodal_sdk_flutter&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;SDK Android: &lt;a href="https://github.com/v-modal/vmodal_sdk_android" rel="noopener noreferrer"&gt;https://github.com/v-modal/vmodal_sdk_android&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Discord: &lt;a href="https://discord.gg/K72z28KUx" rel="noopener noreferrer"&gt;https://discord.gg/K72z28KUx&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Reddit: &lt;a href="https://www.reddit.com/r/v_modal/" rel="noopener noreferrer"&gt;https://www.reddit.com/r/v_modal/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>kotlin</category>
      <category>android</category>
      <category>robotics</category>
      <category>ai</category>
    </item>
    <item>
      <title>Kotlin + Edge AI: Reducing Robot Inference Latency</title>
      <dc:creator>vmodal_ai</dc:creator>
      <pubDate>Fri, 25 Sep 2026 20:31:14 +0000</pubDate>
      <link>https://dev.to/vmodal_ai/kotlin-edge-ai-reducing-robot-inference-latency-3e0a</link>
      <guid>https://dev.to/vmodal_ai/kotlin-edge-ai-reducing-robot-inference-latency-3e0a</guid>
      <description>&lt;h1&gt;
  
  
  Kotlin + Edge AI: Reducing Robot Inference Latency
&lt;/h1&gt;

&lt;h2&gt;
  
  
  What You Will Build
&lt;/h2&gt;

&lt;p&gt;In this tutorial, you will build a practical Kotlin/Android component for a robotics or Physical AI system. The design emphasizes asynchronous processing, lifecycle-aware state, real-time data handling, observability, and safe separation between the Android interface and physical robot control.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Android Kotlin + Jetpack Compose
             ↓
       ViewModel / Flow
             ↓
      Repository / API
             ↓
   ROS 2 / Jetson / AI Backend
             ↓
        Robot System
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 1 — Measure the pipeline
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;start&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;nanoTime&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;preprocessed&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;preprocess&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;preprocessingMs&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;nanoTime&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;1_000_000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Measure separately:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;capture
preprocessing
inference
postprocessing
network
UI rendering
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 2 — Run inference off the main thread
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;result&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;withContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Dispatchers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Default&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;run&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 3 — Reduce allocations
&lt;/h2&gt;

&lt;p&gt;Reuse buffers where the inference API allows it and avoid converting the same frame through multiple image formats.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4 — Reduce unnecessary inference
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="n"&gt;frameFlow&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;sample&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;collect&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nf"&gt;runInference&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 5 — Consider model optimization
&lt;/h2&gt;

&lt;p&gt;Depending on the runtime and model, investigate quantization, smaller input sizes, hardware acceleration, and model architecture changes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 6 — Compare end-to-end latency
&lt;/h2&gt;

&lt;p&gt;A model's benchmark inference time is not the same as application latency. Measure the complete pipeline.&lt;/p&gt;

&lt;h2&gt;
  
  
  Performance Checklist
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Keep CPU-heavy work off the main thread.&lt;/li&gt;
&lt;li&gt;Use bounded buffers for high-rate streams.&lt;/li&gt;
&lt;li&gt;Prefer &lt;code&gt;StateFlow&lt;/code&gt; for observable UI state.&lt;/li&gt;
&lt;li&gt;Sample high-frequency telemetry before rendering.&lt;/li&gt;
&lt;li&gt;Measure end-to-end latency instead of only model latency.&lt;/li&gt;
&lt;li&gt;Handle reconnects and stale data explicitly.&lt;/li&gt;
&lt;li&gt;Keep emergency controls independent of high-bandwidth streams.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Testing Checklist
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Test with no network connection.&lt;/li&gt;
&lt;li&gt;Test reconnect and duplicate messages.&lt;/li&gt;
&lt;li&gt;Test high-rate telemetry.&lt;/li&gt;
&lt;li&gt;Test lifecycle cancellation.&lt;/li&gt;
&lt;li&gt;Test low battery and degraded network conditions.&lt;/li&gt;
&lt;li&gt;Test emergency-stop behavior.&lt;/li&gt;
&lt;li&gt;Verify that AI-generated instructions cannot bypass the deterministic safety layer.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The resulting Kotlin layer can be extended with real ROS 2 bridges, NVIDIA Jetson services, computer vision models, smart-glasses SDKs, or multimodal AI backends. Keep hardware-specific code behind interfaces so the Android application remains maintainable as the robotics stack evolves.&lt;/p&gt;

&lt;h2&gt;
  
  
  Useful Links
&lt;/h2&gt;

&lt;p&gt;Website: &lt;a href="http://www.v-modal.com" rel="noopener noreferrer"&gt;www.v-modal.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;SDK Flutter: &lt;a href="https://github.com/v-modal/vmodal_sdk_flutter" rel="noopener noreferrer"&gt;https://github.com/v-modal/vmodal_sdk_flutter&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;SDK Android: &lt;a href="https://github.com/v-modal/vmodal_sdk_android" rel="noopener noreferrer"&gt;https://github.com/v-modal/vmodal_sdk_android&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Discord: &lt;a href="https://discord.gg/K72z28KUx" rel="noopener noreferrer"&gt;https://discord.gg/K72z28KUx&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Reddit: &lt;a href="https://www.reddit.com/r/v_modal/" rel="noopener noreferrer"&gt;https://www.reddit.com/r/v_modal/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>kotlin</category>
      <category>android</category>
      <category>ai</category>
      <category>robotics</category>
    </item>
    <item>
      <title>Building a Multimodal AI Robot Interface with Kotlin</title>
      <dc:creator>vmodal_ai</dc:creator>
      <pubDate>Fri, 25 Sep 2026 20:30:39 +0000</pubDate>
      <link>https://dev.to/vmodal_ai/building-a-multimodal-ai-robot-interface-with-kotlin-mdd</link>
      <guid>https://dev.to/vmodal_ai/building-a-multimodal-ai-robot-interface-with-kotlin-mdd</guid>
      <description>&lt;h1&gt;
  
  
  Building a Multimodal AI Robot Interface with Kotlin
&lt;/h1&gt;

&lt;h2&gt;
  
  
  What You Will Build
&lt;/h2&gt;

&lt;p&gt;In this tutorial, you will build a practical Kotlin/Android component for a robotics or Physical AI system. The design emphasizes asynchronous processing, lifecycle-aware state, real-time data handling, observability, and safe separation between the Android interface and physical robot control.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Android Kotlin + Jetpack Compose
             ↓
       ViewModel / Flow
             ↓
      Repository / API
             ↓
   ROS 2 / Jetson / AI Backend
             ↓
        Robot System
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 1 — Define multimodal input
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;data class&lt;/span&gt; &lt;span class="nc"&gt;MultimodalInput&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;?,&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;ByteArray&lt;/span&gt;&lt;span class="p"&gt;?,&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;audio&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;ByteArray&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 2 — Build a repository
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;AiRobotRepository&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;suspend&lt;/span&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;analyze&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;input&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;MultimodalInput&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nc"&gt;RobotResponse&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 3 — Display AI results
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;data class&lt;/span&gt; &lt;span class="nc"&gt;RobotResponse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;summary&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;suggestedAction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 4 — Connect to robotics
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Image ─┐
Audio ─┼→ AI backend → structured result
Text ──┘                     ↓
                         validator
                             ↓
                         robot plan
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 5 — Keep actuator control separate
&lt;/h2&gt;

&lt;p&gt;The multimodal model should propose an action. A deterministic robotics layer decides whether the action is valid and safe.&lt;/p&gt;

&lt;h2&gt;
  
  
  Performance Checklist
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Keep CPU-heavy work off the main thread.&lt;/li&gt;
&lt;li&gt;Use bounded buffers for high-rate streams.&lt;/li&gt;
&lt;li&gt;Prefer &lt;code&gt;StateFlow&lt;/code&gt; for observable UI state.&lt;/li&gt;
&lt;li&gt;Sample high-frequency telemetry before rendering.&lt;/li&gt;
&lt;li&gt;Measure end-to-end latency instead of only model latency.&lt;/li&gt;
&lt;li&gt;Handle reconnects and stale data explicitly.&lt;/li&gt;
&lt;li&gt;Keep emergency controls independent of high-bandwidth streams.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Testing Checklist
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Test with no network connection.&lt;/li&gt;
&lt;li&gt;Test reconnect and duplicate messages.&lt;/li&gt;
&lt;li&gt;Test high-rate telemetry.&lt;/li&gt;
&lt;li&gt;Test lifecycle cancellation.&lt;/li&gt;
&lt;li&gt;Test low battery and degraded network conditions.&lt;/li&gt;
&lt;li&gt;Test emergency-stop behavior.&lt;/li&gt;
&lt;li&gt;Verify that AI-generated instructions cannot bypass the deterministic safety layer.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The resulting Kotlin layer can be extended with real ROS 2 bridges, NVIDIA Jetson services, computer vision models, smart-glasses SDKs, or multimodal AI backends. Keep hardware-specific code behind interfaces so the Android application remains maintainable as the robotics stack evolves.&lt;/p&gt;

&lt;h2&gt;
  
  
  Useful Links
&lt;/h2&gt;

&lt;p&gt;Website: &lt;a href="http://www.v-modal.com" rel="noopener noreferrer"&gt;www.v-modal.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;SDK Flutter: &lt;a href="https://github.com/v-modal/vmodal_sdk_flutter" rel="noopener noreferrer"&gt;https://github.com/v-modal/vmodal_sdk_flutter&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;SDK Android: &lt;a href="https://github.com/v-modal/vmodal_sdk_android" rel="noopener noreferrer"&gt;https://github.com/v-modal/vmodal_sdk_android&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Discord: &lt;a href="https://discord.gg/K72z28KUx" rel="noopener noreferrer"&gt;https://discord.gg/K72z28KUx&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Reddit: &lt;a href="https://www.reddit.com/r/v_modal/" rel="noopener noreferrer"&gt;https://www.reddit.com/r/v_modal/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>kotlin</category>
      <category>android</category>
      <category>ai</category>
      <category>robotics</category>
    </item>
    <item>
      <title>Kotlin + LLM + ROS 2: Natural Language Robot Control</title>
      <dc:creator>vmodal_ai</dc:creator>
      <pubDate>Fri, 25 Sep 2026 20:30:03 +0000</pubDate>
      <link>https://dev.to/vmodal_ai/kotlin-llm-ros-2-natural-language-robot-control-1nb2</link>
      <guid>https://dev.to/vmodal_ai/kotlin-llm-ros-2-natural-language-robot-control-1nb2</guid>
      <description>&lt;h1&gt;
  
  
  Kotlin + LLM + ROS 2: Natural Language Robot Control
&lt;/h1&gt;

&lt;h2&gt;
  
  
  What You Will Build
&lt;/h2&gt;

&lt;p&gt;In this tutorial, you will build a practical Kotlin/Android component for a robotics or Physical AI system. The design emphasizes asynchronous processing, lifecycle-aware state, real-time data handling, observability, and safe separation between the Android interface and physical robot control.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Android Kotlin + Jetpack Compose
             ↓
       ViewModel / Flow
             ↓
      Repository / API
             ↓
   ROS 2 / Jetson / AI Backend
             ↓
        Robot System
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 1 — Define the natural-language request
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Serializable&lt;/span&gt;
&lt;span class="kd"&gt;data class&lt;/span&gt; &lt;span class="nc"&gt;RobotRequest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;instruction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 2 — Send it to the backend
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;suspend&lt;/span&gt; &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;submit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;instruction&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;submit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;RobotRequest&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;instruction&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 3 — Return a structured plan
&lt;/h2&gt;

&lt;p&gt;Prefer structured data over free-form motor commands.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Serializable&lt;/span&gt;
&lt;span class="kd"&gt;data class&lt;/span&gt; &lt;span class="nc"&gt;RobotPlan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;action&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;parameters&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Map&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 4 — Validate
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;isAllowed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;plan&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;RobotPlan&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nc"&gt;Boolean&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
    &lt;span class="n"&gt;plan&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;action&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;setOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"NAVIGATE"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"INSPECT"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"STOP"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 5 — Execute through ROS 2
&lt;/h2&gt;

&lt;p&gt;Only validated plans should be converted into ROS 2 actions/services/topics.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 6 — Confirm risky actions
&lt;/h2&gt;

&lt;p&gt;Require explicit human confirmation for actions that could affect people, equipment, or restricted areas.&lt;/p&gt;

&lt;h2&gt;
  
  
  Performance Checklist
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Keep CPU-heavy work off the main thread.&lt;/li&gt;
&lt;li&gt;Use bounded buffers for high-rate streams.&lt;/li&gt;
&lt;li&gt;Prefer &lt;code&gt;StateFlow&lt;/code&gt; for observable UI state.&lt;/li&gt;
&lt;li&gt;Sample high-frequency telemetry before rendering.&lt;/li&gt;
&lt;li&gt;Measure end-to-end latency instead of only model latency.&lt;/li&gt;
&lt;li&gt;Handle reconnects and stale data explicitly.&lt;/li&gt;
&lt;li&gt;Keep emergency controls independent of high-bandwidth streams.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Testing Checklist
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Test with no network connection.&lt;/li&gt;
&lt;li&gt;Test reconnect and duplicate messages.&lt;/li&gt;
&lt;li&gt;Test high-rate telemetry.&lt;/li&gt;
&lt;li&gt;Test lifecycle cancellation.&lt;/li&gt;
&lt;li&gt;Test low battery and degraded network conditions.&lt;/li&gt;
&lt;li&gt;Test emergency-stop behavior.&lt;/li&gt;
&lt;li&gt;Verify that AI-generated instructions cannot bypass the deterministic safety layer.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The resulting Kotlin layer can be extended with real ROS 2 bridges, NVIDIA Jetson services, computer vision models, smart-glasses SDKs, or multimodal AI backends. Keep hardware-specific code behind interfaces so the Android application remains maintainable as the robotics stack evolves.&lt;/p&gt;

&lt;h2&gt;
  
  
  Useful Links
&lt;/h2&gt;

&lt;p&gt;Website: &lt;a href="http://www.v-modal.com" rel="noopener noreferrer"&gt;www.v-modal.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;SDK Flutter: &lt;a href="https://github.com/v-modal/vmodal_sdk_flutter" rel="noopener noreferrer"&gt;https://github.com/v-modal/vmodal_sdk_flutter&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;SDK Android: &lt;a href="https://github.com/v-modal/vmodal_sdk_android" rel="noopener noreferrer"&gt;https://github.com/v-modal/vmodal_sdk_android&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Discord: &lt;a href="https://discord.gg/K72z28KUx" rel="noopener noreferrer"&gt;https://discord.gg/K72z28KUx&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Reddit: &lt;a href="https://www.reddit.com/r/v_modal/" rel="noopener noreferrer"&gt;https://www.reddit.com/r/v_modal/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>kotlin</category>
      <category>android</category>
      <category>ros2</category>
      <category>robotics</category>
    </item>
    <item>
      <title>Building an AI Robot Voice Assistant with Kotlin</title>
      <dc:creator>vmodal_ai</dc:creator>
      <pubDate>Fri, 25 Sep 2026 20:29:24 +0000</pubDate>
      <link>https://dev.to/vmodal_ai/building-an-ai-robot-voice-assistant-with-kotlin-2g01</link>
      <guid>https://dev.to/vmodal_ai/building-an-ai-robot-voice-assistant-with-kotlin-2g01</guid>
      <description>&lt;h1&gt;
  
  
  Building an AI Robot Voice Assistant with Kotlin
&lt;/h1&gt;

&lt;h2&gt;
  
  
  What You Will Build
&lt;/h2&gt;

&lt;p&gt;In this tutorial, you will build a practical Kotlin/Android component for a robotics or Physical AI system. The design emphasizes asynchronous processing, lifecycle-aware state, real-time data handling, observability, and safe separation between the Android interface and physical robot control.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Android Kotlin + Jetpack Compose
             ↓
       ViewModel / Flow
             ↓
      Repository / API
             ↓
   ROS 2 / Jetson / AI Backend
             ↓
        Robot System
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 1 — Define voice commands
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;data class&lt;/span&gt; &lt;span class="nc"&gt;VoiceCommand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;confidence&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Float&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 2 — Convert speech to text
&lt;/h2&gt;

&lt;p&gt;Use the Android speech-recognition mechanism appropriate for your target devices and permissions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3 — Parse the intent
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;parseCommand&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
    &lt;span class="k"&gt;when&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;contains&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"stop"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ignoreCase&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;"STOP"&lt;/span&gt;
        &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;contains&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"forward"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ignoreCase&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;"FORWARD"&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="s"&gt;"UNKNOWN"&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 4 — Add confirmation
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User: "Move forward"
Assistant: "Move forward at 0.3 m/s?"
User: "Confirm"
Robot: execute
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 5 — Keep safety deterministic
&lt;/h2&gt;

&lt;p&gt;Voice/LLM output should never directly control motors. Convert it into a validated command and apply robot-side safety limits.&lt;/p&gt;

&lt;h2&gt;
  
  
  Performance Checklist
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Keep CPU-heavy work off the main thread.&lt;/li&gt;
&lt;li&gt;Use bounded buffers for high-rate streams.&lt;/li&gt;
&lt;li&gt;Prefer &lt;code&gt;StateFlow&lt;/code&gt; for observable UI state.&lt;/li&gt;
&lt;li&gt;Sample high-frequency telemetry before rendering.&lt;/li&gt;
&lt;li&gt;Measure end-to-end latency instead of only model latency.&lt;/li&gt;
&lt;li&gt;Handle reconnects and stale data explicitly.&lt;/li&gt;
&lt;li&gt;Keep emergency controls independent of high-bandwidth streams.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Testing Checklist
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Test with no network connection.&lt;/li&gt;
&lt;li&gt;Test reconnect and duplicate messages.&lt;/li&gt;
&lt;li&gt;Test high-rate telemetry.&lt;/li&gt;
&lt;li&gt;Test lifecycle cancellation.&lt;/li&gt;
&lt;li&gt;Test low battery and degraded network conditions.&lt;/li&gt;
&lt;li&gt;Test emergency-stop behavior.&lt;/li&gt;
&lt;li&gt;Verify that AI-generated instructions cannot bypass the deterministic safety layer.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The resulting Kotlin layer can be extended with real ROS 2 bridges, NVIDIA Jetson services, computer vision models, smart-glasses SDKs, or multimodal AI backends. Keep hardware-specific code behind interfaces so the Android application remains maintainable as the robotics stack evolves.&lt;/p&gt;

&lt;h2&gt;
  
  
  Useful Links
&lt;/h2&gt;

&lt;p&gt;Website: &lt;a href="http://www.v-modal.com" rel="noopener noreferrer"&gt;www.v-modal.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;SDK Flutter: &lt;a href="https://github.com/v-modal/vmodal_sdk_flutter" rel="noopener noreferrer"&gt;https://github.com/v-modal/vmodal_sdk_flutter&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;SDK Android: &lt;a href="https://github.com/v-modal/vmodal_sdk_android" rel="noopener noreferrer"&gt;https://github.com/v-modal/vmodal_sdk_android&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Discord: &lt;a href="https://discord.gg/K72z28KUx" rel="noopener noreferrer"&gt;https://discord.gg/K72z28KUx&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Reddit: &lt;a href="https://www.reddit.com/r/v_modal/" rel="noopener noreferrer"&gt;https://www.reddit.com/r/v_modal/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>kotlin</category>
      <category>android</category>
      <category>ai</category>
      <category>robotics</category>
    </item>
    <item>
      <title>Kotlin + NVIDIA Jetson Camera Streaming for Robotics</title>
      <dc:creator>vmodal_ai</dc:creator>
      <pubDate>Fri, 25 Sep 2026 20:29:13 +0000</pubDate>
      <link>https://dev.to/vmodal_ai/kotlin-nvidia-jetson-camera-streaming-for-robotics-2mi0</link>
      <guid>https://dev.to/vmodal_ai/kotlin-nvidia-jetson-camera-streaming-for-robotics-2mi0</guid>
      <description>&lt;h1&gt;
  
  
  Kotlin + NVIDIA Jetson Camera Streaming for Robotics
&lt;/h1&gt;

&lt;h2&gt;
  
  
  What You Will Build
&lt;/h2&gt;

&lt;p&gt;In this tutorial, you will build a practical Kotlin/Android component for a robotics or Physical AI system. The design emphasizes asynchronous processing, lifecycle-aware state, real-time data handling, observability, and safe separation between the Android interface and physical robot control.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Android Kotlin + Jetpack Compose
             ↓
       ViewModel / Flow
             ↓
      Repository / API
             ↓
   ROS 2 / Jetson / AI Backend
             ↓
        Robot System
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 1 — Separate control and video channels
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Android Kotlin
   ├── control WebSocket
   └── video transport
             ↓
        NVIDIA Jetson
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Do not send high-bandwidth video through the same queue as emergency control commands.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2 — Define stream state
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;data class&lt;/span&gt; &lt;span class="nc"&gt;VideoState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;connected&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Boolean&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;false&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;fps&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Int&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;latencyMs&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Long&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 3 — Monitor stream health
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="n"&gt;_state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;copy&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;connected&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;fps&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;measuredFps&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;latencyMs&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;measuredLatency&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 4 — Optimize
&lt;/h2&gt;

&lt;p&gt;Use an appropriate low-latency video transport, avoid unnecessary transcoding, and adapt resolution/frame rate to network conditions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5 — Add fallback
&lt;/h2&gt;

&lt;p&gt;When the video stream fails, keep robot telemetry and emergency controls available.&lt;/p&gt;

&lt;h2&gt;
  
  
  Performance Checklist
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Keep CPU-heavy work off the main thread.&lt;/li&gt;
&lt;li&gt;Use bounded buffers for high-rate streams.&lt;/li&gt;
&lt;li&gt;Prefer &lt;code&gt;StateFlow&lt;/code&gt; for observable UI state.&lt;/li&gt;
&lt;li&gt;Sample high-frequency telemetry before rendering.&lt;/li&gt;
&lt;li&gt;Measure end-to-end latency instead of only model latency.&lt;/li&gt;
&lt;li&gt;Handle reconnects and stale data explicitly.&lt;/li&gt;
&lt;li&gt;Keep emergency controls independent of high-bandwidth streams.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Testing Checklist
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Test with no network connection.&lt;/li&gt;
&lt;li&gt;Test reconnect and duplicate messages.&lt;/li&gt;
&lt;li&gt;Test high-rate telemetry.&lt;/li&gt;
&lt;li&gt;Test lifecycle cancellation.&lt;/li&gt;
&lt;li&gt;Test low battery and degraded network conditions.&lt;/li&gt;
&lt;li&gt;Test emergency-stop behavior.&lt;/li&gt;
&lt;li&gt;Verify that AI-generated instructions cannot bypass the deterministic safety layer.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The resulting Kotlin layer can be extended with real ROS 2 bridges, NVIDIA Jetson services, computer vision models, smart-glasses SDKs, or multimodal AI backends. Keep hardware-specific code behind interfaces so the Android application remains maintainable as the robotics stack evolves.&lt;/p&gt;

&lt;h2&gt;
  
  
  Useful Links
&lt;/h2&gt;

&lt;p&gt;Website: &lt;a href="http://www.v-modal.com" rel="noopener noreferrer"&gt;www.v-modal.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;SDK Flutter: &lt;a href="https://github.com/v-modal/vmodal_sdk_flutter" rel="noopener noreferrer"&gt;https://github.com/v-modal/vmodal_sdk_flutter&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;SDK Android: &lt;a href="https://github.com/v-modal/vmodal_sdk_android" rel="noopener noreferrer"&gt;https://github.com/v-modal/vmodal_sdk_android&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Discord: &lt;a href="https://discord.gg/K72z28KUx" rel="noopener noreferrer"&gt;https://discord.gg/K72z28KUx&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Reddit: &lt;a href="https://www.reddit.com/r/v_modal/" rel="noopener noreferrer"&gt;https://www.reddit.com/r/v_modal/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>kotlin</category>
      <category>android</category>
      <category>nvidia</category>
      <category>robotics</category>
    </item>
    <item>
      <title>Kotlin + WebSocket for NVIDIA Jetson Robot Telemetry</title>
      <dc:creator>vmodal_ai</dc:creator>
      <pubDate>Fri, 25 Sep 2026 20:28:16 +0000</pubDate>
      <link>https://dev.to/vmodal_ai/kotlin-websocket-for-nvidia-jetson-robot-telemetry-458i</link>
      <guid>https://dev.to/vmodal_ai/kotlin-websocket-for-nvidia-jetson-robot-telemetry-458i</guid>
      <description>&lt;h1&gt;
  
  
  Kotlin + WebSocket for NVIDIA Jetson Robot Telemetry
&lt;/h1&gt;

&lt;h2&gt;
  
  
  What You Will Build
&lt;/h2&gt;

&lt;p&gt;In this tutorial, you will build a practical Kotlin/Android component for a robotics or Physical AI system. The design emphasizes asynchronous processing, lifecycle-aware state, real-time data handling, observability, and safe separation between the Android interface and physical robot control.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Android Kotlin + Jetpack Compose
             ↓
       ViewModel / Flow
             ↓
      Repository / API
             ↓
   ROS 2 / Jetson / AI Backend
             ↓
        Robot System
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 1 — Define telemetry
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Serializable&lt;/span&gt;
&lt;span class="kd"&gt;data class&lt;/span&gt; &lt;span class="nc"&gt;JetsonTelemetry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;cpu&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Float&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;gpu&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Float&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;temperature&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Float&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;battery&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Float&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 2 — Create a WebSocket repository
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TelemetryRepository&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;RobotSocket&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;telemetry&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="nc"&gt;Flow&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;JetsonTelemetry&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
        &lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;messages&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
            &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nc"&gt;Json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;decodeFromString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 3 — Expose StateFlow
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;telemetry&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;repository&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;telemetry&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stateIn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;viewModelScope&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="nc"&gt;SharingStarted&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;WhileSubscribed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5_000&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
        &lt;span class="nc"&gt;JetsonTelemetry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;0f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mf"&gt;0f&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 4 — Display metrics
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"GPU: ${state.gpu}%"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"CPU: ${state.cpu}%"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Temperature: ${state.temperature}°C"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 5 — Reconnect safely
&lt;/h2&gt;

&lt;p&gt;Use bounded retry delays and stop retrying when the ViewModel is destroyed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Performance Checklist
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Keep CPU-heavy work off the main thread.&lt;/li&gt;
&lt;li&gt;Use bounded buffers for high-rate streams.&lt;/li&gt;
&lt;li&gt;Prefer &lt;code&gt;StateFlow&lt;/code&gt; for observable UI state.&lt;/li&gt;
&lt;li&gt;Sample high-frequency telemetry before rendering.&lt;/li&gt;
&lt;li&gt;Measure end-to-end latency instead of only model latency.&lt;/li&gt;
&lt;li&gt;Handle reconnects and stale data explicitly.&lt;/li&gt;
&lt;li&gt;Keep emergency controls independent of high-bandwidth streams.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Testing Checklist
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Test with no network connection.&lt;/li&gt;
&lt;li&gt;Test reconnect and duplicate messages.&lt;/li&gt;
&lt;li&gt;Test high-rate telemetry.&lt;/li&gt;
&lt;li&gt;Test lifecycle cancellation.&lt;/li&gt;
&lt;li&gt;Test low battery and degraded network conditions.&lt;/li&gt;
&lt;li&gt;Test emergency-stop behavior.&lt;/li&gt;
&lt;li&gt;Verify that AI-generated instructions cannot bypass the deterministic safety layer.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The resulting Kotlin layer can be extended with real ROS 2 bridges, NVIDIA Jetson services, computer vision models, smart-glasses SDKs, or multimodal AI backends. Keep hardware-specific code behind interfaces so the Android application remains maintainable as the robotics stack evolves.&lt;/p&gt;

&lt;h2&gt;
  
  
  Useful Links
&lt;/h2&gt;

&lt;p&gt;Website: &lt;a href="http://www.v-modal.com" rel="noopener noreferrer"&gt;www.v-modal.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;SDK Flutter: &lt;a href="https://github.com/v-modal/vmodal_sdk_flutter" rel="noopener noreferrer"&gt;https://github.com/v-modal/vmodal_sdk_flutter&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;SDK Android: &lt;a href="https://github.com/v-modal/vmodal_sdk_android" rel="noopener noreferrer"&gt;https://github.com/v-modal/vmodal_sdk_android&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Discord: &lt;a href="https://discord.gg/K72z28KUx" rel="noopener noreferrer"&gt;https://discord.gg/K72z28KUx&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Reddit: &lt;a href="https://www.reddit.com/r/v_modal/" rel="noopener noreferrer"&gt;https://www.reddit.com/r/v_modal/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>kotlin</category>
      <category>android</category>
      <category>nvidia</category>
      <category>robotics</category>
    </item>
    <item>
      <title>Kotlin + MQTT for Real-Time Robot Fleet Management</title>
      <dc:creator>vmodal_ai</dc:creator>
      <pubDate>Fri, 25 Sep 2026 20:28:03 +0000</pubDate>
      <link>https://dev.to/vmodal_ai/kotlin-mqtt-for-real-time-robot-fleet-management-1iaf</link>
      <guid>https://dev.to/vmodal_ai/kotlin-mqtt-for-real-time-robot-fleet-management-1iaf</guid>
      <description>&lt;h1&gt;
  
  
  Kotlin + MQTT for Real-Time Robot Fleet Management
&lt;/h1&gt;

&lt;h2&gt;
  
  
  What You Will Build
&lt;/h2&gt;

&lt;p&gt;In this tutorial, you will build a practical Kotlin/Android component for a robotics or Physical AI system. The design emphasizes asynchronous processing, lifecycle-aware state, real-time data handling, observability, and safe separation between the Android interface and physical robot control.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Android Kotlin + Jetpack Compose
             ↓
       ViewModel / Flow
             ↓
      Repository / API
             ↓
   ROS 2 / Jetson / AI Backend
             ↓
        Robot System
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 1 — Define fleet telemetry
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="nd"&gt;@Serializable&lt;/span&gt;
&lt;span class="kd"&gt;data class&lt;/span&gt; &lt;span class="nc"&gt;RobotTelemetry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;robotId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;battery&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Float&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;status&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 2 — Connect with MQTT
&lt;/h2&gt;

&lt;p&gt;Use an MQTT client supported by your Android project and configure TLS authentication for production.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;onTelemetry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;telemetry&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
        &lt;span class="nc"&gt;Json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;decodeFromString&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;RobotTelemetry&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;payload&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 3 — Maintain fleet state
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;_robots&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt;
    &lt;span class="nc"&gt;MutableStateFlow&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Map&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;RobotTelemetry&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;gt;(&lt;/span&gt;&lt;span class="nf"&gt;emptyMap&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 4 — Update one robot
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="n"&gt;_robots&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;current&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt;
    &lt;span class="n"&gt;current&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;telemetry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;robotId&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;telemetry&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 5 — Display the fleet
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="nc"&gt;LazyColumn&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nf"&gt;items&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;robots&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toList&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"${it.robotId}: ${it.status}"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 6 — Handle offline robots
&lt;/h2&gt;

&lt;p&gt;Record the last-seen timestamp and visually distinguish stale telemetry from live data.&lt;/p&gt;

&lt;h2&gt;
  
  
  Performance Checklist
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Keep CPU-heavy work off the main thread.&lt;/li&gt;
&lt;li&gt;Use bounded buffers for high-rate streams.&lt;/li&gt;
&lt;li&gt;Prefer &lt;code&gt;StateFlow&lt;/code&gt; for observable UI state.&lt;/li&gt;
&lt;li&gt;Sample high-frequency telemetry before rendering.&lt;/li&gt;
&lt;li&gt;Measure end-to-end latency instead of only model latency.&lt;/li&gt;
&lt;li&gt;Handle reconnects and stale data explicitly.&lt;/li&gt;
&lt;li&gt;Keep emergency controls independent of high-bandwidth streams.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Testing Checklist
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Test with no network connection.&lt;/li&gt;
&lt;li&gt;Test reconnect and duplicate messages.&lt;/li&gt;
&lt;li&gt;Test high-rate telemetry.&lt;/li&gt;
&lt;li&gt;Test lifecycle cancellation.&lt;/li&gt;
&lt;li&gt;Test low battery and degraded network conditions.&lt;/li&gt;
&lt;li&gt;Test emergency-stop behavior.&lt;/li&gt;
&lt;li&gt;Verify that AI-generated instructions cannot bypass the deterministic safety layer.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The resulting Kotlin layer can be extended with real ROS 2 bridges, NVIDIA Jetson services, computer vision models, smart-glasses SDKs, or multimodal AI backends. Keep hardware-specific code behind interfaces so the Android application remains maintainable as the robotics stack evolves.&lt;/p&gt;

&lt;h2&gt;
  
  
  Useful Links
&lt;/h2&gt;

&lt;p&gt;Website: &lt;a href="http://www.v-modal.com" rel="noopener noreferrer"&gt;www.v-modal.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;SDK Flutter: &lt;a href="https://github.com/v-modal/vmodal_sdk_flutter" rel="noopener noreferrer"&gt;https://github.com/v-modal/vmodal_sdk_flutter&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;SDK Android: &lt;a href="https://github.com/v-modal/vmodal_sdk_android" rel="noopener noreferrer"&gt;https://github.com/v-modal/vmodal_sdk_android&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Discord: &lt;a href="https://discord.gg/K72z28KUx" rel="noopener noreferrer"&gt;https://discord.gg/K72z28KUx&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Reddit: &lt;a href="https://www.reddit.com/r/v_modal/" rel="noopener noreferrer"&gt;https://www.reddit.com/r/v_modal/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>kotlin</category>
      <category>android</category>
      <category>mqtt</category>
      <category>robotics</category>
    </item>
    <item>
      <title>Building a Kotlin Android Camera Viewer for ROS 2 Robots</title>
      <dc:creator>vmodal_ai</dc:creator>
      <pubDate>Fri, 25 Sep 2026 20:28:02 +0000</pubDate>
      <link>https://dev.to/vmodal_ai/building-a-kotlin-android-camera-viewer-for-ros-2-robots-4h05</link>
      <guid>https://dev.to/vmodal_ai/building-a-kotlin-android-camera-viewer-for-ros-2-robots-4h05</guid>
      <description>&lt;h1&gt;
  
  
  Building a Kotlin Android Camera Viewer for ROS 2 Robots
&lt;/h1&gt;

&lt;h2&gt;
  
  
  What You Will Build
&lt;/h2&gt;

&lt;p&gt;In this tutorial, you will build a practical Kotlin/Android component for a robotics or Physical AI system. The design emphasizes asynchronous processing, lifecycle-aware state, real-time data handling, observability, and safe separation between the Android interface and physical robot control.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Android Kotlin + Jetpack Compose
             ↓
       ViewModel / Flow
             ↓
      Repository / API
             ↓
   ROS 2 / Jetson / AI Backend
             ↓
        Robot System
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 1 — Define camera frames
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;data class&lt;/span&gt; &lt;span class="nc"&gt;RobotFrame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;ByteArray&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Long&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 2 — Create a bounded stream
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;frames&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Channel&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;RobotFrame&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;
    &lt;span class="n"&gt;capacity&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;onBufferOverflow&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;BufferOverflow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;DROP_OLDEST&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 3 — Receive frames
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;onFrame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;ByteArray&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;frames&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;trySend&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nc"&gt;RobotFrame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;currentTimeMillis&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 4 — Process asynchronously
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="n"&gt;viewModelScope&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;launch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Dispatchers&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Default&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frame&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;frames&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;processFrame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;frame&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 5 — Display the stream
&lt;/h2&gt;

&lt;p&gt;Use an Android-compatible video/image rendering component appropriate to the transport. Keep decoding away from the main thread.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 6 — Measure latency
&lt;/h2&gt;

&lt;p&gt;Track capture, network receive, decode, and display timestamps independently.&lt;/p&gt;

&lt;h2&gt;
  
  
  Performance Checklist
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Keep CPU-heavy work off the main thread.&lt;/li&gt;
&lt;li&gt;Use bounded buffers for high-rate streams.&lt;/li&gt;
&lt;li&gt;Prefer &lt;code&gt;StateFlow&lt;/code&gt; for observable UI state.&lt;/li&gt;
&lt;li&gt;Sample high-frequency telemetry before rendering.&lt;/li&gt;
&lt;li&gt;Measure end-to-end latency instead of only model latency.&lt;/li&gt;
&lt;li&gt;Handle reconnects and stale data explicitly.&lt;/li&gt;
&lt;li&gt;Keep emergency controls independent of high-bandwidth streams.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Testing Checklist
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Test with no network connection.&lt;/li&gt;
&lt;li&gt;Test reconnect and duplicate messages.&lt;/li&gt;
&lt;li&gt;Test high-rate telemetry.&lt;/li&gt;
&lt;li&gt;Test lifecycle cancellation.&lt;/li&gt;
&lt;li&gt;Test low battery and degraded network conditions.&lt;/li&gt;
&lt;li&gt;Test emergency-stop behavior.&lt;/li&gt;
&lt;li&gt;Verify that AI-generated instructions cannot bypass the deterministic safety layer.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The resulting Kotlin layer can be extended with real ROS 2 bridges, NVIDIA Jetson services, computer vision models, smart-glasses SDKs, or multimodal AI backends. Keep hardware-specific code behind interfaces so the Android application remains maintainable as the robotics stack evolves.&lt;/p&gt;

&lt;h2&gt;
  
  
  Useful Links
&lt;/h2&gt;

&lt;p&gt;Website: &lt;a href="http://www.v-modal.com" rel="noopener noreferrer"&gt;www.v-modal.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;SDK Flutter: &lt;a href="https://github.com/v-modal/vmodal_sdk_flutter" rel="noopener noreferrer"&gt;https://github.com/v-modal/vmodal_sdk_flutter&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;SDK Android: &lt;a href="https://github.com/v-modal/vmodal_sdk_android" rel="noopener noreferrer"&gt;https://github.com/v-modal/vmodal_sdk_android&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Discord: &lt;a href="https://discord.gg/K72z28KUx" rel="noopener noreferrer"&gt;https://discord.gg/K72z28KUx&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Reddit: &lt;a href="https://www.reddit.com/r/v_modal/" rel="noopener noreferrer"&gt;https://www.reddit.com/r/v_modal/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>kotlin</category>
      <category>android</category>
      <category>ros2</category>
      <category>robotics</category>
    </item>
    <item>
      <title>Building a ROS 2 Robot Map Viewer with Kotlin</title>
      <dc:creator>vmodal_ai</dc:creator>
      <pubDate>Fri, 25 Sep 2026 20:26:41 +0000</pubDate>
      <link>https://dev.to/vmodal_ai/building-a-ros-2-robot-map-viewer-with-kotlin-59cl</link>
      <guid>https://dev.to/vmodal_ai/building-a-ros-2-robot-map-viewer-with-kotlin-59cl</guid>
      <description>&lt;h1&gt;
  
  
  Building a ROS 2 Robot Map Viewer with Kotlin
&lt;/h1&gt;

&lt;h2&gt;
  
  
  What You Will Build
&lt;/h2&gt;

&lt;p&gt;In this tutorial, you will build a practical Kotlin/Android component for a robotics or Physical AI system. The design emphasizes asynchronous processing, lifecycle-aware state, real-time data handling, observability, and safe separation between the Android interface and physical robot control.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Android Kotlin + Jetpack Compose
             ↓
       ViewModel / Flow
             ↓
      Repository / API
             ↓
   ROS 2 / Jetson / AI Backend
             ↓
        Robot System
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 1 — Define map data
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;data class&lt;/span&gt; &lt;span class="nc"&gt;MapPoint&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Float&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Float&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 2 — Receive map updates
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;mapFlow&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Flow&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;MapPoint&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;rosBridge&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;mapFlow&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 3 — Collect lifecycle-safely
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;points&lt;/span&gt; &lt;span class="k"&gt;by&lt;/span&gt; &lt;span class="n"&gt;mapFlow&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;collectAsStateWithLifecycle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;emptyList&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 4 — Render the map
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="nc"&gt;Canvas&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;Modifier&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fillMaxSize&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;points&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;forEach&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nf"&gt;drawCircle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
            &lt;span class="n"&gt;radius&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mf"&gt;2f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
            &lt;span class="n"&gt;center&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Offset&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 5 — Optimize rendering
&lt;/h2&gt;

&lt;p&gt;Do not redraw the entire map for every unrelated UI state change. Sample high-frequency updates and keep coordinate transformations outside expensive composables where possible.&lt;/p&gt;

&lt;h2&gt;
  
  
  Performance Checklist
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Keep CPU-heavy work off the main thread.&lt;/li&gt;
&lt;li&gt;Use bounded buffers for high-rate streams.&lt;/li&gt;
&lt;li&gt;Prefer &lt;code&gt;StateFlow&lt;/code&gt; for observable UI state.&lt;/li&gt;
&lt;li&gt;Sample high-frequency telemetry before rendering.&lt;/li&gt;
&lt;li&gt;Measure end-to-end latency instead of only model latency.&lt;/li&gt;
&lt;li&gt;Handle reconnects and stale data explicitly.&lt;/li&gt;
&lt;li&gt;Keep emergency controls independent of high-bandwidth streams.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Testing Checklist
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Test with no network connection.&lt;/li&gt;
&lt;li&gt;Test reconnect and duplicate messages.&lt;/li&gt;
&lt;li&gt;Test high-rate telemetry.&lt;/li&gt;
&lt;li&gt;Test lifecycle cancellation.&lt;/li&gt;
&lt;li&gt;Test low battery and degraded network conditions.&lt;/li&gt;
&lt;li&gt;Test emergency-stop behavior.&lt;/li&gt;
&lt;li&gt;Verify that AI-generated instructions cannot bypass the deterministic safety layer.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;The resulting Kotlin layer can be extended with real ROS 2 bridges, NVIDIA Jetson services, computer vision models, smart-glasses SDKs, or multimodal AI backends. Keep hardware-specific code behind interfaces so the Android application remains maintainable as the robotics stack evolves.&lt;/p&gt;

&lt;h2&gt;
  
  
  Useful Links
&lt;/h2&gt;

&lt;p&gt;Website: &lt;a href="http://www.v-modal.com" rel="noopener noreferrer"&gt;www.v-modal.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;SDK Flutter: &lt;a href="https://github.com/v-modal/vmodal_sdk_flutter" rel="noopener noreferrer"&gt;https://github.com/v-modal/vmodal_sdk_flutter&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;SDK Android: &lt;a href="https://github.com/v-modal/vmodal_sdk_android" rel="noopener noreferrer"&gt;https://github.com/v-modal/vmodal_sdk_android&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Discord: &lt;a href="https://discord.gg/K72z28KUx" rel="noopener noreferrer"&gt;https://discord.gg/K72z28KUx&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Reddit: &lt;a href="https://www.reddit.com/r/v_modal/" rel="noopener noreferrer"&gt;https://www.reddit.com/r/v_modal/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>kotlin</category>
      <category>android</category>
      <category>ros2</category>
      <category>robotics</category>
    </item>
  </channel>
</rss>
