<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Featured Projects | Khaled HAMIDI</title><link>https://khaledhamidi.com/en/featured/</link><atom:link href="https://khaledhamidi.com/en/featured/index.xml" rel="self" type="application/rss+xml"/><description>Featured Projects</description><generator>Hugo Blox Builder (https://hugoblox.com)</generator><language>en-us</language><lastBuildDate>Mon, 06 Jan 2025 00:00:00 +0000</lastBuildDate><image><url>https://khaledhamidi.com/media/sharing.jpg</url><title>Featured Projects</title><link>https://khaledhamidi.com/en/featured/</link></image><item><title>Kenobot: A Self-Driving Robotic Platform</title><link>https://khaledhamidi.com/en/featured/kenobot/</link><pubDate>Mon, 06 Jan 2025 00:00:00 +0000</pubDate><guid>https://khaledhamidi.com/en/featured/kenobot/</guid><description>&lt;h2 id="overview">Overview&lt;/h2>
&lt;p>Kenobot is an integrated robotic platform engineered as a commercial solution for autonomous navigation and robotics development. The platform&amp;rsquo;s design is flexible and scalable, making it suitable for a wide range of applications, from internal logistics to advanced research.
&lt;figure >
&lt;div class="flex justify-center ">
&lt;div class="w-100" >&lt;img src="Kenobot.png" alt="Kenobot" loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;/figure>
&lt;/p>
&lt;h3 id="dual-layer-control-architecture">Dual-Layer Control Architecture&lt;/h3>
&lt;p>Kenobot utilizes a two-tier control architecture for high performance and reliability:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>High-Level Control:&lt;/strong> A &lt;strong>Raspberry Pi 5&lt;/strong> computer processes complex sensor data, implements autonomous navigation algorithms, and manages the system.&lt;/li>
&lt;li>&lt;strong>Low-Level Control:&lt;/strong> An &lt;strong>Arduino Mega&lt;/strong> board provides precise control of motors and actuators, and reads raw data from low-level sensors, ensuring a fast and stable response.&lt;/li>
&lt;/ol>
&lt;h3 id="gps-denied-autonomous-navigation">GPS-Denied Autonomous Navigation&lt;/h3>
&lt;p>A key feature of Kenobot is its ability to navigate accurately in indoor environments where GPS signals are unavailable. The platform uses advanced algorithms like SLAM (Simultaneous Localization and Mapping) with data from sensors such as LIDAR and cameras to independently determine its location and map its surroundings.
&lt;figure >
&lt;div class="flex justify-center ">
&lt;div class="w-100" >&lt;img src="kenobot2.png" alt="kenobot2" loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;/figure>
&lt;/p>
&lt;h3 id="communication-system">Communication System&lt;/h3>
&lt;p>The platform supports a bidirectional wireless communication system for exchanging data and commands between the robot and a control station. The receiver unit connects to a computer via a USB port for monitoring and control.
&lt;figure >
&lt;div class="flex justify-center ">
&lt;div class="w-100" >&lt;img alt="kenobot5" srcset="
/en/featured/kenobot/kenobot5_hu_48d7b0c35ca9b25f.webp 400w,
/en/featured/kenobot/kenobot5_hu_a0688284ad97d318.webp 760w,
/en/featured/kenobot/kenobot5_hu_c775c7294cfb97b.webp 1200w"
src="https://khaledhamidi.com/en/featured/kenobot/kenobot5_hu_48d7b0c35ca9b25f.webp"
width="760"
height="760"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;/figure>
&lt;/p>
&lt;h3 id="virtual-development-features">Virtual Development Features&lt;/h3>
&lt;p>To enable developers to test algorithms and applications safely, each platform is equipped with virtual dummy features. This virtual environment simulates various tasks and payloads without requiring physical hardware, accelerating the development cycle and reducing risks.&lt;/p>
&lt;h3 id="potential-applications">Potential Applications&lt;/h3>
&lt;ul>
&lt;li>&lt;strong>Security and Surveillance:&lt;/strong> Conducting autonomous patrols in designated areas.&lt;/li>
&lt;li>&lt;strong>Research and Development:&lt;/strong> A robust testbed for AI and robotics algorithms.
&lt;figure >
&lt;div class="flex justify-center ">
&lt;div class="w-100" >&lt;img alt="kenobot3" srcset="
/en/featured/kenobot/kenobot3_hu_8c40f659aeb6e17e.webp 400w,
/en/featured/kenobot/kenobot3_hu_384869d4276fe69.webp 760w,
/en/featured/kenobot/kenobot3_hu_648121a6f770b706.webp 1200w"
src="https://khaledhamidi.com/en/featured/kenobot/kenobot3_hu_8c40f659aeb6e17e.webp"
width="760"
height="570"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;/figure>
&lt;/li>
&lt;/ul>
&lt;video controls poster="/en/featured/kenobot/Kenobot.jpg" >
&lt;source src="https://khaledhamidi.com/en/featured/kenobot/kenobot.mp4" type="video/mp4">
&lt;/video></description></item><item><title>Autonomous Robot with Longitudinal Control</title><link>https://khaledhamidi.com/en/featured/av/</link><pubDate>Thu, 18 Jan 2024 00:00:00 +0000</pubDate><guid>https://khaledhamidi.com/en/featured/av/</guid><description>&lt;h2 id="about-the-project">About the Project&lt;/h2>
&lt;p>An autonomous robot I designed and built entirely from scratch — from the mechanical frame to the control algorithm. Its key feature is a &lt;strong>longitudinal control system&lt;/strong> based on a hybrid FLC-PID architecture, enabling independent navigation with precise speed and acceleration control.&lt;/p>
&lt;p>
&lt;figure >
&lt;div class="flex justify-center ">
&lt;div class="w-100" >&lt;img alt="autonomous robot" srcset="
/en/featured/av/2_hu_4bb28b210b5a32ed.webp 400w,
/en/featured/av/2_hu_c44d32164156f66a.webp 760w,
/en/featured/av/2_hu_3c66fd6229dc07dd.webp 1200w"
src="https://khaledhamidi.com/en/featured/av/2_hu_4bb28b210b5a32ed.webp"
width="760"
height="386"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;/figure>
&lt;/p>
&lt;h2 id="highlights">Highlights&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>FLC-PID System&lt;/strong>: Combines fuzzy logic with PID for smooth, adaptive speed control.&lt;/li>
&lt;li>&lt;strong>Built from scratch&lt;/strong>: Frame design, component selection, wiring, and programming all done manually.&lt;/li>
&lt;li>&lt;strong>Dual validation&lt;/strong>: Simulated in MATLAB/Simulink, then deployed on Raspberry Pi hardware.&lt;/li>
&lt;li>&lt;strong>Real-time response&lt;/strong>: The robot adapts its behavior based on live sensor readings.&lt;/li>
&lt;/ul>
&lt;p>
&lt;figure >
&lt;div class="flex justify-center ">
&lt;div class="w-100" >&lt;img src="3.png" alt="robot" loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;/figure>
&lt;figure >
&lt;div class="flex justify-center ">
&lt;div class="w-100" >&lt;img alt="robot" srcset="
/en/featured/av/4_hu_f47a4bd7bdc37660.webp 400w,
/en/featured/av/4_hu_9730c42a02652ebd.webp 760w,
/en/featured/av/4_hu_b1f4723682e06216.webp 1200w"
src="https://khaledhamidi.com/en/featured/av/4_hu_f47a4bd7bdc37660.webp"
width="760"
height="342"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;/figure>
&lt;figure >
&lt;div class="flex justify-center ">
&lt;div class="w-100" >&lt;img alt="robot" srcset="
/en/featured/av/5_hu_94e053d6fba1395f.webp 400w,
/en/featured/av/5_hu_fecef91b877e1f96.webp 760w,
/en/featured/av/5_hu_6c802d6c182f0d1b.webp 1200w"
src="https://khaledhamidi.com/en/featured/av/5_hu_94e053d6fba1395f.webp"
width="760"
height="428"
loading="lazy" data-zoomable />&lt;/div>
&lt;/div>&lt;/figure>
&lt;/p></description></item><item><title>Qlink: Serial Command API for Arduino</title><link>https://khaledhamidi.com/en/featured/qlink/</link><pubDate>Tue, 10 Jan 2023 00:00:00 +0000</pubDate><guid>https://khaledhamidi.com/en/featured/qlink/</guid><description>&lt;h2 id="overview">Overview&lt;/h2>
&lt;p>&lt;strong>Qlink&lt;/strong> is a powerful yet lightweight serial command API designed for Arduino, Raspberry Pi, PC, and other embedded systems. It streamlines communication between devices by providing a simple framework for registering and handling commands sent over a serial connection. With support for multiple parameter types (INT, FLOAT, STRING, LONG), Qlink is the ideal solution for controlling your Arduino projects from external applications written in Python, C#, or from a simple serial monitor.&lt;/p>
&lt;h2 id="key-features">Key Features&lt;/h2>
&lt;ul>
&lt;li>&lt;strong>Dynamic Command System&lt;/strong>: Easily define and register custom commands with a clean macro-based syntax (&lt;code>DEF&lt;/code> and &lt;code>REG&lt;/code>).&lt;/li>
&lt;li>&lt;strong>Multi-Type Parameter Support&lt;/strong>: Natively parse integer, float, string, and long arguments from incoming serial commands.&lt;/li>
&lt;li>&lt;strong>Simplified Responses&lt;/strong>: Send formatted strings back to the host device with a single &lt;code>link.response()&lt;/code> call.&lt;/li>
&lt;li>&lt;strong>Lightweight &amp;amp; Efficient&lt;/strong>: Designed for microcontrollers, Qlink has a minimal footprint and processes commands in real-time.&lt;/li>
&lt;li>&lt;strong>Cross-Platform Control&lt;/strong>: Enables seamless control of Arduino from a PC (Windows/Linux), Mac, or Raspberry Pi.&lt;/li>
&lt;/ul>
&lt;h2 id="common-use-cases">Common Use Cases&lt;/h2>
&lt;ul>
&lt;li>Controlling robots or CNC machines from a desktop application.&lt;/li>
&lt;li>Sending sensor data from Arduino to a Python script for logging or analysis.&lt;/li>
&lt;li>Creating interactive prototypes that respond to commands from a serial terminal.&lt;/li>
&lt;li>Configuring device settings (e.g., LED brightness, motor speed) on the fly without reprogramming.&lt;/li>
&lt;/ul>
&lt;h2 id="code-example-simple-blink-control">Code Example: Simple Blink Control&lt;/h2>
&lt;p>The following example demonstrates how to control the built-in LED on an Arduino board using a &lt;code>DELAY&lt;/code> command sent over serial.&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-cpp" data-lang="cpp">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#include&lt;/span> &lt;span class="cpf">&amp;lt;Qlink.h&amp;gt;&lt;/span>&lt;span class="cp">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">int&lt;/span> &lt;span class="n">blinkInterval&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="mi">1000&lt;/span>&lt;span class="p">;&lt;/span> &lt;span class="c1">// Default blink interval
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">Qlink&lt;/span> &lt;span class="nf">link&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">Serial&lt;/span>&lt;span class="p">);&lt;/span> &lt;span class="c1">// Initialize Qlink on the hardware serial port
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">// Define the &amp;#34;DELAY&amp;#34; command, which accepts one integer argument
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="n">DEF&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">DELAY&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">INT&lt;/span>&lt;span class="p">)&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">blinkInterval&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">Convert&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">Args&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="mi">0&lt;/span>&lt;span class="p">],&lt;/span> &lt;span class="kt">int&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">link&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">response&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s">&amp;#34;Blink interval updated to %d ms&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">blinkInterval&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="nf">setup&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">Serial&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">begin&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="mi">9600&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">pinMode&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">LED_BUILTIN&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">OUTPUT&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">REG&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">link&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">DELAY&lt;/span>&lt;span class="p">);&lt;/span> &lt;span class="c1">// Register the DELAY command
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kt">void&lt;/span> &lt;span class="nf">loop&lt;/span>&lt;span class="p">()&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">link&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="n">loop&lt;/span>&lt;span class="p">();&lt;/span> &lt;span class="c1">// Continuously listen for incoming commands
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="c1">// Blink the LED at the current interval
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1">&lt;/span> &lt;span class="n">digitalWrite&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">LED_BUILTIN&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">HIGH&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">delay&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">blinkInterval&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">digitalWrite&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">LED_BUILTIN&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">LOW&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">delay&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">blinkInterval&lt;/span>&lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>To use this, you would simply send a command like &lt;code>DELAY 500&lt;/code> from your serial monitor or application, and the LED blink rate would instantly update.&lt;/p>
&lt;p>
&lt;/p></description></item></channel></rss>