<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Arouna Mounchili</title>
    <description>The latest articles on DEV Community by Arouna Mounchili (@arounamounchili).</description>
    <link>https://dev.to/arounamounchili</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3798720%2F398a02c0-392d-4587-a737-7b9432cadfd9.png</url>
      <title>DEV Community: Arouna Mounchili</title>
      <link>https://dev.to/arounamounchili</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/arounamounchili"/>
    <language>en</language>
    <item>
      <title>Treating Robots as Code: Why We Built a Programmable IR for ROS 2</title>
      <dc:creator>Arouna Mounchili</dc:creator>
      <pubDate>Mon, 01 Jun 2026 05:20:01 +0000</pubDate>
      <link>https://dev.to/arounamounchili/treating-robots-as-code-why-we-built-a-programmable-ir-for-ros-2-2pg1</link>
      <guid>https://dev.to/arounamounchili/treating-robots-as-code-why-we-built-a-programmable-ir-for-ros-2-2pg1</guid>
      <description>&lt;p&gt;How LinkForge v1.4.0 moves beyond static XML (URDF/SRDF) to bring modern software engineering ergonomics to robotics simulation.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzvx6ydf95xtaa8uvxung.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzvx6ydf95xtaa8uvxung.png" alt="linkforge_v1_4_hero_hardened" width="800" height="800"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you work in robotics, you know the pain of the XML monolith.&lt;/p&gt;

&lt;p&gt;For years, we’ve treated URDF and SRDF files like static, hand-written documents. We copy-paste coordinates, manually estimate inertia tensors, and attempt to fix broken collision models only &lt;em&gt;after&lt;/em&gt; our simulator crashes. &lt;/p&gt;

&lt;p&gt;A while ago, I wrote about &lt;a href="https://dev.to/arounamounchili/stop-hand-coding-urdfs-how-we-bridged-blender-and-ros-2-seamlessly-2fo4"&gt;how we stopped hand-coding URDFs by bridging Blender and ROS 2&lt;/a&gt;. That was a massive step forward for visual design. But as robots become increasingly modular, and as Embodied AI demands headless, parallel training loops, visual design is no longer enough.&lt;/p&gt;

&lt;p&gt;Robotics needs modern software engineering ergonomics. &lt;/p&gt;

&lt;p&gt;Today, we are releasing &lt;strong&gt;LinkForge v1.4.0&lt;/strong&gt;, an architectural shift that treats robot descriptions not as static XML files, but as a &lt;strong&gt;programmable, physically-validated Intermediate Representation (IR)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Here is why we built it, and how it changes the workflow.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem with "Robots as XML"
&lt;/h2&gt;

&lt;p&gt;URDFs and SRDFs are essentially compiled executables for simulators. They were never meant to be source code. &lt;/p&gt;

&lt;p&gt;When you attach a robotic arm to a mobile base by hand, you are manually merging two complex, highly sensitive state machines. You have to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Resolve joint name collisions.&lt;/li&gt;
&lt;li&gt;Manually shift geometric origins.&lt;/li&gt;
&lt;li&gt;Merge MoveIt 2 planning groups.&lt;/li&gt;
&lt;li&gt;Pray you didn't accidentally type a mass of &lt;code&gt;0.0&lt;/code&gt;, which will silently crash Gazebo on launch.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This workflow is brittle, error-prone, and entirely disconnected from modern CI/CD practices.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Paradigm Shift: Validated Composition
&lt;/h2&gt;

&lt;p&gt;With LinkForge v1.4.0, we introduced a fluent Python API that acts as an Intermediate Representation (IR). You define your parameters once, compose modules programmatically, and compile headlessly to URDF, SRDF, or your chosen simulation target.&lt;/p&gt;

