<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://myzhar.tech/feed.xml" rel="self" type="application/atom+xml" /><link href="https://myzhar.tech/" rel="alternate" type="text/html" /><updated>2026-06-09T13:10:23+02:00</updated><id>https://myzhar.tech/feed.xml</id><title type="html">Myzhar &amp;amp; MyzharBot — Robotics, Vision &amp;amp; AI</title><subtitle>Insights, projects, and stories about seeing, thinking, and moving machines.</subtitle><author><name>Walter Lucetti</name></author><entry><title type="html">OpenCV 5 is Finally Here!</title><link href="https://myzhar.tech/posts/opencv5-released/" rel="alternate" type="text/html" title="OpenCV 5 is Finally Here!" /><published>2026-06-08T23:00:00+02:00</published><updated>2026-06-08T23:00:00+02:00</updated><id>https://myzhar.tech/posts/opencv5-released</id><content type="html" xml:base="https://myzhar.tech/posts/opencv5-released/"><![CDATA[<p>It’s out! <strong>OpenCV 5</strong> has officially been released, and honestly, this one feels like a bigger deal than most people might realize at first glance.</p>

<figure class="" style="max-width: 400px; margin: 0 auto;"><a href="/assets/images/opencv5/opencv5-release.jpg" class="image-popup"><img src="/assets/images/opencv5/opencv5-release.jpg" alt="OpenCV 5 Release" /></a></figure>

<p>I have a special relationship with this library. I started using OpenCV back in the early 2000s, during its <strong>beta versions</strong>, when the API was pure C and the documentation was sparse. I picked it up while writing my <a href="https://etd.adm.unipi.it/t/etd-11152004-085347/" target="_blank"><strong>laurea degree thesis</strong></a>, and it immediately became the tool I relied on for everything vision-related. Over the following years, I watched it evolve from that original C interface, through the C++ rewrite that made it actually pleasant to use, through the Python bindings that brought it to an entirely new audience, and through the deep learning integration in the 4.x era. It’s a library I’ve grown up with professionally, and every major release carries a bit of that history.</p>

<figure class="" style="max-width: 200px; margin: 0 auto;"><a href="/assets/images/opencv5/walter-gary_bradsky.jpg" class="image-popup" title="Me with Gary Bradski, the father of OpenCV, at GTC 2015 in San Jose.
"><img src="/assets/images/opencv5/walter-gary_bradsky.jpg" alt="Walter Lucetti with Gary Bradski at GTC 2015, San Jose" /></a><figcaption>
      Me with <a href="https://en.wikipedia.org/wiki/Gary_Bradski">Gary Bradski</a>, the father of OpenCV, at GTC 2015 in San Jose.

    </figcaption></figure>

<p>So yes, this announcement landed differently for me than just another library update. OpenCV is one of those tools you just take for granted; it’s been the backbone of computer vision projects for over two decades, and this major version bump is the largest leap the project has taken in a long time.</p>

<p>The official launch happened at <strong><a href="https://cvpr.thecvf.com/Conferences/2026" target="_blank">CVPR 2026 in Denver</a></strong> on June 4th, with the pip package following on June 8th. And honestly, coming just two weeks after <a href="/posts/ros2-lyrical-luth-released/">ROS 2 Lyrical Luth</a>, this is shaping up to be quite a season for open-source robotics and computer vision. Two major releases in less than a month; I’ll happily take it.</p>

<p>Given how important OpenCV is to me, I read through the full announcement pretty carefully, and there’s a lot to unpack.</p>

<h2 id="the-dnn-engine-rewrite-the-headline-feature">The DNN engine rewrite: the headline feature</h2>

<p>If there is one thing that defines this release, it’s the <strong>complete redesign of the deep learning inference engine</strong>. The old DNN module in OpenCV 4.x was functional but limited; ONNX operator coverage sat at around <strong>22%</strong>, which meant you constantly ran into missing ops when trying to load modern models. OpenCV 5 brings that number to <strong>80%+</strong>. That is not an incremental improvement; that is a fundamental change in what you can actually run with OpenCV out of the box.</p>

<figure class="" style="max-width: 400px; margin: 0 auto;"><a href="/assets/images/opencv5/opencv5-onnx-coverage.jpg" class="image-popup" title="ONNX operator coverage: ~22% in OpenCV 4.x vs. more than 80% in OpenCV 5.
"><img src="/assets/images/opencv5/opencv5-onnx-coverage.jpg" alt="ONNX operator coverage comparison: ~22% in OpenCV 4.x vs &gt;80% in OpenCV 5" /></a><figcaption>
      ONNX operator coverage: ~22% in OpenCV 4.x vs. more than 80% in OpenCV 5.

    </figcaption></figure>

<p>The new engine is graph-based, with proper shape inference, constant folding, dynamic shape support, and even control flow through If/Loop subgraphs. It also handles quantized models natively and includes attention fusion using <a href="https://github.com/Dao-AILab/flash-attention" target="_blank">FlashAttention</a>-style optimizations. This is a serious piece of engineering.</p>

<h3 id="three-engines-for-a-smooth-transition">Three engines for a smooth transition</h3>

<p>One of the smartest decisions the team made was keeping backward compatibility through a three-tier engine selection model, exposed via the <code class="language-plaintext highlighter-rouge">EngineType</code> enum:</p>

<p><code class="language-plaintext highlighter-rouge">ENGINE_CLASSIC</code> is the original 4.x engine, preserved for non-CPU backend support. <code class="language-plaintext highlighter-rouge">ENGINE_NEW</code> is the new graph-based engine, currently CPU-only. <code class="language-plaintext highlighter-rouge">ENGINE_AUTO</code> is the default: it tries the new engine first and falls back to classic when needed. There’s also <code class="language-plaintext highlighter-rouge">ENGINE_ORT</code>, an optional wrapper around <a href="https://onnxruntime.ai" target="_blank">ONNX Runtime</a> for cases where you want to delegate to that backend explicitly.</p>

<p>This is a thoughtful migration path. You get the new engine’s benefits immediately for supported models, and nothing breaks for everything else. I can already imagine how many CI pipelines would have exploded otherwise.</p>

<h3 id="llm-and-vlm-support-natively">LLM and VLM support, natively</h3>

