<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Jason Duan | Projects]]></title><description><![CDATA[Vision-Guided Grasping and Real-Time Hand Tracking for a Robotic Gripper, Based on published model]]></description><link>https://summerproject1.hashnode.dev</link><generator>RSS for Node</generator><lastBuildDate>Tue, 03 Nov 2026 00:44:38 GMT</lastBuildDate><atom:link href="https://summerproject1.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Designing a Low-Cost Hip-Assisting Exoskeleton]]></title><description><![CDATA[Exploring wearable robotics through mechanical design, sensor-based control, and rapid prototyping. The idea for this project came from a personal…]]></description><link>https://summerproject1.hashnode.dev/designing-a-low-cost-hip-assisting-exoskeleton</link><guid isPermaLink="true">https://summerproject1.hashnode.dev/designing-a-low-cost-hip-assisting-exoskeleton</guid><category><![CDATA[Exoskeleton]]></category><category><![CDATA[arduino]]></category><dc:creator><![CDATA[Jason Duan]]></dc:creator><pubDate>Tue, 13 Oct 2026 03:10:15 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6acd57353c97869368205345/895ad1a8-3fa1-476e-8e2c-779cefadf10c.jpg" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Exploring wearable robotics through mechanical design, sensor-based control, and rapid prototyping.</em></p>
<p>The idea for this project came from a personal experience. After a hip injury limited my mother's mobility, I began thinking about whether a relatively simple wearable device could make everyday movement easier. That question led me to build a <strong>hip-assisting exoskeleton prototype</strong> using an Arduino, a geared DC motor, pressure sensing, and custom-fabricated metal components.</p>
<h2>Starting with Simple Prototypes</h2>
<p>I began by exploring how sensors could detect a person's movement and trigger mechanical assistance. My first experiment used a <strong>flex sensor, an Arduino, and a servo motor</strong> to support finger motion. Changes in the sensor's resistance were converted into motor commands, helping me understand the basic relationship between human movement and actuator response.</p>
<p>I then built an early leg-assistance prototype with <strong>VEX components</strong>. The motor could help lift my leg, but securing the mechanism with rubber bands was uncomfortable and unstable. That experience showed me that an exoskeleton must solve two problems at once: generating useful torque and transferring that torque comfortably to the body.</p>
<p><a class="embed-card" href="https://www.youtube.com/watch?v=gF1N3RdrTAs">https://www.youtube.com/watch?v=gF1N3RdrTAs</a></p>

<h2>Building the Hip-Assisting System</h2>
<p>The redesigned prototype has three main parts: a <strong>waist-mounted belt, an adjustable leg strap, and an electronics module</strong>.</p>
<p>I designed the structural components for <strong>plasma cutting</strong>. The waist attachment connects to a weightlifting belt to provide a stable base, while the leg support uses Velcro straps and multiple mounting holes for adjustability. Folded metal sections reinforce the structure around the motor connection.</p>
<p>For actuation, I selected a <strong>12 V, 12 RPM worm-gear DC motor</strong> rated at approximately <strong>70 kgf·cm (about 7 N·m)</strong> of torque. A <strong>BTS7960 motor driver</strong> controls motor direction and speed, while an <strong>Arduino</strong> manages the sensor readings and control logic.</p>
<p>A thin-film pressure sensor mounted near the leg strap detects changes in applied pressure as the wearer moves. I used a logarithmic transformation and smoothing in the Arduino code to make the sensor signal more suitable for control. The goal is to detect movement intent and provide assistance at the appropriate time.</p>
<p><a class="embed-card" href="https://www.youtube.com/watch?v=oO3eecIydOg">https://www.youtube.com/watch?v=oO3eecIydOg</a></p>

