Nishanth Sundaran

I build safe, intelligent robots that work alongside people.

About me

Recent M.Eng. graduate, robotics and AI, in Cham, Bavaria.

Nishanth Sundaran
Now

Graduated 14 June 2026. Living in Germany and available immediately for full-time roles or a full-time internship leading to a permanent position.

Focus
I am a robotics and AI engineer based in Cham, Bavaria. I recently completed my M.Eng. in Artificial Intelligence for Smart Sensors and Actuators at Technische Hochschule Deggendorf, and my focus is robots that are safe and genuinely useful around people.
Thesis
My Master’s thesis delivered a complete human-robot interaction stack on a UR3e cobot: a 500 Hz hybrid position-admittance controller, an ISO/TS 15066 safety layer (Speed & Separation Monitoring, Power & Force Limiting, Hand Guiding), and YOLOv8 human detection on an Intel RealSense D435i, built in ROS 2 Humble and MoveIt 2 and validated on real hardware.
Since then
Since then I have focused on connecting foundation models to real robot bodies: a Claude tool-use agent that turns natural-language commands into MoveIt 2 pick-and-place plans, a self-hosted Qwen2.5-VL brain that drives both the Unitree G1 and H1 humanoids through one tool interface, and a G1 motion-imitation policy trained on human motion capture in JAX and MJX.
Most recently
Most recently I have been benchmarking vision-language-action models on LIBERO: reproducing SmolVLA, I traced a gap to the published result to a simulator rendering change and to open-loop action chunks, then trained a 52M-parameter ACT model on a laptop GPU that succeeds in 99% of 300 held-out episodes, against 92% for the 450M SmolVLA. A short assignment teleoperating two Franka arms for robot-learning data collection at AlphaIgnis showed me how such models are trained in practice.
Before robotics
Before robotics I worked as a project engineer on high-voltage power grids, in data analysis at Amazon, and as a remote ML intern applying computer vision to aerial imagery. I am now looking for roles in robotics software, humanoid robotics, VLA and embodied AI, or collaborative robotics, either full-time or as a full-time internship that leads to a permanent position.

Experience

From power engineering to collaborative robotics.

Sep 2025 to Jun 2026

Master’s Thesis Researcher

Technische Hochschule Deggendorf (THD), Cham, Germany

  • Developed a real-time hybrid position-admittance controller for safe physical human-robot interaction on a UR3e collaborative robot using ROS 2 and MoveIt 2
  • Designed and implemented an ISO/TS 15066-compliant safety system with three operational modes: Speed & Separation Monitoring, Power & Force Limiting, and Hand Guiding
  • Built a computer vision pipeline with Intel RealSense D435i for YOLOv8-based human detection, hand-eye calibration, and HSV-based object localisation with depth back-projection
  • Created a 13-state FSM for assistive lift-and-place tasks integrating autonomous grasping with human-guided placement via real-time force feedback

ROS 2, MoveIt 2, Python, OpenCV, YOLOv8, Intel RealSense, Gazebo, tf2

Dec 2023 to Nov 2024

Machine Learning Intern

Energy Future World, London, United Kingdom (Remote)

  • Applied computer vision to aerial imagery for tracking renewable energy infrastructure growth, achieving 85% detection accuracy
  • Developed image processing algorithms (edge detection, contrast enhancement) using OpenCV
  • Conducted pattern analysis and model training using Scikit-learn, NumPy, and Pandas

Python, OpenCV, Scikit-learn, NumPy, Pandas, Jupyter

Mar 2022 to Dec 2022

Process Associate

Amazon, Bangalore, India

  • Performed data analysis and auditing to identify process performance trends
  • Contributed to automation and system optimisation initiatives using data-driven forecasting

May 2019 to Dec 2021

Project Engineer

Power And Instrumentations Ltd, Gujarat, India

  • Analysed high-voltage power grid performance data to optimise reliability and identify failure patterns
  • Managed cost tracking, quality control, and resource allocation across multiple project sites

Projects

Humanoids, robot learning, model post-training and edge deployment, in simulation and on real hardware.

One Brain, Many Bodies: Humanoid Autonomy Stack

A self-hosted vision-language model plans; a compliant whole-body controller walks the Unitree G1 to a bench and fetches a block.

Walk, pick and place
17 of 20 runs
Falls while walking
0 in 30
Plan and control rate
1 / 500 Hz
Read the full write-up