<p>This one genuinely surprised me. OpenCV 5 can now run <strong>large language models and vision-language models</strong> natively, with a built-in tokenizer (no external dependency), KV-cache for autoregressive decoding, and support for <a href="https://github.com/QwenLM/Qwen2.5" target="_blank">Qwen 2.5</a>, <a href="https://ai.google.dev/gemma" target="_blank">Gemma 3</a>, <a href="https://ai.google.dev/gemma/docs/paligemma" target="_blank">PaliGemma</a>, and the <a href="https://openai.com" target="_blank">GPT</a> family. The team reports token-for-token accuracy matching ONNX Runtime. Running a VLM from OpenCV directly is not something I expected to see in 2026, but here we are.</p>

<figure class="" style="max-width: 400px; margin: 0 auto;"><a href="/assets/images/opencv5/opencv5-llm-output.jpg" class="image-popup" title="Qwen 2.5 running natively via OpenCV DNN; output matches ONNX Runtime token for token on the same prompt.
"><img src="/assets/images/opencv5/opencv5-llm-output.jpg" alt="Qwen 2.5 running via OpenCV DNN, output matching ONNX Runtime token for token" /></a><figcaption>
      Qwen 2.5 running natively via OpenCV DNN; output matches ONNX Runtime token for token on the same prompt.

    </figcaption></figure>

<h3 id="performance-numbers">Performance numbers</h3>

<p>The team benchmarked the new engine against ONNX Runtime on an Intel Core i9-14900KS, and the results are worth quoting: <a href="https://github.com/verlab/accelerated_features" target="_blank">XFeat</a> is <strong>31.25% faster</strong>, <a href="https://github.com/ultralytics/ultralytics" target="_blank">YOLOv8n</a> is <strong>11.5% faster</strong>, <a href="https://huggingface.co/google/owlv2-base-patch16" target="_blank">OWLv2</a> is <strong>36.6% faster</strong>, and <a href="https://github.com/ZhengPeng7/BiRefNet" target="_blank">BiRefNet</a> is <strong>32.4% faster</strong>. These are real workloads, not toy benchmarks.</p>

<figure class="" style="max-width: 400px; margin: 0 auto;"><a href="/assets/images/opencv5/opencv5-benchmarks.png" class="image-popup" title="CPU inference latency across lightweight, mid-weight, and heavy models. OpenCV 5 DNN vs. ONNX Runtime; lower is better.
"><img src="/assets/images/opencv5/opencv5-benchmarks.png" alt="CPU inference latency benchmark: OpenCV 5 DNN vs ONNX Runtime across lightweight, mid-weight, and heavy models" /></a><figcaption>
      CPU inference latency across lightweight, mid-weight, and heavy models. OpenCV 5 DNN vs. ONNX Runtime; lower is better.

    </figcaption></figure>

<h2 id="new-data-types-and-core-improvements">New data types and core improvements</h2>

<p>OpenCV 5 adds <strong>native FP16 (<code class="language-plaintext highlighter-rouge">cv::hfloat</code>) and BF16 (<code class="language-plaintext highlighter-rouge">cv::bfloat</code>) support</strong>, which is long overdue. Working with neural network outputs in deep learning pipelines has always required manual conversion steps; having these types first-class in <code class="language-plaintext highlighter-rouge">cv::Mat</code> makes the whole thing significantly cleaner.</p>

<p>There’s also support for <strong>0D (scalar) and 1D tensor</strong> representations, proper broadcasting operations, and new 64-bit integer and boolean types. The library is finally catching up to how modern ML frameworks represent data, which matters a lot when you’re gluing OpenCV preprocessing together with <a href="https://pytorch.org" target="_blank">PyTorch</a> or ONNX models.</p>

<p>On raw performance: the team reports <strong>up to 2x improvements</strong> on mathematical workloads and <strong>3 to 4x speedups</strong> on ARM for operations like resizing and warping. The Universal Intrinsics layer has been updated to v2.0 with support for SSE, AVX2/512, NEON, SVE, and RISC-V Vector. This is great news for anyone running embedded vision on ARM boards.</p>

<h2 id="hardware-acceleration-layer-hal">Hardware Acceleration Layer (HAL)</h2>

<p>This is a feature that I think will have a big long-term impact: OpenCV 5 introduces an automatic dispatch mechanism to <strong>vendor-optimized kernels</strong> through a Hardware Acceleration Layer. Currently supported backends include <a href="https://www.intel.com/content/www/us/en/developer/tools/oneapi/ipp.html" target="_blank">Intel IPP</a> (IPPICV) for x86/x64 with SSE/AVX, <a href="https://gitlab.arm.com/kleidi/kleidicv" target="_blank">Arm KleidiCV</a> for AArch64, <a href="https://developer.qualcomm.com/software/fastcv-sdk" target="_blank">Qualcomm FastCV</a> for Snapdragon/Hexagon DSP, and <a href="https://github.com/riscv/riscv-v-spec" target="_blank">RISC-V Vector</a> extensions. The dispatch is automatic; the same OpenCV code just runs faster on each platform.</p>

<p>For robotics and edge deployments, this is a big deal. You write once and the library adapts to the hardware underneath without any extra configuration.</p>

<figure class="" style="max-width: 400px; margin: 0 auto;"><a href="/assets/images/opencv5/opencv5-hal-diagram.jpg" class="image-popup" title="The HAL transparently dispatches the same OpenCV code to the best available backend, whether CPU, GPU, or NPU.
"><img src="/assets/images/opencv5/opencv5-hal-diagram.jpg" alt="HAL architecture diagram: OpenCV code dispatched transparently to CPU, GPU, or NPU" /></a><figcaption>
      The HAL transparently dispatches the same OpenCV code to the best available backend, whether CPU, GPU, or NPU.

    </figcaption></figure>

<h2 id="3d-vision-a-long-overdue-reorganization">3D vision: a long-overdue reorganization</h2>

<p>This section is personally very relevant to my work. The <code class="language-plaintext highlighter-rouge">calib3d</code> module, which had grown into a bloated catch-all over the years, has been split into three focused modules:</p>

<p><strong><code class="language-plaintext highlighter-rouge">3d</code></strong> covers geometry, I/O, ICP, and SLAM components. <strong><code class="language-plaintext highlighter-rouge">calib</code></strong> handles single and multi-camera calibration, including hand-eye and robot-world calibration. <strong><code class="language-plaintext highlighter-rouge">stereo</code></strong> covers depth estimation from stereo pairs.</p>

<p>The new <code class="language-plaintext highlighter-rouge">calibrateMultiview</code> API for multi-camera setups, point cloud and mesh I/O for OBJ and PLY formats, dense RGB-D fusion with TSDF, HashTSDF, and ColorTSDF, and the USAC framework with MAGSAC robust estimation are all welcome additions. At Stereolabs, we deal with 3D reconstruction and depth pipelines every day; a well-structured API for these building blocks makes a real difference.</p>