&lt;p&gt;Look at the difference between guessing your physics in XML, versus strictly validating them in Python:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffi1d4y89a4v5q7a9dr1c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffi1d4y89a4v5q7a9dr1c.png" alt="xml vs python" width="800" height="405"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Instead of manually editing SRDF files for motion planning, LinkForge provides a robust API to compose subsystems:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;linkforge.core&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;RobotBuilder&lt;/span&gt;

&lt;span class="n"&gt;base&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;RobotBuilder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;mobile_base&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# ... load base parameters ...
&lt;/span&gt;
&lt;span class="n"&gt;arm&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;RobotBuilder&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;manipulator&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;# ... load arm parameters ...
&lt;/span&gt;
&lt;span class="c1"&gt;# Safely attach the arm to the base
&lt;/span&gt;&lt;span class="n"&gt;base&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;attach&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;arm&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;at_link&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;top_plate&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;prefix&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;left_arm_&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Under the hood, the builder automatically re-namespaces conflicting joint names, shifts the topological tree, and seamlessly merges your MoveIt 2 semantic planning groups.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/ntVZRtHWFkI"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;




&lt;h2&gt;
  
  
  Mathematical Rigor: The Physics "Linter"
&lt;/h2&gt;

&lt;p&gt;In standard workflows, you don't know your robot's physics are broken until the simulator rejects them. LinkForge introduces a &lt;code&gt;RobotValidator&lt;/code&gt; that acts as a strict linter for rigid-body physics.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. No More Guessing Inertia&lt;/strong&gt;&lt;br&gt;
Stop guessing your &lt;code&gt;ixx&lt;/code&gt;, &lt;code&gt;iyy&lt;/code&gt;, and &lt;code&gt;izz&lt;/code&gt; values. LinkForge integrates Sylvester &amp;amp; Mirtich algorithms to calculate rigorous inertia tensors directly from your mesh geometry and mass. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Early Validation&lt;/strong&gt;&lt;br&gt;
The linter verifies kinematic trees for disconnected nodes, unintended loops, and non-physical inertia tensors. If a sub-assembly has a zero-mass link, the validator catches it and fails the build &lt;em&gt;before&lt;/em&gt; you ever launch a simulation.&lt;/p&gt;


&lt;h2&gt;
  
  
  Headless Decoupling for Embodied AI
&lt;/h2&gt;

&lt;p&gt;Perhaps the most important architectural change in v1.4.0 is the complete decoupling of &lt;code&gt;linkforge-core&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;We have fully separated the rigid-body core logic from the visual platforms (like Blender). This means you can now run the IR engine &lt;strong&gt;entirely headlessly&lt;/strong&gt; on high-performance clusters. &lt;/p&gt;

&lt;p&gt;If you are working in Reinforcement Learning or Embodied AI, you can programmatically generate, mutate, and validate thousands of robot morphologies (changing joint limits, mass, or geometries) inside parallel training loops with zero external UI dependencies.&lt;/p&gt;


&lt;h2&gt;
  
  
  Stop Editing XML. Start Compiling Robots.
&lt;/h2&gt;

&lt;p&gt;Robotics is advancing too fast to be held back by fragile description files. By treating your robot as code, you unlock version control, continuous integration, and programmatic scale.&lt;/p&gt;

&lt;p&gt;LinkForge is fully open-source and ready for your workflows. &lt;/p&gt;

&lt;p&gt;🔗 &lt;strong&gt;Check out the repository on GitHub:&lt;/strong&gt; &lt;br&gt;
&lt;a href="https://github.com/arounamounchili/linkforge" rel="noopener noreferrer"&gt;https://github.com/arounamounchili/linkforge&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📦 &lt;strong&gt;Download on PyPI:&lt;/strong&gt; &lt;br&gt;
&lt;a href="https://pypi.org/project/linkforge-core/" rel="noopener noreferrer"&gt;https://pypi.org/project/linkforge-core/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Or try it out immediately:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pip &lt;span class="nb"&gt;install &lt;/span&gt;linkforge-core
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I would love to hear your thoughts on this architecture! How are you currently managing your URDF/SRDF pipelines, and what pain points do you face when migrating from CAD to Simulation? Let's chat in the comments!&lt;/p&gt;

