<?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-07-03T20:35:04+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">New ROS 2 Tutorial: Quality of Service (QoS)</title><link href="https://myzhar.tech/posts/ros2-qos-tutorial/" rel="alternate" type="text/html" title="New ROS 2 Tutorial: Quality of Service (QoS)" /><published>2026-07-01T21:00:00+02:00</published><updated>2026-07-01T21:00:00+02:00</updated><id>https://myzhar.tech/posts/ros2-qos-tutorial</id><content type="html" xml:base="https://myzhar.tech/posts/ros2-qos-tutorial/"><![CDATA[<p>New tutorial out today: <strong><a href="/tutorials/ros2/understanding-ros2-qos/">ROS 2 QoS: Why Your Nodes Aren’t Talking (and How to Fix It)</a></strong>.</p>

<p>I decided to write this one because of my day job. As Head of Support at Stereolabs, I’ve lost count of how many tickets I’ve opened, read, or answered that all boiled down to the same thing: “I can see the topic in <code class="language-plaintext highlighter-rouge">ros2 topic list</code>, I can <code class="language-plaintext highlighter-rouge">echo</code> nothing, and I have no idea why.” The customer is convinced the camera driver is broken. It almost never is. What’s broken is the <em>contract</em> between the two ends of the conversation, and that contract is Quality of Service.</p>

<p>It’s such a recurring pattern that I could practically diagnose it in my sleep now. A sensor stream is published one way, someone subscribes the default way, the middleware quietly decides the two are incompatible, and everybody stares at a blinking cursor wondering where the data went. No crash, no error, just silence. When you spend your days helping people integrate real hardware into real robots, you learn very fast that this single concept causes more head-scratching than almost anything else in ROS 2.</p>

<p>But honestly, I didn’t need the support queue to teach me this lesson; MyzharBot taught me first, the hard way. Years ago I spent an entire evening convinced I had a hardware fault on my little tracked robot, because a ultrasonic sensor topic simply wouldn’t reach the node that needed it. I checked cables, I re-flashed, I swapped ports. The real culprit was a mismatched reliability setting between a best-effort sensor and a subscriber that politely demanded guarantees I could never provide. I felt equal parts relieved and embarrassed when I finally found it.</p>

<p>That’s exactly why I promised, back in the <a href="/tutorials/ros2/understanding-ros2-middleware/">Understanding the ROS 2 Communication Middleware</a> tutorial, that QoS deserved its own chapter, and why it kept resurfacing when the <code class="language-plaintext highlighter-rouge">qos_overrides</code> parameters showed up in the <a href="/tutorials/ros2/configure-node-with-parameters/">node parameters</a> tutorial. This is that chapter, and I tried to write the guide I wish someone had handed me before that long “ultrasonic sensor” evening.</p>

<p>I kept the tone practical, with the compatibility tables I actually picture in my head when I read a support ticket, and I closed it with a short <strong>“Test Your Knowledge”</strong> quiz to make the ideas stick.</p>

<p>If a topic has ever gone mysteriously quiet on you, give it a read. My hope is the next silent topic costs you five seconds instead of an afternoon.</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="qos" /><category term="quality_of_service" /><category term="dds" /><category term="middleware" /><summary type="html"><![CDATA[A new in-depth tutorial on ROS 2 Quality of Service: why two healthy nodes refuse to talk, every QoS policy explained, publisher/subscriber compatibility tables, and how to tune QoS with node parameters and qos_overrides.]]></summary></entry><entry><title type="html">YALIO: Yet Another Lidar ICP Odometry</title><link href="https://myzhar.tech/posts/yalio_announcement/" rel="alternate" type="text/html" title="YALIO: Yet Another Lidar ICP Odometry" /><published>2026-06-11T23:00:00+02:00</published><updated>2026-06-11T23:00:00+02:00</updated><id>https://myzhar.tech/posts/yalio_announcement</id><content type="html" xml:base="https://myzhar.tech/posts/yalio_announcement/"><![CDATA[<p>In the few spare hours I’ve managed to carve out lately, I started working on a nice little project that I’m quite excited about: using <strong>cheap 2D lidars to calculate robot odometry</strong>. It’s one of those technical challenges that seems straightforward on paper but gets surprisingly deep once I started looking at the noise profiles of budget sensors and the nuances of real-time scan matching.</p>

<p>The project is called <strong>YALIO</strong>, which stands for <em>Yet Another Lidar ICP Odometry</em>, and I’ve made it available on GitHub at <strong><a href="https://github.com/Myzhar/yalio-ros2" target="_blank">Myzhar/yalio-ros2</a></strong>.</p>

