<?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: Ravindhar</title>
    <description>The latest articles on DEV Community by Ravindhar (@ravindhar).</description>
    <link>https://dev.to/ravindhar</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%2F3891204%2F3e009201-6ad0-4316-aa8a-74cd851bba82.png</url>
      <title>DEV Community: Ravindhar</title>
      <link>https://dev.to/ravindhar</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ravindhar"/>
    <language>en</language>
    <item>
      <title>Convert URDF to MuJoCo MJCF Without Installing Anything</title>
      <dc:creator>Ravindhar</dc:creator>
      <pubDate>Wed, 06 May 2026 20:03:06 +0000</pubDate>
      <link>https://dev.to/ravindhar/convert-urdf-to-mujoco-mjcf-without-installing-anything-58j2</link>
      <guid>https://dev.to/ravindhar/convert-urdf-to-mujoco-mjcf-without-installing-anything-58j2</guid>
      <description>&lt;p&gt;If you've tried converting URDF to MuJoCo MJCF, you know the pain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MuJoCo's &lt;code&gt;./compile&lt;/code&gt; deletes fixed base links&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;urdf2mjcf&lt;/code&gt; ignores off-diagonal inertia terms&lt;/li&gt;
&lt;li&gt;Mesh paths break constantly&lt;/li&gt;
&lt;li&gt;No automatic actuator generation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I built an API that handles all of this in one HTTP call.&lt;/p&gt;

&lt;h2&gt;
  
  
  One curl command
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST https://roboinfra-api.azurewebsites.net/api/urdf/convert-format?target&lt;span class="o"&gt;=&lt;/span&gt;mjcf &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"X-Api-Key: rk_your_key"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-F&lt;/span&gt; &lt;span class="s2"&gt;"file=@robot.urdf"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Real example
&lt;/h2&gt;

&lt;p&gt;Input URDF (6 links, 5 joints):&lt;/p&gt;

&lt;p&gt;Output MJCF:&lt;/p&gt;

&lt;p&gt;Notice what the API auto-generated:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nested body tree (respects URDF kinematic chain)&lt;/li&gt;
&lt;li&gt;4 motor actuators for movable joints (skipped fixed joint)&lt;/li&gt;
&lt;li&gt;Floor plane, lighting, compiler settings&lt;/li&gt;
&lt;li&gt;Half-extent box conversion (URDF 0.15 → MJCF 0.075)&lt;/li&gt;
&lt;li&gt;Continuous joint correctly mapped to unlimited hinge&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Python SDK
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="n"&gt;pip&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;roboinfra&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;sdk&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;roboinfra&lt;/span&gt;
&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;roboinfra&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Client&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;rk_your_key&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;urdf&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;convert_format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;robot.urdf&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;mjcf&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="nf"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;robot.xml&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;w&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;converted_xml&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Also converts to Gazebo SDF
&lt;/h2&gt;

&lt;p&gt;Just change &lt;code&gt;target=sdf&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST .../api/urdf/convert-format?target&lt;span class="o"&gt;=&lt;/span&gt;sdf &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"X-Api-Key: rk_..."&lt;/span&gt; &lt;span class="nt"&gt;-F&lt;/span&gt; &lt;span class="s2"&gt;"file=@robot.urdf"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Free 14-day Pro trial
&lt;/h2&gt;

&lt;p&gt;No credit card. Sign up: &lt;a href="https://roboinfra-dashboard.azurewebsites.net" rel="noopener noreferrer"&gt;https://roboinfra-dashboard.azurewebsites.net&lt;/a&gt;&lt;/p&gt;

</description>
      <category>mujoco</category>
      <category>robotics</category>
      <category>ros</category>
      <category>simulation</category>
    </item>
    <item>
      <title>Convert URDF to MuJoCo MJCF Without Installing Anything</title>
      <dc:creator>Ravindhar</dc:creator>
      <pubDate>Tue, 05 May 2026 18:47:00 +0000</pubDate>
      <link>https://dev.to/ravindhar/convert-urdf-to-mujoco-mjcf-without-installing-anything-2d35</link>
      <guid>https://dev.to/ravindhar/convert-urdf-to-mujoco-mjcf-without-installing-anything-2d35</guid>
      <description>&lt;p&gt;I validated and converted URDFs from 5 popular robots to both &lt;br&gt;
Gazebo SDF and MuJoCo MJCF format. Here's what I found:&lt;/p&gt;

&lt;p&gt;The tool is free to try (14-day Pro trial, no credit card):&lt;/p&gt;

