<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>ROS2 on Mahdi Sarfarazi</title>
    <link>https://mahdisf.ir/tags/ros2/</link>
    <description>Recent content in ROS2 on Mahdi Sarfarazi</description>
    <image>
      <title>Mahdi Sarfarazi</title>
      <url>https://mahdisf.ir/images/social-card.png</url>
      <link>https://mahdisf.ir/images/social-card.png</link>
    </image>
    <generator>Hugo</generator>
    <language>en-US</language>
    <lastBuildDate>Mon, 01 Jun 2026 00:00:00 +0000</lastBuildDate>
    <atom:link href="https://mahdisf.ir/tags/ros2/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Adaptive sit-to-stand assistance for the FUM-NEXA knee exoskeleton</title>
      <link>https://mahdisf.ir/projects/fuzzy-aan-knee-exoskeleton/</link>
      <pubDate>Sat, 23 Aug 2025 00:00:00 +0000</pubDate>
      <guid>https://mahdisf.ir/projects/fuzzy-aan-knee-exoskeleton/</guid>
      <description>Real-time ROS2 control for a knee exoskeleton that adapts sit-to-stand assistance to the user&amp;#39;s measured motion. Engineering prototype; first-author preprint.</description>
      <content:encoded><![CDATA[<div class="case-summary">
<p>A fuzzy &ldquo;Strength Index&rdquo; adapts knee-exoskeleton torque in real time while the user stands up from a chair. In a five-person engineering study it cut measured muscle effort by 30% at slow speed, with smaller gains at faster speeds.</p>
<p>This is a research prototype from FUM CARE. I am first author of a <a href="https://doi.org/10.2139/ssrn.6335794">preprint on SSRN</a>, which has not been peer-reviewed. The study was an engineering evaluation and was not clinical.</p>
</div>
<dl class="snapshot">
  <div><dt>My role</dt><dd>Project manager and first author, in a university research team</dd></div>
  <div><dt>Device</dt><dd>FUM-NEXA: passive hip and actuated knee joint per leg</dd></div>
  <div><dt>Task</dt><dd>Standing up from a 46 cm chair</dd></div>
  <div><dt>Runtime</dt><dd>Raspberry Pi 4B, ROS2 (Python/C++), CAN motor control</dd></div>
  <div><dt>Evaluation</dt><dd>5 healthy subjects × 3 speeds × 3 device conditions</dd></div>
</dl>
<h2 id="the-problem">The problem</h2>
<p>Fixed torque profiles are simple to deploy, but they can&rsquo;t tell a user who is moving faster than the reference from one who needs substantial help. A rehabilitation device also has to avoid the opposite failure: giving so much torque that the user stops contributing.</p>
<p>The project had to meet several constraints at once:</p>
<ul>
<li>estimate how much help is needed from signals available on the robot, without continuous EMG control;</li>
<li>adapt torque <em>during</em> the movement as well as between sessions;</li>
<li>run on a Raspberry Pi-class computer with a small sensor and actuator set;</li>
<li>start assisting at the right moment, close to lifting off the chair;</li>
<li>show that the device reduces effort <strong>after</strong> accounting for its own weight and inertia.</li>
</ul>
<p>The last constraint turned out to matter most. Wearing the exoskeleton with the motors off <em>increased</em> measured muscle effort by about 40%, so the controller had to more than offset the device&rsquo;s own burden before it could help.</p>
<h2 id="my-role">My role</h2>
<p>I was project manager and first author. It was a team project at FUM CARE, and I was not the sole designer, fabricator or experimenter.</p>
<p>I developed the control concept, meaning the Strength Index, the fuzzy rule base and the torque-scaling policy. I connected the controller to ROS2, the CAN sensors and actuators, real-time filtering and logging. I coordinated the control, mechanical, experimental and writing work needed to get from concept to a working prototype, and helped structure the three device conditions and three speeds used for validation. I also wrote the manuscript and prepared its figures.</p>
<h2 id="main-design-decisions">Main design decisions</h2>
<p>The controller estimates how much help the user needs from hip and knee velocity errors and torque feedback, without EMG. That estimate of the user&rsquo;s capability is indirect, but it needs no extra sensors on the body.</p>
<p>It scales a reference torque using the index: assistive torque = desired torque × (1 − Strength Index). The movement target stays the same while the amount of help changes.</p>
<p>We chose a small rule base. Nine fuzzy rules run comfortably on a Raspberry Pi and are easy to inspect and tune, which suited a small team and limited compute better than a learned model.</p>
<p>Assistance starts at chair lift-off. The right torque at the wrong phase of the movement is still a bad experience, so we treated the trigger point as a requirement.</p>
<p>The evaluation included a motors-off condition, which separated the device&rsquo;s burden from the controller&rsquo;s benefit.</p>
<p><img alt="The four phases of standing up and the assistance trigger point near chair lift-off" loading="lazy" src="/projects/fuzzy-aan-knee-exoskeleton/sts-trigger-phases.jpg"></p>
<p><em>The four sit-to-stand phases, with the trigger point near chair lift-off.</em></p>
<h2 id="results">Results</h2>
<p>Average change in muscle effort (EMG IRMS) across the five subjects, relative to standing up without the exoskeleton. Positive values mean less effort.</p>
<table>
  <thead>
      <tr>
          <th>Condition</th>
          <th>Speed</th>
          <th style="text-align: right">Effort change</th>
          <th style="text-align: right">Variability change</th>
      </tr>
  </thead>
  <tbody>
      <tr>
          <td>Assistance on (50% setting)</td>
          <td>Slow</td>
          <td style="text-align: right">30.34% less</td>
          <td style="text-align: right">33.81% less</td>
      </tr>
      <tr>
          <td>Assistance on (50% setting)</td>
          <td>Normal</td>
          <td style="text-align: right">13.20% less</td>
          <td style="text-align: right">16.45% less</td>
      </tr>
      <tr>
          <td>Assistance on (50% setting)</td>
          <td>Fast</td>
          <td style="text-align: right">7.59% less</td>
          <td style="text-align: right">14.10% less</td>
      </tr>
      <tr>
          <td>Motors off</td>
          <td>Slow</td>
          <td style="text-align: right">41.21% more</td>
          <td style="text-align: right">30.09% more</td>
      </tr>
      <tr>
          <td>Motors off</td>
          <td>Normal</td>
          <td style="text-align: right">38.70% more</td>
          <td style="text-align: right">36.17% more</td>
      </tr>
      <tr>
          <td>Motors off</td>
          <td>Fast</td>
          <td style="text-align: right">40.87% more</td>
          <td style="text-align: right">42.53% more</td>
      </tr>
  </tbody>
</table>
<p>Assistance reduced measured effort at all three speeds. The benefit was largest at slow speed, where help matters most for users who struggle to follow the reference, and it shrank at fast speed, so the controller was not equally effective everywhere. The device&rsquo;s own burden was large enough that the results could only be interpreted against the motors-off condition.</p>
<div class="callout">
<p>Five healthy subjects are not a clinical cohort. These results show engineering feasibility and say nothing yet about rehabilitation efficacy. The study did not report latency, confidence intervals, statistical significance, actuator safety margins or long-term reliability. The next step would need more and more varied participants, comfort and safety measures, and repeatability data.</p>
</div>
<p><img alt="Assistive torque follows the shape of the full desired torque profile at lower magnitude at slow, normal and fast speeds" loading="lazy" src="/projects/fuzzy-aan-knee-exoskeleton/aan-torque-profile.png"></p>
<p><em>The adaptive torque keeps the shape of the reference profile at a lower magnitude across the three speeds.</em></p>
<h2 id="what-i-took-into-product-work">What I took into product work</h2>
<p>A feature can make things worse before it helps, so I now try to measure the cost of adopting a product separately from the value of using it.</p>
<p>Timing belongs in the requirements. Correct output delivered at the wrong moment still fails the user.</p>
<p>Limited compute and sensing pushed this design toward a small controller that is easy to explain, and that worked in its favour.</p>
<h2 id="technical-detail">Technical detail</h2>
<details>
<summary>How the Strength Index works</summary>
<p>The controller represents the user&rsquo;s instantaneous capability as a value between 0 and 1. It takes three inputs: knee angular-velocity error, hip angular-velocity error, and the difference between desired and delivered assistive torque. Each input maps to Negative, Zero or Positive fuzzy sets, and the output uses five bands. A nine-rule Mamdani system combines them, using the minimum for rule firing and centroid defuzzification.</p>
<p>When the user keeps up with the reference, the index rises and assistance falls. When the user lags, or the robot isn&rsquo;t delivering the expected torque, the index falls and assistance rises.</p>
<p>The desired hip and knee velocity profiles are sixth-degree polynomials fitted to 20 normal sit-to-stand motions from able-bodied data. A normalized knee torque-angle profile provides the full-assistance reference, which the index scales.</p>
</details>
<details>
<summary>Runtime architecture</summary>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-text" data-lang="text"><span class="line"><span class="cl">CAN sensor data
</span></span><span class="line"><span class="cl">  → filter joint velocity and torque
</span></span><span class="line"><span class="cl">  → compute motion and torque errors
</span></span><span class="line"><span class="cl">  → fuzzy Strength Index → scale desired torque
</span></span><span class="line"><span class="cl">  → motor-driver PID → CAN → knee BLDC actuators
</span></span><span class="line"><span class="cl">  → log sensor, motor and controller data
</span></span></code></pre></div><p>The controller is written in Python, with C++ ROS2 nodes for CAN reading and motor commands (SocketCAN). Real-time second-order Butterworth filters, configured for a 400 Hz sampling assumption, use a 5 Hz cutoff for hip velocity and 10 Hz for knee velocity and torque feedback.</p>
<p><img alt="Functional ROS2 architecture for sensor acquisition, fuzzy control, motor commands and logging" loading="lazy" src="/projects/fuzzy-aan-knee-exoskeleton/ros2-architecture.svg"></p>
</details>
<details>
<summary>Experimental protocol</summary>
<p>Five healthy subjects stood up from a 46 cm chair at three target speeds (slow 20°/s, normal 35°/s, fast 60°/s) under three conditions: no exoskeleton, exoskeleton with motors off, and exoskeleton with assistance at the 50% setting. EMG was recorded from the vastus lateralis, semimembranosus and hamstrings. The analysis used IRMS as a measure of overall muscle effort, signal standard deviation for variability, and percentage change from the no-exoskeleton baseline.</p>
<p><img alt="Processed vastus lateralis EMG for the nine speed and condition combinations" loading="lazy" src="/projects/fuzzy-aan-knee-exoskeleton/emg-results.png"></p>
</details>
<details>
<summary>Hardware and software stack</summary>
<ul>
<li>Two T-Motor BLDC knee actuators (rated up to 48 Nm) with magnetic joint encoders</li>
<li>Raspberry Pi 4B running ROS2</li>
<li>Python, C++, NumPy, SciPy and scikit-fuzzy</li>
<li>CAN bus for sensor acquisition and motor commands</li>
<li>Fuzzy assistance controller on top, PID torque control on the motor driver</li>
</ul>
</details>
<h2 id="publication">Publication</h2>
<p>S. M. Sarfarazi, S. Farhadi, H. Sabzali, M. H. Gheshlaghi, I. Kardan and A. Akbarzadeh, &ldquo;A Fuzzy Strength Index for Adaptive Assist-as-Needed Control of a Knee Exoskeleton Robot to Enhance Sit-to-Stand Transition,&rdquo; SSRN preprint, posted March 2026. <a href="https://doi.org/10.2139/ssrn.6335794">doi:10.2139/ssrn.6335794</a>. The preprint has not been peer-reviewed. Code and video are not public.</p>
]]></content:encoded>
    </item>
    <item>
      <title>LLM-powered robotic task planning</title>
      <link>https://mahdisf.ir/projects/llm-powered-robotic-task-planning/</link>
      <pubDate>Mon, 01 Jun 2026 00:00:00 +0000</pubDate>
      <guid>https://mahdisf.ir/projects/llm-powered-robotic-task-planning/</guid>
      <description>Personal experiment: translating natural-language instructions into ROS2 actions for a simulated robotic arm in Gazebo, using the Gemini API.</description>
      <content:encoded><![CDATA[<p>This is a personal experiment in connecting a language model to a robot safely. The model proposes a plan, and ROS2 executes it on a simulated arm.</p>
<p><img alt="Diagram: a natural-language instruction goes to an LLM planner, which produces ROS2 actions for a simulated arm in Gazebo." loading="lazy" src="/projects/llm-powered-robotic-task-planning/architecture.svg"></p>
<h2 id="what-it-does">What it does</h2>
<p>It takes an instruction in plain language and uses the Gemini API to turn it into a sequence of ROS2 actions, which then run on a simulated robotic arm in Gazebo.</p>
<h2 id="status-and-limits">Status and limits</h2>
<p>This is an early-stage experiment. It has no formal evaluation yet, and the code is not public. I&rsquo;ll update this page with a repository, the supported task set and results when there is something worth measuring.</p>
<p>The same question drives <a href="/projects/vigenx-agentic-video-editor/">ViGenX</a>: how to let a language model plan while keeping execution verifiable.</p>
]]></content:encoded>
    </item>
    <item>
      <title>June 2026 – LLM Planning &amp; New Directions</title>
      <link>https://mahdisf.ir/logs/june-2026-update/</link>
      <pubDate>Mon, 01 Jun 2026 00:00:00 +0000</pubDate>
      <guid>https://mahdisf.ir/logs/june-2026-update/</guid>
      <description>Working on LLM-powered task planning, exploring VLA models, and building a sim benchmark.</description>
      <content:encoded><![CDATA[<h3 id="building">Building</h3>
<p>Working on LLM-powered robotic task planning systems that translate natural-language commands into executable ROS2 action sequences for simulated manipulators. The goal: making robots that can take verbal instructions and turn them into safe, verifiable motion plans.</p>
<h3 id="learning">Learning</h3>
<p>Exploring diffusion-based robot policies and vision-language-action (VLA) models — particularly how they can replace hand-coded task planners in unstructured environments. Also getting deeper into Isaac Sim for large-scale sim-to-real workflows.</p>
<h3 id="reading">Reading</h3>
<ul>
<li><em>Probabilistic Robotics</em> — Thrun, Burgard &amp; Fox (finally finishing it)</li>
<li>Recent papers from CoRL 2025 on world models for robot learning</li>
<li><em>The Art of Doing Science and Engineering</em> — Richard Hamming</li>
</ul>
<h3 id="side-project">Side Project</h3>
<p>Building a small robotics simulation benchmark for evaluating LLM planners across a variety of household manipulation tasks — dishes, drawers, object sorting. Planning to release it as open source.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Starting This Blog</title>
      <link>https://mahdisf.ir/posts/starting-this-blog/</link>
      <pubDate>Wed, 27 May 2026 09:00:00 +0330</pubDate>
      <guid>https://mahdisf.ir/posts/starting-this-blog/</guid>
      <description>Why I am keeping a technical blog about robotics, AI, simulation, and control.</description>
      <content:encoded><![CDATA[<p>This blog is a place for concise technical notes from my work in AI and robotics.</p>
<p>The topics I plan to write about include ROS2 software architecture, reinforcement learning for control, Isaac Gym and Gazebo simulation workflows, multimodal robot data pipelines, and the practical details of connecting LLMs and VLMs to robotic systems.</p>
<p>My goal is to keep the writing useful: implementation notes, design decisions, experiments, lessons from hardware integration, and research summaries that can help another engineer reproduce or improve the work.</p>
]]></content:encoded>
    </item>
    <item>
      <title>ROS2 Simulation and System Log</title>
      <link>https://mahdisf.ir/logs/robotics-simulation-log/</link>
      <pubDate>Sat, 18 Jan 2025 00:00:00 +0000</pubDate>
      <guid>https://mahdisf.ir/logs/robotics-simulation-log/</guid>
      <description>A short log entry covering ROS2 simulation updates and system observations.</description>
      <content:encoded><![CDATA[<p>Today I tested the ROS2 planning stack in Gazebo with a simulated manipulator. The robot completed the pick-and-place behavior, but the controller still needs a tighter feedback loop for fine-grained placement.</p>
<ul>
<li>Added a new <code>lifecycle</code> node for state management.</li>
<li>Logged delay spikes from the joint trajectory action.</li>
<li>Verified collision boundaries in the simulator.</li>
</ul>
]]></content:encoded>
    </item>
  </channel>
</rss>
