<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Jupyter Blog - robotics</title><link href="https://jasongrout.github.io/medium-archive/pelican/" rel="alternate"/><link href="https://jasongrout.github.io/medium-archive/pelican/feeds/tag-robotics.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><entry><title>JupyterLab, the Cloud Robotics Command Station</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2020/jupyterlab-ros/" rel="alternate"/><published>2020-08-11T13:19:00+00:00</published><updated>2020-08-11T13:20:00+00:00</updated><author><name>Carlos Herrero</name></author><id>tag:jasongrout.github.io,2020-08-11:/medium-archive/pelican/posts/2020/jupyterlab-ros/</id><summary type="html">&lt;p&gt;Building a cloud robotics development platform using JupyterLab and ROS&lt;/p&gt;
</summary><content type="html">&lt;figure&gt;
&lt;img alt="JupyterLab-ROS with Voilà to quickly make a standalone web app" src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/jupyterlab-ros/images/001-1_zfaBPxiCzlnoNoKrVpcrIA.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;JupyterLab-ROS with Voilà to quickly make a standalone web app&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;The ROS open-source project (Robot Operating System) has become a &lt;em&gt;de-facto&lt;/em&gt; industry standard in the robotics community. Very much like with Project Jupyter, a large collection of software has been built upon well-specified communication protocols. ROS has become a rich ecosystem of standardized tools for building and distributing ROS-based software, exploratory robotics development, and much more.&lt;/p&gt;
&lt;p&gt;With &lt;em&gt;Industry 4.0&lt;/em&gt;, the number of robots and smart devices has been increasing exponentially. We are talking about fully automated factories with hundreds of robots and thousands of connected sensors, generating large amounts of raw data.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;There is an opportunity in bridging the ROS and the open-source data science ecosystems and tools.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;For this reason, we set ourselves to bring together these ecosystems,&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;by producing a collection of JupyterLab extensions for ROS, turning JupyterLab into a &lt;em&gt;cloud robotics command station&lt;/em&gt;,&lt;/li&gt;
&lt;li&gt;by integrating ROS packages with conda / mamba package management system, to enable their installation alongside other open-source data-science packages.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="jupyterlab-the-cloud-robotics-command-station"&gt;&lt;strong&gt;JupyterLab, the cloud robotics command station&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;While the traditional developer tools from the ROS stack such as RViz are desktop-based, we think that a robotics development environment running in a web browser would provide a lot of flexibility. Also, the ideal robotics developer platform should be plugin-based, and easily extensible to account for the diversity of use cases to enable, from simple interactive scripting to visualization or large datasets. Finally, we should build this environment upon broadly adopted foundations, with open governance, and not let a single entity hold the keys to the ROS ecosystem.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Jupyter is a natural candidate to serve as the foundation for a web-based robotics development environment.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;JupyterLab is a web-based interactive development environment that has many of the much-needed features&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;In JupyterLab, everything is a plugin, including the core components to the application. Anyone can produce a “remix” of core and third-party JupyterLab extensions to their needs.&lt;/li&gt;
&lt;li&gt;Very much in the spirit of ROS, one of the keys to Jupyter’s success is that the project was built upon well-documented and specified protocols and file formats that anyone could implement.&lt;/li&gt;
&lt;li&gt;Jupyter is a multi-stakeholder project, not backed by a single corporation, but by a community of developers at a variety of companies, universities, as well as individual contributors.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Today, we are announcing the first beta of JupyterLab-ROS, a collection of JupyterLab plugins to integrate ROS with the JupyterLab platform. We combine the best of the data-science and robotics worlds to help developers build custom solutions for the industry. ROS can run in a high-performance server while JupyterLab is accessed in a web-browser (on Windows, OS X or Linux).&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="JupyterLab-ROS" src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/jupyterlab-ros/images/002-1_98A8hXDk_cgVqdoA6EPXAg.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;JupyterLab-ROS&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;JupyterLab-ROS automatically starts a rosmaster and rosbridge_server making all the painful setup of WebSockets connections completely transparent to users. A status bar widget allows you to start and stop the rosmaster server with a simple click and displays its state in real-time. Internally this widget runs a launch file which can be changed from the JupyterLab settings UI to launch additional nodes.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Master status widget" src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/jupyterlab-ros/images/003-1_TA29a27cM-21mdTkdBQQxA.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Master status widget&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Another important component of the ROS stack is RViz, a desktop-based 3-D visualization tool. It’s web-based counterpart in JupyterLab is Zethus, started by Rapyuta Robotics. This plugin supports most of the display types supported by RViz. It also provides an info panel that displays the raw messages in realtime, and a web-based version of rqt_graph for visualizing the ROS node graph.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Zethus" src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/jupyterlab-ros/images/004-1_lzap6vG9lEBSQsg9rj7zog.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Zethus&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;A robotics station would be incomplete without a tool for debugging. For that purpose, ROS provides rosconsole, a package which allows developers to send messages to rosout and make them available on every node. The console gives access to these debugging messages in JupyterLab and provides additional features such as filtering by level and by node.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Log Console" src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/jupyterlab-ros/images/005-1_OAsQ5PQoERlx2Tmex25aLg.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Log Console&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="robotics-notebooks"&gt;Robotics Notebooks&lt;/h2&gt;
&lt;p&gt;A key component to the Jupyter stack is the Notebook, an open-source web application that allows you to create and share documents that contain live code, equations, visualizations and narrative text. It’s frequently used to do data cleaning and transformation, numerical simulation, statistical modelling, data visualization, machine learning etc.&lt;/p&gt;
&lt;p&gt;The notebook could be the perfect tool for robotics researchers and educators to make (and share) experiments in control algorithms, working in a dynamic and interactive development environment that allows quick prototyping and exploratory analysis while having access to the sophisticated mathematical libraries already well integrated with Jupyter. It can be tedious to have a different platform for interacting with robots and processing the data obtained from these, JupyterLab-ROS combines both toolsets and enables an integrated workflow.&lt;/p&gt;
&lt;p&gt;At the same time, many projects are becoming more and more interdisciplinary. Currently, it is common to see projects mixing topics like machine learning and robotics. JupyterLab-ROS opens a new world of possibilities for machine learning researchers that are interested in applying their models to robots: now they have the possibility of connecting a robot to a development environment that they are very familiar with.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/RoboStack/jupyter-ros"&gt;JupyROS&lt;/a&gt; is another powerful library that leverages &lt;a href="https://github.com/jupyter-widgets/ipywidgets/"&gt;ipywidgets&lt;/a&gt; and &lt;a href="https://github.com/bqplot/bqplot"&gt;bqplot&lt;/a&gt; to integrate ROS in Jupyter Notebooks, being able to show real time plots from ROS messages and create intuitive forms to control robots in minutes.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Interactive Robotics in the Jupyter Notebook, with live plotting" src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/jupyterlab-ros/images/006-1_GN-BDT8ZT8GOcVZPKb44cg.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Interactive Robotics in the Jupyter Notebook, with live plotting&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id="ros-package-management"&gt;&lt;strong&gt;ROS Package management&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;Modern scientific computing applications typically depend on a large number of libraries. &lt;a href="https://conda-forge.org/"&gt;Conda-forge&lt;/a&gt; is a community initiative to package scientific libraries for the conda package manager, and has become a &lt;em&gt;de-facto&lt;/em&gt; standard source of packages for the scientific computing community, with tens of thousands of available packages, and thousands of contributors.&lt;/p&gt;
&lt;p&gt;During the last year, we have worked hard to package more and more of ROS as &lt;em&gt;conda packages&lt;/em&gt;. Conda-packages for ROS Melodic, including RViz are now available on all three operating systems! You can find the packages on the &lt;a href="https://anaconda.org/robostack"&gt;RoboStack channel&lt;/a&gt; (a more detailed blog post about this is going to follow soon).&lt;/p&gt;
&lt;p&gt;Conda can be used to create virtual environments for ROS projects, which makes it possible to install Melodic, Kinect and Dashing side-by-side on the same Linux system, and have exact control over package versions.&lt;/p&gt;
&lt;p&gt;We are also working on &lt;a href="https://github.com/TheSnakePit/mamba"&gt;Mamba&lt;/a&gt;, a conda-compatible package manager implemented in C++. Together with &lt;a href="https://github.com/TheSnakePit/boa"&gt;Boa&lt;/a&gt; this effort will help to continuously build and release ROS packages on conda.&lt;/p&gt;
&lt;h2 id="try-it-online"&gt;Try it online!&lt;/h2&gt;
&lt;p&gt;You can try the JupyterLab-ROS extension online without installing anything by just clicking on the following binder link:&lt;/p&gt;
&lt;p&gt;&lt;a href="https://mybinder.org/v2/gh/RoboStack/jupyterlab-ros/master?urlpath=lab/tree/examples"&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/jupyterlab-ros/images/007-1_PZkzz4bGGPEyHlx-bbNRHg.webp" alt="https://mybinder.org/v2/gh/RoboStack/jupyterlab-ros/master?urlpath=lab/tree/examples" loading="lazy" data-body-image=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;JupyterLab-ROS is under active development. We are working on new features such as a rosbag widget to play and record bag files and improving existing ones like the roslaunch widget. If you are interested in contributing to JupyterLab-ROS you can find the code at &lt;a href="https://github.com/RoboStack/jupyterlab-ros"&gt;this repository&lt;/a&gt; in the RoboStack organization. Contributions are always welcome!&lt;/p&gt;
&lt;h2 id="installation"&gt;Installation&lt;/h2&gt;
&lt;p&gt;You can install JupyterLab-ROS using Mamba, the first step to create a new environment with JupyterLab and the ROS packages necessary, then you can install the extension.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;mamba create -n test -c conda-forge -c robostack python=3.6 nodejs=12 jupyterlab ros-melodic-ros-core ros-melodic-rosauth ros-melodic-rospy ros-melodic-rosbridge-suite ros-melodic-rosbag ros-melodic-tf2-web-republisher
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;conda activate test
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;pip install jupyter-ros-server
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;If you have any questions don’t hesitate to contact us on the &lt;a href="https://gitter.im/RoboStack/Lobby"&gt;RoboStack&lt;/a&gt; or &lt;a href="https://gitter.im/QuantStack/Lobby"&gt;QuantStack&lt;/a&gt; chats.&lt;/p&gt;
&lt;iframe src="https://www.youtube-nocookie.com/embed/vad9ZAUyw7k" title="JupyterLab ROS Demo" width="560" height="315" style="aspect-ratio: 560 / 315" loading="lazy" allow="accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt;This work has many collaborators around the world, and we are especially grateful to &lt;a href="https://github.com/chaitanya-deep"&gt;Deep Chaitanya&lt;/a&gt; &amp;amp; &lt;a href="https://github.com/tocttou"&gt;Ashish Chaudhary&lt;/a&gt; from Rapyuta Robotics, &lt;a href="https://github.com/seanyen"&gt;Sean Yen&lt;/a&gt; from Microsoft for his amazing work on vinca that automagically generates the conda-recipes, &lt;a href="https://github.com/Tobias-Fischer"&gt;Tobias Fischer&lt;/a&gt; for many patches and pushing us to bring OS X support to the conda packages as well. Many thanks to &lt;a href="https://github.com/jtpio"&gt;Jeremy Tuloup&lt;/a&gt; for his help with the JupyterLab extension system.&lt;/p&gt;
&lt;h2 id="about-the-authors"&gt;About the authors&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://twitter.com/wuoulf"&gt;Wolf Vollprecht&lt;/a&gt; works as a scientific and robotics software developer for QuantStack in Paris and Berlin.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/jupyterlab-ros/images/008-1_HnFdxHmGARUXhanv9pDCYg.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://twitter.com/CarlosHerreroB"&gt;Carlos Herrero&lt;/a&gt; is a Computer Engineer passionate about AI and his applications on robotics. Currently working at QuantStack helping to develop Open Source projects.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2020/jupyterlab-ros/images/009-1_uyE3rS6qzPDbNAJE5Mfx1A.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
</content><category term="JupyterLab"/><category term="robotics"/></entry><entry><title>ROS @ Jupyter</title><link href="https://jasongrout.github.io/medium-archive/pelican/posts/2019/ros-jupyter/" rel="alternate"/><published>2019-04-07T21:15:00+00:00</published><updated>2019-04-07T21:15:00+00:00</updated><author><name>Wolf Vollprecht</name></author><id>tag:jasongrout.github.io,2019-04-07:/medium-archive/pelican/posts/2019/ros-jupyter/</id><summary type="html">&lt;p&gt;Project Jupyter is a huge hit in data science, but it has not yet found widespread adoption in robotics. Today, we are releasing the first version of jupyter-ros, a collection of Jupyter interactive widgets inspired by Qt and RViz, to bring their features to the Jupyter ecosystem. This may be the right time for Jupyter-based developer tools, as cloud robotics is taking off.&lt;/p&gt;
</summary><content type="html">&lt;figure&gt;
&lt;p&gt;&lt;video src="images/005-Ri327iDKuC4pnExM4L-giphy.mp4" preload="metadata" loop muted playsinline controls&gt;&lt;/video&gt;&lt;/p&gt;
&lt;figcaption&gt;
&lt;p&gt;This may be the right time for Jupyter-based developer tools, as cloud robotics is taking off. A PR2 robot in the browser, and making him dance through the traditional Qt interface&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Historically, the &lt;a href="http://www.ros.org/"&gt;ROS (Robot Operating System)&lt;/a&gt; community has relied on Qt for building complex user interfaces. Nowadays, the Jupyter notebook and the ipywidgets framework offer a compelling alternative for several reasons:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Code and interface are &lt;em&gt;not separated&lt;/em&gt; — both are in the same notebook.&lt;/li&gt;
&lt;li&gt;Complex widgets using browser technology are possible: from &lt;a href="https://github.com/jupyter-widgets/ipywidgets"&gt;JavaScript sliders&lt;/a&gt; to 3D with &lt;a href="https://github.com/maartenbreddels/ipyvolume"&gt;WebGL&lt;/a&gt;, &lt;a href="https://github.com/maartenbreddels/ipywebrtc"&gt;real time video streaming with WebRTC&lt;/a&gt;…&lt;/li&gt;
&lt;li&gt;Works with any web browser — not bound to Linux, and no Qt applications need to be compiled.&lt;/li&gt;
&lt;li&gt;Doesn’t need to run locally! Applications can run on a server far away, without any manual setup or installation procedure.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;However, ROS does not play nicely with Jupyter. For example, rospy is inherently multi-threaded (every new ROS topic subscriber spawns a new thread). Debug printouts in callbacks result in Jupyter printing that content into the output area of the active notebook cell, quickly flooding the user interface — and there is no easy way to stop logging threads once started.&lt;/p&gt;
&lt;h3 id="ipywidgets-to-the-rescue-jupyter-ros"&gt;ipywidgets to the rescue: jupyter-ros&lt;/h3&gt;
&lt;p&gt;That is why &lt;a href="https://github.com/RoboStack/jupyter-ros"&gt;jupyter-ros&lt;/a&gt; was created. It is a suite of plugins to the Jupyter ecosystem to make working with ROS inside Jupyter a breeze.&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="Subscribing with jupyter-ros produces an interactive widget" src="https://jasongrout.github.io/medium-archive/pelican/posts/2019/ros-jupyter/images/001-1_35w3erSL2xz0mp9le6YNyg.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;Subscribing with jupyter-ros produces an interactive widget&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;First, when you subscribe using jupyter-ros, the function returns an ipywidget with a start/stop button and a dedicated output area for debug prints. Internally this re-routes all print outs from your subscriber thread to this Jupyter cell, and gives full control over the thread (by being able to stop and restart it at any time).&lt;/p&gt;
&lt;figure&gt;
&lt;img alt="The jupyros publishing sugar" src="https://jasongrout.github.io/medium-archive/pelican/posts/2019/ros-jupyter/images/002-1_yBgrLtyCGlaZcUQnFV9Jpg.webp" loading="lazy" data-body-image=""&gt;
&lt;figcaption&gt;The jupyros publishing sugar&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;If you call the publish function in jupyter-ros, a widget is automatically generated from the message specification. For example, a ROS message String field automatically becomes a text input widget, a Float32 becomes a FloatSlider…&lt;/p&gt;
&lt;figure&gt;
&lt;p&gt;&lt;video src="images/006-fSqNQ06Ujnuu8juH2t-giphy.mp4" preload="metadata" loop muted playsinline controls&gt;&lt;/video&gt;&lt;/p&gt;
&lt;figcaption&gt;
&lt;p&gt;Live plotting IMU data from a BBC micro:bit&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Another interesting functionality is the live plotting, similar to rqt_plot. For this we use &lt;a href="https://github.com/bloomberg/bqplot"&gt;bqplot&lt;/a&gt;, a “jupyter-native” solution to plotting. With jupyter-ros, you can select a couple of fields from your message, and they will be automatically plotted to a bqplot.&lt;/p&gt;
&lt;h3 id="going-3-d"&gt;Going 3-D&lt;/h3&gt;
&lt;p&gt;Most robots are three dimensional, and so should be the visualizations! The go-to tool in the ROS ecosystem at the moment is RViz, a very powerful 3-D visualization tool.&lt;/p&gt;
&lt;p&gt;Some of RViz’s functionality has already been ported over to the web browser as part of the &lt;a href="http://robotwebtools.org/"&gt;RobotWebTools&lt;/a&gt; effort. We’ve been able to piggy-back on their impressive work, and we’re releasing the first iteration of ROS3D Jupyter widgets. Currently, they allow you to programatically plug together RViz like visualizations for different data types, such as laser scans, robot trajectories, and 3D (URDF) models of the robot!&lt;/p&gt;
&lt;p&gt;Thanks to the ipywidgetification, you can now bring complex visualizations to the web, without writing any JavaScript, and arrange those visualizations freely in JupyterLab.&lt;/p&gt;
&lt;figure&gt;
&lt;iframe src="https://www.youtube-nocookie.com/embed/mPvYZango2E" title="ROS widgets in JupyterLab" width="560" height="315" style="aspect-ratio: 560 / 315" loading="lazy" allow="accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen&gt;&lt;/iframe&gt;
&lt;figcaption&gt;
&lt;p&gt;Interactive widgets showing ROS data inside JupyterLab&lt;/p&gt;
&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h3 id="jupyter-widgets-and-cloud-robotics"&gt;Jupyter, Widgets, and Cloud Robotics&lt;/h3&gt;
&lt;p&gt;We hope that Jupyter, and the jupyter-ros widgets will play a big role in cloud robotics. In cloud robotics, some of the software powering one or multiple robots runs on powerful computers in data centers. For monitoring purposes, or development, Jupyter and JupyterLab are perfect candidates. Robot customers will be able to login to a single user-friendly interface, without having to install any custom software on their machine, or run a specialized operating system (ROS usually runs on Ubuntu). Exciting possibilities arise: it is already possible to run a Docker container running JupyterLab and jupyter-ros on the leading cloud robotics platforms, &lt;a href="https://rapyuta-robotics.com"&gt;Rapyuta Robotics&lt;/a&gt; and their freshly launched platform &lt;a href="http://rapyuta.io"&gt;rapyuta.io&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id="installation-source"&gt;Installation &amp;amp; source&lt;/h3&gt;
&lt;p&gt;The jupyter-ros widgets can be installed from PyPI using&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$&lt;span class="w"&gt; &lt;/span&gt;pip&lt;span class="w"&gt; &lt;/span&gt;install&lt;span class="w"&gt; &lt;/span&gt;jupyros
$&lt;span class="w"&gt; &lt;/span&gt;jupyter&lt;span class="w"&gt; &lt;/span&gt;nbextension&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;enable&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;--py&lt;span class="w"&gt; &lt;/span&gt;--sys-prefix&lt;span class="w"&gt; &lt;/span&gt;jupyros
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The examples and the source code can be found on github: &lt;a href="https://github.com/robostack/jupyter-ros"&gt;https://github.com/robostack/jupyter-ros&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This work is still early stages and you might find some rough edges. We look forward to collaborating with the community to polish these widgets to the highest standards!&lt;/p&gt;
&lt;h3 id="about-quantstack"&gt;About QuantStack&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://twitter.com/QuantStack"&gt;QuantStack&lt;/a&gt; is located in the center of Europe (Paris). We are core Jupyter developers, and love ROS, and the cloud. If you are interested in working with us on professional user interfaces for developers or clients in the cloud, do not hesitate to send us an email: &lt;a href="mailto:wolf.vollprecht@quantstack.net"&gt;wolf.vollprecht@quantstack.net&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2019/ros-jupyter/images/003-1_puvws-ulE4ShvCd9inzo0g.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;br&gt;
&lt;img src="https://jasongrout.github.io/medium-archive/pelican/posts/2019/ros-jupyter/images/004-1_WqG2vz1hl2X0-Z2TZFFSAQ.webp" alt="" loading="lazy" data-body-image=""&gt;&lt;/p&gt;
</content><category term="robotics"/><category term="visualization"/></entry></feed>