&lt;p&gt;&lt;a href="https://roboinfra-dashboard.azurewebsites.net/validator" rel="noopener noreferrer"&gt;https://roboinfra-dashboard.azurewebsites.net/validator&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Validate: POST /api/urdf/validate&lt;/li&gt;
&lt;li&gt;Convert to SDF: POST /api/urdf/convert-format?target=sdf&lt;/li&gt;
&lt;li&gt;Convert to MJCF: POST /api/urdf/convert-format?target=mjcf&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Python SDK: pip install roboinfra-sdk&lt;br&gt;
GitHub Action: roboinfra/validate-urdf-action@v1&lt;/p&gt;

</description>
      <category>mujoco</category>
      <category>robotics</category>
      <category>ros</category>
      <category>simulation</category>
    </item>
    <item>
      <title>How to Validate URDF Files in GitHub Actions Without Installing ROS</title>
      <dc:creator>Ravindhar</dc:creator>
      <pubDate>Sun, 03 May 2026 11:37:09 +0000</pubDate>
      <link>https://dev.to/ravindhar/how-to-validate-urdf-files-in-github-actions-without-installing-ros-3jmj</link>
      <guid>https://dev.to/ravindhar/how-to-validate-urdf-files-in-github-actions-without-installing-ros-3jmj</guid>
      <description>&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;The problem (3 sentences)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ROS CI pipelines are slow because check_urdf needs full ROS install&lt;/li&gt;
&lt;li&gt;Most GitHub Actions runners don't have ROS&lt;/li&gt;
&lt;li&gt;You just want to catch broken joint refs before merging&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The solution (show the YAML)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;6 lines of GitHub Action config&lt;/li&gt;
&lt;li&gt;No ROS install, no Docker, runs in 5 seconds&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Real example (screenshot)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Show NASA Robonaut 2 URDF passing validation&lt;/li&gt;
&lt;li&gt;Show a broken URDF failing with clear error messages&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;How to set it up (step by step)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create free account (link)&lt;/li&gt;
&lt;li&gt;Copy API key to GitHub Secrets&lt;/li&gt;
&lt;li&gt;Add the YAML to your repo&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Free tier: 50 validations/month, no credit card&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>ros</category>
      <category>robotics</category>
      <category>github</category>
      <category>devops</category>
    </item>
    <item>
      <title>Convert URDF to MuJoCo MJCF Without Installing Anything API + Python SDK</title>
      <dc:creator>Ravindhar</dc:creator>
      <pubDate>Sun, 03 May 2026 11:22:24 +0000</pubDate>
      <link>https://dev.to/ravindhar/convert-urdf-to-mujoco-mjcf-without-installing-anything-api-python-sdk-43ge</link>
      <guid>https://dev.to/ravindhar/convert-urdf-to-mujoco-mjcf-without-installing-anything-api-python-sdk-43ge</guid>
      <description>&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;The Problem (3 paragraphs)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MuJoCo is the fastest-growing robotics simulator&lt;/li&gt;
&lt;li&gt;Converting URDF to MJCF is painful (./compile is buggy, 
urdf2mjcf ignores off-diagonal inertia, mesh paths break)&lt;/li&gt;
&lt;li&gt;You just want to convert and start training your RL agent&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The Solution (show curl + Python code)&lt;br&gt;
curl -X POST .../api/urdf/convert-format?target=mjcf \&lt;br&gt;
 -H "X-Api-Key: rk_..." -F "file=&lt;a class="mentioned-user" href="https://dev.to/robot"&gt;@robot&lt;/a&gt;.urdf"&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;import roboinfra&lt;br&gt;
   client = roboinfra.Client("rk_...")&lt;br&gt;
   result = client.urdf.convert_format("robot.urdf", "mjcf")&lt;br&gt;
   with open("robot.xml", "w") as f:&lt;br&gt;
       f.write(result.converted_xml)&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Real Example (use your preview_test_arm.urdf)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Show the input URDF (6 links, 5 joints)&lt;/li&gt;
&lt;li&gt;Show the output MJCF (with actuators, floor, lighting)&lt;/li&gt;
&lt;li&gt;"This would take 2-3 hours manually. API did it in 200ms."&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Also Converts to Gazebo SDF&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Same API, just change target=sdf&lt;/li&gt;
&lt;li&gt;Show the SDF output&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Bonus: Validate + Convert in CI&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub Action YAML (6 lines)&lt;/li&gt;
&lt;li&gt;Validate URDF + convert to MJCF on every push&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Free 14-day Pro trial, no credit card&lt;br&gt;
Link: &lt;a href="https://roboinfra-dashboard.azurewebsites.net" rel="noopener noreferrer"&gt;https://roboinfra-dashboard.azurewebsites.net&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>mujoco</category>
      <category>robotics</category>
      <category>ros</category>
      <category>simulation</category>
    </item>
    <item>
      <title>How to Validate URDF Files in GitHub Actions Without Installing ROS</title>
      <dc:creator>Ravindhar</dc:creator>
      <pubDate>Sun, 03 May 2026 11:21:00 +0000</pubDate>
      <link>https://dev.to/ravindhar/how-to-validate-urdf-files-in-github-actions-without-installing-ros-a71</link>
      <guid>https://dev.to/ravindhar/how-to-validate-urdf-files-in-github-actions-without-installing-ros-a71</guid>
      <description>&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;The Problem (3 paragraphs)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MuJoCo is the fastest-growing robotics simulator&lt;/li&gt;