<h2 id="features-module-deep-learning-meets-classic-detectors">Features module: deep learning meets classic detectors</h2>

<p>The <code class="language-plaintext highlighter-rouge">features2d</code> module has been replaced by a new <strong><code class="language-plaintext highlighter-rouge">features</code></strong> module that brings deep learning-based detection and matching alongside the classic detectors we know and love.</p>

<p>New additions include <strong><a href="https://github.com/Shiaoming/ALIKED" target="_blank">ALIKED</a></strong> (a CNN-based keypoint detector and descriptor), <strong><a href="https://github.com/cvlab-epfl/disk" target="_blank">DISK</a></strong> (reinforcement learning features designed for wide-baseline matching), and <strong><a href="https://github.com/cvg/LightGlue" target="_blank">LightGlueMatcher</a></strong> (an attention-based matcher with confidence-scored correspondences). Classic detectors like SIFT, ORB, and FAST are retained for backward compatibility, so nothing breaks if you’re not ready to migrate.</p>

<p>The combination of learned features with the classic OpenCV pipeline architecture is interesting; I’m curious to see how ALIKED and LightGlueMatcher perform on real-world robotics sequences versus standard benchmarks.</p>

<figure class="" style="max-width: 400px; margin: 0 auto;"><a href="/assets/images/opencv5/opencv5-lightglue-matching.jpg" class="image-popup" title="LightGlue adapts computation to scene difficulty: easy pairs stop after 3 layers (16.9ms), hard pairs go deeper (8 layers, 32.3ms).
"><img src="/assets/images/opencv5/opencv5-lightglue-matching.jpg" alt="LightGlue keypoint matching on easy and difficult image pairs with adaptive depth" /></a><figcaption>
      LightGlue adapts computation to scene difficulty: easy pairs stop after 3 layers (16.9ms), hard pairs go deeper (8 layers, 32.3ms).

    </figcaption></figure>

<h2 id="generative-models-in-opencv">Generative models in OpenCV</h2>

<p>I wouldn’t have predicted this one a couple of years ago. OpenCV 5 ships with <strong><a href="https://github.com/advimman/lama" target="_blank">LaMa inpainting</a></strong> for mask-guided object removal and a <strong>diffusion-based inpainting</strong> pipeline as a second option. This feels a bit out of scope for a library historically focused on classical and discriminative vision, but given where the field has gone, I understand the push. It makes OpenCV more self-contained for demo and prototyping use cases.</p>

<figure class="" style="max-width: 400px; margin: 0 auto;"><a href="/assets/images/opencv5/opencv5-lama-inpainting.jpg" class="image-popup" title="LaMa inpainting: the original image, the masked region, and the restored output with the tree seamlessly removed.
"><img src="/assets/images/opencv5/opencv5-lama-inpainting.jpg" alt="LaMa inpainting example: input image, masked region, and clean output" /></a><figcaption>
      LaMa inpainting: the original image, the masked region, and the restored output with the tree seamlessly removed.

    </figcaption></figure>

<h2 id="python-and-c-improvements">Python and C++ improvements</h2>

<p>On the Python side: <strong><a href="https://numpy.org/doc/stable/release/2.0.0-notes.html" target="_blank">NumPy 2.x</a> support</strong> is here at last, named (keyword) arguments work properly for algorithm classes, and the bindings have been modernized throughout. If you’ve spent time fighting NumPy deprecation warnings in OpenCV, this update is for you.</p>

<p>On the C++ side: <strong><a href="https://en.cppreference.com/w/cpp/17" target="_blank">C++17</a> is now the minimum recommended standard</strong>, with <a href="https://en.cppreference.com/w/cpp/20" target="_blank">C++20</a> modules planned for later 5.x releases. The legacy C API (the old <code class="language-plaintext highlighter-rouge">cvXxx</code> function style) is officially deprecated in this release. It’s been a long time coming; the C API has been a maintenance burden and a source of confusion for newcomers for years.</p>

<p>The documentation has also been migrated from <a href="https://www.doxygen.nl" target="_blank">Doxygen</a> to <a href="https://www.sphinx-doc.org" target="_blank">Sphinx</a> + Doxygen, with persistent navigation, hand-written tutorials alongside the API reference, and Python and C++ signatures shown together. A small change in appearance, but a big improvement in day-to-day usability.</p>

<h2 id="whats-coming-next-in-the-5x-cycle">What’s coming next in the 5.x cycle</h2>

<p>The work isn’t done. The team has committed to GPU acceleration for the new DNN engine (<a href="https://developer.nvidia.com/cuda-toolkit" target="_blank">CUDA</a> and <a href="https://developer.nvidia.com/tensorrt" target="_blank">TensorRT</a>), a non-CPU HAL for accelerated pre/post-processing that avoids GPU-to-CPU round trips during inference, and C++20 module support. These are the pieces that will make OpenCV 5 really complete for production deep learning pipelines; right now the new engine is CPU-only, which limits where you’d actually deploy it.</p>

<h2 id="final-thoughts">Final thoughts</h2>

<p>OpenCV 5 is a real release. The DNN engine rewrite alone would justify a major version bump; everything else on top, the HAL, the 3D reorganization, the new data types, and the Python modernization, makes this feel like the library catching up to where the field has been for the past few years. The ~1 million daily installs figure and <a href="https://github.com/opencv/opencv" target="_blank">86,000+ GitHub stars</a> show how many projects still depend on it; this update will have a wide impact.</p>

<p>If you’re maintaining a computer vision pipeline that uses OpenCV’s DNN module, this is the time to start testing. The <code class="language-plaintext highlighter-rouge">ENGINE_AUTO</code> default means migration should be smooth for most cases, but it’s worth validating explicitly rather than assuming. The <a href="https://docs.opencv.org/5.0/" target="_blank">full OpenCV 5.0 documentation</a> is the best place to start.</p>

