<?xml version="1.0" encoding="utf-8" standalone="yes"?><feed xmlns="http://www.w3.org/2005/Atom">
  <title></title>
  <subtitle></subtitle>
  <id>https://www.endpointdev.com/blog/tags/ros/</id>
  <link href="https://www.endpointdev.com/blog/tags/ros/"/>
  <link href="https://www.endpointdev.com/blog/tags/ros/" rel="self"/>
  <updated>2020-10-23T00:00:00+00:00</updated>
  <author>
    <name>End Point Dev</name>
  </author>
  
    <entry>
      <title>ROS 2 Migration</title>
      <link rel="alternate" href="https://www.endpointdev.com/blog/2020/10/ros2-migration/"/>
      <id>https://www.endpointdev.com/blog/2020/10/ros2-migration/</id>
      <published>2020-10-23T00:00:00+00:00</published>
      <author>
        <name>Matt Vollrath</name>
      </author>
      <content type="html">
        &lt;p&gt;&lt;img src=&#34;/blog/2020/10/ros2-migration/20200821-144901-crop.jpg&#34; alt=&#34;Photo of wilderness waterfall (Iris Falls in Yellowstone)&#34;&gt;&lt;/p&gt;
&lt;!-- Photo by Jon Jensen --&gt;
&lt;p&gt;Migrating from ROS 1 to ROS 2 is much more than a “flip of a switch”. The internals of ROS are fundamentally changed, client libraries and their interfaces have been rewritten. The benefits of these changes are significant for users embedding ROS in a product.&lt;/p&gt;
&lt;p&gt;Some of these benefits include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;First-class support for real-time and embedded platforms such as microcontrollers&lt;/li&gt;
&lt;li&gt;Higher reliability under less-than-ideal network conditions&lt;/li&gt;
&lt;li&gt;Distributed, cooperative robotics systems without a single “master”&lt;/li&gt;
&lt;li&gt;More prescribed patterns for building systems with ROS&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Because official ROS 1 support ends in 2025, the clock is ticking for all ROS 1 users to migrate their projects to ROS 2. While the amount of work required to port a project scales with its size, codebases of all sizes should have a migration plan.&lt;/p&gt;
&lt;p&gt;By carefully approaching your ROS 2 migration, disruption to ongoing development and maintenance of the project can be minimized while maintaining the mission critical reliability required in the robotics domain.&lt;/p&gt;
&lt;h3 id=&#34;dependencies&#34;&gt;Dependencies&lt;/h3&gt;
&lt;p&gt;If your project depends on any of the numerous free open source ROS packages, they will need to be ported to ROS 2. Much progress has been made here, but it is not complete. Converging compatibility of all dependencies can be done in parallel with ongoing development, before making any changes to your own codebase.&lt;/p&gt;
&lt;h3 id=&#34;forward-compatibility&#34;&gt;Forward Compatibility&lt;/h3&gt;
&lt;p&gt;Some ROS interfaces are compatible with both ROS 1 and ROS 2. These are a great place to start, because changes can be tested in your familiar ROS 1 environment with minimal disruption.&lt;/p&gt;
&lt;p&gt;ROS 1 packages using older distributions should begin by upgrading to the “noetic” distribution, the final ROS 1 release. This release can be expected to have the most cross-compatibility with ROS 2, including Python 3 and newer package metadata formats.&lt;/p&gt;
&lt;h3 id=&#34;porting-the-code&#34;&gt;Porting the Code&lt;/h3&gt;
&lt;p&gt;Having done as much as possible in the ROS 1 environment, it’s time to start porting packages to ROS 2. If your project is split into multiple packages or entrypoints, you can leverage a ROS 1/2 compatibility tool to make these changes incrementally and test integration as you go.&lt;/p&gt;
&lt;p&gt;Speaking of testing, porting automated tests should happen first. This is a great time to expand test coverage if it is not complete enough to give you confidence in the transition.&lt;/p&gt;
&lt;h3 id=&#34;integration&#34;&gt;Integration&lt;/h3&gt;
&lt;p&gt;Having finished all of the porting tasks, you can deploy your complete ROS 2 project to hardware and test it rigorously. When all of the smoke has been released and the bugs shaken off the tree, it’s time to continue building your product. Bring the turtles to the people!&lt;/p&gt;
&lt;h3 id=&#34;further-reading&#34;&gt;Further Reading&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;The reasons for breaking changes are laid out in &lt;a href=&#34;https://design.ros2.org/articles/why_ros2.html&#34;&gt;Why ROS 2?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;The &lt;a href=&#34;https://index.ros.org/doc/ros2/Contributing/Migration-Guide/&#34;&gt;official ROS 2 migration guide&lt;/a&gt; has many more details about the changes I have outlined.&lt;/li&gt;
&lt;/ul&gt;

      </content>
    </entry>
  
    <entry>
      <title>ROS architecture of Liquid Galaxy</title>
      <link rel="alternate" href="https://www.endpointdev.com/blog/2015/12/ros-has-become-pivotal-piece-of/"/>
      <id>https://www.endpointdev.com/blog/2015/12/ros-has-become-pivotal-piece-of/</id>
      <published>2015-12-18T00:00:00+00:00</published>
      <author>
        <name>Jacob Minshall</name>
      </author>
      <content type="html">
        &lt;p&gt;&lt;a href=&#34;http://wiki.ros.org/ROS/Introduction&#34;&gt;ROS&lt;/a&gt; has become the pivotal piece of software we have written our new Liquid Galaxy platform on. We have also recently open sourced all of our ROS nodes &lt;a href=&#34;https://github.com/endpointcorp/lg_ros_nodes#liquid-galaxy&#34;&gt;on GitHub&lt;/a&gt;. While the system itself is not a robot per se, it does have many characteristics of modern robots, making the ROS platform so useful.  Our system is made up of multiple computers and peripheral devices, all working together to bring view synced content to multiple displays at the same time. To do this we made use of &lt;a href=&#34;http://wiki.ros.org/Messages&#34;&gt;ROS’s messaging&lt;/a&gt; platform, and distributed the work done on our system to many small &lt;a href=&#34;http://wiki.ros.org/Nodes&#34;&gt;ROS nodes&lt;/a&gt;.&lt;/p&gt;