<h2>What I Learned</h2>
<p>This project was a <strong>proof of concept</strong>, not a clinically validated mobility aid. Although the motor's rated torque is roughly 7% of a 100 N·m reference hip torque, that comparison does not establish how much assistance a wearer actually receives. Similarly, preliminary estimates of reduced walking effort still need controlled testing.</p>
<p>The biggest lesson was that wearable robotics is as much about <strong>ergonomics, load paths, and reliable sensing</strong> as it is about programming. A working actuator is only one part of a useful exoskeleton.</p>
<p>My next steps would be to reduce structural weight, improve attachment comfort, explore <strong>EMG-based movement-intent sensing</strong>, and evaluate stronger motors and closed-loop control. Ultimately, I hope to develop a more practical and accessible system for people with limited lower-limb mobility.</p>
]]></content:encoded></item><item><title><![CDATA[Automating Robot Joint Scans with a SolidWorks Add-In]]></title><description><![CDATA[Building a C# engineering tool to sweep joint angles, capture fingertip coordinates, and check mechanical interference. Tech stack: C#, SolidWorks API, COM…]]></description><link>https://summerproject1.hashnode.dev/automating-robot-joint-scans-with-a-solidworks-add-in</link><guid isPermaLink="true">https://summerproject1.hashnode.dev/automating-robot-joint-scans-with-a-solidworks-add-in</guid><category><![CDATA[Solidwork-api]]></category><category><![CDATA[C++]]></category><category><![CDATA[inverse kinematics]]></category><category><![CDATA[CAD Automation]]></category><dc:creator><![CDATA[Jason Duan]]></dc:creator><pubDate>Tue, 13 Oct 2026 02:32:03 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6acd57353c97869368205345/88b01d2f-9665-4acd-9fa0-0cb2efa6d773.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<img src="https://cdn.hashnode.com/uploads/covers/6acd57353c97869368205345/cfaac022-de7c-4b3d-9564-1fee2adc82d5.png" alt="" style="display:block;margin:0 auto" />

<p><em>Building a C# engineering tool to sweep joint angles, capture fingertip coordinates, and check mechanical interference.</em></p>
<p><strong>Tech stack:</strong> C#, SolidWorks API, COM Interop, CAD automation</p>
<p>I worked on a SolidWorks add-in that automates the repetitive process of testing joint configurations in a mechanical assembly. The tool started from a joint-interference analysis workflow and evolved into a more flexible scanner for collecting fingertip-position data from robotic finger mechanisms. This tool ease the way of calculating inverse-kinematics, while still give an accurate solution.</p>
<h2>The Engineering Problem</h2>
<p>To model how a robotic finger moves, I needed to calculate the kinematics of the two-servo controlled finger. Since I does not have pure accurate data for the angles and dimensions, I build this plugin to both double-check my kinematics calculation and give an full, achievable angle/coordinate scan.</p>
<p>The goal was to automate that workflow while keeping interference analysis available when needed.</p>
<h2>How the Add-In Works</h2>
<p>The add-in uses the <strong>SolidWorks API</strong> from C# to work with two angular mates, labeled <strong>J1</strong> and <strong>J2</strong>. I can specify angle ranges and scan both joints in combinations, or hold one joint fixed while varying the other. Configurable coarse, medium, and fine step sizes make it possible to start with a broad scan and then examine a smaller region more closely.</p>
<p>For each sampled configuration, the tool can record:</p>
<ul>
<li><p>Requested and actual joint angles</p>
</li>
<li><p>Whether the requested position was reached</p>
</li>
<li><p>The XYZ position of a selected scan point</p>
</li>
<li><p>Interference information, when that option is enabled</p>
</li>
</ul>
<p>These records help build an angle-to-position dataset that can support later fingertip modeling and gripper control.</p>
<h2>Solving Assembly-Level Challenges</h2>
<p>A surprisingly important problem was finding the correct mates. A joint may live inside a subassembly rather than the top-level assembly, and different subassemblies can contain mates with the same name.</p>
<p>To handle this, the add-in can recursively search loaded subassemblies for angular mates. It also supports <strong>Pick J1 mate</strong> and <strong>Pick J2 mate</strong>, allowing me to select the exact mates from the SolidWorks feature tree instead of relying only on names.</p>
<p>For coordinate collection, I can also select a specific <strong>scan point</strong>. When a mate is selected directly, the tool can read its angle value without requiring a separate reference-plane measurement for every test.</p>
<h2>Making the Workflow More Efficient</h2>
<p>Interference calculation is useful for clearance studies but is not always necessary when the objective is simply to sample coordinates. I added an option to disable interference checks during those scans, avoiding unnecessary calculations.</p>
<p>The delivered package includes a compiled add-in DLL, a COM type library, SolidWorks interoperability dependencies, a registration script, and the C# source code. That makes the tool easier to inspect, register, and continue improving.</p>
<h2>What I Learned</h2>
<p>This project showed me how to turn a CAD model into an engineering data source. Beyond writing code against an API, I had to think about assembly structure, mate selection, model state, repeatability, and the difference between requested and achieved geometry.</p>
<p>The add-in provides a foundation for generating kinematic datasets more systematically. Future work could focus on validating the exported coordinates against physical measurements and further streamlining data analysis.</p>
]]></content:encoded></item><item><title><![CDATA[Building a Desktop Control Interface for a Three-Finger Robotic Gripper]]></title><description><![CDATA[Connecting six-servo actuation, fingertip modeling, and high-level grasping motions in a Windows application. Tech stack: C#, Windows Forms, C++, serial…]]></description><link>https://summerproject1.hashnode.dev/building-a-desktop-control-interface-for-a-three-finger-robotic-gripper</link><guid isPermaLink="true">https://summerproject1.hashnode.dev/building-a-desktop-control-interface-for-a-three-finger-robotic-gripper</guid><category><![CDATA[C++]]></category><category><![CDATA[Serial Communication]]></category><category><![CDATA[Inverse-kinematic]]></category><category><![CDATA[Windows Forms]]></category><dc:creator><![CDATA[Jason Duan]]></dc:creator><pubDate>Tue, 13 Oct 2026 02:20:21 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6acd57353c97869368205345/534664e9-be8c-4071-868c-367c84695a21.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Connecting six-servo actuation, fingertip modeling, and high-level grasping motions in a Windows application.</em></p>
<p><strong>Tech stack:</strong> C#, Windows Forms, C++, serial communication, robotic kinematics</p>
<p>During my summer 2026 internship, I worked on <strong>GripperControlApp</strong>, a Windows desktop application for operating and debugging a three-finger robotic gripper. The project brought together low-level servo commands, position models, and more intuitive controls for movements such as pinching, gripping, and twisting.</p>
<p>The main goal was to make the gripper easier to test than it would be through individual servo commands alone.</p>
<img src="https://cdn.hashnode.com/uploads/covers/6acd57353c97869368205345/8739349e-0784-477d-b4ec-639955f3f930.png" alt="" style="display:block;margin:0 auto" />

<h2>From Servo IDs to a Usable Interface</h2>
<p>The gripper uses <strong>six servo channels</strong>. GripperControlApp provides a graphical interface where I can select a COM port, connect or disconnect the device, switch between left-hand and right-hand configurations, and adjust individual servos.</p>
<p>For engineering tests, the interface also shows estimated fingertip <strong>XYZ coordinates</strong> and raw servo-load values. The load readings are useful as diagnostic feedback, although they are not calibrated torque measurements.</p>
<p>The application also supports previewing finger angles and coordinates without connecting the physical gripper, which is helpful when checking mappings and control logic.</p>
<h2>Translating Fingertip Motion into Commands</h2>
<p>Directly changing a servo position does not tell me where the fingertip will go. To make the controls more meaningful, I worked with sampled motion data and coordinate models for the index finger, middle finger, and thumb.</p>
<p>These models support two useful operations: translating functional motions such as <strong>bend</strong> and <strong>swing</strong> into servo positions, and searching for a nearby reachable finger configuration from a requested XYZ target.</p>
<p>The thumb needed special attention. Its sampled bending range extended to <strong>78°</strong>, so a curve-fitting approach was used to extrapolate the model toward <strong>95°</strong>. This expands the modeled control range, but the extrapolated positions require physical validation.</p>
<h2>Reusable Grasping Modes</h2>
<p>Rather than repeatedly tuning each servo by hand, I added higher-level movement functions:</p>
<ul>
<li><p><strong>Pinch:</strong> Coordinate the index finger and thumb around a specified fingertip separation.</p>
</li>
<li><p><strong>Grip:</strong> Generate a three-finger grasp using a cylindrical object diameter and an adjustable spread parameter.</p>
</li>
<li><p><strong>Twist:</strong> Combine index-finger lateral motion with thumb rotation to approximate a repeated twisting action while maintaining a pinch-distance constraint.</p>
</li>
</ul>
<p>Twist is an approximate motion strategy, not a verified exact spiral trajectory. It is intended as a useful starting point for manipulation experiments.</p>
<h2>Designing for Real Hardware</h2>
<p>The software includes adjustable calibration offsets, servo-position limits, motion speeds, waiting behavior, serial timeouts, and left/right-hand mapping. The underlying C++ modules for finger modeling and movement logic were also retained for reuse and future integration.</p>
<p>The GUI includes optional entry points for vision-triggered grasping and hand-pose tracking. Those perception pipelines are a separate project; here, the focus was on creating a practical control and debugging layer between software and the actuators.</p>
<p><a class="embed-card" href="https://youtu.be/dFQ2OKNHxc8">https://youtu.be/dFQ2OKNHxc8</a></p>
]]></content:encoded></item><item><title><![CDATA[Vision-Guided Grasping and Real-Time Hand Tracking for a Robotic Gripper]]></title><description><![CDATA[Using YOLOv8, OpenCV, and MediaPipe to connect camera perception with a three-finger robot. Tech stack: Python, YOLOv8n, OpenCV, MediaPipe, JSON-based…]]></description><link>https://summerproject1.hashnode.dev/vision-guided-grasping-and-real-time-hand-tracking-for-a-robotic-gripper</link><guid isPermaLink="true">https://summerproject1.hashnode.dev/vision-guided-grasping-and-real-time-hand-tracking-for-a-robotic-gripper</guid><category><![CDATA[YoloV8]]></category><category><![CDATA[opencv]]></category><category><![CDATA[mediapipe]]></category><category><![CDATA[robotics]]></category><dc:creator><![CDATA[Jason Duan]]></dc:creator><pubDate>Tue, 13 Oct 2026 01:52:59 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6acd57353c97869368205345/a5fcd8ef-de4d-4037-a555-0b00d531a372.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Using YOLOv8, OpenCV, and MediaPipe to connect camera perception with a three-finger robot.</em></p>
<p><strong>Tech stack:</strong> Python, YOLOv8n, OpenCV, MediaPipe, JSON-based interprocess communication</p>
<p>During my summer 2026 engineering internship, I explored two ways of turning visual information into robotic gripper commands: detecting when a bottle is approaching a grasp position, and translating human hand motion into a three-finger robot's control parameters.</p>
<p>Both prototypes use Python for perception and exchange simple state files with a separate Windows gripper-control application. That kept the vision experiments modular while making integration possible.</p>
<h2>Demo 1: Bottle Detection and a Grasp-Ready Signal</h2>
<p><a class="embed-card" href="https://youtu.be/9NCkOY2QKWQ">https://youtu.be/9NCkOY2QKWQ</a></p>

