<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Jupyter Blog - Yahia Heni</title><link href="https://jasongrout.github.io/medium-archive/pelican/" rel="alternate"/><link href="https://jasongrout.github.io/medium-archive/pelican/feeds/author-yahia-heni.atom.xml" rel="self"/><id>https://jasongrout.github.io/medium-archive/pelican/</id><updated>2026-09-02T18:22:00+00:00</updated><subtitle>The Project Jupyter blog: news, releases, and community stories, archived from blog.jupyter.org.</subtitle><entry><title>A Robotics Workbench for JupyterCAD</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2026/a-robotics-workbench-for-jupytercad/" rel="alternate"/><published>2026-09-02T18:22:00+00:00</published><updated>2026-09-02T18:22:00+00:00</updated><author><name>Yahia Heni</name></author><id>tag:jasongrout.github.io,2026-09-02:/medium-archive/pelican/posts/2026/a-robotics-workbench-for-jupytercad/</id><summary type="html">&lt;p&gt;A unified in-browser workflow from CAD to URDF kinematics&lt;/p&gt;
</summary><content type="html">&lt;p&gt;Robotics education often hits a wall before the fun even begins. Students and engineers must first navigate a labyrinth of installations: ROS, environment configurations, dependency management, and a patchwork of software, just to visualize a simple robot. It doesn’t have to be this way.&lt;/p&gt;
&lt;p&gt;Thanks to Jupyter and its extensions, the entire process, from designing a robot to simulating its kinematics, can now happen entirely in the browser, in a single workspace with zero local installation.&lt;/p&gt;
&lt;h2 id="the-problem-the-fragmented-robotics-pipeline"&gt;The Problem: The Fragmented Robotics Pipeline&lt;/h2&gt;
&lt;p&gt;Traditionally, creating a robot model involves dealing with three distinct, often incompatible worlds:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Parametric Design:&lt;/strong&gt; Creating the shapes in dedicated CAD software (FreeCAD, SolidWorks, and the like).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mesh Generation:&lt;/strong&gt; Exporting those solid bodies into triangular meshes (STL) while manually managing the coordinates and file paths.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Kinematic Description:&lt;/strong&gt; Writing URDF (Unified Robot Description Format) XML that ties the meshes together using joints and other parameters.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Getting this pipeline working locally typically requires a complete ROS installation, a source of friction for students and educators.&lt;/p&gt;
&lt;h2 id="the-solution-a-unified-browser-workflow"&gt;The Solution: A Unified Browser Workflow&lt;/h2&gt;
&lt;p&gt;By leveraging the JupyterCAD and JupyterLite, this entire toolchain is delivered as an instant, zero-install workspace in the browser. It is made available on the &lt;a href="https://notebook.link/"&gt;&lt;strong&gt;notebook.link&lt;/strong&gt;&lt;/a&gt; service.&lt;/p&gt;
&lt;h2 id="1-jupytercad-the-design-hub"&gt;1. JupyterCAD: The Design Hub&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://medium.com/@yahia.heni/github.com/jupytercad/JupyterCAD"&gt;&lt;strong&gt;JupyterCAD&lt;/strong&gt;&lt;/a&gt; is a JupyterLab extension for collaborative 3D modeling. It also supports FreeCAD files and offers a full set of tools for creating, transforming, and combining 3D shapes.&lt;/p&gt;
&lt;p&gt;It can also export to various formats:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;STL/BREP:&lt;/strong&gt; Users can simply right-click any shape and generate meshes directly in their browser.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/a-robotics-workbench-for-jupytercad/images/001-1_pZAalrX9FpY6Bbv0aSJAWg.mp4" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;FreeCAD:&lt;/strong&gt; Through the &lt;a href="https://github.com/jupytercad/JupyterCAD-FreeCAD"&gt;&lt;strong&gt;JupyterCAD-FreeCAD&lt;/strong&gt;&lt;/a&gt; plugin, designs can move freely between the browser and desktop CAD (FreeCAD) without losing the feature tree, exporting back and forth between the .jcad and .FCStd formats.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="2-jupytercad-urdf-the-urdf-workbench-for-jupytercad"&gt;2. JupyterCAD-URDF: The URDF Workbench for JupyterCAD&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/jupytercad/JupyterCAD-urdf"&gt;&lt;strong&gt;JupyterCAD-URDF&lt;/strong&gt;&lt;/a&gt; is a JupyterCAD plugin for exporting CAD designs to the URDF format.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It generates STL meshes automatically for complex shapes. For simple primitives (boxes, spheres, and cylinders), it emits XML tags instead of producing external mesh files.&lt;/li&gt;
&lt;li&gt;It produces a &lt;strong&gt;URDF XML&lt;/strong&gt; document that references those meshes while preserving hierarchies, names, colors and placements.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/a-robotics-workbench-for-jupytercad/images/002-1_eWCCAx2Uyw7pf3DXCmbVyQ.mp4" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;h2 id="3-jupyterlab-urdf-interactive-kinematics"&gt;3. JupyterLab-URDF: Interactive Kinematics&lt;/h2&gt;
&lt;p&gt;Once the model is exported, the &lt;strong&gt;JupyterLab-URDF&lt;/strong&gt; extension, which can be used in JupyterLab independently of JupyterCAD, allows for inspection of the XML content as well as interactive 3D visualization:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Real-Time Kinematic Articulation&lt;/strong&gt;: Drag joint sliders to test degrees of freedom, joint limits, and coordinate hierarchies in real time.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;3D Scene Controls&lt;/strong&gt;: The control panel has several settings to customize the scene, such as coordinate frame helpers, lighting controls, mesh visibility, and other options.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Joints Editor:&lt;/strong&gt; An interface to define kinematic relationships (joints) between parts by selecting them directly in the 3D scene. This allows for creating new joints or editing existing ones.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/a-robotics-workbench-for-jupytercad/images/003-1_hG86LjJfW9V_AVmjbAd_Pw.mp4" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;h2 id="walkthrough-zero-to-robot-workflow"&gt;Walkthrough: Zero-to-Robot Workflow&lt;/h2&gt;
&lt;p&gt;This new pipeline allows a student to go from a blank page to a moving robot:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Phase 1: CAD Modeling &amp;amp; Export (JupyterCAD + JupyterCAD-URDF)&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Design&lt;/strong&gt; parametric parts in JupyterCAD.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Export&lt;/strong&gt; to URDF using JupyterCAD-URDF.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;Phase 2: Assembly &amp;amp; Simulation (jupyterlab-urdf)&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Assemble&lt;/strong&gt; the generated URDF in jupyterlab-urdf and use the &lt;strong&gt;Joints Editor&lt;/strong&gt; to connect links.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Simulate&lt;/strong&gt; the robot movement using the joint sliders.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;You can try it right now without any local installation thanks to the deployment on notebook.link, by following the link below.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://notebook.link/@Yahiewi/urdf-demo"&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2026/a-robotics-workbench-for-jupytercad/images/004-0_Zir-X_cL1PYlmmnW.svg" alt="" loading="lazy" data-body-image=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="repos"&gt;Repos&lt;/h2&gt;
&lt;p&gt;All tools in this pipeline are free, open source, and available on GitHub, PyPI, npm, and Conda-forge:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/jupytercad/JupyterCAD"&gt;&lt;strong&gt;JupyterCAD&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jupytercad/JupyterCAD-urdf"&gt;&lt;strong&gt;JupyterCAD-URDF&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/jupyter-robotics/jupyterlab-urdf"&gt;&lt;strong&gt;JupyterLab-URDF&lt;/strong&gt;&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="acknowledgements"&gt;Acknowledgements&lt;/h2&gt;
&lt;p&gt;This work was conducted at &lt;strong&gt;QuantStack&lt;/strong&gt; as part of an effort to make 3D modeling and robotics accessible directly in web-native environments.&lt;/p&gt;
&lt;p&gt;Special thanks go to everyone in the open-source community who made this possible, to &lt;a href="https://github.com/IsabelParedes"&gt;Isabel Paredes&lt;/a&gt;, the creator and maintainer of the jupyterlab-urdf extension, to &lt;a href="https://github.com/trungleduc"&gt;Le Duc Trung&lt;/a&gt; and &lt;a href="https://github.com/martinRenou"&gt;Martin Renou&lt;/a&gt;, the main contributors to JupyterCAD, and to everyone else at QuantStack who helped with this project.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="about-the-author"&gt;About the Author&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://github.com/Yahiewi"&gt;&lt;strong&gt;Yahia Heni&lt;/strong&gt;&lt;/a&gt; is a software engineer at QuantStack, focusing on the Jupyter Ecosystem, by contributing to Jupyter and several of its extensions, as well as notebook.link and other related open-source projects.&lt;/p&gt;
</content><category term="JupyterCAD"/><category term="robotics"/><category term="urdu"/></entry></feed>