<p>To be honest, this is a project that has been on my mind for a long time. I spent a significant amount of time searching, but I could never find anything simple online that performs only odometry estimation using 2D lidar information. Most existing solutions are either buried inside massive, complex SLAM suites or are too specialized for a specific research platform. I wanted something modular, lightweight, and easy to drop into any ROS 2 stack—something that does one thing and does it well.</p>

<p>There’s also a bit of personal history behind it. I first worked with <strong>ICP (Iterative Closest Point) algorithms</strong> back in <strong>2005</strong>, right after getting my laurea degree. Back then, I was working on my thesis, and the computational power I had available was a tiny fraction of what a modern NVIDIA Jetson offers. I’ve always wanted to go back and see how these algorithms have evolved over the 21 years since then. After digging back into the literature, I decided to go with <strong>Point-to-Line ICP (PL-ICP)</strong> because it seemed to be the most promising evolution of the original method for structured environments.</p>

<p>The idea is simple: low-cost 2D lidars like the <strong>LDRobot LD19 and LD06</strong> are everywhere now. While they are often used just for basic obstacle avoidance, I believe the scan data they produce is more than good enough to estimate the motion of a robot by matching consecutive scans. YALIO does exactly that. I chose PL-ICP because, unlike standard point-to-point matching, it accounts for the surface geometry of walls and corners, which makes it much more robust in the indoor environments where these 2D lidars typically operate.</p>

<p>I’ve implemented YALIO as a managed (lifecycle) ROS 2 component that loads into a shared container. However, I made a conscious effort to keep the core algorithm in a pure C++ library with no ROS dependency. This means the math can be reused in non-ROS projects or even on tiny embedded systems if needed. If you’ve followed my recent ROS 2 Lifecycle Nodes tutorial, you’ll recognize YALIO as a real-world application of those concepts: the odometry node is a <code class="language-plaintext highlighter-rouge">nav2_util::LifecycleNode</code> composable component, optionally managed by the Nav2 <code class="language-plaintext highlighter-rouge">lifecycle_manager</code>.</p>

<p>⚠️ Please keep in mind that the project is still a <strong>work in progress</strong>. I’m currently refining the error handling and tuning the parameters for higher speeds. In the next few weeks, once I have validated and tested it in different lighting and geometric conditions, I will add a new page to the ROS 2 Projects section to describe its internal architecture in detail.</p>

<p>In the meantime, I’ve already added a <a href="https://github.com/Myzhar/ldrobot-lidar-ros2/tree/add_yalio_odometry">new branch to my <strong>LD Lidar ROS 2 Driver</strong> repository</a>, <code target="_blank" class="language-plaintext highlighter-rouge">add_yalio_odometry</code>. This branch uses YALIO as the primary odometry source in a new demo SLAM launch file. I finally got to replace the “fake” static odometry node I used in the original launch file with a real, dynamic estimate. This makes the SLAM demo much more meaningful and closer to how a real autonomous robot should behave.</p>

<p>I’m excited to see how this performs on MyzharBot in more complex environments. Stay tuned for updates, and feel free to try it out and open issues on GitHub if you find problems or have ideas for improvements!</p>

<p>Happy robotics programming! 🤖</p>]]></content><author><name>Walter Lucetti</name></author><category term="news" /><category term="projects" /><category term="robotics" /><category term="ROS" /><category term="ROS_2" /><category term="robotics" /><category term="lidar" /><category term="odometry" /><category term="ICP" /><category term="SLAM" /><category term="ldrobot" /><category term="LD19" /><category term="LD06" /><category term="yalio" /><summary type="html"><![CDATA[A new side project is born: YALIO, a ROS 2 package that turns cheap 2D lidars like the LDRobot LD19/LD06 into a reliable odometry source using Point-to-Line ICP scan matching.]]></summary></entry><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>I’ve had this one sitting on my to-do list for quite a while, and for a very good reason. Lifecycle nodes are one of those topics that you can technically ignore when you’re first learning ROS 2—right up until the day a hardware conflict or a race condition crashes your robot in a way you can’t explain. At that point, you usually find yourself wishing someone had forced you to learn about managed nodes weeks earlier.</p>

<p>I’ve often joked that in robotics, timing isn’t just everything—it’s the only thing. I’ve been burned enough times by unmanaged hardware drivers doing the wrong thing at startup, or trying to publish data before the serial port was even open, that I finally decided it was time to sit down and write a proper, in-depth guide to this architecture.</p>