<p>The first pipeline processes an <strong>RTSP camera stream</strong> using OpenCV and a pretrained <strong>YOLOv8n</strong> object detector. It identifies bottles, draws bounding boxes, measures their apparent width, and displays a guidance arrow from the detected object toward a target point in the frame.</p>
<p>The camera configuration supports cropping a view from a combined stereo stream. In the archived setup, the program selected the <strong>top half</strong> of a top-bottom camera layout.</p>
<p>Instead of assuming that a 2D detection provides an exact distance, I used the bottle's changing bounding-box width as a simple <strong>approach indicator</strong>. The packaged logic computes width statistics every 0.5 seconds. After two sufficiently increasing measurement periods, a subsequent disappearance lasting more than 0.5 seconds produces the status:</p>
<pre><code class="language-text">Ready to Grab
</code></pre>
<p>That status is written to <code>vision_status.txt</code>, which the gripper application can read through its <strong>Vision Auto Grip</strong> function.</p>
<p>This is a rule-based prototype for recognizing an approach-and-disappearance sequence, not a calibrated depth-estimation or autonomous grasp-planning system.</p>
<h2>Demo 2: Translating Human Hand Motion</h2>
<p><a class="embed-card" href="https://youtu.be/VJNXMwqcy-Y">https://youtu.be/VJNXMwqcy-Y</a></p>