</description>
      <category>robotics</category>
      <category>python</category>
      <category>ros2</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Stop Hand-Coding URDFs: How We Bridged Blender and ROS 2 Seamlessly</title>
      <dc:creator>Arouna Mounchili</dc:creator>
      <pubDate>Sat, 28 Feb 2026 19:31:58 +0000</pubDate>
      <link>https://dev.to/arounamounchili/stop-hand-coding-urdfs-how-we-bridged-blender-and-ros-2-seamlessly-2fo4</link>
      <guid>https://dev.to/arounamounchili/stop-hand-coding-urdfs-how-we-bridged-blender-and-ros-2-seamlessly-2fo4</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8vpkrzs1019ui682hv96.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8vpkrzs1019ui682hv96.png" alt="linkforge master vision" width="800" height="800"&gt;&lt;/a&gt;&lt;br&gt;
If you work in robotics, you know the drill. &lt;/p&gt;

&lt;p&gt;You spend weeks designing a beautiful, mechanically sound robot in CAD. Then, you need to simulate it in Gazebo or control it with ROS 2. &lt;/p&gt;

&lt;p&gt;Suddenly, your engineering masterpiece becomes a nightmare of XML tags. You are staring at a &lt;code&gt;robot.urdf&lt;/code&gt; file at 2 AM, trying to figure out why your inertia tensor has negative diagonal values, why your LiDAR is floating three meters above the chassis, or why your generic &lt;code&gt;&amp;lt;ros2_control&amp;gt;&lt;/code&gt; hardware interface is throwing errors.&lt;/p&gt;

&lt;p&gt;We’ve all been there. The gap between &lt;strong&gt;Visual Rigging&lt;/strong&gt; and &lt;strong&gt;Mathematical Kinematics&lt;/strong&gt; is the most frustrating bottleneck in robotics simulation.&lt;/p&gt;

&lt;p&gt;That’s why I built &lt;strong&gt;&lt;a href="https://github.com/arounamounchili/linkforge" rel="noopener noreferrer"&gt;LinkForge&lt;/a&gt;&lt;/strong&gt;: &lt;strong&gt;The Linter &amp;amp; Bridge for Robotics&lt;/strong&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  What is LinkForge?
&lt;/h3&gt;

&lt;p&gt;LinkForge is an open-source ecosystem designed to turn Blender 4.2+ into a production-grade robotics IDE. &lt;/p&gt;

&lt;p&gt;It allows you to model your robot as naturally as sculpting a 3D scene, while acting as a strict safety net to guarantee the output is rigorous, mathematically sound code ready for ROS 2 and Gazebo.&lt;/p&gt;

&lt;p&gt;Instead of writing XML, you use a native Blender interface to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; &lt;strong&gt;Define Physics:&lt;/strong&gt; Automatically calculate perfect mass properties and inertia tensors for complex arbitrary meshes.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Attach Sensors:&lt;/strong&gt; Visually place Cameras, LiDARs, IMUs, and Contact sensors.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Configure Control:&lt;/strong&gt; Set up &lt;code&gt;ros2_control&lt;/code&gt; Command and State interfaces (Position, Velocity, Effort) directly on your joints.&lt;/li&gt;
&lt;li&gt; &lt;strong&gt;Lint &amp;amp; Export:&lt;/strong&gt; Catch simulation-breaking errors &lt;em&gt;before&lt;/em&gt; you export your final URDF/XACRO.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm8zthnagycfy9kw715nd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm8zthnagycfy9kw715nd.png" alt="Unitree H1-2 robot" width="800" height="523"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Why not just use existing exporters?
&lt;/h3&gt;

&lt;p&gt;There are a few historical URDF exporters for Blender and SolidWorks. However, as ROS 2 has matured, the requirements for simulation have become stricter.&lt;/p&gt;