Cross-embodiment humanoid autonomy stack in MuJoCo, driven by a self-hosted vision-language model (Qwen2.5-VL-3B, no cloud APIs) and a compliant whole-body controller. The VLM plans at ~1 Hz via tool-calling with Set-of-Mark visual grounding; the controller executes at ~500 Hz. The same brain drives Unitree G1 and H1 through one tool interface (only a per-robot config file changes); 22-DoF five-finger hands composed onto the H1 at load time via MjSpec. The G1 walks about 3 m to a bench, stops, picks a block and places it in a bin in 17 of 20 runs, using GPU-trained PPO walk-and-stop and stance policies trained on the states and arm motions the task really produces. Every policy is scored against human motion: torso lean while manipulating fell from 36° to 1.7°, foot lifts while standing by 97%, the gait runs at about 2 steps/s (human 1.9) with 0 falls in 30 walks, and the arm follows minimum-jerk paths.

Built with Python, PyTorch, MuJoCo, Qwen2.5-VL, PPO, tool use, Set-of-Mark, admittance control, differential IK, Unitree G1 and Unitree H1.

Eight LAFAN1 mocap clips on a G1 with Dex3 hands. The fingers are inferred, since the mocap has none: fists in the fight, flat on the floor.

rigidax: Differentiable Rigid-Body Dynamics and Motion Retargeting in JAX

An open-source JAX library, released on PyPI, that retargets human motion capture onto the Unitree G1 at about 20,000 frames per second on a laptop CPU.

Read the full write-up

Its design starts from frax (Stanford ASL): the dense, loop-free formulation of the dynamics over a DOF ancestor mask. rigidax fills in what frax lacks: it loads MJCF and URDF through MuJoCo, supports ball joints and several joints per body, makes gravity a model parameter, and keeps masses, inertias and offsets as pytree leaves, so jax.grad and vmap work over the physical parameters without recompiling. Every quantity is tested against MuJoCo on random trees and the G1, A2 and Panda, plus Pinocchio. On top of it sits a batched IK retargeter for LAFAN1. Both libraries ran frax’s own LAFAN1 settings on the same laptop, on 8 clips (53,621 frames, 30 minutes of motion), scored with the same metrics: with self-collision rigidax runs at 22,836 frames/s against 18,327, the toe slides 0.9 cm/s median against 4.6 while the human toe is planted, frames with a joint jump over 20° fall from 1.9% to 0.1%, and the lag goes from 0.16 frames to zero. frax is still slightly ahead on forearm twist and on leg motion kept. The G1 wears Dex3 hands, and since LAFAN1 records no fingers the grip is inferred from context and written after the body solve, so the hands cost almost nothing (18.8k frames/s). An operational space controller on the Panda, with all its dynamics from rigidax, tracks a figure-eight at 0.9 mm mean error in about 54 µs per step.

Built with JAX, MuJoCo, Pinocchio, NumPy, pytest, GitHub Actions, PyPI trusted publishing and Python.

Retargeting speed, laptop CPU
22.8k frames/s
Toe slide, median (frax 4.6)
0.9 cm/s
Frames with a 20° jump (frax 1.9)
0.1 %
The same held-out episode, three policies: each places the tomato sauce in the basket.

LIBERO Imitation Study: VLA vs ACT vs Diffusion Policy

A 52M-parameter ACT model, trained on a laptop GPU for all ten LIBERO-Object tasks, beats the 450M-parameter SmolVLA over 300 held-out episodes.

Read the full write-up

Benchmark of a vision-language-action model (SmolVLA) against two imitation-learning policies, ACT and Diffusion Policy, on LIBERO-Object with LeRobot, all on a 6 GB RTX 3060 laptop GPU. Before training anything I reproduced the published SmolVLA checkpoint: it first scored 56% against a published 96%, and I traced the gap to a MuJoCo rendering change (pinning 3.3.2 restored it) and to open-loop action chunks (replanning every 10 actions brought it to the published level). I then trained one ACT model (52M) and one Diffusion Policy model (89M) on the same 454 demonstrations for all ten tasks, chose every setting on a separate dev split, and scored each policy on 300 held-out episodes (three seeds, re-seeded per episode so every policy faces identical episodes). Image augmentation lifted ACT from 74 to 99/100; over 300 episodes ACT reached 99.0%, ahead of SmolVLA at 92.3% and Diffusion Policy at 92.0% (paired McNemar, p < 0.001 for both). Two evaluation lessons: Diffusion Policy samples noise at inference and scored 81, 96 and 99 on the three seeds, so one seed is not enough; and GPU kernel autotuning made repeat runs differ by about 2 episodes in 100, so I made evaluation deterministic and re-measured everything, with repeat runs now matching episode for episode. A demo-count study shows how much data the recipe needs: 10 demonstrations per task give 74%, 20 give 91% and all ~45 give 99% on the same held-out episodes, and with little data the failures move from tall bottles to small, partly hidden boxes.