<p>Happy robotics programming… with vision! 🤖</p>]]></content><author><name>Walter Lucetti</name></author><category term="news" /><category term="computer_vision" /><category term="OpenCV" /><category term="computer_vision" /><category term="deep_learning" /><category term="news" /><category term="release" /><category term="opencv5" /><category term="DNN" /><category term="ONNX" /><summary type="html"><![CDATA[After years of development, OpenCV 5 officially launched at CVPR 2026. A complete DNN engine rewrite, native LLM/VLM support, FP16/BF16 types, HAL hardware acceleration, and a major 3D vision reorganization make this the biggest OpenCV release in years.]]></summary></entry><entry><title type="html">New ROS 2 Tutorial: Lifecycle (Managed) Nodes</title><link href="https://myzhar.tech/posts/ros2-lifecycle-nodes-tutorial/" rel="alternate" type="text/html" title="New ROS 2 Tutorial: Lifecycle (Managed) Nodes" /><published>2026-05-24T23:00:00+02:00</published><updated>2026-05-24T23:00:00+02:00</updated><id>https://myzhar.tech/posts/ros2-lifecycle-nodes-tutorial</id><content type="html" xml:base="https://myzhar.tech/posts/ros2-lifecycle-nodes-tutorial/"><![CDATA[<p>New tutorial out tonight: <strong><a href="/tutorials/ros2/ros2-lifecycle-nodes/">Lifecycle (Managed) Nodes: why, what, and how</a></strong>.</p>

<p>This one has been sitting on my to-do list for a while, and for good reason — lifecycle nodes are one of those topics that you can technically ignore until the day you really need them, at which point you wish someone had forced you to learn them earlier. I’ve been burned enough times by unmanaged hardware drivers doing the wrong thing at startup that I felt it was time to write this properly.</p>

<p>The tutorial covers the full lifecycle state machine from first principles: the four primary states, the six transition states, all transitions with their success and failure paths, and what actually happens inside each callback. There’s a detailed interactive diagram you can expand to read every state and arrow at full resolution.</p>

<figure class="" style="max-width: 600px; margin: 0 auto;"><a href="/assets/images/tutorials/ros2_lifecycle_nodes/lifecycle-state-machine.svg" class="image-popup" title="The complete ROS 2 lifecycle node state machine. Blue = primary states, amber = transition states, red = error handling state. Green arrows = success, red arrows = failure, dashed orange = error/shutdown paths.
"><img src="/assets/images/tutorials/ros2_lifecycle_nodes/lifecycle-state-machine.svg" alt="ROS 2 Lifecycle Node State Machine diagram showing all states and transitions" /></a><figcaption>
      The complete ROS 2 lifecycle node state machine. Blue = primary states, amber = transition states, red = error handling state. Green arrows = success, red arrows = failure, dashed orange = error/shutdown paths.

    </figcaption></figure>

<p>On the practical side, I use my own <a href="https://myzhar.tech/projects/ros2/ldrobot-lidar-ros2/">ldrobot-lidar-ros2</a> driver as a concrete example of why lifecycle nodes make sense for hardware: being able to stop a LiDAR motor without closing the serial port, or reconfigure the driver without destroying and recreating the node, is exactly the kind of thing that saves you in production.</p>

<p>The tutorial also covers <strong>Nav2’s Lifecycle Manager</strong> and, more importantly, explains why Nav2 introduced its own <code class="language-plaintext highlighter-rouge">nav2_util::LifecycleNode</code> on top of the standard one — the <em>bond</em> mechanism. If you’ve ever had a navigation stack silently fall apart because one node crashed without anyone noticing, bonds are the answer to that.</p>

<p>And yes, there’s a “Test Your Knowledge” section at the end. Seven multiple-choice questions, some with more than one correct answer. I put a particular amount of care into the <code class="language-plaintext highlighter-rouge">on_activate()</code> question — let’s just say it was inspired by personal experience 😅</p>

<p>Happy robotics programming! 🤖</p>]]></content><author><name>Walter Lucetti</name></author><category term="updates" /><category term="website" /><category term="tutorials" /><category term="updates" /><category term="website" /><category term="tutorials" /><category term="ROS" /><category term="ROS_2" /><category term="robotics" /><category term="lifecycle" /><category term="managed_nodes" /><category term="nav2" /><category term="hardware_drivers" /><summary type="html"><![CDATA[A new in-depth tutorial covering the ROS 2 lifecycle state machine, all states and transitions, C++ implementation, Nav2 Lifecycle Manager, and real hardware driver examples.]]></summary></entry><entry><title type="html">Test Your Knowledge - A New Section in the ROS 2 Tutorials</title><link href="https://myzhar.tech/posts/ros2-tutorials-test-your-knowledge/" rel="alternate" type="text/html" title="Test Your Knowledge - A New Section in the ROS 2 Tutorials" /><published>2026-05-23T13:15:00+02:00</published><updated>2026-05-23T13:15:00+02:00</updated><id>https://myzhar.tech/posts/ros2-tutorials-test-your-knowledge</id><content type="html" xml:base="https://myzhar.tech/posts/ros2-tutorials-test-your-knowledge/"><![CDATA[<p>One of the goals I set for the ROS 2 tutorial series was to make each entry genuinely useful for learning, not just a reference to skim and forget. A tutorial that explains concepts clearly should also give you a way to check whether those concepts actually stuck.</p>

<p>That’s why I’ve added a <strong>“Test Your Knowledge”</strong> section at the end of every ROS 2 tutorial.</p>

<h2 id="what-it-looks-like">What it looks like</h2>

<p>Each quiz is a short set of multiple-choice questions covering the key ideas from that tutorial. Questions are deliberately practical, they focus on concepts that tend to trip people up or that matter when you’re working on a real system. You pick an answer, then expand a collapsible panel to see whether you got it right and, more importantly, <strong>why</strong>.</p>

<p>It looks like this:</p>

<blockquote>
  <p><strong>What is the default RMW implementation in ROS 2 Humble?</strong></p>

  <ul>
    <li>a) Cyclone DDS</li>
    <li>b) Fast DDS</li>
    <li>c) RTI Connext</li>
    <li>d) Zenoh</li>
  </ul>

  <details>
<summary>Show correct answer</summary>
<br />
<strong>b) Fast DDS</strong><br />
ROS 2 Humble ships with eProsima Fast DDS as its default RMW implementation.
</details>
</blockquote>

<p>No score, no time limit, just you and the material. If you find yourself unsure about an answer, it’s a good signal to re-read that section of the tutorial before moving on.</p>

<h2 id="where-to-find-it">Where to find it</h2>

<p>The section is already live in every published ROS 2 tutorial:</p>

