<!DOCTYPE article PUBLIC "-//NLM//DTD JATS (Z39.96) Journal Archiving and Interchange DTD v1.0 20120330//EN" "JATS-archivearticle1.dtd">
<article xmlns:xlink="http://www.w3.org/1999/xlink">
  <front>
    <journal-meta />
    <article-meta>
      <title-group>
        <article-title>Interactive ROS Tutorials with Jupyter Notebooks</article-title>
      </title-group>
      <contrib-group>
        <contrib contrib-type="author">
          <string-name>Enric Cervera?</string-name>
          <xref ref-type="aff" rid="aff0">0</xref>
        </contrib>
        <aff id="aff0">
          <label>0</label>
          <institution>Robotic Intelligence Lab Universitat Jaume-I de Castello ́</institution>
          ,
          <country country="ES">Spain</country>
        </aff>
      </contrib-group>
      <pub-date>
        <year>2018</year>
      </pub-date>
      <abstract>
        <p>Collaboration is a major strength of ROS, as it was designed specifically for groups with different expertise (mapping, navigation, vision, etc) to collaborate and build upon each other's work. The ROS Wiki is such an example,1 with the official documentation for ROS packages, as provided by their developers, and every user has dived into its ROS tutorials for learning the basic concepts. Those tutorials consist of web pages with embedded examples of source code that the user can run in a separate terminal. We aim to transform the static tutorials into interactive documents where the user not only reads but also runs the code inside the same web browser, by using Jupyter Notebook technology.2 Our goal is to make the tutorials more concise and effective, avoiding the tedious and error-prone copying-and-pasting of code. Also, the integration of execution results provides the user with step-by-step feedback, for a more illuminating learning experience.</p>
      </abstract>
      <kwd-group>
        <kwd>tutorial</kwd>
        <kwd>interaction</kwd>
        <kwd>literate computing</kwd>
      </kwd-group>
    </article-meta>
  </front>
  <body>
    <sec id="sec-1">
      <title>-</title>
      <p>The ROS Tutorials are the primary source of information for learning ROS.
They consist of a collection of web pages about the installation and setup of
the system, the core concepts, and the development of robot applications in the
programming languages C++ or Python.</p>
      <p>Each web page presents a specific issue, combining an informative description
interleaved with snippets of code or commands. The code must be first copied
and pasted into an editor, then run in a terminal. The commands can be
copypasted directly into the terminal, and executed. Such a workflow requires several
views simultaneously:
– Documentation (teaching materials)
– Edition of the source code
? ORCID id: 0000-0002-5386-8968. The views and opinions expressed in this article
are those of the author, not affiliated with any of the projects mentioned.
1 http://wiki.ros.org/
2 http://jupyter.org/
– Execution and monitoring of results</p>
      <p>For a proper management of these views, several windows are needed in the
user desktop. A typical layout is shown in Fig. 1, with the browser window at
the left, displaying the documentation, the editor window at the top right, and
the terminal window for execution at the bottom right.</p>
      <p>There are some disadvantages in this arrangement, the most obvious one is
the duplication of code: the programming statements are shown in the
documentation, then they need to be copied into the development editor. In fact, some
tutorials feature two versions of the same code, a complete one for easy copying
and pasting, and a step-by-step version for the explanations.</p>
      <p>In addition, the execution of the code takes place in a third window (the
console), losing the context of the source code. Moreover, the complete program
is run, making it difficult to execute the statements step-by-step, as opposed to
the explanations in the tutorial.</p>
      <p>Jupyter notebooks provide an integrated environment for the execution of
code statements, interleaved in the same web pages of documentation. The code
can be executed in cells, or snippets of code with a few statements, and the
results are displayed below the same cell of code. Code cells can be edited and
run freely by the user, interactively. As a result, a single window combines the
three necessary views (teaching materials, edition, execution), as shown in Fig. 2.
2
2
code, and execution results are all presented together in the browser window.
3
3</p>
      <p>This paper describes how jupyter notebooks work (Section 2), how ROS and