<p>I often find that beginners overlook Lifecycle nodes because they seem like unnecessary boilerplate. I certainly did at first. I remember thinking, “Why do I need a complex state machine just to start a node?” But as MyzharBot evolved from a simple mobile platform into a complex system with multiple GPUs and lidars, I realized that deterministic startup is the primary difference between a reliable robot and a fragile prototype.</p>

<p>In this tutorial, I cover the full lifecycle state machine from first principles. I break down the four primary states, the six transition states, and all the success and failure paths. I’ve also detailed exactly what I think should happen inside each callback to keep your system stable. To make it easier to visualize, I’ve included a detailed interactive diagram that you can expand to read every state and transition 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 ldrobot-lidar-ros2 driver as a concrete example of why this makes sense for hardware. I’ve found that being able to stop a LiDAR motor without actually closing the serial port, or reconfiguring the driver settings without destroying and recreating the entire node, is a massive time-saver when I’m out in the field.</p>

<p>I also spent a good chunk of the guide talking about <strong>Nav2’s Lifecycle Manager</strong>. More importantly, I explain why the Nav2 team felt the need to introduce their own <code class="language-plaintext highlighter-rouge">nav2_util::LifecycleNode</code> wrapper. I personally think the <em>bond</em> mechanism they added is a life-saver. If you’ve ever had your navigation stack silently fall apart because a depth camera node crashed and none of the other nodes noticed, you’ll appreciate why bonds are so important for safety-critical tasks.</p>

<p>I’m also continuing my new tradition of adding a “Test Your Knowledge” section at the end. I’ve put together seven multiple-choice questions, and I’ll warn you now: some of them have more than one correct answer. I put a particular amount of care into the question about <code class="language-plaintext highlighter-rouge">on_activate()</code>—let’s just say that one was inspired by a very long, very painful debugging session I had on MyzharBot a few years back! 😅</p>

<p>I really hope this tutorial helps you build more robust robots.</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>I’ve always believed that the best way to learn robotics is by doing, but I also know how easy it is to read a long technical guide, nod along, and then realize five minutes later that I didn’t actually retain the core concepts. When I was learning ROS 2 myself, I often found myself re-reading the same documentation pages over and over because I hadn’t properly tested my understanding of the “why” behind certain features.</p>

<p>One of the main goals I set for this tutorial series was to make each entry a genuine learning tool, not just a reference document to skim and forget. I want to make sure that when I explain a concept, I’m giving you a way to verify that it actually stuck.</p>

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

<p>I didn’t want these to be boring, academic tests. I’ve personally designed each quiz to be a short set of multiple-choice questions that target the specific ideas that I’ve seen trip people up—including the mistakes I made myself during my first few months with ROS 2.</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 a bit of an experiment for me. I’m genuinely curious if you find these quizzes useful. Do the questions hit the right difficulty level? Do they actually help you feel more confident about the material? I’m always looking for ways to make my site a better resource for the community, and I’d love to hear your thoughts on how I can improve this format.</p>

<p>If you have any feedback, please drop me a message at <strong>info@myzhar.com</strong> or reach out through my contact page. I read every single message I get, and I’m always happy to chat about robotics.</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>I’ve always felt that tutorials are a fantastic way to learn individual concepts, but there’s a different kind of value in seeing how those concepts actually come together in a real-world, production-ready piece of software. I’ve spent a lot of my time over the last few years building various ROS 2 packages to support my own robots and experiments, and I recently realized that just having them tucked away on GitHub wasn’t enough. I wanted a place here on my site where I could explain the “why” behind the technical choices I’ve made.</p>

<p>That’s why I’m so excited to finally launch the ROS 2 Projects section of the website. This space is dedicated to the open-source packages I’ve developed, providing a much deeper look into their architecture, their features, and—most importantly—how you can integrate them into your own robotic stacks.</p>

<p>I decided to kick things off with a project that is very close to my heart: the <strong>LD Lidar ROS 2 Driver</strong>. This project actually started from a place of mild frustration for me. Back in 2021, I backed the LDRobot Kickstarter for the LD19 lidar. When it finally arrived, I was eager to get it running on MyzharBot. However, I quickly discovered that while a ROS 1 driver existed, there was absolutely nothing for ROS 2. Since I was already moving all my development to the newer stack, I didn’t want to look back or use bridge hacks.</p>