Built with LeRobot, PyTorch, SmolVLA, ACT, Diffusion Policy, LIBERO, MuJoCo, mixed-precision training and Python.

ACT, 52M, trained here
99.0 %
SmolVLA, 450M, published
92.3 %
Diffusion Policy, 89M, trained here
92.0 %
The same held-out task at 4x speed: the stock model (left) keeps retrying a grasp, the fine-tuned one hands the cup across.

Planner Post-Training: SFT, DAgger and GRPO for a 3B VLM

Fine-tuned the humanoid’s Qwen2.5-VL-3B planner on a 6 GB laptop GPU, from 23 to 92 solved tasks out of 100 held out.

Read the full write-up

Post-training of the vision-language planner from One Brain, Many Bodies: a 3B model reads a camera frame with numbered markers and calls grasp, place and done tools to carry out table-top commands on the Unitree G1. I built a benchmark of six task families (bin, two objects in the bin, next to, left or right side, absent object, goal already met) where success is read from the physics state, never from what the model says, with every task feasible by a measured reach map. A privileged expert that reads the true state solves 94 of 100 held-out tasks; the stock model solves 23. QLoRA SFT (4-bit NF4, rank 16, loss on the answer tokens only) on 2432 expert steps brought it to 83, and one DAgger round, where the planner drives and the expert labels the states it reaches, brought it to 92 with failed tool calls down from 418 to 28 (paired McNemar: 61 to 1, p = 3e-17, and 11 to 2, p = 0.022). GRPO with physics rewards then solved exactly the same tasks: 66% of groups had four identical rewards, and the few errors left are rare states that random rollouts barely visit, so on this benchmark the on-policy correction that worked was DAgger. Engineering that changed the numbers: cutting the prompt from 4.5k to 1.3k tokens so training fits in 6 GB, capping the free-text thought so constrained JSON always closes, and finding a stale MuJoCo renderer that blinded the first DAgger collection.

Built with PyTorch, Hugging Face Transformers, PEFT, QLoRA, bitsandbytes, constrained JSON decoding, DAgger, GRPO, MuJoCo, Qwen2.5-VL and Python.

Stock Qwen2.5-VL-3B
23 / 100
SFT + DAgger, trained here
92 / 100
Privileged expert, the ceiling
94 / 100
Real calls to the service on a laptop CPU, a good part and a defect per category. Last: a rotated transistor is caught, a board with no transistor is missed.

Edge Inspection: Anomaly Detection from Benchmark to CPU Service

PatchCore on MVTec AD within 0.2 points of the published accuracy, then served in INT8 from Docker at 94 ms per part on a laptop CPU.

Read the full write-up

Industrial visual inspection on all 15 MVTec AD categories, learned from good parts only. I compared PatchCore, PaDiM, EfficientAD and zero-shot WinCLIP with my own metric code, after finding that anomalib by default tunes its thresholds on the test set. PatchCore reaches 98.8 image AUROC and 93.0 AUPRO (paper 99.0 / 93.5); an inspection region that scores the part and not the background fixed toothbrush, where a loose bristle on the backdrop had dropped it to 91.7 (now 100). I benchmarked eleven runtimes on the full test set: TensorRT fp16 runs in 5.2 ms with no accuracy loss, after I found ONNX Runtime silently falling back to the CPU because two CUDA libraries were missing. Naive INT8 took capsule from 97 to 64: the memory bank held FP32 features while the quantised backbone produced slightly different ones, and rebuilding the bank from INT8 features brought it back to 97 at 61 ms. A label-free gate decides per category whether INT8 ships (screw stays FP32). Thresholds set on training images flagged 47% of good leather, because the test parts come from another capture session; calibrating on a few good parts from the line cuts that to 3%, so the service has a calibrate endpoint and a drift monitor. The service is FastAPI with no torch inside, Prometheus metrics, and GitHub Actions CI that builds the Docker image and sends it a real request.