its tutorials can be integrated in the workflow (Section 3), and a couple of
examples of representative tutorials regarding ROS topics and services (Section 4).
Finally, Section 5 draws some conclusions and outlines the work in progress.
2</p>
    </sec>
    <sec id="sec-2">
      <title>Jupyter Notebooks</title>
      <p>
        The Jupyter Notebook is an interactive computing environment that extends the
console-based approach in a new direction: it provides a web-based application
suitable for capturing the whole computation process of developing,
documenting, and executing code. Its roots lie in the Interactive Python environment [
        <xref ref-type="bibr" rid="ref5">5</xref>
        ],
and the ideas behind the proprietary-based Mathematica Notebook environment
[
        <xref ref-type="bibr" rid="ref12">12</xref>
        ].
      </p>
      <p>
        Jupyter Notebooks are experiencing an immense success in recent years,
applied to education and research [
        <xref ref-type="bibr" rid="ref7">7</xref>
        ] in a number of disciplines like computer
vision, machine learning, or even the analysis of gravitational wave data [
        <xref ref-type="bibr" rid="ref9">9</xref>
        ].
      </p>
      <p>
        Jupyter implements a ”literate computing” scheme [
        <xref ref-type="bibr" rid="ref4">4</xref>
        ], inspired in the
”literate programming” paradigm [
        <xref ref-type="bibr" rid="ref3">3</xref>
        ], a software development style pioneered by
Stanford computer scientist, Donald Knuth, that emphasizes an approach where
exposition with human-friendly text is punctuated with code blocks. Such an
approach seems more adequate for demonstration, teaching and research purposes,
especially for science and technology.
      </p>
      <p>As a server-client application, there are several processes involved in the user
interaction, as seen in Fig. 3. The kernel is the separate process that actually runs
the code. The notebook server stores code and output, together with markdown
notes (a lightweight markup language that can be converted to HTML), in an
editable document called a notebook. The user interacts with the browser, which
is connected to the notebook server for rendering notebooks, and sending user
input to the kernel.</p>
      <p>There are kernels available for many languages, starting from Julia, Python
and R (the original languages Jupyter was developed for —hence the acronym)
but also to other compiled languages like Java or C++.
3</p>
    </sec>
    <sec id="sec-3">
      <title>Integration of Jupyter and ROS</title>
      <p>
        Jupyter notebooks are being used in robotic Internet sites such The Construct
[
        <xref ref-type="bibr" rid="ref8">8</xref>
        ], which also integrates 3D simulations with Gazebo. In our approach we will
only focus on the programming task.
      </p>
      <p>ROS development is mainly based on the languages C++ and Python. The
former is perhaps the most widely used client library, and it is designed for high
performance. The latter provides the advantages of an object-oriented scripting
language: it favors implementation speed so that algorithms can be quickly
prototyped and tested. Python is a core dependency of ROS, since some tools are
developed in that language.
3.1</p>
      <sec id="sec-3-1">
        <title>Local Install</title>
        <p>Jupyter can be easily installed using Python’s package manager,3 or third-party
distributions like Anaconda.4 Once installed, it is launched from the terminal,
where the server keeps running in the background. At the same time, a new
browser window opens and displays the notebook folder, or a specific notebook.</p>
        <p>The user can then interact with the notebook, with an environment similar
to that of the console, i.e. all the C++ or Python libraries are accessible as in
any ROS application. Practical examples of tutorials will be shown in Section 4.</p>
        <p>Obviously, ROS is a prerequisite that should be available in the system, either
in a local installation or as a Docker image.5
3.2</p>
      </sec>
      <sec id="sec-3-2">
        <title>Notebooks in the Cloud</title>
        <p>Since Jupyter Notebooks use a client/server approach, it is possible to run the
server in a different computer than the client. Both machines surely must be
connected, but the connection protocol (http - the WWW protocol) makes it
possible to run the server in any computer connected to Internet.</p>
        <p>Free cloud services for IPython and Jupyter already exist, where their basic
functionality can be tested.6</p>
        <p>A recent and interesting initiative is Binder,7 which not only enables
