<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Mechatronics on Mulham Fetna</title>
    <link>https://mulhamfetna.com/tags/mechatronics/</link>
    <description>Recent content in Mechatronics on Mulham Fetna</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en</language>
    <managingEditor>contact@mulhamfetna.com (Mulham Fetna)</managingEditor>
    <webMaster>contact@mulhamfetna.com (Mulham Fetna)</webMaster>
    <copyright>© 2026 Mulham Fetna</copyright>
    <lastBuildDate>Wed, 16 Sep 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://mulhamfetna.com/tags/mechatronics/index.xml" rel="self" type="application/rss+xml" />
    
    <item>
      <title>From an Onshape assembly to a MuJoCo model with onshape-to-robot</title>
      <link>https://mulhamfetna.com/projects/ros2-tendon-driven-hand-mujoco-digital-twin-vision-teleoperation/onshape-to-mujoco/</link>
      <pubDate>Wed, 16 Sep 2026 00:00:00 +0000</pubDate>
      <author>contact@mulhamfetna.com (Mulham Fetna)</author>
      <guid>https://mulhamfetna.com/projects/ros2-tendon-driven-hand-mujoco-digital-twin-vision-teleoperation/onshape-to-mujoco/</guid>
      <description>&lt;div class=&#34;lead text-neutral-500 dark:text-neutral-400 !mb-9 text-xl&#34;&gt;&#xA;  The simulated hand was never modelled by hand. It is an Onshape assembly — five SG90 servos, fifteen&#xA;knuckle mates, a palm full of tendon channels — pulled through the Onshape API and written out as&#xA;MuJoCo XML. Here is the design, and every setting that steers the export.&#xA;&lt;/div&gt;&#xA;&#xA;&lt;a&#xA;  class=&#34;!rounded-md bg-primary-600 px-4 py-2 !text-neutral !no-underline hover:!bg-primary-500 dark:bg-primary-800 dark:hover:!bg-primary-700&#34;&#xA;  href=&#34;https://cad.onshape.com/documents/a2dbb5f16624f10f1aa22f02/w/693ffc0be3e83ae21f78f6ed/e/4d69727744037003575f4068?renderMode=0&#34;&#xA;  target=&#34;_blank&#34;&#xA;  &#xA;  role=&#34;button&#34;&gt;&#xA;  Open the Onshape assembly&#xA;&lt;/a&gt;&#xA;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The design&#xA;    &lt;div id=&#34;the-design&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#the-design&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;figure&gt;&#xA;  &lt;video&#xA;    class=&#34;w-full rounded-md aspect-video object-contain&#34;preload=&#34;metadata&#34; muted controls playsinline&gt;&#xA;    &lt;source src=&#34;https://mulhamfetna.com/projects/ros2-tendon-driven-hand-mujoco-digital-twin-vision-teleoperation/onshape-to-mujoco/onshape_cad_tour_current_design.webm&#34;&gt;&#xA;    &lt;p&gt;Your browser cannot play this video. &lt;a href=&#34;https://mulhamfetna.com/projects/ros2-tendon-driven-hand-mujoco-digital-twin-vision-teleoperation/onshape-to-mujoco/onshape_cad_tour_current_design.webm&#34;&gt;Download video&lt;/a&gt;.&lt;/p&gt;&#xA;  &lt;/video&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&#xA;&#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &#xA;  &lt;div class=&#34;width-patch&#34;&gt;&lt;/div&gt;&#xA;&lt;div id=&#34;gallery-7acbdbda855d714d7a7934961dc8bbc7&#34; class=&#34;gallery&#34;&gt;&#xA;  &#xA;  &lt;img src=&#34;https://mulhamfetna.com/projects/ros2-tendon-driven-hand-mujoco-digital-twin-vision-teleoperation/onshape-to-mujoco/current_assembly_iso.png&#34; class=&#34;grid-w50&#34; alt=&#34;Current assembly, isometric, with mate connectors visible&#34; /&gt;&#xA;  &lt;img src=&#34;https://mulhamfetna.com/projects/ros2-tendon-driven-hand-mujoco-digital-twin-vision-teleoperation/onshape-to-mujoco/current_front_tendon_channels.png&#34; class=&#34;grid-w50&#34; alt=&#34;Front view: one tendon channel per finger down the palm&#34; /&gt;&#xA;  &lt;img src=&#34;https://mulhamfetna.com/projects/ros2-tendon-driven-hand-mujoco-digital-twin-vision-teleoperation/onshape-to-mujoco/current_servo_block.png&#34; class=&#34;grid-w50&#34; alt=&#34;Five SG90 servos staggered in the base block&#34; /&gt;&#xA;  &lt;img src=&#34;https://mulhamfetna.com/projects/ros2-tendon-driven-hand-mujoco-digital-twin-vision-teleoperation/onshape-to-mujoco/current_servo_layout.png&#34; class=&#34;grid-w50&#34; alt=&#34;Servo layout seen from below the palm&#34; /&gt;&#xA;  &lt;img src=&#34;https://mulhamfetna.com/projects/ros2-tendon-driven-hand-mujoco-digital-twin-vision-teleoperation/onshape-to-mujoco/current_fingers_flexing.png&#34; class=&#34;grid-w50&#34; alt=&#34;Finger and thumb mates driven to flexion in Onshape&#34; /&gt;&#xA;  &lt;img src=&#34;https://mulhamfetna.com/projects/ros2-tendon-driven-hand-mujoco-digital-twin-vision-teleoperation/onshape-to-mujoco/current_side_profile_flexed.png&#34; class=&#34;grid-w50&#34; alt=&#34;Side profile of the flexed finger and thumb chains&#34; /&gt;&#xA;&lt;/div&gt;&#xA;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Palm and fingers:&lt;/strong&gt; four three-phalanx fingers and a three-segment thumb, every knuckle a&#xA;&lt;strong&gt;revolute mate&lt;/strong&gt; with limits. The RGB triads in the views are mate connectors.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Tendon channels:&lt;/strong&gt; one per finger, running down the palm into the base.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Servo block:&lt;/strong&gt; five SG90-class servos, staggered so each horn sits under a tendon exit.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The design has a history&#xA;    &lt;div id=&#34;the-design-has-a-history&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#the-design-has-a-history&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;ol class=&#34;border-s-2 border-primary-500 dark:border-primary-300 list-none&#34;&gt;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&lt;li&gt;&#xA;  &lt;div class=&#34;flex&#34;&gt;&#xA;    &lt;div&#xA;      class=&#34;bg-primary-500 dark:bg-primary-300 text-neutral-50 dark:text-neutral-700 min-w-[30px] h-8 text-2xl flex items-center justify-center rounded-full ltr:-ml-12 rtl:-mr-[79px] mt-5&#34;&gt;&#xA;      &lt;span class=&#34;relative block icon&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;0 0 512 512&#34;&gt;&lt;path fill=&#34;currentColor&#34; d=&#34;M421.7 220.3L188.5 453.4L154.6 419.5L158.1 416H112C103.2 416 96 408.8 96 400V353.9L92.51 357.4C87.78 362.2 84.31 368 82.42 374.4L59.44 452.6L137.6 429.6C143.1 427.7 149.8 424.2 154.6 419.5L188.5 453.4C178.1 463.8 165.2 471.5 151.1 475.6L30.77 511C22.35 513.5 13.24 511.2 7.03 504.1C.8198 498.8-1.502 489.7 .976 481.2L36.37 360.9C40.53 346.8 48.16 333.9 58.57 323.5L291.7 90.34L421.7 220.3zM492.7 58.75C517.7 83.74 517.7 124.3 492.7 149.3L444.3 197.7L314.3 67.72L362.7 19.32C387.7-5.678 428.3-5.678 453.3 19.32L492.7 58.75z&#34;/&gt;&lt;/svg&gt;&#xA;&lt;/span&gt;&#xA;    &lt;/div&gt;&#xA;    &lt;div class=&#34;block p-6 rounded-lg shadow-2xl flex-1 ms-6 mb-10 break-words&#34;&gt;&#xA;      &lt;div class=&#34;flex justify-between&#34;&gt;&#xA;        &#xA;          &lt;h2 class=&#34;mt-0&#34;&gt;Start&lt;/h2&gt;&#xA;        &#xA;        &#xA;      &lt;/div&gt;&#xA;      &#xA;        &lt;h4 class=&#34;mt-0&#34;&gt;&#xA;          2026-09-02&#xA;        &lt;/h4&gt;&#xA;      &#xA;      &lt;div class=&#34;mb-6&#34;&gt;&#xA;        The first version in the history.&#xA;      &lt;/div&gt;&#xA;    &lt;/div&gt;&#xA;  &lt;/div&gt;&#xA;&lt;/li&gt;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&lt;li&gt;&#xA;  &lt;div class=&#34;flex&#34;&gt;&#xA;    &lt;div&#xA;      class=&#34;bg-primary-500 dark:bg-primary-300 text-neutral-50 dark:text-neutral-700 min-w-[30px] h-8 text-2xl flex items-center justify-center rounded-full ltr:-ml-12 rtl:-mr-[79px] mt-5&#34;&gt;&#xA;      &lt;span class=&#34;relative block icon&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;0 0 576 512&#34;&gt;&lt;path fill=&#34;currentColor&#34; d=&#34;M287.9 0C297.1 0 305.5 5.25 309.5 13.52L378.1 154.8L531.4 177.5C540.4 178.8 547.8 185.1 550.7 193.7C553.5 202.4 551.2 211.9 544.8 218.2L433.6 328.4L459.9 483.9C461.4 492.9 457.7 502.1 450.2 507.4C442.8 512.7 432.1 513.4 424.9 509.1L287.9 435.9L150.1 509.1C142.9 513.4 133.1 512.7 125.6 507.4C118.2 502.1 114.5 492.9 115.1 483.9L142.2 328.4L31.11 218.2C24.65 211.9 22.36 202.4 25.2 193.7C28.03 185.1 35.5 178.8 44.49 177.5L197.7 154.8L266.3 13.52C270.4 5.249 278.7 0 287.9 0L287.9 0zM287.9 78.95L235.4 187.2C231.9 194.3 225.1 199.3 217.3 200.5L98.98 217.9L184.9 303C190.4 308.5 192.9 316.4 191.6 324.1L171.4 443.7L276.6 387.5C283.7 383.7 292.2 383.7 299.2 387.5L404.4 443.7L384.2 324.1C382.9 316.4 385.5 308.5 391 303L476.9 217.9L358.6 200.5C350.7 199.3 343.9 194.3 340.5 187.2L287.9 78.95z&#34;/&gt;&lt;/svg&gt;&lt;/span&gt;&#xA;    &lt;/div&gt;&#xA;    &lt;div class=&#34;block p-6 rounded-lg shadow-2xl flex-1 ms-6 mb-10 break-words&#34;&gt;&#xA;      &lt;div class=&#34;flex justify-between&#34;&gt;&#xA;        &#xA;          &lt;h2 class=&#34;mt-0&#34;&gt;v1.0.0 — MediaPipe&lt;/h2&gt;&#xA;        &#xA;        &#xA;      &lt;/div&gt;&#xA;      &#xA;        &lt;h4 class=&#34;mt-0&#34;&gt;&#xA;          2026-09-06&#xA;        &lt;/h4&gt;&#xA;      &#xA;      &lt;div class=&#34;mb-6&#34;&gt;&#xA;        The joint-angle-driven hand behind the &lt;a href=&#34;https://mulhamfetna.com/projects/ros2-mediapipe-robotic-hand-digital-twin-vision-teleoperation/&#34; &gt;RViz predecessor project&lt;/a&gt;.&#xA;      &lt;/div&gt;&#xA;    &lt;/div&gt;&#xA;  &lt;/div&gt;&#xA;&lt;/li&gt;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&lt;li&gt;&#xA;  &lt;div class=&#34;flex&#34;&gt;&#xA;    &lt;div&#xA;      class=&#34;bg-primary-500 dark:bg-primary-300 text-neutral-50 dark:text-neutral-700 min-w-[30px] h-8 text-2xl flex items-center justify-center rounded-full ltr:-ml-12 rtl:-mr-[79px] mt-5&#34;&gt;&#xA;      &lt;span class=&#34;relative block icon&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; height=&#34;1em&#34; viewBox=&#34;0 0 512 512&#34;&gt;&lt;path fill=&#34;currentColor&#34; d=&#34;M441 58.9L453.1 71c9.4 9.4 9.4 24.6 0 33.9L424 134.1 377.9 88 407 58.9c9.4-9.4 24.6-9.4 33.9 0zM209.8 256.2L344 121.9 390.1 168 255.8 302.2c-2.9 2.9-6.5 5-10.4 6.1l-58.5 16.7 16.7-58.5c1.1-3.9 3.2-7.5 6.1-10.4zM373.1 25L175.8 222.2c-8.7 8.7-15 19.4-18.3 31.1l-28.6 100c-2.4 8.4-.1 17.4 6.1 23.6s15.2 8.5 23.6 6.1l100-28.6c11.8-3.4 22.5-9.7 31.1-18.3L487 138.9c28.1-28.1 28.1-73.7 0-101.8L474.9 25C446.8-3.1 401.2-3.1 373.1 25zM88 64C39.4 64 0 103.4 0 152V424c0 48.6 39.4 88 88 88H360c48.6 0 88-39.4 88-88V312c0-13.3-10.7-24-24-24s-24 10.7-24 24V424c0 22.1-17.9 40-40 40H88c-22.1 0-40-17.9-40-40V152c0-22.1 17.9-40 40-40H200c13.3 0 24-10.7 24-24s-10.7-24-24-24H88z&#34;/&gt;&lt;/svg&gt;&lt;/span&gt;&#xA;    &lt;/div&gt;&#xA;    &lt;div class=&#34;block p-6 rounded-lg shadow-2xl flex-1 ms-6 mb-10 break-words&#34;&gt;&#xA;      &lt;div class=&#34;flex justify-between&#34;&gt;&#xA;        &#xA;          &lt;h2 class=&#34;mt-0&#34;&gt;v1.0.1 → Main&lt;/h2&gt;&#xA;        &#xA;        &#xA;      &lt;/div&gt;&#xA;      &#xA;        &lt;h4 class=&#34;mt-0&#34;&gt;&#xA;          2026-09-08&#xA;        &lt;/h4&gt;&#xA;      &#xA;      &lt;div class=&#34;mb-6&#34;&gt;&#xA;        Point release and the main line the later work branches from.&#xA;      &lt;/div&gt;&#xA;    &lt;/div&gt;&#xA;  &lt;/div&gt;&#xA;&lt;/li&gt;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&lt;li&gt;&#xA;  &lt;div class=&#34;flex&#34;&gt;&#xA;    &lt;div&#xA;      class=&#34;bg-primary-500 dark:bg-primary-300 text-neutral-50 dark:text-neutral-700 min-w-[30px] h-8 text-2xl flex items-center justify-center rounded-full ltr:-ml-12 rtl:-mr-[79px] mt-5&#34;&gt;&#xA;      &lt;span class=&#34;relative block icon&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;0 0 448 512&#34;&gt;&lt;path fill=&#34;currentColor&#34; d=&#34;M80 104c13.3 0 24-10.7 24-24s-10.7-24-24-24S56 66.7 56 80s10.7 24 24 24zm80-24c0 32.8-19.7 61-48 73.3V192c0 17.7 14.3 32 32 32H304c17.7 0 32-14.3 32-32V153.3C307.7 141 288 112.8 288 80c0-44.2 35.8-80 80-80s80 35.8 80 80c0 32.8-19.7 61-48 73.3V192c0 53-43 96-96 96H256v70.7c28.3 12.3 48 40.5 48 73.3c0 44.2-35.8 80-80 80s-80-35.8-80-80c0-32.8 19.7-61 48-73.3V288H144c-53 0-96-43-96-96V153.3C19.7 141 0 112.8 0 80C0 35.8 35.8 0 80 0s80 35.8 80 80zm208 24c13.3 0 24-10.7 24-24s-10.7-24-24-24s-24 10.7-24 24s10.7 24 24 24zM248 432c0-13.3-10.7-24-24-24s-24 10.7-24 24s10.7 24 24 24s24-10.7 24-24z&#34;/&gt;&lt;/svg&gt;&lt;/span&gt;&#xA;    &lt;/div&gt;&#xA;    &lt;div class=&#34;block p-6 rounded-lg shadow-2xl flex-1 ms-6 mb-10 break-words&#34;&gt;&#xA;      &lt;div class=&#34;flex justify-between&#34;&gt;&#xA;        &#xA;          &lt;h2 class=&#34;mt-0&#34;&gt;V3 → Mujoco branch&lt;/h2&gt;&#xA;        &#xA;        &#xA;      &lt;/div&gt;&#xA;      &#xA;        &lt;h4 class=&#34;mt-0&#34;&gt;&#xA;          2026-09-16&#xA;        &lt;/h4&gt;&#xA;      &#xA;      &lt;div class=&#34;mb-6&#34;&gt;&#xA;        The current design used by this twin — the version with the servo base block shown above.&#xA;      &lt;/div&gt;&#xA;    &lt;/div&gt;&#xA;  &lt;/div&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Onshape version history&lt;/th&gt;&#xA;          &lt;th&gt;Mate features&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;figure&gt;&lt;img&#xA;    class=&#34;my-0 rounded-md&#34;&#xA;    loading=&#34;lazy&#34;&#xA;    decoding=&#34;async&#34;&#xA;    fetchpriority=&#34;auto&#34;&#xA;    alt=&#34;Onshape version graph: Start, v1.0.0 MediaPipe, v1.0.1, Main, V3, Mujoco branch&#34;&#xA;    width=&#34;413&#34;&#xA;    height=&#34;475&#34;&#xA;    src=&#34;https://mulhamfetna.com/projects/ros2-tendon-driven-hand-mujoco-digital-twin-vision-teleoperation/onshape-to-mujoco/current_version_history.png&#34;&#xA;    srcset=&#34;https://mulhamfetna.com/projects/ros2-tendon-driven-hand-mujoco-digital-twin-vision-teleoperation/onshape-to-mujoco/current_version_history.png 800w, https://mulhamfetna.com/projects/ros2-tendon-driven-hand-mujoco-digital-twin-vision-teleoperation/onshape-to-mujoco/current_version_history.png 1280w&#34;&#xA;    sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;&#xA;    data-zoom-src=&#34;https://mulhamfetna.com/projects/ros2-tendon-driven-hand-mujoco-digital-twin-vision-teleoperation/onshape-to-mujoco/current_version_history.png&#34;&gt;&lt;/figure&gt;&#xA;&lt;/td&gt;&#xA;          &lt;td&gt;&lt;figure&gt;&lt;img&#xA;    class=&#34;my-0 rounded-md&#34;&#xA;    loading=&#34;lazy&#34;&#xA;    decoding=&#34;async&#34;&#xA;    fetchpriority=&#34;auto&#34;&#xA;    alt=&#34;Mate features list: dof_pinky_dip through dof_thumb_ip, then Fastened mates&#34;&#xA;    width=&#34;255&#34;&#xA;    height=&#34;750&#34;&#xA;    src=&#34;https://mulhamfetna.com/projects/ros2-tendon-driven-hand-mujoco-digital-twin-vision-teleoperation/onshape-to-mujoco/current_mate_list.png&#34;&#xA;    srcset=&#34;https://mulhamfetna.com/projects/ros2-tendon-driven-hand-mujoco-digital-twin-vision-teleoperation/onshape-to-mujoco/current_mate_list.png 800w, https://mulhamfetna.com/projects/ros2-tendon-driven-hand-mujoco-digital-twin-vision-teleoperation/onshape-to-mujoco/current_mate_list.png 1280w&#34;&#xA;    sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;&#xA;    data-zoom-src=&#34;https://mulhamfetna.com/projects/ros2-tendon-driven-hand-mujoco-digital-twin-vision-teleoperation/onshape-to-mujoco/current_mate_list.png&#34;&gt;&lt;/figure&gt;&#xA;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;&lt;em&gt;43 part instances, 112 mate features: the 15 &lt;code&gt;dof_*&lt;/code&gt; knuckle mates, the servo mates, and many &lt;code&gt;Fastened&lt;/code&gt; mates.&lt;/em&gt;&lt;/p&gt;</description>
      <media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://mulhamfetna.com/projects/ros2-tendon-driven-hand-mujoco-digital-twin-vision-teleoperation/onshape-to-mujoco/cover.png" />
    </item>
    
    <item>
      <title>From tutorial project to production robot: a roadmap for the tendon hand twin</title>
      <link>https://mulhamfetna.com/projects/ros2-tendon-driven-hand-mujoco-digital-twin-vision-teleoperation/roadmap-to-production/</link>
      <pubDate>Wed, 16 Sep 2026 00:00:00 +0000</pubDate>
      <author>contact@mulhamfetna.com (Mulham Fetna)</author>
      <guid>https://mulhamfetna.com/projects/ros2-tendon-driven-hand-mujoco-digital-twin-vision-teleoperation/roadmap-to-production/</guid>
      <description>&lt;div class=&#34;lead text-neutral-500 dark:text-neutral-400 !mb-9 text-xl&#34;&gt;&#xA;  The system works, and it teaches well. Getting it to drive real servos safely is a sequence of&#xA;well-scoped upgrades — each one grounded in a limitation measured earlier in this series.&#xA;&lt;/div&gt;&#xA;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Where it stands&#xA;    &lt;div id=&#34;where-it-stands&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#where-it-stands&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Area&lt;/th&gt;&#xA;          &lt;th&gt;Today&lt;/th&gt;&#xA;          &lt;th&gt;Production target&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Hand tracking&lt;/td&gt;&#xA;          &lt;td&gt;image-normalized landmarks, one global calibration&lt;/td&gt;&#xA;          &lt;td&gt;metric world landmarks, per-finger calibration, a temporal filter&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Command mapping&lt;/td&gt;&#xA;          &lt;td&gt;flexion → ±50 N; the twin is a switch&lt;/td&gt;&#xA;          &lt;td&gt;flexion → tendon length; proportional curl&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Physics model&lt;/td&gt;&#xA;          &lt;td&gt;force motors, decorative horns, no self-contact&lt;/td&gt;&#xA;          &lt;td&gt;position servos on horns, tuned stiffness, contacts for grasping&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Middleware&lt;/td&gt;&#xA;          &lt;td&gt;one topic, default QoS, open on the LAN&lt;/td&gt;&#xA;          &lt;td&gt;parameters, explicit QoS, a watchdog, SROS 2&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Containers&lt;/td&gt;&#xA;          &lt;td&gt;privileged, host namespaces, root, &lt;code&gt;xhost&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;least privilege, non-root, optional headless&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Code&lt;/td&gt;&#xA;          &lt;td&gt;classes copied into three files, no tests&lt;/td&gt;&#xA;          &lt;td&gt;one shared package, tests, CI&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Hardware&lt;/td&gt;&#xA;          &lt;td&gt;simulation only&lt;/td&gt;&#xA;          &lt;td&gt;a servo driver on the same topic&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;ol class=&#34;border-s-2 border-primary-500 dark:border-primary-300 list-none&#34;&gt;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&lt;li&gt;&#xA;  &lt;div class=&#34;flex&#34;&gt;&#xA;    &lt;div&#xA;      class=&#34;bg-primary-500 dark:bg-primary-300 text-neutral-50 dark:text-neutral-700 min-w-[30px] h-8 text-2xl flex items-center justify-center rounded-full ltr:-ml-12 rtl:-mr-[79px] mt-5&#34;&gt;&#xA;      &lt;span class=&#34;relative block icon&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;0 0 448 512&#34;&gt;&lt;path fill=&#34;currentColor&#34; d=&#34;M438.6 105.4C451.1 117.9 451.1 138.1 438.6 150.6L182.6 406.6C170.1 419.1 149.9 419.1 137.4 406.6L9.372 278.6C-3.124 266.1-3.124 245.9 9.372 233.4C21.87 220.9 42.13 220.9 54.63 233.4L159.1 338.7L393.4 105.4C405.9 92.88 426.1 92.88 438.6 105.4H438.6z&#34;/&gt;&lt;/svg&gt;&#xA;&lt;/span&gt;&#xA;    &lt;/div&gt;&#xA;    &lt;div class=&#34;block p-6 rounded-lg shadow-2xl flex-1 ms-6 mb-10 break-words&#34;&gt;&#xA;      &lt;div class=&#34;flex justify-between&#34;&gt;&#xA;        &#xA;          &lt;h2 class=&#34;mt-0&#34;&gt;Stage 1 · Correctness&lt;/h2&gt;&#xA;        &#xA;        &#xA;      &lt;/div&gt;&#xA;      &#xA;        &lt;h4 class=&#34;mt-0&#34;&gt;&#xA;          Measure the right thing, command the right quantity&#xA;        &lt;/h4&gt;&#xA;      &#xA;      &lt;div class=&#34;mb-6&#34;&gt;&#xA;        &lt;p&gt;&lt;strong&gt;World landmarks.&lt;/strong&gt; Image-normalized coordinates bend angles by up to 16° with hand orientation&#xA;(&lt;a href=&#34;https://mulhamfetna.com/projects/ros2-tendon-driven-hand-mujoco-digital-twin-vision-teleoperation/mediapipe-hands/&#34; &gt;Part 4&lt;/a&gt;).&#xA;Read &lt;code&gt;multi_hand_world_landmarks&lt;/code&gt; instead, then recalibrate.&lt;/p&gt;</description>
      <media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://mulhamfetna.com/projects/ros2-tendon-driven-hand-mujoco-digital-twin-vision-teleoperation/roadmap-to-production/cover.png" />
    </item>
    
    <item>
      <title>The manual MJCF edits that turn a CAD export into a tendon-driven hand</title>
      <link>https://mulhamfetna.com/projects/ros2-tendon-driven-hand-mujoco-digital-twin-vision-teleoperation/mjcf-edits/</link>
      <pubDate>Wed, 16 Sep 2026 00:00:00 +0000</pubDate>
      <author>contact@mulhamfetna.com (Mulham Fetna)</author>
      <guid>https://mulhamfetna.com/projects/ros2-tendon-driven-hand-mujoco-digital-twin-vision-teleoperation/mjcf-edits/</guid>
      <description>&lt;div class=&#34;lead text-neutral-500 dark:text-neutral-400 !mb-9 text-xl&#34;&gt;&#xA;  A raw CAD export gives you bodies, joints, meshes and sites — and a hand that does nothing. Four&#xA;edits and one extra file turn it into a tendon-driven twin. One of those edits, it turns out, does&#xA;nothing at all — which is worth understanding too.&#xA;&lt;/div&gt;&#xA;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Which edits survive a re-export&#xA;    &lt;div id=&#34;which-edits-survive-a-re-export&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#which-edits-survive-a-re-export&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;pre class=&#34;not-prose mermaid&#34;&gt;&#xA;flowchart TB&#xA;    subgraph generated[&#34;robot.xml — regenerated by onshape-to-robot&#34;]&#xA;        D[&#34;① joint defaults&lt;br&gt;manual — re-apply&#34;]&#xA;        T[&#34;② tendons + ③ contacts&lt;br&gt;auto-injected from tendons.xml&#34;]&#xA;        B[&#34;bodies · joints · sites · meshes&lt;br&gt;generated&#34;]&#xA;        A[&#34;④ actuators&lt;br&gt;manual — re-apply&#34;]&#xA;    end&#xA;    S[&#34;⑤ scene.xml&lt;br&gt;floor · lights · skybox&lt;br&gt;never regenerated&#34;] --&gt;|&#34;include robot.xml&#34;| generated&#xA;&lt;/pre&gt;&#xA;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;#&lt;/th&gt;&#xA;          &lt;th&gt;Edit&lt;/th&gt;&#xA;          &lt;th&gt;Lives in&lt;/th&gt;&#xA;          &lt;th&gt;Survives re-export?&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;①&lt;/td&gt;&#xA;          &lt;td&gt;Joint friction / armature / damping defaults&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;robot.xml&lt;/code&gt; &lt;code&gt;&amp;lt;default&amp;gt;&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;✘ re-apply&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;②&lt;/td&gt;&#xA;          &lt;td&gt;Flexor + extensor spatial tendons&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;tendons.xml&lt;/code&gt; → injected&lt;/td&gt;&#xA;          &lt;td&gt;✔&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;③&lt;/td&gt;&#xA;          &lt;td&gt;Contact exclusions&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;tendons.xml&lt;/code&gt; → injected&lt;/td&gt;&#xA;          &lt;td&gt;✔&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;④&lt;/td&gt;&#xA;          &lt;td&gt;Five tendon motors&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;robot.xml&lt;/code&gt; &lt;code&gt;&amp;lt;actuator&amp;gt;&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;✘ re-apply&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;⑤&lt;/td&gt;&#xA;          &lt;td&gt;Environment&lt;/td&gt;&#xA;          &lt;td&gt;&lt;code&gt;scene.xml&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;✔ separate file&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;&lt;code&gt;tendons.xml&lt;/code&gt; is kept byte-identical to the &lt;code&gt;&amp;lt;tendon&amp;gt;&lt;/code&gt; and &lt;code&gt;&amp;lt;contact&amp;gt;&lt;/code&gt; region of &lt;code&gt;robot.xml&lt;/code&gt;. Tune a&#xA;tendon in &lt;code&gt;robot.xml&lt;/code&gt; without copying it back and the next export silently reverts it.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;① Joint defaults — stability&#xA;    &lt;div id=&#34;-joint-defaults--stability&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#-joint-defaults--stability&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight-wrapper&#34;&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-xml&#34; data-lang=&#34;xml&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nt&#34;&gt;&amp;lt;default&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;class=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;ros2-tendon-driven-hand-gazebo-digital-twin&amp;#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  &lt;span class=&#34;nt&#34;&gt;&amp;lt;joint&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;frictionloss=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;0.001&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;armature=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;0.0001&amp;#34;&lt;/span&gt; &lt;span class=&#34;na&#34;&gt;damping=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;&amp;#34;0.01&amp;#34;&lt;/span&gt;&lt;span class=&#34;nt&#34;&gt;/&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;Attribute&lt;/th&gt;&#xA;          &lt;th&gt;Value&lt;/th&gt;&#xA;          &lt;th&gt;Role&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;damping&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;0.01 N·m·s/rad&lt;/td&gt;&#xA;          &lt;td&gt;stops a 2 g phalanx reaching absurd speed when 50 N yanks it&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;armature&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;0.0001 kg·m²&lt;/td&gt;&#xA;          &lt;td&gt;rotor-like inertia on each joint&amp;rsquo;s diagonal — conditions the solver for very light bodies&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;&lt;code&gt;frictionloss&lt;/code&gt;&lt;/td&gt;&#xA;          &lt;td&gt;0.001 N·m&lt;/td&gt;&#xA;          &lt;td&gt;a small dry-friction dead-band so joints settle instead of creeping&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;Phalanges weigh &lt;strong&gt;1.8–5.4 g&lt;/strong&gt;. Without these, tiny inertias under large tendon forces blow up the&#xA;integrator — an earlier, larger revision of the model logged&#xA;&lt;code&gt;Nan, Inf or huge value in QACC at DOF 128. The simulation is unstable.&lt;/code&gt;&lt;/p&gt;</description>
      <media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://mulhamfetna.com/projects/ros2-tendon-driven-hand-mujoco-digital-twin-vision-teleoperation/mjcf-edits/cover.png" />
    </item>
    
    <item>
      <title>Underactuation: why three knuckle angles become one tendon command</title>
      <link>https://mulhamfetna.com/projects/ros2-tendon-driven-hand-mujoco-digital-twin-vision-teleoperation/underactuation-averaging/</link>
      <pubDate>Wed, 16 Sep 2026 00:00:00 +0000</pubDate>
      <author>contact@mulhamfetna.com (Mulham Fetna)</author>
      <guid>https://mulhamfetna.com/projects/ros2-tendon-driven-hand-mujoco-digital-twin-vision-teleoperation/underactuation-averaging/</guid>
      <description>&lt;div class=&#34;lead text-neutral-500 dark:text-neutral-400 !mb-9 text-xl&#34;&gt;&#xA;  &lt;code&gt;avg_angle = np.mean(angles)&lt;/code&gt; looks like noise filtering. It isn&amp;rsquo;t. It is a mechanical decision: a&#xA;human finger has three joints you can move separately, and this robot finger has one string.&#xA;&lt;/div&gt;&#xA;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;Not smoothing — compression&#xA;    &lt;div id=&#34;not-smoothing--compression&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#not-smoothing--compression&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;&amp;ldquo;Averaging&amp;rdquo; in a sensor pipeline usually means averaging over &lt;strong&gt;time&lt;/strong&gt; to reduce noise. Nothing here&#xA;keeps history between frames. The mean is taken &lt;strong&gt;across space&lt;/strong&gt; — over the three joints of one&#xA;finger in a single frame — to solve a problem called &lt;strong&gt;underactuation&lt;/strong&gt;.&lt;/p&gt;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The 3-to-1 problem&#xA;    &lt;div id=&#34;the-3-to-1-problem&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#the-3-to-1-problem&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;table&gt;&#xA;  &lt;thead&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;th&gt;&lt;/th&gt;&#xA;          &lt;th&gt;Human finger&lt;/th&gt;&#xA;          &lt;th&gt;Robot finger&lt;/th&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/thead&gt;&#xA;  &lt;tbody&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Joints&lt;/td&gt;&#xA;          &lt;td&gt;3 (MCP, PIP, DIP)&lt;/td&gt;&#xA;          &lt;td&gt;3 hinges (&lt;code&gt;*_mcp&lt;/code&gt;, &lt;code&gt;*_pip&lt;/code&gt;, &lt;code&gt;*_dip&lt;/code&gt;)&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Independent actuators&lt;/td&gt;&#xA;          &lt;td&gt;many muscles; joints move semi-independently&lt;/td&gt;&#xA;          &lt;td&gt;&lt;strong&gt;1 flexor tendon, 1 motor&lt;/strong&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;      &lt;tr&gt;&#xA;          &lt;td&gt;Degrees of freedom you can command&lt;/td&gt;&#xA;          &lt;td&gt;~3&lt;/td&gt;&#xA;          &lt;td&gt;&lt;strong&gt;1&lt;/strong&gt;&lt;/td&gt;&#xA;      &lt;/tr&gt;&#xA;  &lt;/tbody&gt;&#xA;&lt;/table&gt;&#xA;&lt;p&gt;A system with fewer actuators than joints is &lt;strong&gt;underactuated&lt;/strong&gt;. A single tendon threads all three&#xA;joints of each robot finger, so the only command is &lt;em&gt;&amp;ldquo;pull this string with force F&amp;rdquo;&lt;/em&gt; — and the&#xA;joints share that pull according to routing geometry and dynamics.&lt;/p&gt;&#xA;&lt;figure&gt;&lt;img&#xA;    class=&#34;my-0 rounded-md&#34;&#xA;    loading=&#34;lazy&#34;&#xA;    decoding=&#34;async&#34;&#xA;    fetchpriority=&#34;auto&#34;&#xA;    alt=&#34;The index finger&amp;rsquo;s single flexor tendon threaded through six labelled sites from palm to fingertip&#34;&#xA;    width=&#34;1280&#34;&#xA;    height=&#34;960&#34;&#xA;    src=&#34;https://mulhamfetna.com/projects/ros2-tendon-driven-hand-mujoco-digital-twin-vision-teleoperation/underactuation-averaging/tendon_routing_index_hu_2b0b115de9facdf8.png&#34;&#xA;    srcset=&#34;https://mulhamfetna.com/projects/ros2-tendon-driven-hand-mujoco-digital-twin-vision-teleoperation/underactuation-averaging/tendon_routing_index_hu_2b0b115de9facdf8.png 800w, https://mulhamfetna.com/projects/ros2-tendon-driven-hand-mujoco-digital-twin-vision-teleoperation/underactuation-averaging/tendon_routing_index.png 1280w&#34;&#xA;    sizes=&#34;(min-width: 768px) 50vw, 65vw&#34;&#xA;    data-zoom-src=&#34;https://mulhamfetna.com/projects/ros2-tendon-driven-hand-mujoco-digital-twin-vision-teleoperation/underactuation-averaging/tendon_routing_index.png&#34;&gt;&lt;figcaption&gt;One string, six via-points, three joints. Pull it and all three knuckles move together.&lt;/figcaption&gt;&lt;/figure&gt;&#xA;&lt;p&gt;So the vision layer must compress &lt;strong&gt;three human measurements into one robot command&lt;/strong&gt;.&lt;/p&gt;</description>
      <media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://mulhamfetna.com/projects/ros2-tendon-driven-hand-mujoco-digital-twin-vision-teleoperation/underactuation-averaging/cover.png" />
    </item>
    
    <item>
      <title>A webcam, some vector geometry, and a hand that moves</title>
      <link>https://mulhamfetna.com/projects/ros2-mediapipe-robotic-hand-digital-twin-vision-teleoperation/overview/</link>
      <pubDate>Tue, 08 Sep 2026 00:00:00 +0000</pubDate>
      <author>contact@mulhamfetna.com (Mulham Fetna)</author>
      <guid>https://mulhamfetna.com/projects/ros2-mediapipe-robotic-hand-digital-twin-vision-teleoperation/overview/</guid>
      <description>&lt;div class=&#34;lead text-neutral-500 dark:text-neutral-400 !mb-9 text-xl&#34;&gt;&#xA;  Everything in this series in one read: how a $20 webcam ends up driving a 15-DOF CAD model in&#xA;real time, why every step is deliberately explicit rather than learned, and what broke along the&#xA;way.&#xA;&lt;/div&gt;&#xA;&#xA;&lt;p&gt;You hold your hand up to a laptop camera. On the other half of the screen, a robotic hand —&#xA;designed in CAD, never manufactured — closes its fingers at the same moment yours do.&lt;/p&gt;&#xA;&lt;p&gt;There is no glove, no marker, no depth sensor. Just an RGB webcam, two small neural networks,&#xA;about forty lines of vector geometry, and a middleware stack that thinks it is talking to a real&#xA;robot.&lt;/p&gt;&#xA;&lt;p&gt;All of it is open source under AGPL-3.0 and archived with a DOI:&#xA;&lt;a href=&#34;https://doi.org/10.5281/zenodo.22658556&#34;  target=&#34;_blank&#34; rel=&#34;noreferrer&#34;&gt;10.5281/zenodo.22658556&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;pre class=&#34;not-prose mermaid&#34;&gt;&#xA;flowchart LR&#xA;    A[&#34;📷 Webcam&lt;br&gt;/dev/video0&#34;] --&gt; B[&#34;BlazePalm&lt;br&gt;palm detector&#34;]&#xA;    B --&gt; C[&#34;Landmark regressor&lt;br&gt;21 × (x, y, z)&#34;]&#xA;    C --&gt; D[&#34;Dot-product geometry&lt;br&gt;15 interior angles&#34;]&#xA;    D --&gt; E[&#34;Normalize → flexion&lt;br&gt;0.0 straight · 1.0 curled&#34;]&#xA;    E --&gt; F[&#34;Lerp onto the URDF&#39;s&lt;br&gt;mechanical limits&#34;]&#xA;    F --&gt; G[&#34;/joint_states&#34;]&#xA;    G --&gt; H[&#34;robot_state_publisher&lt;br&gt;→ /tf&#34;]&#xA;    H --&gt; I[&#34;🖥️ RViz digital twin&#34;]&#xA;&lt;/pre&gt;&#xA;&#xA;&#xA;&lt;h2 class=&#34;relative group&#34;&gt;The rule that shaped the build&#xA;    &lt;div id=&#34;the-rule-that-shaped-the-build&#34; class=&#34;anchor&#34;&gt;&lt;/div&gt;&#xA;    &#xA;    &lt;span&#xA;        class=&#34;absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none&#34;&gt;&#xA;        &lt;a class=&#34;text-primary-300 dark:text-neutral-700 !no-underline&#34; href=&#34;#the-rule-that-shaped-the-build&#34; aria-label=&#34;Anchor&#34;&gt;#&lt;/a&gt;&#xA;    &lt;/span&gt;&#xA;    &#xA;&lt;/h2&gt;&#xA;&lt;p&gt;There is an easier version of this project. Collect a few thousand frames of a hand next to the&#xA;corresponding CAD poses, train a network to map one to the other, and let gradient descent work out&#xA;the relationship.&lt;/p&gt;</description>
      <media:content xmlns:media="http://search.yahoo.com/mrss/" url="https://mulhamfetna.com/projects/ros2-mediapipe-robotic-hand-digital-twin-vision-teleoperation/overview/featured.png" />
    </item>
    
    <item>
      <title>Code-to-CAD: Generating a 15×15 Microneedle Array Four Ways</title>
      <link>https://mulhamfetna.com/tutorials-guides/code-to-cad-microneedle-array/</link>
      <pubDate>Mon, 07 Sep 2026 00:00:00 +0000</pubDate>
      <author>contact@mulhamfetna.com (Mulham Fetna)</author>
      <guid>https://mulhamfetna.com/tutorials-guides/code-to-cad-microneedle-array/</guid>
      <description>The same 15×15 microneedle array, generated four ways in code. The interesting part isn&amp;rsquo;t the loops — it&amp;rsquo;s that three of the four scripts refuse to merge the 225 cones into the baseplate at all, and hand that job to the slicer instead.</description>
      
    </item>
    
    <item>
      <title>Beyond the Mold: The Manufacturing Constraints of Bone Scaffolds</title>
      <link>https://mulhamfetna.com/research/printing-bone-scaffolds/</link>
      <pubDate>Sat, 29 Aug 2026 00:00:00 +0000</pubDate>
      <author>contact@mulhamfetna.com (Mulham Fetna)</author>
      <guid>https://mulhamfetna.com/research/printing-bone-scaffolds/</guid>
      <description>The manufacturing route behind a published bone scaffold, and an honest comparison against direct ink writing, electrospinning and vat photopolymerisation.</description>
      
    </item>
    
    <item>
      <title>Treating a Biomaterial Like a Machine: The Closed-Loop Bone Scaffold</title>
      <link>https://mulhamfetna.com/research/bone-scaffold-closed-loop/</link>
      <pubDate>Sat, 29 Aug 2026 00:00:00 +0000</pubDate>
      <author>contact@mulhamfetna.com (Mulham Fetna)</author>
      <guid>https://mulhamfetna.com/research/bone-scaffold-closed-loop/</guid>
      <description>Sensor, controller, actuator — all three built into a crystal lattice. What a triple-doped hydroxyapatite scaffold looks like when you read it as a control system.</description>
      
    </item>
    
  </channel>
</rss>