Built with PyTorch, anomalib, ONNX, ONNX Runtime, TensorRT, OpenVINO, NNCF INT8 quantisation, FastAPI, Docker, Prometheus, GitHub Actions and Python.

PatchCore image AUROC, 15 categories
98.8
INT8 service on a laptop CPU
94 ms
TensorRT fp16 on the laptop GPU
5.2 ms
Four questions in one take: German manual, error code, an SQL answer from my trial logs, and another robot it refuses. Model time shown at 4x.

Robot Ops Copilot: Local Agentic RAG for a UR3e Cell

A bilingual support copilot over the UR3e manuals, error codes, ROS 2 docs and my thesis logs, running on one laptop GPU. Every answer cites its page, or it says it does not know.

Read the full write-up

The copilot answers from the UR3e user manual in English and German, the UR Error Codes Directory (parsed into 1222 codes), the ROS 2, MoveIt 2 and UR driver docs, and the config files and 38 logged trials of my thesis. Retrieval is BM25 plus bge-m3 embeddings, fused and reranked by a multilingual cross-encoder on the CPU (right page in the top five for 99% of questions). qwen2.5:7b answers from numbered passages and can call four tools: document search, exact error code lookup, read-only SQL over the trial logs, and parameter lookup. I wrote 133 questions plus a held-out set of 49 that was never used to choose anything, graded by fact matching with no LLM judge. Five rounds of reading every failure took it from 66% to 96%, 92% on held-out. Each fix came from a real failure: the model copied example answers from its prompt, offering tools up front made it refuse questions its passages answered (so tools now come only after a refusal), it read a range written in brackets in the driver docs as a citation, and it answered questions about other robots with UR3e values. A guard drops any citation the model was not given. Plain RAG without tools reaches 82%, since it cannot run SQL over the trials. Every request goes to an audit log with the passages the model saw, so an answer can be traced to its page.

Built with Ollama, qwen2.5, bge-m3, sentence-transformers cross-encoders, rank-bm25, PyMuPDF, SQLite, FastAPI, pytest, GitHub Actions and Python.

Answer accuracy, 133 questions
96 %
Held-out set, 49 questions
92 %
Right page in the top five
99 %
VLM planning loop, local Qwen2.5-VL with Set-of-Mark grounding
Same brain, two bodies: Unitree G1 and H1, only a config file changes
Side-by-side comparison: LAFAN1 human motion-capture reference on the left (speed 0.49 m/s, stride 0.46 m, cadence 1.07/s) and the trained Unitree G1 policy at cycle 7 on the right (speed 0.49 m/s, stride 0.39 m, cadence 1.52/s, 4.6B training steps), both walking in MuJoCo with overlaid gait metrics

G1 Motion Imitation: Learning Human Gait from Motion Capture

Speed, robot and human
0.48 / 0.49 m/s
Cadence
1.09 / 1.07 /s
Stride
0.43 / 0.46 m
Read the full write-up

DeepMimic-style motion imitation training the Unitree G1 to track LAFAN1 human mocap, running in JAX and MJX with PPO on a 6 GB laptop GPU at ~30,000 env-steps/s (9x the CPU baseline); 5.8B total training steps across 13 measured cycles. The resulting gait sits within 2 to 7% of the human reference on speed (0.48 vs 0.49 m/s), cadence (1.09 vs 1.07/s), stride (0.43 vs 0.46 m) and pelvis bounce. Found that PD position control reached in 5M steps what the reference torque-control recipe needed 300M for (~60x sample efficiency), and shipped four undocumented framework fixes upstream, including a silent JAX-scalar vs MuJoCo-enum bug that had been blocking every dataset load.

Built with JAX, MJX, PPO, DeepMimic, LAFAN1 mocap, Unitree G1, MuJoCo and Python.

Autonomous Mobile Robot with SLAM & Nav2

Four-wheeled LiDAR robot rebuilt on ROS 2 Humble with slam_toolbox and a full Nav2 stack. In a cluttered warehouse: 3/3 goals reached, 0 collisions, 0 recoveries.

Read the full write-up

Four-wheeled mobile robot with a 2D LiDAR, rebuilt from scratch on ROS 2 Humble as a solo portfolio piece. Runs slam_toolbox for online SLAM and a full Nav2 stack (AMCL, NavFn A*, DWB local planner, behaviour-tree navigator) for autonomous goal-to-pose navigation on the saved map. Verified in a cluttered warehouse: 3/3 goals reached, 0 collisions, 0 recoveries on the final tuning pass.

