Robotics Β· Reinforcement Learning Β· LLM Inference Β· Sim-to-Real
PhD Student β Open to Robotics / Machine Learning / Embodied AI Internships.
PhD student working at the intersection of Robot Learning and Large-scale Systems. I train RL policies in simulation and push them toward real hardware, and I build the AI agents and infrastructure that make both fast and correct.
I came to AI from an unusual direction: architecture, which taught me to reason about complex systems, geometry and the tradeoffs between elegant ideas and real-world constraints. I love learning new things, digging into hard problems, and figuring out how to solve them.
- π€ Robotics Reinforcement Learning β I trained contact-rich manipulation policies in NVIDIA Isaaclab and transferred them from simulation to real robots. I'm a contributor to Isaaclab, with PRs to the Newton physics engine.
- π¦Ύ ROS 2 β I bridge learned policies to real robot stacks, and I built armguard-mcp, a safety-first MCP server that lets LLM agents operate ROS 2 robot arms.
- π§ AI Agents β I build VLM-driven agents that perceive, reason over policy, and act in a closed senseβthinkβactβreport loop (see SafetyCommander below).
- βοΈ LLM Infrastructure β I contribute to vLLM, the core LLM inference engine.
| Project | Description | Stack |
|---|---|---|
| SafetyCommander β Autonomous Factory Safety Officer | A VLM agent that owns a safety officer's shift: it watches the production floor on camera, reasons about risk by reading the site's written safety policy (and citing the exact clause it relied on), fires risk-graded actions (log β notify β corrective ticket β escalate β Slack), routes each alert to the right worker, and rolls each shift up into KPI reports + a forward-looking inspection/training plan. The VLM makes every risk decision β no hardcoded rules (edit one line of policy and the verdict flips). Built at the Zapdos Labs Γ Antler hackathon (AI Agents for the American Industrial Revolution); in active development since. | Qwen3-VL on vLLM, YOLO perception, TF-IDF RAG (OSHA/SOP), Flask |
| Arm Reinforcement Learning (Isaac Lab) | Reinforcement-learning training for a Franka Emika Panda manipulator in NVIDIA Isaac Lab β GPU-parallel environments for arm control (reaching / manipulation) with PPO-style policy training in simulation. | Isaac Lab, Isaac Sim, PyTorch, RL |
| Archiagents | End-to-end AI agent for architectural design (collaborative project). Ingests project briefs + CAD/DWG/IFC/Revit files, runs requirement dialogue, generates design schemes and photorealistic renders, and outputs IFC4 BIM models with an embedded Autodesk APS viewer. My role: brought the architecture-domain expertise (B.Arch background) β shaping the design-requirement logic, the agent's reasoning over building programs, and the IFC4 / BIM modeling that turns AI output into valid design deliverables. | Vercel AI SDK, shadcn/ui, Autodesk APS, IFC4 |
| Revit-Civil-AI-Estimator | Revit 2025 add-in that uses OpenAI to automate quantity takeoff and cost estimation for civil-engineering workflows. | C#, OpenAI API, Revit |
- PR #46542 β
[Perf][LoRA](Merged): Replaced a per-tokenlist.index()lookup inconvert_mappingβ an O(num_tokens Γ num_loras) hot path the code had flagged with a TODO β by building a reverse{lora_id: index}dict once for O(1) lookups, cutting mapping construction to O(num_tokens). 2.5Γβ6.5Γ faster in microbenchmarks (e.g. 64 LoRAs / 1024 tokens: 275Β΅s β 42Β΅s), with identical output verified against randomized + existing LoRA tests. - PR #46543 β
[Perf][Multimodal](Merged): Removed a wasteful O(num_frames) timestamp-list allocation in GLM-4V / GLM video frame sampling, computing each timestamp inline asframe_index * duration_per_frame. Byte-for-byte identical behavior with lower memory on long videos.
- PR #7967 β Force/Torque Frame Fixes (Merged):
- FORGE:
change_FT_frameapplied the inverse rotation and the wrong lever-arm sign when re-expressing a wrench in another frame. I fixed it and added a point-force reference test. - PhysX Joint-Wrench Sensor: I suspected the sensor transformed its readings twice, then confirmed it in simulation. With rotated and offset joint frames, the raw PhysX wrench matched the analytic value in every case, while the sensor output did not. Based on this finding, a maintainer implemented the PhysX fix in this PR.
- FORGE:
- Issue #7969 β Newton Wrist F/T Sensing on Fixed Joints (Implemented Upstream in #7978): Proposed reporting joint reaction wrenches for welded tool flanges and wrist sensors on the Newton backend, for parity with PhysX. The proposal covered the failure mode, the physics check and the design.
- PR #7989 β Body-Offset Jacobian for DiffIK / OSC (Open):
Fixes the Jacobian shift to the end-effector offset frame used by the Franka IK/OSC tasks.
- It rotates the lever arm into the root frame and no longer rotates the angular rows.
- Against finite differences, the maximum error drops from 0.6 to 2e-7.
- PRs #7987, #7988 β Observation and Actuator Fixes (Open):
- #7987: The multi-body projected-gravity observation crashed with the default all-body selection.
- #7988: The ANYmal LSTM actuator ignored the DC-motor torque-speed limit.
- PR #6235 β Documentation Fixes (Merged).
Newton (newton-physics/newton, ~5.7kβ ) β GPU Physics Engine (NVIDIA Β· Google DeepMind Β· Disney Research)
- PR #4306 β Static vs. Dynamic Coulomb Friction (Open):
- Adds a separate static (break-away) friction coefficient to Newton's shape materials.
- Keeps USD
staticFriction, which the importer used to discard. - Passes the coefficient to the Kamino solver.
- The change is backward-compatible, and it is the first step toward stick-slip contact (#3560).
- PR #4307 β USD Joint-State Units (Open): Imported angular joint velocities were 57.3Γ too large. The importer now converts deg/s to rad/s for revolute, D6 and merged joints.
armguard-mcp β Safety-First MCP Server for ROS 2 Manipulators
- Lets LLM agents inspect, plan and execute on ROS 2 arms (MoveIt 2, ros2_control, franka_ros2).
- The server enforces the safety envelope itself: joint, workspace and force/torque limits, keep-out zones, allowlists and rate limits.
- Motion requires human approval through MCP elicitation, and the server provides a software e-stop and an audit log.
- CI runs unit tests and live-MoveIt integration tests on ROS 2 Jazzy.
Robotics & Simulation
AI / ML
Languages & Systems