<p>What began as a quick weekend hack for me to get a basic <code class="language-plaintext highlighter-rouge">/scan</code> topic publishing eventually evolved into a much more robust project. I didn’t want just a prototype script; I wanted a driver that followed modern ROS 2 best practices. I implemented it using Nav2 Lifecycle nodes to ensure predictable state management, integrated it with SLAM Toolbox for easy mapping, and I even sat down to model a custom URDF for the sensor because I couldn’t find a decent 3D model anywhere online.</p>

<p>I also added udev rules to handle those common “permission denied” serial port issues that always seem to pop up at the worst times, and I included benchmarking tools to verify latency—because in robotics, I know that every millisecond counts. It’s been incredibly rewarding for me to see members of the community chime in to confirm support for the LD06 sensor as well. Currently, I’ve ensured that everything works smoothly on both ROS 2 <strong>Humble</strong> and <strong>Jazzy</strong>.</p>

<p>This is just the beginning for the Projects section. I have several other packages in the pipeline—ranging from custom sensor interfaces to navigation utilities—that I can’t wait to document and share with you all. I truly believe that by sharing these complete projects, I can help others bridge the gap between “learning” ROS 2 and actually “building” with it.</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>I’m already working on the next set of project pages, so stay tuned for more updates!</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. Life happens, and between a series of unexpected events and some health issues, I was forced to step away from my workstation for much longer than I ever intended. It was incredibly frustrating to have all these ideas for new content and projects swirling in my head while being physically unable to sit down and actually build them. But the good news is that I’m back now, feeling much better, and I’m ready to dive right back into the rhythm of things!</p>

<p>Instead of dwelling on the downtime, I want to focus on the two major updates I’ve just pushed to the site. These are topics I’ve been wanting to cover for a long time because they represent the bridge between simply “writing a script” and actually “building a production-ready robot system.”</p>

<p>The first is a comprehensive guide on <a href="/tutorials/ros2/python-launch-explained/"><strong>ROS 2 Python Launch files</strong></a>. If you’ve spent any time in the ROS ecosystem, you know that launch files are the glue that holds everything together. However, moving from the simple XML of ROS 1 to the fully programmatic Python-based system in ROS 2 can be quite a shock. I’ve packed this tutorial with the specific tips and tricks I use in my day-to-day workflow to make my bringup scripts as flexible and reusable as possible. I remember the “aha!” moment I had when I first mastered concepts like <code class="language-plaintext highlighter-rouge">OpaqueFunction</code>: it completely changed how I architect my robot software, and I’ve tried to pass that same clarity on in this guide.</p>

<p>The second update is an advanced tutorial diving deep into <a href="/tutorials/ros2/ros2-node-composition-explained/"><strong>ROS 2 Node Composition</strong></a>. This is a topic that many developers overlook when they’re starting out, but it’s absolutely crucial for high-performance robotics. As I started pushing more high-bandwidth data, like high-resolution camera streams and dense point clouds, through the latest iterations of MyzharBot, I realized that the standard process-based node model was becoming a massive overhead bottleneck. Composition allows me to load multiple nodes into a single process container, enabling zero-copy data transfer between them. In this tutorial, I explain the core concepts behind IPC (Intra-Process Communication) and show you exactly how to leverage it to make your systems run significantly faster.</p>

<p>I truly hope you find these tutorials useful in your own robotics journey. It feels great to be back at the keyboard sharing these lessons, and I’m already working on the next set of guides to keep this momentum going!</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’ve made a commitment to release at least one new tutorial each week, and I’m particularly excited about this one: it’s all about understanding ROS 2 node names and namespaces. While these might seem like simple, foundational concepts, I can tell you from personal experience that mastering them is absolutely crucial for anyone serious about organizing and managing robotic applications effectively.</p>

<p>Think of it this way: in a complex ROS 2 system, you might have dozens, even hundreds, of individual nodes running simultaneously. Each node performs a specific task, like reading sensor data, controlling motors, or planning a path. Without a clear naming convention and a way to group related nodes, your system can quickly become a tangled mess. That’s where node names and namespaces come in.</p>

<p>A <strong>node name</strong> is essentially a unique identifier for a specific instance of a node. It’s how you refer to that particular node when you want to interact with it, inspect its state, or remap its topics. For example, you might have two camera drivers, and giving them distinct names like <code class="language-plaintext highlighter-rouge">/camera_front</code> and <code class="language-plaintext highlighter-rouge">/camera_rear</code> makes it immediately clear which is which.</p>