<ul>
  <li><a href="/tutorials/ros2/understanding-ros2/">Understanding ROS 2</a></li>
  <li><a href="/tutorials/ros2/installing-ros2/">Installing ROS 2</a></li>
  <li><a href="/tutorials/ros2/starting-ros2-nodes/">Starting ROS 2 Nodes</a></li>
  <li><a href="/tutorials/ros2/understanding-ros2-middleware/">Understanding the ROS 2 Communication Middleware</a></li>
  <li><a href="/tutorials/ros2/configure-node-with-parameters/">Configuring a ROS 2 Node Using Parameters</a></li>
  <li><a href="/tutorials/ros2/understanding-ros2-namespace-node-name/">Understanding ROS 2 Node Names and Namespaces</a></li>
  <li><a href="/tutorials/ros2/python-launch-explained/">ROS 2 Python Launch File Explained</a></li>
  <li><a href="/tutorials/ros2/ros2-node-composition-explained/">ROS 2 Node Composition Explained</a></li>
</ul>

<p>Scroll to the bottom of any of these pages to find it.</p>

<h2 id="let-me-know-what-you-think">Let me know what you think</h2>

<p>This is an experiment. I’m genuinely curious whether you find it useful, whether the questions hit the right level, whether they actually help you consolidate what you’ve read, or whether the format could be improved.</p>

<p>If you have feedback, drop me a message at <strong><a href="mailto:info@myzhar.com">info@myzhar.com</a></strong> or reach out via the <a href="/contact/">contact page</a>. I read every message.</p>