&lt;p&gt;LinkForge was built completely from scratch with a &lt;strong&gt;Hexagonal Architecture&lt;/strong&gt; to solve three major problems with older tools:&lt;/p&gt;

&lt;h4&gt;
  
  
  1. The "Garbage In, Garbage Out" Problem
&lt;/h4&gt;

&lt;p&gt;Older exporters blindly translate whatever is in your 3D viewport into XML. If you accidentally detach a link, or if your collision mesh causes a physics engine singularity, you won't find out until Gazebo crashes. &lt;/p&gt;

&lt;p&gt;LinkForge introduces &lt;strong&gt;The Linter for Robotics&lt;/strong&gt;. Before it lets you export, the core Python engine validates your kinematic graph. It catches negative inertias, circular dependency chains, and invalid joint limits instantly.&lt;/p&gt;

&lt;h4&gt;
  
  
  2. Native &lt;code&gt;ros2_control&lt;/code&gt; Generation
&lt;/h4&gt;

&lt;p&gt;Writing &lt;code&gt;&amp;lt;ros2_control&amp;gt;&lt;/code&gt; blocks by hand is tedious. LinkForge includes a dedicated control dashboard. You simply check the joints you want to actuate, choose your interfaces, and LinkForge generates the perfect, standard-compliant XACRO macros for your hardware interfaces.&lt;/p&gt;

&lt;h4&gt;
  
  
  3. Headless CI/CD Capabilities
&lt;/h4&gt;

&lt;p&gt;Because LinkForge uses a Hexagonal Architecture, the core engine (&lt;code&gt;linkforge-core&lt;/code&gt;) is completely decoupled from the Blender UI. &lt;/p&gt;

&lt;p&gt;While artists and engineers use the Blender add-on visually, you can also install the core engine locally on your Linux CI/CD servers. You can run automated tests to validate the physics of your robot models every time someone opens a Pull Request on your repository! (And yes, an official standalone PyPI package is on our near-term roadmap!)&lt;/p&gt;




&lt;h3&gt;
  
  
  Fully Open Source (And Seeking Contributors!)
&lt;/h3&gt;

&lt;p&gt;LinkForge is built &lt;em&gt;by&lt;/em&gt; roboticists, &lt;em&gt;for&lt;/em&gt; roboticists. We are licensed under &lt;strong&gt;GPLv3&lt;/strong&gt; to ensure the tool remains forever free and community-driven.&lt;/p&gt;

&lt;p&gt;Whether you are building a simple differential drive robot for a university project, or a complex quadruped for research, LinkForge will save you hours of XML debugging.&lt;/p&gt;

&lt;h3&gt;
  
  
  Try it out today:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Check out the &lt;strong&gt;&lt;a href="https://github.com/arounamounchili/linkforge" rel="noopener noreferrer"&gt;GitHub Repository&lt;/a&gt;&lt;/strong&gt;. If you find it useful, I’d be honored if you left a Star ⭐!&lt;/li&gt;
&lt;li&gt;Read the &lt;strong&gt;&lt;a href="https://linkforge.readthedocs.io/" rel="noopener noreferrer"&gt;Official Documentation &amp;amp; Tutorials&lt;/a&gt;&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Download it directly inside Blender via the &lt;strong&gt;Get Extensions&lt;/strong&gt; menu!&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you are a Python or Rust developer interested in kinematics, or if you just have ideas on how to improve the URDF workflow, we are actively looking for contributors to help shape our &lt;strong&gt;upcoming roadmap&lt;/strong&gt; (which includes SRDF Support!). Come say hi in our GitHub Discussions!&lt;/p&gt;

&lt;p&gt;Let's stop hand-coding XML, and get back to building robots. 🤖✨&lt;/p&gt;

</description>
      <category>robotics</category>
      <category>ros2</category>
      <category>python</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