<p><strong>Namespaces</strong>, on the other hand, provide a hierarchical structure, allowing you to group related nodes and topics under a common prefix. Imagine building a multi-robot system, say, with two identical MyzharBots. If both robots use a node named <code class="language-plaintext highlighter-rouge">/camera</code>, you’d have a conflict. By assigning each robot its own namespace, like <code class="language-plaintext highlighter-rouge">/robot1/camera</code> and <code class="language-plaintext highlighter-rouge">/robot2/camera</code>, you can run identical software stacks on multiple platforms without any naming clashes. This is incredibly powerful for scalability and reusability.</p>

<p>A clear understanding of how node names and namespaces work will greatly enhance your ability to design and implement complex robotic systems. It helps you:</p>

<ul>
  <li><strong>Avoid naming conflicts:</strong> As mentioned, this is vital for multi-robot setups or even just when integrating multiple instances of the same type of sensor or actuator on a single robot.</li>
  <li><strong>Improve modularity:</strong> Namespaces allow you to encapsulate parts of your system, making it easier to develop, test, and deploy individual modules without affecting the entire application.</li>
  <li><strong>Create more maintainable code:</strong> A well-structured naming scheme makes your ROS graph much more readable and understandable, not just for you, but for anyone else who might work on your project. Debugging becomes a much less painful experience when you can quickly identify which node is responsible for what.</li>
  <li><strong>Simplify multi-robot deployments:</strong> This is a game-changer. With namespaces, you can launch an entire robot’s software stack, including all its sensors, actuators, and navigation nodes, and then easily duplicate that stack for another robot by simply changing the top-level namespace.</li>
</ul>

<p>I’ve personally found these concepts invaluable when working on MyzharBot, especially as it evolved through different versions and integrated more complex functionalities. Being able to logically separate the perception stack from the navigation stack, or easily adapt the entire system for different hardware configurations, has saved me countless hours of debugging and refactoring.</p>

<p>This new tutorial dives deep into these concepts, showing you not just the “what” but also the “how.” You’ll learn how to rename and remap nodes at launch, and how to follow best practices for building robust multi-robot systems. It’s packed with practical examples and insights that I’ve gathered over years of working with ROS.</p>

<p>So, if you’re looking to level up your ROS 2 skills and build more robust, scalable, and maintainable robotic applications, I highly recommend checking it out.</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>As always, please don’t hesitate to reach out if you have any questions or feedback. I love hearing from you and seeing what you’re building.</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>! This is one of those foundational topics that might not sound as flashy as SLAM or AI, but I can tell you from years of experience building robots that mastering node configuration is absolutely essential for creating robust, adaptable, and maintainable robotic applications.</p>

<p>I remember countless times in the early days of MyzharBot when I would hardcode values directly into my C++ or Python nodes. Every time I wanted to change a PID gain, a sensor threshold, or even just a topic name, I had to recompile or restart everything. It was a huge time sink and a source of constant frustration. That’s why I quickly learned to appreciate the power of ROS 2 parameters.</p>

<p>This tutorial covers the essentials of using parameters to configure your ROS 2 nodes effectively. I’ll walk you through how to declare parameters in your code, how to give them default values, and then, crucially, how to override those values without touching your source code. You’ll learn how to list, get, and set parameters both from the command line—which is great for quick debugging and testing—and using the <code class="language-plaintext highlighter-rouge">rqt</code> GUI, which provides a fantastic visual interface for dynamic reconfiguration. I personally love <code class="language-plaintext highlighter-rouge">rqt</code> for tuning parameters on the fly while MyzharBot is running, letting me see the immediate impact of my changes.</p>

<p>A significant section of the tutorial is dedicated to using YAML files for parameter management. This is where things get really powerful for complex configurations. Imagine having dozens of nodes, each with multiple parameters. Trying to manage that from the command line would be a nightmare. YAML files allow me to define all my parameters in a structured, human-readable format that I can easily version control, share, and load with a single command. This is indispensable for deploying robots in different environments or with varying hardware setups.</p>

<p>I’ve poured a lot of my practical experience into this guide, aiming to make it as clear and actionable as possible. My goal is to equip you with the knowledge to build ROS 2 systems that are not only functional but also flexible and easy to manage.</p>

<p>So, <a href="/tutorials/ros2/configure-node-with-parameters/">dive into the tutorial</a>, experiment a bit with configuring your own nodes, and see how much easier it makes your robotics development.</p>

<p>As always, I’m eager to hear your thoughts and see what you build!</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></feed>