<p>The second pipeline uses <strong>MediaPipe</strong> to track <strong>21 hand landmarks</strong> from a computer webcam. Rather than treating hand tracking as a collection of discrete gestures only, it estimates continuous motion parameters: finger bending, finger spread, and thumb rotation.</p>
<p>Because the robotic gripper has only three fingers, the human-to-robot mapping is adapted:</p>
<ul>
<li><p>Human index finger → robot index finger</p>
</li>
<li><p>Human little finger → robot middle finger</p>
</li>
<li><p>Human thumb → robot thumb</p>
</li>
</ul>
<p>The program converts landmark geometry into bend, swing, and rotation values and writes them to <code>hand_state.json</code>. The desktop controller reads these values in its <strong>Fast Tracking</strong> mode and translates them into servo targets.</p>
<h2>Stabilizing the Control Signal</h2>
<p>Camera landmarks fluctuate, and sending every small movement directly to motors can produce jerky behavior. To limit that effect, the controller uses several filtering and command constraints:</p>
<ul>
<li><p>A <strong>five-sample median filter</strong> and <strong>exponential moving average</strong> (EMA)</p>
</li>
<li><p>A <strong>dead zone</strong> to ignore very small target changes</p>
</li>
<li><p>A <strong>maximum servo-position step</strong> per update</p>
</li>
<li><p>Thumb-angle restrictions and a reduced command speed</p>
</li>
</ul>
<p>The packaged Fast Tracking settings use a <strong>50 ms update interval</strong> (up to 20 Hz). These controls reduce command jitter but are not substitutes for a physical emergency stop or verified mechanical limits.</p>
<h2>Integration and Next Steps</h2>
<p>The overall pipelines are straightforward:</p>
<pre><code class="language-text">RTSP camera → YOLO bottle detection → vision_status.txt → Vision Auto Grip
Webcam → MediaPipe landmarks → hand_state.json → Fast Tracking
</code></pre>
<p>The file-based connection made it easy to develop perception and actuator control as separate programs. It also has limitations: hard-coded paths need adjustment on another computer, and a reader can occasionally encounter a state file while it is being updated.</p>
<p>The next steps would be to replace file polling with a more robust communication channel, validate the hand-to-gripper mapping on hardware, and evaluate the system under changing lighting, camera angles, and object motion.</p>
]]></content:encoded></item></channel></rss>