sharing of live notebooks in a computational environment, but authors can publish</p>
        <sec id="sec-3-2-1">
          <title>3 https://packaging.python.org/tutorials/installing-packages/</title>
          <p>
            4 https://www.anaconda.com/
5 http://wiki.ros.org/docker/
6 https://try.jupyter.org/
7 https://mybinder.org/
notebooks in a source code repository along with an environment specification.
By pointing the Binder web service at the repository, a temporary environment
is automatically created with the notebooks and any libraries and data required
to run them. This allows authors to publish their code in an interactive and
immediately verifiable form [
            <xref ref-type="bibr" rid="ref2">2</xref>
            ].
          </p>
          <p>
            An environment specification for ROS can be created based on the ROS
docker images.8 These images provide a simplified and consistent platform to
build and deploy applications, with an easy way to develop, reuse and ship
software [
            <xref ref-type="bibr" rid="ref11">11</xref>
            ].
          </p>
          <p>We have upgraded the ROS docker images with the necessary packages for
running Jupyter along ROS, so that the example tutorials presented in the next
section are stored in a GitHub repository that can be run either in a local
environment, or in the cloud using the Binder service.9
4</p>
        </sec>
      </sec>
    </sec>
    <sec id="sec-4">
      <title>Tutorial Examples</title>
      <p>
        For demonstration purposes, we have adapted the tutorials for some of the most
fundamental concepts in ROS: topics and services [
        <xref ref-type="bibr" rid="ref6">6</xref>
        ]. Topics are named buses
over which nodes exchange messages. They have anonymous publish / subscribe
semantics: nodes that are interested in data subscribe to the relevant topic;
nodes that generate data publish to the relevant topic. There can be multiple
publishers and subscribers to a topic.
      </p>
      <p>The publish / subscribe model is a very flexible communication paradigm,
but its many-to-many one-way transport is not appropriate for request / reply
interactions. For that purpose, ROS features another paradigm called Service,
which is defined by a pair of messages: one for the request and one for the
reply. A providing ROS node offers a service under a string name, and a client
calls the service by sending the request message and awaiting the reply. Client
libraries usually present this interaction to the programmer as if it were a remote
procedure call.</p>
      <p>We have developed the Jupyter Notebook versions of the ROS tutorials for
writing a simple publisher and subscriber of topics, and a simple service and
client. The primary programming language is Python, but a working example in
C++ will also be presented.
4.1</p>
      <sec id="sec-4-1">
        <title>Writing a Simple Publisher and Subscriber</title>
        <p>This tutorial consists of one section for the publisher node, and another section
for the subscriber node.10 Each section is divided into two sub-sections, a first
part with the code, and a second one with the ”code explained”. This last part
consists of the code split into chunks of a few lines, followed by paragraphs of
description about each code fragment.</p>
        <sec id="sec-4-1-1">
          <title>8 https://hub.docker.com/ /ros/ 9 https://github.com/RobInLabUJI/ROS-Tutorials 10 http://wiki.ros.org/ROS/Tutorials/WritingServiceClient(python)</title>
          <p>We first divide the materials into two notebooks, for the publisher and the
subscriber. The first section is not necessary, since the code in the ”explanatory”
section can be readily executed in the notebook. So this second section is
transferred to the notebook by simply moving the source code into ”code cells” and
the description into the ”markdown cells” (Fig. 4).</p>
          <p>Some additional simplifications apply: the initial declaration for Python scripts
is not necessary, since the Jupyter environment is already running a Python
kernel. For the same reason, it is not necessary to add the lines of code for checking
that a ”main” application is running. One should keep in mind that for the code
to be re-useable in another execution environment, the full source code should
be used.</p>
          <p>The subscriber code is adapted in a similar way. The resulting document has
fewer lines than the original, since there is no duplicated code, and some
unnecessary statements have been removed. In addition, it can be readily executed
from the same browser, without need to launch the script in a console terminal
(Fig. 5).
4.2</p>
        </sec>
      </sec>
      <sec id="sec-4-2">
        <title>Writing a Simple Service and Client</title>
        <p>The structure of this tutorial is similar to the previous one.11 Again, the tutorial