<p>Happy robotics programming! 🤖</p>]]></content><author><name>Walter Lucetti</name></author><category term="updates" /><category term="website" /><category term="tutorials" /><category term="updates" /><category term="website" /><category term="tutorials" /><category term="ROS" /><category term="ROS_2" /><category term="robotics" /><category term="learning" /><summary type="html"><![CDATA[All ROS 2 tutorials now include a 'Test Your Knowledge' section with multiple-choice questions so you can verify how well you've understood the material.]]></summary></entry><entry><title type="html">ROS 2 Lyrical Luth is Here!</title><link href="https://myzhar.tech/posts/ros2-lyrical-luth-released/" rel="alternate" type="text/html" title="ROS 2 Lyrical Luth is Here!" /><published>2026-05-22T23:00:00+02:00</published><updated>2026-05-22T23:00:00+02:00</updated><id>https://myzhar.tech/posts/ros2-lyrical-luth-released</id><content type="html" xml:base="https://myzhar.tech/posts/ros2-lyrical-luth-released/"><![CDATA[<p>It’s out! <strong>ROS 2 Lyrical Luth</strong> has officially landed, and I have to say: this is the release I’ve been looking forward to for a while. It’s the twelfth ROS 2 distribution and a brand new <strong>Long-Term Support (LTS)</strong> release, supported until <strong>May 2031</strong>.</p>

<figure class="" style="max-width: 300px; margin: 0 auto;"><a href="/assets/images/ros2/ros2-lyrical-luth-release.jpg" class="image-popup"><img src="/assets/images/ros2/ros2-lyrical-luth-release.jpg" alt="ROS 2 Lyrical Luth" /></a></figure>

<p>It pairs with <strong>Ubuntu 26.04 “Resolute”</strong> as its primary Tier 1 platform, which makes total sense: Lyrical Luth + Ubuntu 26.04 is the LTS-on-LTS combo that most production teams have been waiting for. If you’re still on ROS 2 Humble with Ubuntu 22.04, now is a great time to start planning your migration.</p>

<hr />

<h2 id="whats-new-compared-to-jazzy">What’s new compared to Jazzy?</h2>

<p>Jazzy Jalisco was a good release, but Lyrical Luth brings some things that genuinely excited me when I read the changelog. Let me walk you through what I think is most interesting.</p>

<h3 id="callback-group-events-executor">Callback Group Events Executor</h3>

<p>This one is huge for performance. The new <code class="language-plaintext highlighter-rouge">CallbackGroupEventsExecutor</code> uses <strong>10–15% less CPU</strong> than the classic <code class="language-plaintext highlighter-rouge">SingleThreadedExecutor</code> and <code class="language-plaintext highlighter-rouge">MultiThreadedExecutor</code>. It also comes with proper support for multiple time sources and finer threading control. On nodes with a lot of callbacks, this is a meaningful free win; <strong>you just switch executor type and get better efficiency for nothing</strong>. Can’t wait to try it on my setups!</p>

<h3 id="async-ros-nodes-in-python-asyncnode">Async ROS Nodes in Python (<code class="language-plaintext highlighter-rouge">AsyncNode</code>)</h3>

<p>Finally! <code class="language-plaintext highlighter-rouge">rclpy</code> now has an <code class="language-plaintext highlighter-rouge">AsyncNode</code> base class that integrates ROS callbacks natively with Python’s <code class="language-plaintext highlighter-rouge">asyncio</code> event loop. If you’ve ever wrestled with mixing async code and ROS subscribers, you know how painful that could be. This makes the whole thing much cleaner and more CPU-efficient than the default <code class="language-plaintext highlighter-rouge">SingleThreadedExecutor</code>.</p>

<h3 id="zero-copy-gpu-data-transfer">Zero-Copy GPU Data Transfer</h3>

<p>This is the one I’m personally most excited about. <code class="language-plaintext highlighter-rouge">rosidl::Buffer</code> now lets you publish and subscribe to ROS messages <strong>without copying data between CPU and GPU memory</strong>. The initial support is for <code class="language-plaintext highlighter-rouge">rmw_fastrtps_cpp</code>, but it’s a game changer for any pipeline that touches deep learning or computer vision; the cost of memcpy between GPU frames has always been a silent killer of latency budgets.</p>

<h3 id="parameters-and-configuration">Parameters and configuration</h3>

<ul>
  <li><strong>YAML type annotations</strong>: you can now use <code class="language-plaintext highlighter-rouge">!!str</code>, <code class="language-plaintext highlighter-rouge">!!bool</code>, <code class="language-plaintext highlighter-rouge">!!int</code>, <code class="language-plaintext highlighter-rouge">!!float</code> tags in parameter files to resolve ambiguous type interpretation once and for all</li>
  <li><strong>Parameter range validation</strong> extended to integer and double arrays, not just scalars</li>
  <li>Expanded <code class="language-plaintext highlighter-rouge">ros2 param</code> CLI with batch operations on single nodes</li>
</ul>

<h3 id="launch-file-improvements">Launch file improvements</h3>

<p>A bunch of quality-of-life improvements here that will make launch files nicer to write and maintain:</p>

<ul>
  <li><strong>New substitutions</strong>: <code class="language-plaintext highlighter-rouge">string-join</code> and <code class="language-plaintext highlighter-rouge">path-join</code> for XML/YAML launch files</li>
  <li><strong>Per-message log level control</strong>: granular severity per message directly from the launch file</li>
  <li><strong>Runtime logging backend selection</strong>: via <code class="language-plaintext highlighter-rouge">RCL_LOGGING_IMPLEMENTATION</code> env variable, no rebuild needed</li>
</ul>

<h3 id="bag-recording-enhancements">Bag recording enhancements</h3>

<p>Several additions I’ve wanted for a long time:</p>

<ul>
  <li><strong>Remote control</strong> via ROS service APIs; start/stop/discover bags from anywhere on the network</li>
  <li><strong>Python bag APIs</strong> for programmatic pause, resume, seek, and state queries</li>
  <li><strong>Circular recording</strong> with <code class="language-plaintext highlighter-rouge">--max-bag-files</code> to cap disk usage by auto-deleting the oldest splits</li>
  <li><strong>Descriptive split naming</strong> with counter, prefix, and timestamp built in</li>
  <li><strong>Per-topic message loss statistics</strong> published to <code class="language-plaintext highlighter-rouge">events/rosbag2_messages_lost</code></li>
</ul>

<h3 id="cli-enhancements">CLI enhancements</h3>

<ul>
  <li><strong><code class="language-plaintext highlighter-rouge">ros2 topic bw</code></strong> can now monitor multiple topics at once</li>
  <li><strong><code class="language-plaintext highlighter-rouge">ros2 service info --verbose</code></strong> shows QoS profiles and endpoint details</li>
  <li><strong><code class="language-plaintext highlighter-rouge">ros2 doctor --report</code></strong> expanded to include actions, services, and ROS env variables</li>
  <li><strong>Fish shell</strong> support is finally here alongside bash/zsh 🐟</li>
</ul>

<h3 id="urdf-12">URDF 1.2</h3>

<p>The robot description format gets a proper update:</p>

<ul>
  <li><strong>Quaternion support</strong> via <code class="language-plaintext highlighter-rouge">quat_xyzw</code>, no more euler-only rotations</li>
  <li><strong>Capsule geometry</strong> as a new collision primitive</li>
  <li>Acceleration, deceleration, and jerk limits in joint definitions</li>
  <li><code class="language-plaintext highlighter-rouge">robot_state_publisher</code> can now subscribe to <code class="language-plaintext highlighter-rouge">robot_description</code> topic instead of only publishing it</li>
</ul>

<h3 id="tracing">Tracing</h3>

<p>For anyone doing serious performance work:</p>

<ul>
  <li><strong>Runtime opt-out</strong> via <code class="language-plaintext highlighter-rouge">TRACETOOLS_RUNTIME_DISABLE=1</code> disable instrumentation without a rebuild</li>
  <li><strong>Snapshot mode</strong> with LTTng for “flight recorder” style memory-buffered capture</li>
  <li><strong>Dual session tracing</strong> with separate sessions for initialization and runtime events</li>
</ul>

<h3 id="developer-quality-of-life">Developer quality of life</h3>

<ul>
  <li>Thread naming utilities in <code class="language-plaintext highlighter-rouge">rcpputils</code> for easier profiling and debugging</li>
  <li><code class="language-plaintext highlighter-rouge">class_loader</code> plugins can now accept constructor arguments for initialization parameters</li>
  <li><code class="language-plaintext highlighter-rouge">rcutils</code> gains Base64 encoding/decoding and <code class="language-plaintext highlighter-rouge">strnlen</code> for platform compatibility</li>
  <li>New CMake target <code class="language-plaintext highlighter-rouge">ament_ros_defaults</code> for consistent C/C++ version specification across packages</li>
</ul>

<hr />

<h2 id="supported-platforms">Supported platforms</h2>

<table>
  <thead>
    <tr>
      <th>Tier</th>
      <th>Platform</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1</td>
      <td>Ubuntu 26.04 amd64 / arm64</td>
    </tr>
    <tr>
      <td>1</td>
      <td>Windows 11 (VS 2022) amd64</td>
    </tr>
    <tr>
      <td>2</td>
      <td>RHEL 10 amd64</td>
    </tr>
    <tr>
      <td>3</td>
      <td>Ubuntu 24.04, macOS, Debian Trixie, OpenEmbedded</td>
    </tr>
  </tbody>
</table>

<hr />

<h2 id="by-the-numbers">By the numbers</h2>

<p>Behind every <code class="language-plaintext highlighter-rouge">apt install ros-lyrical-*</code> there’s a massive community effort: <strong>239 contributors</strong>, <strong>110 beta testers</strong>, and nearly <strong>2,651 test cases</strong> executed. That’s pretty impressive, and it shows how healthy the ROS ecosystem remains.</p>

<hr />

<h2 id="whats-next">What’s next?</h2>

<p>The next non-LTS distribution, <strong>ROS 2 Makoa Mata-mata</strong>, is already on the calendar for May 2027.</p>

<p>If you’re on Jazzy, migration should be pretty smooth; most new features are additive and things like the executor change are opt-in. I covered the highlights here, but the full changelog is extensive, so check the <a href="https://docs.ros.org/en/lyrical/Releases/Release-Lyrical-Luth.html" target="_blank">official Lyrical Luth release notes</a> for the complete picture before jumping in on production systems.</p>

<p>Happy robotics programming! 🤖</p>]]></content><author><name>Walter Lucetti</name></author><category term="news" /><category term="robotics" /><category term="ROS" /><category term="ROS_2" /><category term="robotics" /><category term="news" /><category term="release" /><category term="lyrical_luth" /><category term="ubuntu" /><category term="lyrical" /><summary type="html"><![CDATA[The twelfth ROS 2 release lands today. A new LTS distribution built on Ubuntu 26.04, packed with performance gains, async Python support, zero-copy GPU transfers, and much more.]]></summary></entry><entry><title type="html">Introducing the ROS 2 Projects Section</title><link href="https://myzhar.tech/posts/new_ros2_projects_section/" rel="alternate" type="text/html" title="Introducing the ROS 2 Projects Section" /><published>2026-05-16T08:00:00+02:00</published><updated>2026-05-16T08:00:00+02:00</updated><id>https://myzhar.tech/posts/new_ros2_projects_section</id><content type="html" xml:base="https://myzhar.tech/posts/new_ros2_projects_section/"><![CDATA[<p>Alongside the <a href="/tutorials/">tutorials section</a>, I’ve been working on a dedicated space for the open source ROS 2 packages I’ve built over the years. Today I’m launching the <a href="/projects/ros2/">ROS 2 Projects</a> section of the website.</p>