&lt;li&gt;Converting URDF to MJCF is painful (./compile is buggy, 
urdf2mjcf ignores off-diagonal inertia, mesh paths break)&lt;/li&gt;
&lt;li&gt;You just want to convert and start training your RL agent&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The Solution (show curl + Python code)&lt;br&gt;
curl -X POST .../api/urdf/convert-format?target=mjcf \&lt;br&gt;
 -H "X-Api-Key: rk_..." -F "file=&lt;a class="mentioned-user" href="https://dev.to/robot"&gt;@robot&lt;/a&gt;.urdf"&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;import roboinfra&lt;br&gt;
   client = roboinfra.Client("rk_...")&lt;br&gt;
   result = client.urdf.convert_format("robot.urdf", "mjcf")&lt;br&gt;
   with open("robot.xml", "w") as f:&lt;br&gt;
       f.write(result.converted_xml)&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Real Example (use your preview_test_arm.urdf)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Show the input URDF (6 links, 5 joints)&lt;/li&gt;
&lt;li&gt;Show the output MJCF (with actuators, floor, lighting)&lt;/li&gt;
&lt;li&gt;"This would take 2-3 hours manually. API did it in 200ms."&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Also Converts to Gazebo SDF&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Same API, just change target=sdf&lt;/li&gt;
&lt;li&gt;Show the SDF output&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Bonus: Validate + Convert in CI&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub Action YAML (6 lines)&lt;/li&gt;
&lt;li&gt;Validate URDF + convert to MJCF on every push&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Free 14-day Pro trial, no credit card&lt;br&gt;
Link: &lt;a href="https://roboinfra-dashboard.azurewebsites.net" rel="noopener noreferrer"&gt;https://roboinfra-dashboard.azurewebsites.net&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>ros</category>
      <category>robotics</category>
      <category>github</category>
      <category>devops</category>
    </item>
    <item>
      <title>How to validate URDF files in GitHub Actions without installing ROS</title>
      <dc:creator>Ravindhar</dc:creator>
      <pubDate>Tue, 21 Apr 2026 18:59:27 +0000</pubDate>
      <link>https://dev.to/ravindhar/how-to-validate-urdf-files-in-github-actions-without-installing-ros-1dp7</link>
      <guid>https://dev.to/ravindhar/how-to-validate-urdf-files-in-github-actions-without-installing-ros-1dp7</guid>
      <description>&lt;ol&gt;
&lt;li&gt;&lt;p&gt;The problem: ROS CI pipelines are slow because check_urdf &lt;br&gt;
needs a full ROS install (1GB+)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The solution: a 3-line GitHub Action that validates URDFs &lt;br&gt;
via API (show your Action YAML)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Real example: I ran NASA Robonaut 2's URDF through it &lt;br&gt;
and found... (show the results)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How to set it up (step by step with screenshots)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Free tier: 50 validations/month, no credit card&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;built a free validator: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://roboinfra-dashboard.azurewebsites.net/validator" rel="noopener noreferrer"&gt;https://roboinfra-dashboard.azurewebsites.net/validator&lt;/a&gt; &lt;br&gt;
(no signup, runs in browser)&lt;/p&gt;

&lt;p&gt;🔒&lt;br&gt;
Your files are safe&lt;/p&gt;

&lt;p&gt;Never stored: file contents exist only in memory during the request. Not written to disk, database, or logs.&lt;/p&gt;

&lt;p&gt;Never used for training: We do not use uploads to train AI models or for any purpose beyond your requested validation.&lt;/p&gt;

&lt;p&gt;Never shared: We do not share uploaded files with third parties.&lt;/p&gt;

&lt;p&gt;Metadata logged 30 days: File size in bytes, validation result (valid/invalid), error count, and timestamp. Used for abuse prevention only.&lt;/p&gt;

&lt;p&gt;After response: file content is garbage-collected and unrecoverable.&lt;/p&gt;

</description>
      <category>robotics</category>
      <category>ros</category>
      <category>ros2</category>
      <category>urdf</category>
    </item>
  </channel>
</rss>