is split into two notebooks, for the service and client respectively. Each
notebook consists of the contents of the section ”code explained”, either as code or
markdown cells.</p>
        <p>The code can be readily executed on each notebook in parallel, and the results
of the remote call are shown in both notebooks too (Fig. 6).</p>
        <p>11 http://wiki.ros.org/ROS/Tutorials/WritingServiceClient(python)
each node is displayed in the corresponding notebook.
is displayed in the corresponding notebook.
8
8</p>
      </sec>
      <sec id="sec-4-3">
        <title>Adapting Tutorials in C++</title>
        <p>Though Jupyter has evolved from IPython, much effort has been devoted to
the separation between the kernel running the code, and the notebook frontend.
Nowadays, more than 40 different kernels are available, each for a huge variety
of programming languages.12</p>
        <p>
          One of such kernels is based on Cling, an interactive C++ Interpreter [
          <xref ref-type="bibr" rid="ref10">10</xref>
          ]
developed within ROOT, a framework for data processing created at CERN [
          <xref ref-type="bibr" rid="ref1">1</xref>
          ].
        </p>
        <p>We have also adapted the C++ versions of the topics and services tutorials
to jupyter notebooks. Similar to Python, slight changes are needed: the main
function is removed, since the code is run interactively step-by-step; blocks of
code cannot be split across cells, e.g. loops or if-else constructs. Care must be
taken with the declarations, since any second run raises an error. The solution
is to restart the kernel, which eliminates all declared variables for a fresh start.</p>
        <p>The results of a C++ notebook for the tutorial on ROS services is shown in
Fig. 7. These results are coming from a local install, since at this moment the
Binder version of the tutorial only features the Python kernel.
Jupyter notebooks bring new live to ROS tutorials; instead of
copying-andpasting code and running it in a terminal console, the code is interleaved in
12 https://github.com/jupyter/jupyter/wiki/Jupyter-kernels
the same tutorial, where it can be run, and its output is displayed in context.
Tutorials become more concise, and the user workflow is greatly simplified, thus
enhancing the learning process.</p>
        <p>Jupyter is an open-source, cross-platform project that has become
enormously popular in the recent years. A variety of programming languages is
supported, including C++ and Python, the most widely-used languages in ROS. In
future extensions, we plan to test languages like Lisp, Go, Haskell, Java, Node.js,
Julia, and Ruby: all of them are available both in Jupyter kernels and ROS client
libraries.13 14</p>
        <p>The notebook platform is easily installed in a local computer alongside with
ROS, or it can be deployed in a cloud server. The Binder web service allows
any author to publish a tutorial in a public web repository that becomes live
instantly, allowing other users to try ROS without even installing it in their
computers.</p>
        <p>Though the adaptation of existing tutorials to interactive notebooks can be
time-consuming, as it is done manually by now, we encourage the ROS
community to use these tools for the development of new materials, since teaching of
robotics and ROS can greatly benefit from them.</p>
        <p>In the future, we plan to evaluate groups of students for quantitative