<p>The first project page covers the <strong><a href="/projects/ros2/ldrobot-lidar-ros2/">LD Lidar ROS 2 Driver</a></strong> — a driver I originally wrote because no ROS 2 support existed for the LDRobot LD19 lidar I backed on Kickstarter. What started as a weekend effort to get a <code class="language-plaintext highlighter-rouge">/scan</code> topic publishing grew into a full driver: Nav2 Lifecycle nodes, SLAM Toolbox integration, a custom-modelled URDF, udev rules, benchmarking tools, and launch files for every use case. It supports the <strong>LD19</strong> and <strong>LD06</strong> sensors on ROS 2 <strong>Humble</strong> and <strong>Jazzy</strong>.</p>

<figure class="third ">
  
    
      <a href="/assets/images/projects/ldrobot-lidar-ros2/ldlidar_rviz2.png" title="Live laser scan in RViz2">
          <img src="/assets/images/projects/ldrobot-lidar-ros2/ldlidar_rviz2.png" alt="Live laser scan in RViz2" />
      </a>
    
  
    
      <a href="/assets/images/projects/ldrobot-lidar-ros2/ld19_slam.png" title="2D occupancy map built with SLAM Toolbox">
          <img src="/assets/images/projects/ldrobot-lidar-ros2/ld19_slam.png" alt="2D occupancy map built with SLAM Toolbox" />
      </a>
    
  
    
      <a href="/assets/images/projects/ldrobot-lidar-ros2/ld19_3d_mount.jpg" title="LD19 on its 3D-printed mount">
          <img src="/assets/images/projects/ldrobot-lidar-ros2/ld19_3d_mount.jpg" alt="LD19 on its 3D-printed mount" />
      </a>
    
  
  
    <figcaption>RViz2 scan (left), SLAM Toolbox map (center), LD19 on its 3D-printed mount (right)
</figcaption>
  
</figure>

<p>More ROS 2 project pages are on the way. Stay tuned!</p>

<p>Happy robotics programming! 🤖</p>]]></content><author><name>Walter Lucetti</name></author><category term="updates" /><category term="website" /><category term="projects" /><category term="updates" /><category term="website" /><category term="projects" /><category term="ROS" /><category term="ROS_2" /><category term="robotics" /><category term="lidar" /><category term="ldrobot" /><category term="LD19" /><category term="LD06" /><summary type="html"><![CDATA[A new section of the website dedicated to open source ROS 2 packages — starting with the LD Lidar ROS 2 Driver for LDRobot LD19/LD06 sensors.]]></summary></entry><entry><title type="html">New ROS 2 Tutorials about ‘Python Launch Files’ and ‘Node Composition’</title><link href="https://myzhar.tech/posts/new_ros2_tutorials_launch_files_and_composition/" rel="alternate" type="text/html" title="New ROS 2 Tutorials about ‘Python Launch Files’ and ‘Node Composition’" /><published>2026-05-13T00:30:00+02:00</published><updated>2026-05-13T00:30:00+02:00</updated><id>https://myzhar.tech/posts/new_ros2_tutorials_launch_files_and_composition</id><content type="html" xml:base="https://myzhar.tech/posts/new_ros2_tutorials_launch_files_and_composition/"><![CDATA[<p>I have to admit that I wasn’t able to keep my promise of releasing at least one ROS 2 tutorial every week. A series of unfortunate events and some health issues kept me away from my PC for longer than expected… but I’m back now, and everything is fine!</p>

<p>Let’s not dwell on that and focus on the good news instead.</p>

<p>I published a detailed tutorial on <a href="/tutorials/ros2/python-launch-explained/">ROS 2 Python Launch files</a>, packed with tips and tricks I use in my day-to-day workflow to make launch files as flexible as possible by taking full advantage of Python’s capabilities.</p>

<p>I also published an advanced tutorial diving deep into <a href="/tutorials/ros2/ros2-node-composition-explained/">ROS 2 Node Composition</a>, explaining the concepts behind it and how to leverage it to significantly improve the performance of your robotics systems, thanks to IPC (Intra-Process Communication) and zero-copy data transfer.</p>

<p>I hope you find these tutorials useful.</p>

<p>Happy robotics programming! 🤖</p>]]></content><author><name>Walter Lucetti</name></author><category term="updates" /><category term="website" /><category term="tutorials" /><category term="updates" /><category term="website" /><category term="tutorials" /><category term="ROS" /><category term="ROS_2" /><category term="robotics" /><category term="python" /><category term="launch_files" /><category term="composition" /><category term="ipc" /><summary type="html"><![CDATA[Two new tutorials covering ROS 2 Python Launch files and Node Composition with IPC and zero-copy communication.]]></summary></entry><entry><title type="html">New ROS 2 Tutorial: Understanding ROS 2 Node Names and Namespaces</title><link href="https://myzhar.tech/posts/understanding_ros2_node_names_and_namespaces/" rel="alternate" type="text/html" title="New ROS 2 Tutorial: Understanding ROS 2 Node Names and Namespaces" /><published>2026-02-21T10:00:00+01:00</published><updated>2026-02-21T10:00:00+01:00</updated><id>https://myzhar.tech/posts/understanding_ros2_node_names_and_namespaces</id><content type="html" xml:base="https://myzhar.tech/posts/understanding_ros2_node_names_and_namespaces/"><![CDATA[<p>I took the decision to release at least a new tutorial each week, and this time it’s all about understanding ROS 2 node names and namespaces.</p>

<p>The new tutorial is easy and explains simple concepts, but it’s crucial for organizing and managing your robotic applications effectively.</p>

<p>A clear view of how node names and namespaces work can greatly enhance your ability to design and implement complex robotic systems. By understanding these concepts, you’ll be better equipped to avoid naming conflicts, improve modularity, and create more maintainable code.</p>

<p>Go to the tutorial section to <a href="/tutorials/ros2/understanding-ros2-namespace-node-name/">Understand ROS 2 Node Names and Namespaces</a>!</p>

<p>Do not hesitate to reach out if you have any questions or feedback and…</p>