&lt;h3 id=&#34;overview&#34;&gt;Overview&lt;/h3&gt;
&lt;p&gt;Our systems are made up of usually 3 or more machines:&lt;/p&gt;
&lt;div class=&#34;separator&#34; style=&#34;clear: both; text-align: center;&#34;&gt;&lt;a href=&#34;/blog/2015/12/ros-has-become-pivotal-piece-of/image-0-big.png&#34; imageanchor=&#34;1&#34; style=&#34;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;/blog/2015/12/ros-has-become-pivotal-piece-of/image-0.png&#34;/&gt;&lt;/a&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Head node: Small computer that runs roscore, more of a director in the system.&lt;/li&gt;
&lt;li&gt;display-a: Usually controls the center three screens and a touchscreen + spacenav joystick.&lt;/li&gt;
&lt;li&gt;display-b: Controls four screens, two on either side of the middle three.&lt;/li&gt;
&lt;li&gt;display-$N: Controls more and more screens as needed, usually about four a piece.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Display-a and display-b are mostly identical in build. They mainly have a powerful graphics card and a PXE booted Ubuntu image. ROS has become our means to communicate between these machines to synchronize content across the system. The two most common functions are running Google Earth with &lt;a href=&#34;https://developers.google.com/kml/documentation/?hl=en&#34;&gt;KML&lt;/a&gt; / browser overlays to show extra content, and panoramic image viewers like Google’s Street View. ROS is how we tell each instance of Google Earth what it should be looking at, and what should appear on all the screens.&lt;/p&gt;
&lt;h3 id=&#34;ros-architecture&#34;&gt;Ros Architecture&lt;/h3&gt;
&lt;p&gt;Here is a general description all our &lt;a href=&#34;http://wiki.ros.org/Nodes&#34;&gt;ROS nodes&lt;/a&gt;.  Hopefully we will be writing more blog posts about each node individually, as we do links will be filled in below. The source to all nodes can be &lt;a href=&#34;https://github.com/endpointcorp/lg_ros_nodes&#34;&gt;found here on GitHub&lt;/a&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;lg_activity: A node that measures activity across the system to determine when the system has become inactive. It will send an alert on a specific &lt;a href=&#34;http://wiki.ros.org/Topics&#34;&gt;ROS topic&lt;/a&gt; when it detects inactivity, as well as another alert when the system is active again.&lt;/li&gt;
&lt;li&gt;lg_attract_loop: This node will go over a list of tours that we provide to it. This node is usually listening for inactivity before starting, providing a unique screensaver when inactive.&lt;/li&gt;
&lt;li&gt;lg_builder: Makes use of the ROS build system to create Debian packages.&lt;/li&gt;
&lt;li&gt;lg_common: Full of useful tools and common message types to reduce coupling between nodes.&lt;/li&gt;
&lt;li&gt;lg_earth: Manages Google Earth, syncs instances between all screens, includes a KML server to automate loading KML on earth.&lt;/li&gt;
&lt;li&gt;lg_media: This shows images, videos, and text (or really any webpage) on screen at whatever geometry / location through &lt;a href=&#34;http://awesome.naquadah.org/&#34;&gt;awesome window manager&lt;/a&gt; rules.&lt;/li&gt;
&lt;li&gt;lg_nav_to_device: This grabs the output of the /spacenav/twist topic, and translates it back into an event device. This was needed because Google Earth grabs the spacenav event device, not allowing the &lt;a href=&#34;http://wiki.ros.org/spacenav_node&#34;&gt;spacenav ROS node&lt;/a&gt; access.&lt;/li&gt;
&lt;li&gt;lg_replay: This grabs any event device, and publishes its activity over a ROS topic.&lt;/li&gt;
&lt;li&gt;lg_sv: This includes a Street View and generic panoramic image viewer, plus a server that manages the current POV / image for either viewer.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;why-ros&#34;&gt;Why ROS&lt;/h3&gt;
&lt;p&gt;None of the above nodes specifically needs to exist as a ROS node. The reason we chose ROS is because as a ROS node, each running program (and sometimes any one of these nodes can exist multiple times at once on one machine) has an easy way to communicate with any other program. We really liked the pub/sub style for &lt;a href=&#34;https://en.wikipedia.org/wiki/Inter-process_communication&#34;&gt;Inter-Process Communication&lt;/a&gt; in ROS. This has helped us reduce coupling between nodes. Each node can be replaced as needed without detrimental effects on the system.&lt;/p&gt;
&lt;p&gt;We also make heavy use of the ROS packaging/build system, &lt;a href=&#34;http://wiki.ros.org/catkin/Tutorials&#34;&gt;Catkin&lt;/a&gt;. We use it to build Debian packages which are installed on the PXE booted images.&lt;/p&gt;
&lt;p&gt;Lastly ROS has become a real joy to work with. It is a really dependable system, with many powerful features. The ROS architecture allows us to easily add on new features as we develop them, without conflicting with everything else going on.  We were able to re-implement our Street View viewer recently, and had no issues plugging the new one into the system. Documenting the nodes from a client facing side is also very easy. As long as we describe each &lt;a href=&#34;http://wiki.ros.org/rosparam&#34;&gt;rosparam&lt;/a&gt; and &lt;a href=&#34;http://wiki.ros.org/rostopic&#34;&gt;rostopic&lt;/a&gt; then we have finished most of the work needed to document a node. Each program becomes a small, easy to understand, high functioning piece of the system, similar to the &lt;a href=&#34;https://en.wikipedia.org/wiki/Unix_philosophy&#34;&gt;Unix philosophy.&lt;/a&gt; We couldn’t be happier with our new changes, or our decision to open source the ROS nodes.&lt;/p&gt;

      </content>
    </entry>
  
    <entry>
      <title>ROS Platform Upgrades for Liquid Galaxy</title>
      <link rel="alternate" href="https://www.endpointdev.com/blog/2015/12/ros-platform-upgrades-for-liquid-galaxy/"/>
      <id>https://www.endpointdev.com/blog/2015/12/ros-platform-upgrades-for-liquid-galaxy/</id>
      <published>2015-12-14T00:00:00+00:00</published>
      <author>
        <name>Dave Jenkins</name>
      </author>
      <content type="html">
        &lt;div class=&#34;separator&#34; style=&#34;clear: both; text-align: center;&#34;&gt;&lt;a href=&#34;/blog/2015/12/ros-platform-upgrades-for-liquid-galaxy/image-0-big.jpeg&#34; imageanchor=&#34;1&#34; style=&#34;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;/blog/2015/12/ros-platform-upgrades-for-liquid-galaxy/image-0.jpeg&#34;/&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;For the last few months, End Point has been rolling out a new application framework along with updated display applications and monitoring infrastructure for the Liquid Galaxy Display Platform.  These upgrades center on the ROS framework and allow a great number of functionality extensions and enhancements for the end user, as well as improvements to the stability and security of the core systems. It is intended that the 50+ systems that we currently maintain and support on behalf of our enterprise clients will be upgraded to this new platform.&lt;/p&gt;