Built with ROS 2 Humble, Nav2, slam_toolbox, Gazebo Classic, AMCL, DWB, URDF/Xacro and Python launch files.

Embodied LLM Agent for UR3e Pick-and-Place

A Claude vision model finds the objects in the RealSense frame; a Claude planner turns a sentence into MoveIt 2 actions through eight tools, behind a read-only safety gate.

  • describe_scene
  • pick
  • place
  • move_to
  • open_gripper
  • close_gripper
  • check_safety
  • home
Read the full write-up

Production-pattern agentic AI product built on Claude tool-use: a natural-language command becomes a grounded robot plan through structured outputs, validation logic, and an evaluation loop. A Claude vision model reads the RealSense D435i frame and returns a JSON list of objects with pixel centres; depth + camera intrinsics back-project each one into the base_link frame; a Claude planner then drives an 8-tool loop to execute the instruction on MoveIt 2. Built on top of my thesis’s UR3e + Robotiq 2F-140 + D435i Gazebo sim, with a read-only safety gate that reuses the thesis F/T and proximity topics. The point is that the high-level reasoning (e.g. “put the red block next to the blue cup”, then a grasp pose, then a place pose) is synthesised by the LLM over real tool feedback, not a hand-written state machine.

Built with Claude (Anthropic API), tool use, VLM, ROS 2 Humble, MoveIt 2, UR3e, Robotiq 2F-140, RealSense D435i, Gazebo and Python.

Air Quality Index Prediction & Forecasting for Chennai

Seven SARIMA models feed monthly pollutant forecasts into the Indian CPCB sub-index formula, served as a Streamlit web app.

Read the full write-up

Seven independent SARIMA models (PM2.5, PM10, NO2, SO2, O3, CO, and overall AQI) trained on the Kaggle Air Quality in India dataset, feeding monthly pollutant forecasts into the Indian CPCB sub-index formula I = ((IHI−ILO)/(BPHI−BPLO))(Cp−BPLO) + ILO. Overall AQI = max sub-index across pollutants, with a colour-coded six-category severity banner and health advice. The original Tkinter windows were rewritten as a single Streamlit web app with a forecast-by-month tab and a live AQI calculator tab (dominant-pollutant readout, CSV export, expandable CPCB breakpoint reference).

Built with Python, SARIMA, statsmodels, Streamlit, Pandas, time-series forecasting and the CPCB India standard.

Human-Robot Interaction with Force Feedback in Collaborative Tasks

My master’s thesis, on a real UR3e cobot.

Hybrid position-admittance control
500 Hz
ISO/TS 15066 modes: SSM, PFL, hand guiding
3
States in the assistive lift-and-place machine
13

Complete HRI framework on a UR3e cobot: hybrid admittance control, ISO/TS 15066 safety (SSM, PFL, Hand Guiding), YOLOv8 human detection with Intel RealSense D435i, and a 13-state FSM for assistive manipulation.

Built with ROS 2, MoveIt 2, YOLOv8, Python, Gazebo, ISO/TS 15066, UR3e and Intel RealSense.

UR3e collaborative robot workspace
UR3e workspace with Robotiq 2F-140 gripper and Intel RealSense D435i

Earlier and self-study work

Contour Detection Using Computer Vision

Self study

Classical OpenCV pipeline that segments tablets in a blister pack and classifies each by whether its horizontal seam edge is visible, with no deep learning.

Show the pipeline

Pipeline: Sobel-based edge exploration, then Gaussian blur + adaptive thresholding to get a clean binary mask, then Canny edges on the cropped region, then cv2.findContours with area filtering to isolate tablets; a per-contour horizontal-edge check drives red / green bounding-box classification. Built without any deep learning, the point was to reason about edges, thresholds, and morphology from first principles.

Built with OpenCV, Python, Sobel, Canny, adaptive thresholding and contour analysis.

Point Operations: Brightness, Contrast & Inversion

Self study

Pixel-wise intensity transforms from first principles: darken, lighten, contrast, negative and grayscale.

Show the result

Implemented the core pixel-wise intensity transforms from first principles: the affine map g(x,y) = α·f(x,y) + β drives darken, lighten, low-contrast, and high-contrast variants; a bitwise NOT gives the photographic negative; and a weighted RGB to luminance projection 0.3R + 0.6G + 0.1B produces grayscale. All seven outputs (original, darken, lighten, invert, low-contrast, high-contrast, grayscale) are rendered side by side. No library-level helpers beyond the numpy clip and the OpenCV colour-space wrappers.