<p>Happy robotics programming! 🤖</p>]]></content><author><name>Walter Lucetti</name></author><category term="updates" /><category term="website" /><category term="tutorials" /><category term="updates" /><category term="website" /><category term="tutorials" /><category term="ROS" /><category term="ROS_2" /><category term="robotics" /><category term="node_name" /><category term="namespace" /><category term="rqt" /><category term="rqt_graph" /><summary type="html"><![CDATA[New tutorial: understand how ROS 2 node names and namespaces work, learn to rename and remap nodes at launch, and follow best practices for multi-robot systems.]]></summary></entry><entry><title type="html">New ROS 2 Tutorial: Configure ROS 2 Nodes</title><link href="https://myzhar.tech/posts/configure_ros2_nodes/" rel="alternate" type="text/html" title="New ROS 2 Tutorial: Configure ROS 2 Nodes" /><published>2026-02-14T18:00:00+01:00</published><updated>2026-02-14T18:00:00+01:00</updated><id>https://myzhar.tech/posts/configure_ros2_nodes</id><content type="html" xml:base="https://myzhar.tech/posts/configure_ros2_nodes/"><![CDATA[<p>I’m particularly active in this period, and I’m glad to announce the release of a <a href="/tutorials/ros2/configure-node-with-parameters/">new ROS 2 tutorial on <strong>Configuring Nodes</strong></a>!</p>

<p>This tutorial covers the essentials of using parameters to configure your ROS 2 nodes effectively. You’ll learn how to list, set, and manage parameters both from the command line and using the <code class="language-plaintext highlighter-rouge">rqt</code> GUI.</p>

<p>A section is dedicated to using YAML files for parameter management, which is especially useful for complex configurations.</p>

<p>Dive into the <a href="/tutorials/ros2/configure-node-with-parameters/">tutorial</a>, experiment a bit, and as always…</p>

<p>happy robotics programming! 🤖</p>]]></content><author><name>Walter Lucetti</name></author><category term="updates" /><category term="website" /><category term="tutorials" /><category term="updates" /><category term="website" /><category term="tutorials" /><category term="ROS" /><category term="ROS_2" /><category term="robotics" /><category term="middleware" /><category term="dds" /><category term="zenoh" /><summary type="html"><![CDATA[I released a new tutorial on configuring ROS 2 nodes.]]></summary></entry><entry><title type="html">New ROS 2 Tutorial: Understanding the ROS 2 Communication Middleware</title><link href="https://myzhar.tech/posts/understanding_ros2_middleware/" rel="alternate" type="text/html" title="New ROS 2 Tutorial: Understanding the ROS 2 Communication Middleware" /><published>2026-02-12T00:00:00+01:00</published><updated>2026-02-12T00:00:00+01:00</updated><id>https://myzhar.tech/posts/understanding_ros2_middleware</id><content type="html" xml:base="https://myzhar.tech/posts/understanding_ros2_middleware/"><![CDATA[<p>I’m excited to announce a brand-new addition to my ROS 2 tutorial series: <a href="/tutorials/ros2/understanding-ros2-middleware/"><strong>Understanding the ROS 2 Communication Middleware</strong></a>!</p>

<p>If you’ve ever felt confused by how ROS 2 handles communication under the hood, you’re definitely not alone. The middleware layer can be tricky—especially for developers moving from ROS 1 to ROS 2, or even for those jumping straight into ROS 2 for the first time.</p>

<p>In this guide, we’ll explore the different middleware implementations available in ROS 2, including:</p>

<ul>
  <li><strong>Fast DDS</strong></li>
  <li><strong>Cyclone DDS</strong></li>
  <li><strong>Connext DDS</strong></li>
  <li><strong>GurumDDS</strong></li>
  <li><strong>Zenoh</strong></li>
</ul>

<p>You’ll also find hands-on examples, clear explanations, and tips for choosing and configuring the best middleware for your project.</p>

<p>Dive in, experiment a bit, and as always—happy robotics programming! 🤖</p>]]></content><author><name>Walter Lucetti</name></author><category term="updates" /><category term="website" /><category term="tutorials" /><category term="updates" /><category term="website" /><category term="tutorials" /><category term="ROS" /><category term="ROS_2" /><category term="robotics" /><category term="parameters" /><category term="configure" /><category term="rqt" /><summary type="html"><![CDATA[I released a new tutorial on understanding the ROS 2 communication middleware.]]></summary></entry><entry><title type="html">A New Chapter of My Life</title><link href="https://myzhar.tech/posts/a_new_chapter_of_my_life/" rel="alternate" type="text/html" title="A New Chapter of My Life" /><published>2026-02-09T20:00:00+01:00</published><updated>2026-02-09T20:00:00+01:00</updated><id>https://myzhar.tech/posts/a_new_chapter_of_my_life</id><content type="html" xml:base="https://myzhar.tech/posts/a_new_chapter_of_my_life/"><![CDATA[<p>My life has taken an exciting turn as <a href="https://www.stereolabs.com/">Stereolabs</a>, the company I work for, has been acquired by <a href="https://www.ouster.com/">Ouster</a>, a leader in 3D LiDAR technology. This acquisition marks a significant milestone in my career and opens up new opportunities for growth and innovation.</p>

<h2 id="a-circle-closing">A Circle Closing?</h2>

<p>Twenty-three years ago, in 2003, I began my Computer Engineering thesis by transforming a 2D Sick LiDAR into a 3D sensor to digitize environments for robotic navigation.</p>

<figure class=""><a href="/assets/images/posts/20260209-ouster_x_stereolabs/thesis_robot_lidar.jpg" class="image-popup" title="The robot that I used for my experiments with 3D LiDAR scans
"><img src="/assets/images/posts/20260209-ouster_x_stereolabs/thesis_robot_lidar.jpg" alt="The robot that I used for my experiments with 3D LiDAR scans" /></a><figcaption>
      The robot that I used for my experiments with 3D LiDAR scans

    </figcaption></figure>

<p>Today, the circle closes as <a href="https://www.stereolabs.com/">Stereolabs</a>, the incredible company I’ve been with since 2018, joins forces with <a href="https://www.ouster.com/">Ouster</a>, a pioneer in 3D LiDAR technology.</p>

<p>Stereo vision and 3D lasers, two passions I’ve cultivated for decades, along with Robotics and AI, are converging in my professional life. It feels like destiny. I’m still processing the emotions of this moment.</p>

<p>I’m eager to see what the future holds as we embark on this new journey together. The possibilities are boundless, and I’m excited to be part of this transformative chapter.</p>]]></content><author><name>Walter Lucetti</name></author><category term="updates" /><category term="personal" /><category term="job" /><category term="stereolabs" /><category term="zed" /><category term="ouster" /><category term="lidar" /><category term="3d_lidar" /><category term="robotics" /><summary type="html"><![CDATA[My life has taken an exciting turn as the Company I work for, Stereolabs, has been acquired by Ouster.]]></summary></entry></feed>