&lt;h3 id=&#34;ros-overview&#34;&gt;ROS Overview&lt;/h3&gt;
&lt;p&gt;ROS is short for “Robot Operating System”.  Just as it sounds, it is a framework used for controlling robots, and handles various environmental ‘inputs’ and ‘outputs’ well.  End Point chose this framework in conjunction with related ongoing development projects on behalf of our enterprise clients.  This system allows complex interactions from a touchscreen, camera, SpaceNav, or other device to be interpreted conditionally and then invoke other outputs such as displaying Google Earth, Street View, or other content on a given screen, speaker, or other output device.  For more details, see: &lt;a href=&#34;http://www.ros.org&#34;&gt;http://www.ros.org&lt;/a&gt;&lt;/p&gt;
&lt;div class=&#34;separator&#34; style=&#34;clear: both; text-align: center;&#34;&gt;&lt;a href=&#34;/blog/2015/12/ros-platform-upgrades-for-liquid-galaxy/image-1-big.jpeg&#34; imageanchor=&#34;1&#34; style=&#34;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;/blog/2015/12/ros-platform-upgrades-for-liquid-galaxy/image-1.jpeg&#34;/&gt;&lt;/a&gt;&lt;/div&gt;
&lt;h3 id=&#34;liquid-galaxy-enhancements&#34;&gt;Liquid Galaxy Enhancements&lt;/h3&gt;
&lt;p&gt;This new platform brings a number of improvements to the back-end systems and viewing customer experience.&lt;/p&gt;
&lt;h4 id=&#34;improved-street-view-panospheres&#34;&gt;Improved Street View Panospheres&lt;/h4&gt;
&lt;p&gt;The new Street View viewer draws Street View tiles inside a WebGL sphere.  This is a dramatic performance and &lt;a href=&#34;https://www.youtube.com/watch?v=YvQ5JmXx3Bg&#34;&gt;visual enhancement&lt;/a&gt; over the older method, and can now support spherical projection, hardware acceleration, and seamless panning.  For a user, this means tilting the view vertically as well as horizontally, zooming in and out, and improved frame rates.&lt;/p&gt;
&lt;h4 id=&#34;improved-panoramic-video&#34;&gt;Improved Panoramic Video&lt;/h4&gt;
&lt;p&gt;As with the panoramic Street View application, this new platform improves the panoramic video playback as well.  YouTube and Google have announced major initiatives to start actively supporting 360° panoramic video, including the financial backing of some high profile projects as  example use cases.  The Liquid Galaxy, with its panoramic screen layout already in place, is ideally suited for this new media format.&lt;/p&gt;
&lt;div class=&#34;separator&#34; style=&#34;clear: both; text-align: center;&#34;&gt;&lt;a href=&#34;/blog/2015/12/ros-platform-upgrades-for-liquid-galaxy/image-2-big.png&#34; imageanchor=&#34;1&#34; style=&#34;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;/blog/2015/12/ros-platform-upgrades-for-liquid-galaxy/image-2.png&#34;/&gt;&lt;/a&gt;&lt;/div&gt;
&lt;h4 id=&#34;improved-touchscreen&#34;&gt;Improved Touchscreen&lt;/h4&gt;
&lt;p&gt;The touchscreen incorporates a templated layout for easier modification and customization.  The scene view selector is now consolidated to a single interface and no longer requires sub-pages or redundant touches.  The Street View interface, complete with the ‘pegman’ icon, is a photo-realistic map with pinch and zoom just like a tablet interface.&lt;/p&gt;
&lt;h4 id=&#34;browser-windows&#34;&gt;Browser Windows&lt;/h4&gt;
&lt;p&gt;The Liquid Galaxy can control multiple browser windows that can appear anywhere on the screens, often across multiple screens.  These browser windows can show anything that can appear in a desktop web browser: web pages, videos, social media updates, data visualizations, etc.&lt;/p&gt;
&lt;h4 id=&#34;content-management-system&#34;&gt;Content Management System&lt;/h4&gt;
&lt;p&gt;Beginning in 2014, End Point began to upgrade the content management system for the Liquid Galaxy.  With the new ROS platform, we have updated this application to Roscoe (the ROS content experience).  Roscoe gives registered users the ability to create complex presentations with specific scenes.  Each scene can have a specific global location to guide the Google Earth or Street View, and then invoke overlays that appear across the screens.  These overlays can include photos,  data graphs, videos, or web pages.  Each scene can also include a specific KML data set e.g., population density data, property value data, etc.) that can appear as 3D bar graphs directly in the ‘Earth’ view.&lt;/p&gt;
&lt;h4 id=&#34;content-isolation&#34;&gt;Content Isolation&lt;/h4&gt;
&lt;p&gt;Isolating the entire presentation layer in ROS makes it easy to develop exhibits without a full-fledged Liquid Galaxy system.  The entire ROS stack can be installed and run on an Ubuntu 14.04 computer or within a Docker container.  This ROS stack can be used by a developer or designer to build out presentations that will ultimately run on a Liquid Galaxy system.&lt;/p&gt;
&lt;h4 id=&#34;app-modularization&#34;&gt;App Modularization&lt;/h4&gt;
&lt;p&gt;Each component of a Liquid Galaxy exhibit is a configurable ROS node, allowing us to reuse large swaths of code and distribute the exhibit across any number of machines. This architecture brings two strong advantages: 1) each ROS node does one specific thing, which increases portability and modularity, and 2) each node can be tested automatically, which improves reliability.&lt;/p&gt;
&lt;h4 id=&#34;enhanced-platform-stability&#34;&gt;Enhanced Platform Stability&lt;/h4&gt;
&lt;p&gt;By unifying all deployments on a common base, End Point is able to deploy bug fixes, monitoring scripts, and ongoing enhancements much more quickly and safely.  This has enhanced the overall stability for all supported and monitored Liquid Galaxy platforms.&lt;/p&gt;
&lt;h3 id=&#34;product-roadmap&#34;&gt;Product Roadmap&lt;/h3&gt;
&lt;div class=&#34;separator&#34; style=&#34;clear: both; text-align: center;&#34;&gt;&lt;a href=&#34;/blog/2015/12/ros-platform-upgrades-for-liquid-galaxy/image-3-big.png&#34; imageanchor=&#34;1&#34; style=&#34;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&#34;&gt;&lt;img border=&#34;0&#34; src=&#34;/blog/2015/12/ros-platform-upgrades-for-liquid-galaxy/image-3.png&#34;/&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The items described above are the great things that we can do already with this new platform.  Even greater things are coming soon:&lt;/p&gt;
&lt;h4 id=&#34;lidar-point-clouds&#34;&gt;LiDAR Point Clouds&lt;/h4&gt;
&lt;p&gt;End Point has already built early prototypes for the Liquid Galaxy platform that can view LiDAR point clouds.  LiDAR is rapidly gaining traction in the architecture, surveyor, and construction industries.  With the large viewing area of the Liquid Galaxy, these LiDAR point clouds become much more impactful and useful to the command and control center.&lt;/p&gt;
&lt;h4 id=&#34;google-earth-and-google-maps-upgrades&#34;&gt;Google Earth and Google Maps Upgrades&lt;/h4&gt;
&lt;p&gt;End Point continues to work with the latest developments in the Google Earth and Google Maps platforms and is actively working to integrate new features and functionality. These new capabilities will be rolled out to the fleet of Liquid Galaxies as available.&lt;/p&gt;
&lt;h4 id=&#34;3d-webgl-visualizations&#34;&gt;3D WebGL Visualizations&lt;/h4&gt;
&lt;p&gt;The Liquid Galaxy will be enhanced to view completely virtual 3D environments using WebGL and other common formats.  These environments include complex data visualizations, interior space renderings for office planning, and even games.&lt;/p&gt;
&lt;h3 id=&#34;next-steps&#34;&gt;Next Steps&lt;/h3&gt;
&lt;p&gt;If you’re considering the Liquid Galaxy platform, &lt;a href=&#34;https://www.visionport.com/contact/&#34;&gt;contact us&lt;/a&gt; to discuss these latest enhancements and how they can improve the communications and presentation tools for your organization.&lt;/p&gt;

      </content>
    </entry>
  
    <entry>
      <title>Liquid Galaxy at UNESCO in Paris</title>
      <link rel="alternate" href="https://www.endpointdev.com/blog/2015/11/liquid-galaxy-at-unesco-in-paris/"/>
      <id>https://www.endpointdev.com/blog/2015/11/liquid-galaxy-at-unesco-in-paris/</id>
      <published>2015-11-09T00:00:00+00:00</published>
      <author>
        <name>Dave Jenkins</name>
      </author>
      <content type="html">
        &lt;div class=&#34;separator&#34; style=&#34;clear: both; text-align: center;&#34;&gt;&lt;a href=&#34;/blog/2015/11/liquid-galaxy-at-unesco-in-paris/image-0-big.jpeg&#34; imageanchor=&#34;1&#34; style=&#34;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&#34;&gt;&lt;img border=&#34;0&#34; height=&#34;240&#34; src=&#34;/blog/2015/11/liquid-galaxy-at-unesco-in-paris/image-0.jpeg&#34; width=&#34;320&#34;/&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;The &lt;a href=&#34;http://www.japansmeijiindustrialrevolution.com/en/&#34;&gt;National Congress of Industrial Heritage of Japan&lt;/a&gt; (NCoIH) recently deployed a Liquid Galaxy at UNESCO Headquarters in Paris, France.  The display showed several locations throughout southern Japan that were key to her rapid industrialization in the late 19th and early 20th century.  Over the span of 30 years, Japan went from an agrarian society dominated by Samurai still wearing swords in public to an industrial powerhouse, forging steel and building ships that would eventually form a world-class navy and an industrial base that still dominates many lead global industries.&lt;/p&gt;