Seven-panel comparison of a sports photograph showing original, darken, lighten, invert, low-contrast, high-contrast, and grayscale variants

Built with OpenCV, NumPy and Python.

Histogram Equalization from Scratch

Self study

Global histogram equalization without cv2.equalizeHist, through the PDF and CDF.

Show the result

Reimplemented global histogram equalization without using cv2.equalizeHist: compute the 256-bin intensity histogram, derive the PDF and then the CDF, and use np.interp to remap every pixel through the CDF × 255 lookup. Applied to an under-exposed sunset photograph where most of the intensity mass sits near zero; the equalized output spreads that narrow range across the full 0 to 255 gamut, pulling foliage texture and cloud structure out of the near-black regions.

Side-by-side comparison of an under-exposed sunset photograph and the same image after manual histogram equalization, showing recovered detail in the sky and foliage

Built with NumPy, Matplotlib and Python.

Object Detection Using YOLO with Audio Alert

Self study

Integrated YOLOv8 with Google text-to-speech (gTTS) and a real-time GUI for enhancing accessibility for visually impaired users with audio feedback of detected objects.

Built with YOLOv8, gTTS and Python.

Implementation of MPPT on PV Cell Using Incremental Conductance Method

Bachelor’s thesis

Modelled a 150W PV module in MATLAB/Simulink, implemented the Incremental Conductance MPPT algorithm with a SEPIC DC-DC converter. Achieved 97%+ MPP tracking accuracy, outperforming Perturb & Observe under varying irradiance.

Built with MATLAB, Simulink and Simscape.

Technical skills

Tools and technologies I work with.

Programming and toolsPython, C/C++, Git, Linux, VS Code, Jupyter
Robotics and controlROS 2, MoveIt 2, MoveIt Servo, admittance control, OMPL, Pilz, SLAM, Gazebo, URDF/Xacro, tf2, humanoid robotics
AI and machine learningAgentic AI, tool use, VLM, VLA, LLM application development, PyTorch, JAX, TensorFlow, Scikit-learn, deep learning, reinforcement learning (PPO), ARIMA, SARIMA
Computer vision and sensorsOpenCV, YOLOv8, Intel RealSense D435i, depth estimation, HSV segmentation, hand-eye calibration, point clouds
Safety and standardsISO/TS 15066, SSM, PFL, hand guiding, risk assessment, functional safety
Data and analysisNumPy, Pandas, Matplotlib, MATLAB, Simulink, feature engineering

Languages

English
Fluent
German
A2
Malayalam
Native
Tamil
Fluent
Hindi
Fluent

Education

Master of Engineering, 2022 to 2026

Artificial Intelligence for Smart Sensors and Actuators

Technische Hochschule Deggendorf (DIT), Cham, Germany

“Human-Robot Interaction with Force Feedback in Collaborative Tasks”

Specialisation: Machine Learning, Deep Learning, Computer Vision, Autonomous Systems, IoT, Robotics

Bachelor of Engineering

Electrical and Electronics Engineering

University of Calicut, Kerala, India

“Implementation of MPPT on PV Cell Using Incremental Conductance Method”

Specialisation: Digital Signal Processing, Digital System Design, Power Electronics, IoT

Certifications

Vanderbilt University, August 2026

AI Agents and Agentic AI with Python & Generative AI

Vanderbilt University certificate for AI Agents and Agentic AI with Python and Generative AI, issued to Nishanth Sundaran, August 2026
Skills covered

Agentic AI, Tool Use, Function Calling, AI Agent Architecture, LLM Application Development, Prompt Engineering, Prompt Patterns, OpenAI API, Retrieval-Augmented Generation (RAG), Python for AI.

Verify credential

IBM, September 2026

Machine Learning with Python

IBM certificate for Machine Learning with Python, issued to Nishanth Sundaran, September 2026
Skills covered

Supervised Learning, Unsupervised Learning, Classification (Logistic Regression, KNN, SVM, Decision Trees), Regression (Linear, Non-linear), Clustering (k-means, Hierarchical, DBSCAN), Recommender Systems, Model Evaluation (Cross-validation, Precision/Recall/F1), Scikit-learn, Pandas.

Verify credential

Get in touch

Available immediately for robotics and AI engineering roles in Germany, full-time or as a full-time internship. Based in Cham, Bavaria, and open to relocation and hybrid or remote arrangements.