measurements of the user proficiency in comparison with the classical tutorial approach.</p>
      </sec>
    </sec>
    <sec id="sec-5">
      <title>Acknowledgments</title>
      <p>Support of IEEE RAS through the CEMRA program (Creation of Educational
Material for Robotics and Automation) is gratefully acknowledged. This paper
describes research done at the Robotic Intelligence Laboratory. Support for this
laboratory is provided in part by Ministerio de Economia y Competitividad
(DPI2015-69041-R), by Generalitat Valenciana (PROMETEOII/2014/028) and
by Universitat Jaume I (P1-1B2014-52).
13 https://github.com/jupyter/jupyter/wiki/Jupyter-kernels
14 http://wiki.ros.org/Client%20Libraries
11
11</p>
    </sec>
  </body>
  <back>
    <ref-list>
      <ref id="ref1">
        <mixed-citation>
          1.
          <string-name>
            <surname>Antcheva</surname>
            ,
            <given-names>I.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Ballintijn</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Bellenot</surname>
            ,
            <given-names>B.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Biskup</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Brun</surname>
            ,
            <given-names>R.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Buncic</surname>
            ,
            <given-names>N.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Canal</surname>
            ,
            <given-names>P.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Casadei</surname>
            ,
            <given-names>D.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Couet</surname>
            ,
            <given-names>O.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Fine</surname>
            ,
            <given-names>V.</given-names>
          </string-name>
          , et al.:
          <article-title>Root-a c++ framework for petabyte data storage, statistical analysis and visualization</article-title>
          .
          <source>Computer Physics Communications</source>
          <volume>182</volume>
          (
          <issue>6</issue>
          ),
          <fpage>1384</fpage>
          -
          <lpage>1385</lpage>
          (
          <year>2011</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref2">
        <mixed-citation>
          2.
          <string-name>
            <surname>Kluyver</surname>
            ,
            <given-names>T.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Ragan-Kelley</surname>
            ,
            <given-names>B.</given-names>
          </string-name>
          , P´erez,
          <string-name>
            <given-names>F.</given-names>
            ,
            <surname>Granger</surname>
          </string-name>
          ,
          <string-name>
            <given-names>B.E.</given-names>
            ,
            <surname>Bussonnier</surname>
          </string-name>
          ,
          <string-name>
            <given-names>M.</given-names>
            ,
            <surname>Frederic</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            ,
            <surname>Kelley</surname>
          </string-name>
          ,
          <string-name>
            <given-names>K.</given-names>
            ,
            <surname>Hamrick</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.B.</given-names>
            ,
            <surname>Grout</surname>
          </string-name>
          ,
          <string-name>
            <given-names>J.</given-names>
            ,
            <surname>Corlay</surname>
          </string-name>
          ,
          <string-name>
            <surname>S.</surname>
          </string-name>
          , et al.:
          <article-title>Jupyter notebooksa publishing format for reproducible computational workflows</article-title>
          . In:
          <string-name>
            <given-names>F.</given-names>
            <surname>Loizides</surname>
          </string-name>
          ,
          <string-name>
            <surname>B.</surname>
          </string-name>
          Schmidt (eds.) Positioning and Power in Academic Publishing: Players, Agents and Agendas, pp.
          <fpage>87</fpage>
          -
          <lpage>90</lpage>
          (
          <year>2016</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref3">
        <mixed-citation>
          3.
          <string-name>
            <surname>Knuth</surname>
            ,
            <given-names>D.E.</given-names>
          </string-name>
          :
          <article-title>Literate programming</article-title>
          .
          <source>CSLI Lecture Notes</source>
          , Stanford, CA:
          <article-title>Center for the Study of Language and Information (CSLI</article-title>
          ),
          <year>1992</year>
          (
          <year>1992</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref4">
        <mixed-citation>
          4.
          <string-name>
            <surname>Millman</surname>
            ,
            <given-names>K.J.</given-names>
          </string-name>
          , P´erez,
          <string-name>
            <given-names>F.</given-names>
            ,
            <surname>Stodden</surname>
          </string-name>
          ,
          <string-name>
            <given-names>V.</given-names>
            ,
            <surname>Leisch</surname>
          </string-name>
          ,
          <string-name>
            <given-names>F.</given-names>
            ,
            <surname>Peng</surname>
          </string-name>
          , R.:
          <article-title>Developing open-source scientific practice</article-title>
          .
          <source>Implementing Reproducible Research</source>
          <volume>149</volume>
          (
          <year>2014</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref5">
        <mixed-citation>
          5. P´erez,
          <string-name>
            <given-names>F.</given-names>
            ,
            <surname>Granger</surname>
          </string-name>
          ,
          <string-name>
            <surname>B.E.</surname>
          </string-name>
          :
          <article-title>Ipython: a system for interactive scientific computing</article-title>
          .
          <source>Computing in Science &amp; Engineering</source>
          <volume>9</volume>
          (
          <issue>3</issue>
          ) (
          <year>2007</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref6">
        <mixed-citation>
          6.
          <string-name>
            <surname>Quigley</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Conley</surname>
            ,
            <given-names>K.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Gerkey</surname>
            ,
            <given-names>B.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Faust</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Foote</surname>
            ,
            <given-names>T.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Leibs</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Wheeler</surname>
            ,
            <given-names>R.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Ng</surname>
            ,
            <given-names>A.Y.</given-names>
          </string-name>
          :
          <article-title>Ros: an open-source robot operating system</article-title>
          .
          <source>In: ICRA workshop on open source software</source>
          , vol.
          <volume>3</volume>
          , p.
          <fpage>5</fpage>
          .
          <string-name>
            <surname>Kobe</surname>
          </string-name>
          ,
          <string-name>
            <surname>Japan</surname>
          </string-name>
          (
          <year>2009</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref7">
        <mixed-citation>
          7.
          <string-name>
            <surname>Shen</surname>
            ,
            <given-names>H.</given-names>
          </string-name>
          :
          <article-title>Interactive notebooks: Sharing the code</article-title>
          .
          <source>Nature News</source>
          <volume>515</volume>
          (
          <issue>7525</issue>
          ),
          <volume>151</volume>
          (
          <year>2014</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref8">
        <mixed-citation>
          8.
          <string-name>
            <surname>Tellez</surname>
            ,
            <given-names>R.:</given-names>
          </string-name>
          <article-title>A thousand robots for each student: Using cloud robot simulations to teach robotics</article-title>
          . In: M.
          <string-name>
            <surname>Merdan</surname>
            ,
            <given-names>W.</given-names>
          </string-name>
          <string-name>
            <surname>Lepuschitz</surname>
          </string-name>
          , G. Koppensteiner, R. Balogh (eds.) Robotics in Education, pp.
          <fpage>143</fpage>
          -
          <lpage>155</lpage>
          . Springer International Publishing,
          <string-name>
            <surname>Cham</surname>
          </string-name>
          (
          <year>2017</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref9">
        <mixed-citation>
          9.
          <string-name>
            <surname>Vallisneri</surname>
            ,
            <given-names>M.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Kanner</surname>
            ,
            <given-names>J.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Williams</surname>
            ,
            <given-names>R.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Weinstein</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Stephens</surname>
            ,
            <given-names>B.</given-names>
          </string-name>
          :
          <article-title>The ligo open science center</article-title>
          .
          <source>In: Journal of Physics: Conference Series</source>
          , vol.
          <volume>610</volume>
          , p.
          <fpage>012021</fpage>
          . IOP Publishing (
          <year>2015</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref10">
        <mixed-citation>
          10.
          <string-name>
            <surname>Vasilev</surname>
            ,
            <given-names>V.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Canal</surname>
            ,
            <given-names>P.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Naumann</surname>
            ,
            <given-names>A.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Russo</surname>
            ,
            <given-names>P.</given-names>
          </string-name>
          :
          <article-title>Cling-the new interactive interpreter for root 6</article-title>
          .
          <source>In: Journal of Physics: Conference Series</source>
          , vol.
          <volume>396</volume>
          , p.
          <fpage>052071</fpage>
          . IOP Publishing (
          <year>2012</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref11">
        <mixed-citation>
          11.
          <string-name>
            <surname>White</surname>
            ,
            <given-names>R.</given-names>
          </string-name>
          ,
          <string-name>
            <surname>Christensen</surname>
          </string-name>
          , H.:
          <article-title>Ros and docker</article-title>
          .
          <source>In: Robot Operating System (ROS)</source>
          , pp.
          <fpage>285</fpage>
          -
          <lpage>307</lpage>
          . Springer (
          <year>2017</year>
          )
        </mixed-citation>
      </ref>
      <ref id="ref12">
        <mixed-citation>
          12.
          <string-name>
            <surname>Wolfram</surname>
            ,
            <given-names>S.</given-names>
          </string-name>
          :
          <article-title>Mathematica: a system for doing mathematics by computer</article-title>
          .
          <source>AddisonWesley</source>
          (
          <year>1991</year>
          )
        </mixed-citation>
      </ref>
    </ref-list>
  </back>
</article>