&lt;p&gt;End Point assisted by supplying the servers, frame, and display hardware for this temporary installation.  The NCoIH supplied panoramic photos, historical records, and location information.  Together using our Roscoe Content Management Application, we built out presentations that guided the viewer through several storylines for each location: viewers could see the early periods of Trial &amp;amp; Error and then later industrial mastery, or could view the locations by technology: coal mining, shipbuilding, and steel making.  The touchscreen interface was custom-designed to allow a self-exploration among these storylines, and also showed thumbnail images of each scene in the presentations that, when touched, brought the viewer directly to that location and showed a short explanatory text, historical photos, as well as transitioning directly into Google Street View to show the preserved site.&lt;/p&gt;
&lt;p&gt;From a technical point of view, End Point debuted several new features with this deployment:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;New scene control and editing functionalities in the Roscoe Content Management System&lt;/li&gt;
&lt;li&gt;A new touchscreen interface that shows presentations and scenes within a presentation in a compact, clean layout&lt;/li&gt;
&lt;li&gt;A new Street View interface that allows the “pinch and zoom” map navigation that we all expect from our smart phones and tablets&lt;/li&gt;
&lt;li&gt;Debut of the new ROS-based operating system, including new ROS-nodes that can control Google Earth, Street View, panoramic content viewers, browser windows, and other interfaces&lt;/li&gt;
&lt;li&gt;Deployment of some very nice NEC professional-grade displays&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;separator&#34; style=&#34;clear: both; text-align: center;&#34;&gt;&lt;a href=&#34;/blog/2015/11/liquid-galaxy-at-unesco-in-paris/image-1-big.jpeg&#34; imageanchor=&#34;1&#34; style=&#34;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&#34;&gt;&lt;img border=&#34;0&#34; height=&#34;240&#34; src=&#34;/blog/2015/11/liquid-galaxy-at-unesco-in-paris/image-1.jpeg&#34; width=&#34;320&#34;/&gt;&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Overall, the exhibit was a great success. Several diplomats from European, African, Asian, and American countries came to the display, explored the sites, and expressed their wonderment at the platform&amp;rsquo;s ability to bring a given location and history into such vivid detail. Japan recently won recognition for these sites from the overall UNESCO governing body, and this exhibit was a chance to show those locations back to the UNESCO delegates.&lt;/p&gt;
&lt;p&gt;From here, the Liquid Galaxy will be shipped to Japan where it will be installed permanently at a regional museum, hopefully to be joined by a whole chain of Liquid Galaxy platforms throughout Japan showing her rich history and heritage to museum visitors.&lt;/p&gt;

      </content>
    </entry>
  
    <entry>
      <title>Simple cross-browser communication with ROS</title>
      <link rel="alternate" href="https://www.endpointdev.com/blog/2015/03/simple-cross-browser-communication-ros/"/>
      <id>https://www.endpointdev.com/blog/2015/03/simple-cross-browser-communication-ros/</id>
      <published>2015-03-24T00:00:00+00:00</published>
      <author>
        <name>Matt Vollrath</name>
      </author>
      <content type="html">
        &lt;p&gt;&lt;a href=&#34;http://www.ros.org/&#34;&gt;ROS&lt;/a&gt; and &lt;a href=&#34;http://robotwebtools.org/&#34;&gt;RobotWebTools&lt;/a&gt; have been extremely useful in building our latest crop of distributed interactive experiences. We’re continuing to develop browser-fronted ROS experiences very quickly based on their huge catalog of existing device drivers. Whether a customer wants their interaction to use a touchscreen, joystick, lights, sound, or just about anything you can plug into the wall, we now say with confidence: “Yeah, we can do that.”&lt;/p&gt;
&lt;p&gt;A typical ROS system is made out of a group (“graph”) of nodes that communicate with (usually TCP) messaging. Topics for messaging can be either publish/subscribe namespaces or request/response services. ROS bindings exist for several languages, but C++ and Python are the only supported direct programming interfaces. ROS nodes can be custom logic processors, aggregators, arbitrators, command-line tools for debugging, native Arduino sketches, or just about any other imaginable consumer of the data streams from other nodes.&lt;/p&gt;
&lt;p&gt;The &lt;a href=&#34;https://github.com/RobotWebTools/rosbridge_suite/tree/master&#34;&gt;rosbridge server&lt;/a&gt;, implemented with &lt;a href=&#34;http://wiki.ros.org/rospy&#34;&gt;rospy&lt;/a&gt; in Python, is a ROS node that provides a web socket interface to the ROS graph with a simple JSON protocol, making it easy to communicate with ROS from any language that can connect to a web socket and parse JSON. Data is published to a messaging topic (or topics) from any node in the graph and the rosbridge server is just another subscriber to those topics. This is the critical piece that brings all the magic of the ROS graph into a browser.&lt;/p&gt;
&lt;p&gt;A handy feature of the &lt;a href=&#34;https://github.com/RobotWebTools/rosbridge_suite/blob/master/ROSBRIDGE_PROTOCOL.md&#34;&gt;rosbridge JSON protocol&lt;/a&gt; is the ability to create topics on the fly. For interactive exhibits that require multiple screens displaying synchronous content, topics that are only published and subscribed between web socket clients are a quick and dirty way to share data without writing a “third leg” ROS node to handle input arbitration and/or logic. In this case, rosbridge will act as both a publisher and a subscriber of the topic.&lt;/p&gt;
&lt;p&gt;To develop a ROS-enabled browser app, all you need is an Ubuntu box with ROS, the rosbridge server and a web socket-capable browser installed. Much has been written about &lt;a href=&#34;http://wiki.ros.org/indigo/Installation/Ubuntu&#34;&gt;installing ROS (indigo)&lt;/a&gt;, and once you’ve installed ros-indigo-ros-base, set up your shell environment, and started the ROS core/master, a rosbridge server is two commands away:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ sudo apt-get install ros-indigo-rosbridge-suite
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ rosrun rosbridge_server rosbridge_websocket&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;While rosbridge is running, you can connect to it via ws://hostname:9090 and access the ROS graph using the rosbridge protocol. Interacting with rosbridge from a browser is best done via &lt;a href=&#34;http://wiki.ros.org/roslibjs&#34;&gt;roslibjs&lt;/a&gt;, the JavaScript companion library to rosbridge. All the JavaScripts are available from the &lt;a href=&#34;http://wiki.ros.org/roslibjs#CDN_Releases&#34;&gt;roslibjs CDN&lt;/a&gt; for your convenience.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;script type=&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;text/javascript&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  src=&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;http://cdn.robotwebtools.org/EventEmitter2/current/eventemitter2.min.js&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;/script&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;script type=&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;text/javascript&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  src=&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#34;http://cdn.robotwebtools.org/roslibjs/current/roslib.min.js&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#a61717;background-color:#e3d2d2&#34;&gt;/script&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;From here, you will probably want some shared code to declare the Ros object and any Topic objects.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;//* The Ros object, wrapping a web socket connection to rosbridge.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;var&lt;/span&gt; ros = &lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;new&lt;/span&gt; ROSLIB.Ros({
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  url: &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;ws://localhost:9090&amp;#39;&lt;/span&gt; &lt;span style=&#34;color:#888&#34;&gt;// url to your rosbridge server
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;&lt;/span&gt;});
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;//* A topic for messaging.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;var&lt;/span&gt; exampleTopic = &lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;new&lt;/span&gt; ROSLIB.Topic({
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ros: ros,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  name: &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;/com/endpoint/example&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#888&#34;&gt;// use a sensible namespace
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;&lt;/span&gt;  messageType: &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;std_msgs/String&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The messageType of &lt;a href=&#34;http://docs.ros.org/api/std_msgs/html/msg/String.html&#34;&gt;std_msgs/String&lt;/a&gt; means that we are using a message definition from the std_msgs package (which ships with ROS) containing a single string field. Each topic can have only one messageType that must be used by all publishers and subscribers of that topic.&lt;/p&gt;
&lt;p&gt;A “proper” ROS communication scheme will use predefined message types to serialize messages for maximum efficiency over the wire. When using the std_msgs package, this means each message will contain a value (or an array of values) of a single, very specific type. See the &lt;a href=&#34;http://wiki.ros.org/std_msgs&#34;&gt;std_msgs documentation&lt;/a&gt; for a complete list. Other message types may be available, depending on which ROS packages are installed on the system.&lt;/p&gt;
&lt;p&gt;For cross-browser application development, a bit more flexibility is usually desired. You can roll your own data-to-string encoding and pack everything into a single string topic or use multiple topics of appropriate messageType if you like, but unless you have severe performance needs, a JSON stringify and parse will pack arbitrary JavaScript objects as messages just fine. It will only take a little bit of boilerplate to accomplish this.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt; * Serializes an object and publishes it to a std_msgs/String topic.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt; * @param {ROSLIB.Topic} topic
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt; *       A topic to publish to. Must use messageType: std_msgs/String
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt; * @param {Object} obj
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt; *       Any object that can be serialized with JSON.stringify
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;function&lt;/span&gt; publishEncoded(topic, obj) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;var&lt;/span&gt; msg = &lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;new&lt;/span&gt; ROSLIB.Message({
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    data: JSON.stringify(obj)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  });
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  topic.publish(msg);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt; * Decodes an object from a std_msgs/String message.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt; * @param {Object} msg
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt; *       Message from a std_msgs/String topic.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt; * @return {Object}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt; *       Decoded object from the message.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;function&lt;/span&gt; decodeMessage(msg) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;return&lt;/span&gt; JSON.parse(msg.data);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;All of the above code can be shared by all pages and views, unless you want some to use different throttle or queue settings on a per-topic basis.&lt;/p&gt;
&lt;p&gt;On the receiving side, any old anonymous function can handle the receipt and unpacking of messages.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;// Example of subscribing to a topic with decodeMessage().
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;&lt;/span&gt;exampleTopic.subscribe(&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;function&lt;/span&gt;(msg) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;var&lt;/span&gt; decoded = decodeMessage(msg);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#888&#34;&gt;// do something with the decoded message object
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;&lt;/span&gt;  console.log(decoded);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;});&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The sender can publish updates at will, and all messages will be felt by the receivers.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;// Example of publishing to a topic with publishEncoded().
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;// Explicitly declare that we intend to publish on this Topic.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;&lt;/span&gt;exampleTopic.advertise();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;setInterval(&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;function&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;var&lt;/span&gt; mySyncObject = {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    time: &lt;span style=&#34;color:#038&#34;&gt;Date&lt;/span&gt;.now(),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    myFavoriteColor: &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;red&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  publishEncoded(exampleTopic, mySyncObject);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}, &lt;span style=&#34;color:#00d;font-weight:bold&#34;&gt;1000&lt;/span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;From here, you can add another layer of data shuffling by writing message handlers for your communication channel. Re-using the EventEmitter2 class upon which roslibjs depends is not a bad way to go. If it feels like you’re implementing ROS messaging on top of ROS messaging.. well, that’s what you’re doing! This approach will generally break down when communicating with other non-browser nodes, so use it sparingly and only for application layer messaging that needs to be flexible.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt; * Typed messaging wrapper for a std_msgs/String ROS Topic.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt; * Requires decodeMessage() and publishEncoded().
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt; * @param {ROSLIB.Topic} topic
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt; *       A std_msgs/String ROS Topic for cross-browser messaging.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt; * @constructor
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;function&lt;/span&gt; RosTypedMessaging(topic) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;this&lt;/span&gt;.topic = topic;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;this&lt;/span&gt;.topic.subscribe(&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;this&lt;/span&gt;.handleMessage_.bind(&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;this&lt;/span&gt;));
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;RosTypedMessaging.prototype.__proto__ = EventEmitter2.prototype;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt; * Handles an incoming message from the topic by firing an event.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt; * @param {Object} msg
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt; * @private
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;RosTypedMessaging.prototype.handleMessage_ = &lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;function&lt;/span&gt;(msg) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;var&lt;/span&gt; decoded = decodeMessage(msg);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;var&lt;/span&gt; type = decoded.type;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;var&lt;/span&gt; data = decoded.data;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;this&lt;/span&gt;.emit(type, data);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;/**
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt; * Sends a typed message to the topic.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt; * @param {String} type
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt; * @param {Object} data
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt; */&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;RosTypedMessaging.prototype.sendMessage = &lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;function&lt;/span&gt;(type, data) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;var&lt;/span&gt; msg = {type: type, data: data};
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  publishEncoded(&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;this&lt;/span&gt;.topic, msg);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;Here’s an example using RosTypedMessaging.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-javascript&#34; data-lang=&#34;javascript&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;//* Example implementation of RosTypedMessaging.
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;var&lt;/span&gt; myMessageChannel = &lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;new&lt;/span&gt; RosTypedMessaging(exampleTopic);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;myMessageChannel.on(&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;fooo&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;function&lt;/span&gt;(data) {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  console.log(&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;fooo!&amp;#39;&lt;/span&gt;, data);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;});
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;setInterval(&lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;function&lt;/span&gt;() {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#080;font-weight:bold&#34;&gt;var&lt;/span&gt; mySyncObject = {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    time: &lt;span style=&#34;color:#038&#34;&gt;Date&lt;/span&gt;.now(),
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    myFavoriteColor: &lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;red&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  };
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  myMessageChannel.sendMessage(&lt;span style=&#34;color:#d20;background-color:#fff0f0&#34;&gt;&amp;#39;fooo&amp;#39;&lt;/span&gt;, mySyncObject);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}, &lt;span style=&#34;color:#00d;font-weight:bold&#34;&gt;1000&lt;/span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;If you need to troubleshoot communications or are just interested in seeing how it works, ROS comes with some neat command line tools for publishing and subscribing to topics.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-plain&#34; data-lang=&#34;plain&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;### show messages on /example/topicname
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ rostopic echo /example/topicname
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;### publish a single std_msgs/String message to /example/topicname
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;### the quotes are tricky, since rostopic pub parses yaml or JSON
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ export MY_MSG=&amp;#34;data: &amp;#39;{\&amp;#34;type\&amp;#34;:\&amp;#34;fooo\&amp;#34;,\&amp;#34;data\&amp;#34;:{\&amp;#34;asdf\&amp;#34;:\&amp;#34;hjkl\&amp;#34;}}&amp;#39;&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ rostopic pub -1 /example/topicname std_msgs/String &amp;#34;$MY_MSG&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;To factor input, arbitration or logic out of the browser, you could write a roscpp or rospy node acting as a server. Also worth a look are ROS services, which can abstract asynchronous data requests through the same messaging system.&lt;/p&gt;
&lt;p&gt;A &lt;a href=&#34;https://gist.github.com/minshallj/50e6b2e85985ca56e8e0&#34;&gt;gist of this example JavaScript&lt;/a&gt; is available, much thanks to &lt;a href=&#34;/team/jacob-minshall/&#34;&gt;Jacob Minshall&lt;/a&gt;.&lt;/p&gt;

      </content>
    </entry>
  
</feed>
