<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>programming &#8211; Robohub</title>
	<atom:link href="https://robohub.org/tag/programming/feed/" rel="self" type="application/rss+xml" />
	<link>https://robohub.org</link>
	<description>Connecting the robotics community to the world</description>
	<lastBuildDate>Mon, 05 Oct 2026 01:12:20 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.3</generator>
	<item>
		<title>Using MATLAB for hardware-in-the-loop prototyping #1 : Message passing systems</title>
		<link>https://robohub.org/using-matlab-for-hardware-in-the-loop-prototyping-1-message-passing-systems/</link>
		
		<dc:creator><![CDATA[Florian Enner]]></dc:creator>
		<pubDate>Wed, 28 Jun 2017 10:00:00 +0000</pubDate>
				<category><![CDATA[education]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[control]]></category>
		<category><![CDATA[MATLAB]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[ROS]]></category>
		<category><![CDATA[software]]></category>
		<guid isPermaLink="false">http://robohub.org/using-matlab-for-hardware-in-the-loop-prototyping-1-message-passing-systems/</guid>

					<description><![CDATA[<div>
<div>
<div>
<p>MATLAB&#169; is a programming language and environment designed for scientific computing. It is one of the best languages for developing robot control algorithms and is widely used in the research community. While it is often thought of as an offline programming language, there are several ways to interface with it to control robotic hardware 'in the loop'. As part of our own development we surveyed a number of different projects that accomplish this by using a <a href="https://en.wikipedia.org/wiki/Message_passing" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">message passing</a> system and we compared the approaches they took. This post focuses on bindings for the following message passing frameworks: LCM, ROS, DDS, and ZeroMQ.</p>
</div>
<div>
<p>The main motivation for using MATLAB to prototype directly on real hardware is to dramatically accelerate the development cycle by reducing the time it takes to find out out whether an algorithm can withstand ubiquitous real-world problems like noisy and poorly-calibrated sensors, imperfect actuator controls, and unmodeled robot dynamics. Additionally, a workflow that requires researchers to port prototype code to another language before being able to test on real hardware can often lead to weeks or months being lost in chasing down new technical bugs introduceed by the port. Finally, programming in a language like C++ can pose a significant barrier to controls engineers who often have a strong electro-mechanical background but are not as strong in computer science or software engineering.</p>
</div>
<div>
<p>We have also noticed that over the past few years several other groups in the robotics community also experience these problems and have started to develop ways to control hardware directly from MATLAB.</p>
</div>
</div>
</div>
<div>
<h2>The Need for External Languages</h2>
<div>
<div>
<p>The main limitation when trying to use MATLAB to interface with hardware stems from the fact that its scripting language is fundamentally single threaded. It has been designed to allow non-programmers to do complex math operations without needing to worry about programming concepts like multi-threading or synchronization.  However, this poses a problem for real-time control of hardware because all communication is forced to happen synchronously in the main thread. For example, if a control loop runs at 100Hz and it takes a message ~8ms for a round-trip, the main thread ends up wasting 80% of the available time budget waiting for a response without doing any actual work.</p>
</div>
<div>
<p>A second hurdle is that while MATLAB is very efficient in the execution of math operations, it is not particularly well suited for byte manipulation. This makes it difficult to develop code that can efficiently create and parse binary message formats that the target hardware can understand. Thus, after having the main thread spend its time waiting for and parsing the incoming data, there may not be any time left for performing interesting math operations.</p>
</div>
<div>
<div>
<a href="https://ennerf.github.io/images/matlab/comms-single-threaded.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="https://ennerf.github.io/images/matlab/comms-single-threaded.png" alt="comms single threaded.png" width="100%"></a>
</div>
<div>Figure 1. Communications overhead in the main MATLAB thread</div>
</div>
<div>
<p>Pure MATLAB implementations can work for simple applications, such as interfacing with an Arduino to gather temperature data or blink an LED, but it is not feasible to control complex robotic systems (e.g. a humanoid) at high rates (e.g. 100Hz-1KHz). Fortunately, MATLAB does have the ability to interface with other programming languages that allow users to create background threads that can offload the communications aspect from the main thread.</p>
</div>
<div>
<div>
<a href="https://ennerf.github.io/images/matlab/comms-multi-threaded.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="https://ennerf.github.io/images/matlab/comms-multi-threaded.png" alt="comms multi threaded.png" width="100%"></a>
</div>
<div>Figure 2. Communications overhead offloaded to other threads</div>
</div>
<div>
<p>Out of the box MATLAB provides two interfaces to other languages:  <a href="https://www.mathworks.com/help/matlab/matlab_external/introducing-mex-files.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">MEX</a> for calling C/C++ code, and the <a href="https://www.mathworks.com/help/matlab/matlab_external/product-overview.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Java Interface</a> for calling Java code. There are some differences between the two, but at the end of the day the choice effectively comes down to personal preference. Both provide enough capabilities for developing sophisticated interfaces and have orders of magnitude better performance than required.  There are additional interfaces to <a href="https://www.mathworks.com/help/matlab/calling-external-functions.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">other languages</a>, but those require additional setup steps.</p>
</div>
</div>
</div>
<div>
<h2>Message Passing Frameworks</h2>
<div>
<div>
<p><a href="https://en.wikipedia.org/wiki/Message_passing" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Message passing</a> frameworks such as <a href="http://www.ros.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Robot Operating System (ROS)</a> and <a href="https://lcm-proj.github.io/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Lightweight Communication and Marshalling (LCM)</a> have been widely adopted in the robotics research community. At the core they typically consist of two parts: a way to exchange data between processes (e.g. UDP/TCP), as well as a defined binary format for encoding and decoding the messages. They allow systems to be built with distributed components (e.g. processes) that run on different computers, different operating systems, and different programming languages.</p>
</div>
<div>
<p>The resulting systems are very extensible and provide convenient ways for prototyping. For example, a component communicating with a physical robot can be exchanged with a simulator without affecting the rest of the system. Similarly, a new walking controller could be implemented in MATLAB and communicate with external processes (e.g. robot comms) through the exchange of messages.  With ROS and LCM in particular, their flexibility, wide-spread adoption, and support for different languages make them a nice starting point for a MATLAB-hardware interface.</p>
</div>
<div>
<h3>Lightweight Communication and Marshalling (LCM)</h3>
<div>
<p><a href="https://lcm-proj.github.io/tut_matlab.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">LCM</a> was developed in 2006 at <a href="http://www.mit.edu/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">MIT</a> for their entry to DARPA&#8217;s Urban Challenge. In recent years it has become a popular alternative to ROS-messaging, and it was as far as we know the first message passing framework for robotics that supported MATLAB as a core language.</p>
</div>
<div>
<p>The snippet below shows how the MATLAB code for sending a command message could look like. The code creates a struct-like <em>message</em>, sets desired values, and publishes it on an appropriate channel.</p>
</div>
<div>
<div>
<pre><code>%% MATLAB code for sending an LCM message
% Setup
lc = lcm.lcm.LCM.getSingleton();

% Fill message
cmd = types.command();
cmd.position = [1 2 3];
cmd.velocity = [1 2 3];

% Publish
lc.publish('COMMAND_CHANNEL', cmd);</code></pre>
</div>
</div>
<div>
<p>Interestingly, the backing implementation of these bindings was done in pure Java and did not contain any actual MATLAB code. The exposed interface consisted of two Java classes as well as auto-generated message types.</p>
</div>
<div>
<ul><li>
<p>The <a href="https://github.com/lcm-proj/lcm/blob/master/lcm-java/lcm/lcm/LCM.java" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">LCM</a> class provides a way to publish messages and subscribe to channels</p>
</li>
<li>
<p>The generated Java messages handle the binary encoding and exposed fields that MATLAB can access</p>
</li>
<li>
<p>The <a href="https://github.com/lcm-proj/lcm/blob/master/lcm-java/lcm/lcm/MessageAggregator.java" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">MessageAggregator</a> class provides a way to receive messages on a background thread and queue them for MATLAB.</p>
</li>
</ul></div>
<div>
<p>Thus, even though the snippet looks similar to MATLAB code, all variables are actually Java objects. For example, the struct-like <em>command</em> type is a Java object that exposes public fields as shown in the snippet below. Users can access them the same way as fields of a standard MATLAB struct (or class properties) resulting in nice syntax. The types are automatically converted according to the <a href="https://mathworks.com/help/matlab/matlab_external/passing-data-to-java-methods.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">type mapping</a>.</p>
</div>
<div>
<div>
<pre><code>/**
 * Java class that behaves like a MATLAB struct
 */
public final class command implements lcm.lcm.LCMEncodable
{
    public double[] position;
    public double[] velocity;
    // etc. ...
}</code></pre>
</div>
</div>
<div>
<p>Receiving messages is done by subscribing an <em>aggregator</em> to one or more channels. The aggregator receives messages from a background thread and stores them in a queue that MATLAB can access in a synchronous manner using <em>aggregator.getNextMessage()</em>. Each message contains the raw bytes as well as some meta data for selecting an appropriate type for decoding.</p>
</div>
<div>
<div>
<pre><code>%% MATLAB code for receiving an LCM message
% Setup
lc = lcm.lcm.LCM.getSingleton();
aggregator = lcm.lcm.MessageAggregator();
lc.subscribe('FEEDBACK_CHANNEL', aggregator);

% Continuously check for new messages
timeoutMs = 1000;
while true

    % Receive raw message
    msg = aggregator.getNextMessage(timeoutMs);

    % Ignore timeouts
    if ~isempty(msg)

        % Select message type based on channel name
        if strcmp('FEEDBACK_CHANNEL', char(msg.channel))

            % Decode raw bytes to a usable type
            fbk = types.feedback(msg.data);

            % Use data
            position = fbk.position;
            velocity = fbk.velocity;

        end

    end
end</code></pre>
</div>
</div>
<div>
<p>The snippet below shows a simplified version of the backing Java code for the aggregator class. Since Java is limited to a single return argument, the <em>getNextMessage</em> call returns a Java type that contains the received bytes as well as meta data to identify the type, i.e., the source channel name.</p>
</div>
<div>
<div>
<pre><code>/**
 * Java class for receiving messages in the background
 */
public class MessageAggregator implements LCMSubscriber {

    /**
     * Value type that combines multiple return arguments
     */
    public static class Message {

        final public byte[] data; // raw bytes
        final public String channel; // source channel name

        public Message(String channel_, byte[] data_) {
            data = data_;
            channel = channel_;
        }
    }

    /**
     * Method that gets called from MATLAB to receive new messages
     */
    public synchronized Message getNextMessage(long timeout_ms) {

		if (!messages.isEmpty()) {
		    return messages.removeFirst();
        }

        if (timeout_ms == 0) { // non-blocking
            return null;
        }

        // Wait for new message until timeout ...
    }

}</code></pre>
</div>
</div>
<div>
<p>Note that the <em>getNextMessage</em> method requires a timeout argument. In general it is important for blocking Java methods to have a timeout in order to prevent the main thread from getting stuck permanently. Being in a Java call prohibits users from aborting the execution (ctrl-c), so timeouts should be reasonably short, i.e., in the low seconds. Otherwise this could cause the UI to become unresponsive and users may be forced to close MATLAB without being able to save their workspace. Passing in a timeout of zero serves as a non-blocking interface that immediately returns empty if no messages are available. This is often useful for working with multiple aggregators or for integrating asynchronous messages with unknown timing, such as user input.</p>
</div>
<div>
<p>Overall, we thought that this was a well thought out API and a great example for a minimum viable interface that works well in practice. By receiving messages on a background thread and by moving the encoding and decoding steps to the Java language, the main thread is able to spend most of its time on actually working with the data. Its minimalistic implementation is comparatively simple and we would recommend it as a starting point for developing similar interfaces.</p>
</div>
<div>
<p>Some minor points for improvement that we found were:</p>
</div>
<div>
<ul><li>
<p>The decoding step <em>fbk = types.feedback(msg.data)</em> forces two unnecessary translations due to <em>msg.data</em> being a <em>byte[]</em>, which automatically gets converted to and from <em>int8</em>. This could result in a noticeable performance hit when receiving larger messages (e.g. images) and could be avoided by adding an overload that accepts a non-primitive type that does not get translated, e.g., <em>fbk = types.feedback(msg)</em>.</p>
</li>
<li>
<p>The Java classes did not implement <a href="https://mathworks.com/help/matlab/matlab_external/save-and-load-java-objects-to-mat-files.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Serializable</a>, which could become bothersome when trying to save the workspace.</p>
</li>
<li>
<p>We would prefer to select the decoding type during the subscription step, e.g., <em>lc.subscribe('FEEDBACK_CHANNEL', aggregator, 'types.feedback')</em>, rather than requiring users to instantiate the type manually. This would clean up the parsing code a bit and allow for a less confusing error message if types are missing.</p>
</li>
</ul></div>
</div>
<div>
<h3>Robot Operating System (ROS)</h3>
<div>
<p><a href="http://www.ros.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ROS</a> is by far the most widespread messaging framework in the robotics research community and has been officially supported by Mathworks' <a href="https://www.mathworks.com/products/robotics.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Robotics System Toolbox</a> since 2014. While the Simulink code generation uses ROS C++, the MATLAB implementation is built on the less common RosJava.</p>
</div>
<div>
<p>The API was designed such that each topic requires dedicated publishers and subscribers, which is different from LCM where each subscriber may listen to multiple channels/topics. While this may result in potentially more subscribers, the specification of the expected type at initialization removes much of the boiler plate code necessary for dealing with message types.</p>
</div>
<div>
<div>
<pre><code>%% MATLAB code for publishing a ROS message
% Setup Publisher
chatpub = rospublisher('/chatter', 'std_msgs/String');

% Fill message
msg = rosmessage(chatpub);
msg.Data = 'Some test string';

% Publish
chatpub.send(msg);</code></pre>
</div>
</div>
<div>
<p>Subscribers support three different styles to access messages: blocking calls, non-blocking calls, and callbacks.</p>
</div>
<div>
<div>
<pre><code>%% MATLAB code for receiving a ROS message
% Setup Subscriber
laser = rossubscriber('/scan');

% (1) Blocking receive
scan = laser.receive(1); % timeout [s]

% (2) Non-blocking latest message (may not be new)
scan = laser.LatestMessage;

% (3) Callback
callback = @(msg) disp(msg);
subscriber = rossubscriber('/scan', @callback);</code></pre>
</div>
</div>
<div>
<p>Contrary to LCM, all objects that are visible to users are actually MATLAB classes. Even though the implementation is using Java underneath, all exposed functionality is wrapped in MATLAB classes that hide all Java calls. For example, each message type is associated with a generated wrapper class. The code below shows a simplified example of a wrapper for a message that has a <em>Name</em> property.</p>
</div>
<div>
<div>
<pre><code>%% MATLAB code for wrapping a Java message type
classdef WrappedMessage

    properties (Access = protected)
        % The underlying Java message object (hidden from user)
        JavaMessage
    end

    methods

        function name = get.Name(obj)
            % value = msg.Name;
            name = char(obj.JavaMessage.getName);
        end

        function set.Name(obj, name)
            % msg.Name = value;
            validateattributes(name, {'char'}, {}, 'WrappedMessage', 'Name');
            obj.JavaMessage.setName(name); % Forward to Java method
        end

        function out = doSomething(obj)
            % msg.doSomething() and doSomething(msg)
            try
                out = obj.JavaMessage.doSomething(); % Forward to Java method
            catch javaException
                throw(WrappedException(javaException)); % Hide Java exception
            end
        end

    end
end</code></pre>
</div>
</div>
<div>
<p>Due to the implementation being closed-source, we were only able to look at the public toolbox files as well as the compiled Java bytecode. As far as we could tell they built a small Java library that wrapped RosJava functionality in order to provide an interface that is easier to call from MATLAB. Most of the actual logic seemed to be implemented in MATLAB code, but we also found several calls to various Java libraries for problems that would have been difficult to implement in pure MATLAB, e.g., listing networking interfaces or doing in-memory decompression of images.</p>
</div>
<div>
<p>Overall, we found that the ROS support toolbox looked very nice and was a great example of how seamless external languages could be integrated with MATLAB. We also really liked that they offered a way to load log files (rosbags).</p>
</div>
<div>
<p>One concern we had was that there did not seem to be a simple non-blocking way to check for new messages, e.g., a <em>hasNewMessage()</em> method or functionality equivalent to LCM&#8217;s <em>getNextMessage(0)</em>. We often found this useful for applications that combined data from multiple topics that arrived at different rates (e.g. sensor feedback and joystick input events). We checked whether this behavior could be emulated by specifying a very small timeout in the <em>receive</em> method (shown in the snippet below), but any value below 0.1s seemed to never successfully return.</p>
</div>
<div>
<div>
<pre><code>%% Trying to check whether a new message has arrived without blocking
try
    msg = sub.receive(0.1); % below 0.1s always threw an error
    % ... use message ...
catch ex
    % ignore
end</code></pre>
</div>
</div>
</div>
<div>
<h3>Data Distribution Service (DDS)</h3>
<div>
<p>In 2014 Mathworks also added a <a href="https://www.mathworks.com/hardware-support/rti-dds.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">support package for DDS</a>, which is the messaging middleware that ROS 2.0 is based on. It supports MATLAB and Simulink, as
well as code generation. Unfortunately, we did not have all the requirements to get it setup, and we could not find much information about the underlying implementation. After looking at some of the intro videos, we believe that the resulting code should look as follows.</p>
</div>
<div>
<div>
<pre><code>%% MATLAB code for sending and receiving DDS messages
% Setup
DDS.import('ShapeType.idl','matlab');
dp = DDS.DomainParticipant

% Create message
myTopic = ShapeType;
myTopic.x = int32(23);
myTopic.y = int32(35);

% Send Message
dp.addWriter('ShapeType', 'Square');
dp.write(myTopic);

% Receive message
dp.addReader('ShapeType', 'Square');
readTopic = dp.read();</code></pre>
</div>
</div>
</div>
<div>
<h3>ZeroMQ</h3>
<div>
<p>ZeroMQ is another asynchonous messaging library that is popular for building distributed systems. It only handles the messaging aspect, so users need to supply their own wire format. <a href="https://github.com/smcgill3/zeromq-matlab" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ZeroMQ-matlab</a> is a MATLAB interface to ZeroMQ that was developed at UPenn between 2013-2015. We were not able to find much documentation, but as far as we could tell the resulting code should look similar to following snippet.</p>
</div>
<div>
<div>
<pre><code>%% MATLAB code for sending and receiving ZeroMQ data
% Setup
subscriber = zmq( 'subscribe', 'tcp', '127.0.0.1', 43210 );
publisher = zmq( 'publish', 'tcp', 43210 );

% Publish data
bytes = uint8(rand(100,1));
nbytes = zmq( 'send', publisher, bytes );

% Receive data
receiver = zmq('poll', 1000); // polls for next message
[recv_data, has_more] = zmq( 'receive', receiver );

disp(char(recv_data));</code></pre>
</div>
</div>
<div>
<p>It was implemented as a single MEX function that selects appropriate sub-functions based on a string argument. State was maintained by using socket IDs that were passed in by the user at every call. The code below shows a simplified snippet of the send action.</p>
</div>
<div>
<div>
<pre><code>// Parsing the selected ZeroMQ action behind the MEX barrier
// Grab command String
if ( !(command = mxArrayToString(prhs[0])) )
	mexErrMsgTxt("Could not read command string. (1st argument)");

// Match command String with desired action (e.g. 'send')
if (strcasecmp(command, "send") == 0){
	// ... (argument validation)

	// retrieve arguments
	socket_id = *( (uint8_t*)mxGetData(prhs[1]) );
	size_t n_el = mxGetNumberOfElements(prhs[2]);
	size_t el_sz = mxGetElementSize(prhs[2]);
	size_t msglen = n_el*el_sz;

	// send data
	void* msg = (void*)mxGetData(prhs[2]);
	int nbytes = zmq_send( sockets[ socket_id ], msg, msglen, 0 );

	// ... check outcome and return
}
// ... other actions</code></pre>
</div>
</div>
</div>
<div>
<h3>Other Frameworks</h3>
<div>
<p>Below is a list of APIs to other frameworks that we looked at but could not cover in more detail.</p>
</div>
<table><colgroup><col><col></colgroup><thead><tr><th>Project</th>
<th>Notes</th>
</tr></thead><tbody><tr><td><div><div>
<p><a href="https://github.com/ragavsathish/RabbitMQ-Matlab-Client" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">RabbitMQ-Matlab-Client</a></p>
</div></div></td>
<td><div><div>
<p>Simple Java wrapper for RabbitMQ with callbacks into MATLAB</p>
</div></div></td>
</tr><tr><td><div><div>
<p><a href="https://sourceforge.net/projects/urbi/?source=typ_redirect" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">URBI</a> (<a href="http://agents.csse.uwa.edu.au/aibosig/resources/downloads/tutorial_liburbiMatlab_0.1.pdf" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">tutorial</a>)</p>
</div></div></td>
<td><div><div>
<p>Seems to be deprecated</p>
</div></div></td>
</tr></tbody></table></div>
</div>
</div>
<div>
<h2>Final Notes</h2>
<div>
<div>
<p>Contrary to the situation a few years ago, nowadays there exist interfaces for most of the common message passing frameworks that allow researchers to do at least basic hardware-in-the-loop prototyping directly from MATLAB. However, if none of the available options work for you and you are planning on developing your own, we recommend the following:</p>
</div>
<div>
<ul><li>
<p>If there is no clear pre-existing preference between C++ and Java, we recommend to start with a Java implementation. MEX interfaces require a lot of conversion code that Java interfaces would handle automatically.</p>
</li>
<li>
<p>We would recommend starting with a minimalstic LCM-like implementation and then add complexity when necessary.</p>
</li>
<li>
<p>While interfaces that only expose MATLAB code can provide a better and more consistent user experience (e.g. help documentation), there is a significant cost associated with maintaing all of the involved layers. We would recommend holding off on creating MATLAB wrappers until the API is relatively stable.</p>
</li>
</ul></div>
<div>
<p>Finally, even though message passing systems are very widespread in the robotics community, they do have drawbacks and are not appropriate for every application. Future posts in this series will focus on some of the alternatives.</p>
</div>
&#60;!----&#62;&#60;!----&#62;&#60;!--hljs.initHighlightingOnLoad()--&#62;</div>
</div>]]></description>
										<content:encoded><![CDATA[<div id="preamble">
<div class="sectionbody">
<div class="paragraph">
<img fetchpriority="high" decoding="async" class="aligncenter size-full wp-image-80888" src="http://robohub.org/wp-content/uploads/2017/06/maxresdefault.jpg" alt="" width="1024" height="600" srcset="https://robohub.org/wp-content/uploads/2017/06/maxresdefault.jpg 1024w, https://robohub.org/wp-content/uploads/2017/06/maxresdefault-425x249.jpg 425w, https://robohub.org/wp-content/uploads/2017/06/maxresdefault-768x450.jpg 768w" sizes="(max-width: 1024px) 100vw, 1024px" />
<p>MATLAB© is a programming language and environment designed for scientific computing. It is one of the best languages for developing robot control algorithms and is widely used in the research community. While it is often thought of as an offline programming language, there are several ways to interface with it to control robotic hardware &#8216;in the loop&#8217;. As part of our own development we surveyed a number of different projects that accomplish this by using a <a href="https://en.wikipedia.org/wiki/Message_passing" target="_blank" rel="noopener noreferrer follow external" data-wpel-link="external">message passing</a> system and we compared the approaches they took. This post focuses on bindings for the following message passing frameworks: LCM, ROS, DDS, and ZeroMQ.</p>
</div>
<div class="paragraph">
<p>The main motivation for using MATLAB to prototype directly on real hardware is to dramatically accelerate the development cycle by reducing the time it takes to find out out whether an algorithm can withstand ubiquitous real-world problems like noisy and poorly-calibrated sensors, imperfect actuator controls, and unmodeled robot dynamics. Additionally, a workflow that requires researchers to port prototype code to another language before being able to test on real hardware can often lead to weeks or months being lost in chasing down new technical bugs introduceed by the port. Finally, programming in a language like C++ can pose a significant barrier to controls engineers who often have a strong electro-mechanical background but are not as strong in computer science or software engineering.</p>
</div>
<div class="paragraph">
<p>We have also noticed that over the past few years several other groups in the robotics community also experience these problems and have started to develop ways to control hardware directly from MATLAB.</p>
<hr class="xh2  ">
</div>
</div>
</div>
<h3>The Need for External Languages</h3>
<div class="sect1">
<div class="sectionbody">
<div class="paragraph">
<p>The main limitation when trying to use MATLAB to interface with hardware stems from the fact that its scripting language is fundamentally single threaded. It has been designed to allow non-programmers to do complex math operations without needing to worry about programming concepts like multi-threading or synchronization. However, this poses a problem for real-time control of hardware because all communication is forced to happen synchronously in the main thread. For example, if a control loop runs at 100Hz and it takes a message ~8ms for a round-trip, the main thread ends up wasting 80% of the available time budget waiting for a response without doing any actual work.</p>
</div>
<div class="paragraph">
<p>A second hurdle is that while MATLAB is very efficient in the execution of math operations, it is not particularly well suited for byte manipulation. This makes it difficult to develop code that can efficiently create and parse binary message formats that the target hardware can understand. Thus, after having the main thread spend its time waiting for and parsing the incoming data, there may not be any time left for performing interesting math operations.</p>
</div>
<div class="imageblock text-center">
<div class="content"><a class="image" href="https://ennerf.github.io/images/matlab/comms-single-threaded.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img decoding="async" class="aligncenter" src="https://ennerf.github.io/images/matlab/comms-single-threaded.png" alt="comms single threaded.png" width="100%" /></a></div>
<div class="title">Figure 1. Communications overhead in the main MATLAB thread</div>
</div>
<div class="paragraph">
<p>Pure MATLAB implementations can work for simple applications, such as interfacing with an Arduino to gather temperature data or blink an LED, but it is not feasible to control complex robotic systems (e.g. a humanoid) at high rates (e.g. 100Hz-1KHz). Fortunately, MATLAB does have the ability to interface with other programming languages that allow users to create background threads that can offload the communications aspect from the main thread.</p>
</div>
<div class="imageblock text-center">
<div class="content"><a class="image" href="https://ennerf.github.io/images/matlab/comms-multi-threaded.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img decoding="async" class="aligncenter" src="https://ennerf.github.io/images/matlab/comms-multi-threaded.png" alt="comms multi threaded.png" width="100%" /></a></div>
<div class="title">Figure 2. Communications overhead offloaded to other threads</div>
</div>
<div class="paragraph">
<p>Out of the box MATLAB provides two interfaces to other languages: <a href="https://www.mathworks.com/help/matlab/matlab_external/introducing-mex-files.html" target="_blank" rel="noopener noreferrer follow external" data-wpel-link="external">MEX</a> for calling C/C++ code, and the <a href="https://www.mathworks.com/help/matlab/matlab_external/product-overview.html" target="_blank" rel="noopener noreferrer follow external" data-wpel-link="external">Java Interface</a> for calling Java code. There are some differences between the two, but at the end of the day the choice effectively comes down to personal preference. Both provide enough capabilities for developing sophisticated interfaces and have orders of magnitude better performance than required. There are additional interfaces to <a href="https://www.mathworks.com/help/matlab/calling-external-functions.html" target="_blank" rel="noopener noreferrer follow external" data-wpel-link="external">other languages</a>, but those require additional setup steps.</p>
<hr class="xh2  ">
<h3>Message Passing Frameworks</h3>
</div>
</div>
</div>
<div class="sect1">
<div class="sectionbody">
<div class="paragraph">
<p><a href="https://en.wikipedia.org/wiki/Message_passing" target="_blank" rel="noopener noreferrer follow external" data-wpel-link="external">Message passing</a> frameworks such as <a href="http://www.ros.org/" target="_blank" rel="noopener noreferrer follow external" data-wpel-link="external">Robot Operating System (ROS)</a> and <a href="https://lcm-proj.github.io/" target="_blank" rel="noopener noreferrer follow external" data-wpel-link="external">Lightweight Communication and Marshalling (LCM)</a> have been widely adopted in the robotics research community. At the core they typically consist of two parts: a way to exchange data between processes (e.g. UDP/TCP), as well as a defined binary format for encoding and decoding the messages. They allow systems to be built with distributed components (e.g. processes) that run on different computers, different operating systems, and different programming languages.</p>
</div>
<div class="paragraph">
<p>The resulting systems are very extensible and provide convenient ways for prototyping. For example, a component communicating with a physical robot can be exchanged with a simulator without affecting the rest of the system. Similarly, a new walking controller could be implemented in MATLAB and communicate with external processes (e.g. robot comms) through the exchange of messages. With ROS and LCM in particular, their flexibility, wide-spread adoption, and support for different languages make them a nice starting point for a MATLAB-hardware interface.</p>
<hr class="xh2  ">
</div>
<div class="sect2">
<h3 id="_lightweight_communication_and_marshalling_lcm">Lightweight Communication and Marshalling (LCM)</h3>
<div class="paragraph">
<p><a href="https://lcm-proj.github.io/tut_matlab.html" target="_blank" rel="noopener noreferrer follow external" data-wpel-link="external">LCM</a> was developed in 2006 at <a href="http://www.mit.edu/" target="_blank" rel="noopener noreferrer follow external" data-wpel-link="external">MIT</a> for their entry to DARPA’s Urban Challenge. In recent years it has become a popular alternative to ROS-messaging, and it was as far as we know the first message passing framework for robotics that supported MATLAB as a core language.</p>
</div>
<div class="paragraph">
<p>The snippet below shows how the MATLAB code for sending a command message could look like. The code creates a struct-like <em>message</em>, sets desired values, and publishes it on an appropriate channel.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-matlab" data-lang="matlab">%% MATLAB code for sending an LCM message
% Setup
lc = lcm.lcm.LCM.getSingleton();

% Fill message
cmd = types.command();
cmd.position = [1 2 3];
cmd.velocity = [1 2 3];

% Publish
lc.publish('COMMAND_CHANNEL', cmd);</code></pre>
</div>
</div>
<div class="paragraph">
<p>Interestingly, the backing implementation of these bindings was done in pure Java and did not contain any actual MATLAB code. The exposed interface consisted of two Java classes as well as auto-generated message types.</p>
</div>
<div class="ulist">
<ul>
<li>The <a href="https://github.com/lcm-proj/lcm/blob/master/lcm-java/lcm/lcm/LCM.java" target="_blank" rel="noopener noreferrer follow external" data-wpel-link="external">LCM</a> class provides a way to publish messages and subscribe to channels</li>
<li>The generated Java messages handle the binary encoding and exposed fields that MATLAB can access</li>
<li>The <a href="https://github.com/lcm-proj/lcm/blob/master/lcm-java/lcm/lcm/MessageAggregator.java" target="_blank" rel="noopener noreferrer follow external" data-wpel-link="external">MessageAggregator</a> class provides a way to receive messages on a background thread and queue them for MATLAB.</li>
</ul>
</div>
<div class="paragraph">
<p>Thus, even though the snippet looks similar to MATLAB code, all variables are actually Java objects. For example, the struct-like <em>command</em> type is a Java object that exposes public fields as shown in the snippet below. Users can access them the same way as fields of a standard MATLAB struct (or class properties) resulting in nice syntax. The types are automatically converted according to the <a href="https://mathworks.com/help/matlab/matlab_external/passing-data-to-java-methods.html" target="_blank" rel="noopener noreferrer follow external" data-wpel-link="external">type mapping</a>.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-java" data-lang="java">/**
 * Java class that behaves like a MATLAB struct
 */
public final class command implements lcm.lcm.LCMEncodable
{
    public double[] position;
    public double[] velocity;
    // etc. ...
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>Receiving messages is done by subscribing an <em>aggregator</em> to one or more channels. The aggregator receives messages from a background thread and stores them in a queue that MATLAB can access in a synchronous manner using <em>aggregator.getNextMessage()</em>. Each message contains the raw bytes as well as some meta data for selecting an appropriate type for decoding.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-matlab" data-lang="matlab">%% MATLAB code for receiving an LCM message
% Setup
lc = lcm.lcm.LCM.getSingleton();
aggregator = lcm.lcm.MessageAggregator();
lc.subscribe('FEEDBACK_CHANNEL', aggregator);

% Continuously check for new messages
timeoutMs = 1000;
while true

    % Receive raw message
    msg = aggregator.getNextMessage(timeoutMs);

    % Ignore timeouts
    if ~isempty(msg)

        % Select message type based on channel name
        if strcmp('FEEDBACK_CHANNEL', char(msg.channel))

            % Decode raw bytes to a usable type
            fbk = types.feedback(msg.data);

            % Use data
            position = fbk.position;
            velocity = fbk.velocity;

        end

    end
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>The snippet below shows a simplified version of the backing Java code for the aggregator class. Since Java is limited to a single return argument, the <em>getNextMessage</em> call returns a Java type that contains the received bytes as well as meta data to identify the type, i.e., the source channel name.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-java" data-lang="java">/**
 * Java class for receiving messages in the background
 */
public class MessageAggregator implements LCMSubscriber {

    /**
     * Value type that combines multiple return arguments
     */
    public static class Message {

        final public byte[] data; // raw bytes
        final public String channel; // source channel name

        public Message(String channel_, byte[] data_) {
            data = data_;
            channel = channel_;
        }
    }

    /**
     * Method that gets called from MATLAB to receive new messages
     */
    public synchronized Message getNextMessage(long timeout_ms) {

		if (!messages.isEmpty()) {
		    return messages.removeFirst();
        }

        if (timeout_ms == 0) { // non-blocking
            return null;
        }

        // Wait for new message until timeout ...
    }

}</code></pre>
</div>
</div>
<div class="paragraph">
<p>Note that the <em>getNextMessage</em> method requires a timeout argument. In general it is important for blocking Java methods to have a timeout in order to prevent the main thread from getting stuck permanently. Being in a Java call prohibits users from aborting the execution (ctrl-c), so timeouts should be reasonably short, i.e., in the low seconds. Otherwise this could cause the UI to become unresponsive and users may be forced to close MATLAB without being able to save their workspace. Passing in a timeout of zero serves as a non-blocking interface that immediately returns empty if no messages are available. This is often useful for working with multiple aggregators or for integrating asynchronous messages with unknown timing, such as user input.</p>
</div>
<div class="paragraph">
<p>Overall, we thought that this was a well thought out API and a great example for a minimum viable interface that works well in practice. By receiving messages on a background thread and by moving the encoding and decoding steps to the Java language, the main thread is able to spend most of its time on actually working with the data. Its minimalistic implementation is comparatively simple and we would recommend it as a starting point for developing similar interfaces.</p>
</div>
<div class="paragraph">
<p>Some minor points for improvement that we found were:</p>
</div>
<div class="ulist">
<ul>
<li>The decoding step <em>fbk = types.feedback(msg.data)</em> forces two unnecessary translations due to <em>msg.data</em> being a <em>byte[]</em>, which automatically gets converted to and from <em>int8</em>. This could result in a noticeable performance hit when receiving larger messages (e.g. images) and could be avoided by adding an overload that accepts a non-primitive type that does not get translated, e.g., <em>fbk = types.feedback(msg)</em>.</li>
<li>The Java classes did not implement <a href="https://mathworks.com/help/matlab/matlab_external/save-and-load-java-objects-to-mat-files.html" target="_blank" rel="noopener noreferrer follow external" data-wpel-link="external">Serializable</a>, which could become bothersome when trying to save the workspace.</li>
<li>We would prefer to select the decoding type during the subscription step, e.g., <em>lc.subscribe(&#8216;FEEDBACK_CHANNEL&#8217;, aggregator, &#8216;types.feedback&#8217;)</em>, rather than requiring users to instantiate the type manually. This would clean up the parsing code a bit and allow for a less confusing error message if types are missing.</li>
</ul>
<hr class="xh2  ">
</div>
</div>
<div class="sect2">
<h3 id="_robot_operating_system_ros">Robot Operating System (ROS)</h3>
<div class="paragraph">
<p><a href="http://www.ros.org/" target="_blank" rel="noopener noreferrer follow external" data-wpel-link="external">ROS</a> is by far the most widespread messaging framework in the robotics research community and has been officially supported by Mathworks&#8217; <a href="https://www.mathworks.com/products/robotics.html" target="_blank" rel="noopener noreferrer follow external" data-wpel-link="external">Robotics System Toolbox</a> since 2014. While the Simulink code generation uses ROS C++, the MATLAB implementation is built on the less common RosJava.</p>
</div>
<div class="paragraph">
<p>The API was designed such that each topic requires dedicated publishers and subscribers, which is different from LCM where each subscriber may listen to multiple channels/topics. While this may result in potentially more subscribers, the specification of the expected type at initialization removes much of the boiler plate code necessary for dealing with message types.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-matlab" data-lang="matlab">%% MATLAB code for publishing a ROS message
% Setup Publisher
chatpub = rospublisher('/chatter', 'std_msgs/String');

% Fill message
msg = rosmessage(chatpub);
msg.Data = 'Some test string';

% Publish
chatpub.send(msg);</code></pre>
</div>
</div>
<div class="paragraph">
<p>Subscribers support three different styles to access messages: blocking calls, non-blocking calls, and callbacks.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-matlab" data-lang="matlab">%% MATLAB code for receiving a ROS message
% Setup Subscriber
laser = rossubscriber('/scan');

% (1) Blocking receive
scan = laser.receive(1); % timeout [s]

% (2) Non-blocking latest message (may not be new)
scan = laser.LatestMessage;

% (3) Callback
callback = @(msg) disp(msg);
subscriber = rossubscriber('/scan', @callback);</code></pre>
</div>
</div>
<div class="paragraph">
<p>Contrary to LCM, all objects that are visible to users are actually MATLAB classes. Even though the implementation is using Java underneath, all exposed functionality is wrapped in MATLAB classes that hide all Java calls. For example, each message type is associated with a generated wrapper class. The code below shows a simplified example of a wrapper for a message that has a <em>Name</em> property.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-matlab" data-lang="matlab">%% MATLAB code for wrapping a Java message type
classdef WrappedMessage

    properties (Access = protected)
        % The underlying Java message object (hidden from user)
        JavaMessage
    end

    methods

        function name = get.Name(obj)
            % value = msg.Name;
            name = char(obj.JavaMessage.getName);
        end

        function set.Name(obj, name)
            % msg.Name = value;
            validateattributes(name, {'char'}, {}, 'WrappedMessage', 'Name');
            obj.JavaMessage.setName(name); % Forward to Java method
        end

        function out = doSomething(obj)
            % msg.doSomething() and doSomething(msg)
            try
                out = obj.JavaMessage.doSomething(); % Forward to Java method
            catch javaException
                throw(WrappedException(javaException)); % Hide Java exception
            end
        end

    end
end</code></pre>
</div>
</div>
<div class="paragraph">
<p>Due to the implementation being closed-source, we were only able to look at the public toolbox files as well as the compiled Java bytecode. As far as we could tell they built a small Java library that wrapped RosJava functionality in order to provide an interface that is easier to call from MATLAB. Most of the actual logic seemed to be implemented in MATLAB code, but we also found several calls to various Java libraries for problems that would have been difficult to implement in pure MATLAB, e.g., listing networking interfaces or doing in-memory decompression of images.</p>
</div>
<div class="paragraph">
<p>Overall, we found that the ROS support toolbox looked very nice and was a great example of how seamless external languages could be integrated with MATLAB. We also really liked that they offered a way to load log files (rosbags).</p>
</div>
<div class="paragraph">
<p>One concern we had was that there did not seem to be a simple non-blocking way to check for new messages, e.g., a <em>hasNewMessage()</em> method or functionality equivalent to LCM’s <em>getNextMessage(0)</em>. We often found this useful for applications that combined data from multiple topics that arrived at different rates (e.g. sensor feedback and joystick input events). We checked whether this behavior could be emulated by specifying a very small timeout in the <em>receive</em> method (shown in the snippet below), but any value below 0.1s seemed to never successfully return.</p>
<a href="http://robohub.org/wp-content/uploads/2017/06/Screen-Shot-2017-06-28-at-15.56.14.png" data-wpel-link="internal"><img decoding="async" class="aligncenter size-full wp-image-80937" src="http://robohub.org/wp-content/uploads/2017/06/Screen-Shot-2017-06-28-at-15.56.14.png" alt="" width="716" height="170" srcset="https://robohub.org/wp-content/uploads/2017/06/Screen-Shot-2017-06-28-at-15.56.14.png 716w, https://robohub.org/wp-content/uploads/2017/06/Screen-Shot-2017-06-28-at-15.56.14-425x101.png 425w" sizes="(max-width: 716px) 100vw, 716px" /></a>
</div>
<div class="listingblock">
<div class="content">
<hr class="xh2  ">
</div>
</div>
</div>
<div class="sect2">
<h3 id="_data_distribution_service_dds">Data Distribution Service (DDS)</h3>
<div class="paragraph">
<p>In 2014 Mathworks also added a <a href="https://www.mathworks.com/hardware-support/rti-dds.html" target="_blank" rel="noopener noreferrer follow external" data-wpel-link="external">support package for DDS</a>, which is the messaging middleware that ROS 2.0 is based on. It supports MATLAB and Simulink, as<br />
well as code generation. Unfortunately, we did not have all the requirements to get it setup, and we could not find much information about the underlying implementation. After looking at some of the intro videos, we believe that the resulting code should look as follows.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-matlab" data-lang="matlab">%% MATLAB code for sending and receiving DDS messages
% Setup
DDS.import('ShapeType.idl','matlab');
dp = DDS.DomainParticipant

% Create message
myTopic = ShapeType;
myTopic.x = int32(23);
myTopic.y = int32(35);

% Send Message
dp.addWriter('ShapeType', 'Square');
dp.write(myTopic);

% Receive message
dp.addReader('ShapeType', 'Square');
readTopic = dp.read();</code></pre>
</div>
</div>
</div>
<div class="sect2">
<hr class="xh2  ">
<h3 id="_zeromq">ZeroMQ</h3>
<div class="paragraph">
<p>ZeroMQ is another asynchonous messaging library that is popular for building distributed systems. It only handles the messaging aspect, so users need to supply their own wire format. <a href="https://github.com/smcgill3/zeromq-matlab" target="_blank" rel="noopener noreferrer follow external" data-wpel-link="external">ZeroMQ-matlab</a> is a MATLAB interface to ZeroMQ that was developed at UPenn between 2013-2015. We were not able to find much documentation, but as far as we could tell the resulting code should look similar to following snippet.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-matlab" data-lang="matlab">%% MATLAB code for sending and receiving ZeroMQ data
% Setup
subscriber = zmq( 'subscribe', 'tcp', '127.0.0.1', 43210 );
publisher = zmq( 'publish', 'tcp', 43210 );

% Publish data
bytes = uint8(rand(100,1));
nbytes = zmq( 'send', publisher, bytes );

% Receive data
receiver = zmq('poll', 1000); // polls for next message
[recv_data, has_more] = zmq( 'receive', receiver );

disp(char(recv_data));</code></pre>
</div>
</div>
<div class="paragraph">
<p>It was implemented as a single MEX function that selects appropriate sub-functions based on a string argument. State was maintained by using socket IDs that were passed in by the user at every call. The code below shows a simplified snippet of the send action.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code class="language-c++" data-lang="c++">// Parsing the selected ZeroMQ action behind the MEX barrier
// Grab command String
if ( !(command = mxArrayToString(prhs[0])) )
	mexErrMsgTxt("Could not read command string. (1st argument)");

// Match command String with desired action (e.g. 'send')
if (strcasecmp(command, "send") == 0){
	// ... (argument validation)

	// retrieve arguments
	socket_id = *( (uint8_t*)mxGetData(prhs[1]) );
	size_t n_el = mxGetNumberOfElements(prhs[2]);
	size_t el_sz = mxGetElementSize(prhs[2]);
	size_t msglen = n_el*el_sz;

	// send data
	void* msg = (void*)mxGetData(prhs[2]);
	int nbytes = zmq_send( sockets[ socket_id ], msg, msglen, 0 );

	// ... check outcome and return
}
// ... other actions</code></pre>
</div>
</div>
</div>
<div class="sect2">
<hr class="xh2  ">
<h3 id="_other_frameworks">Other Frameworks</h3>
<div class="paragraph">
<p>Below is a list of APIs to other frameworks that we looked at but could not cover in more detail.</p>
</div>
<table class="tableblock frame-all grid-all spread">
<colgroup>
<col style="width: 25%;" />
<col style="width: 75%;" /> </colgroup>
<thead>
<tr>
<th class="tableblock halign-left valign-top">Project</th>
<th class="tableblock halign-left valign-top">Notes</th>
</tr>
</thead>
<tbody>
<tr>
<td class="tableblock halign-left valign-top">
<div>
<div class="paragraph">
<p><a href="https://github.com/ragavsathish/RabbitMQ-Matlab-Client" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">RabbitMQ-Matlab-Client</a></p>
</div>
</div>
</td>
<td class="tableblock halign-left valign-top">
<div>
<div class="paragraph">
<p>Simple Java wrapper for RabbitMQ with callbacks into MATLAB</p>
</div>
</div>
</td>
</tr>
<tr>
<td class="tableblock halign-left valign-top">
<div>
<div class="paragraph">
<p><a href="https://sourceforge.net/projects/urbi/?source=typ_redirect" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">URBI</a> (<a href="http://agents.csse.uwa.edu.au/aibosig/resources/downloads/tutorial_liburbiMatlab_0.1.pdf" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">tutorial</a>)</p>
</div>
</div>
</td>
<td class="tableblock halign-left valign-top">
<div>
<div class="paragraph">
<p>Seems to be deprecated</p>
</div>
</div>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
<div class="sect1">
<hr class="xh2  ">
<h3 id="_final_notes">Final Notes</h3>
<div class="sectionbody">
<div class="paragraph">
<p>Contrary to the situation a few years ago, nowadays there exist interfaces for most of the common message passing frameworks that allow researchers to do at least basic hardware-in-the-loop prototyping directly from MATLAB. However, if none of the available options work for you and you are planning on developing your own, we recommend the following:</p>
</div>
<div class="ulist">
<ul>
<li>If there is no clear pre-existing preference between C++ and Java, we recommend to start with a Java implementation. MEX interfaces require a lot of conversion code that Java interfaces would handle automatically.</li>
<li>We would recommend starting with a minimalstic LCM-like implementation and then add complexity when necessary.</li>
<li>While interfaces that only expose MATLAB code can provide a better and more consistent user experience (e.g. help documentation), there is a significant cost associated with maintaing all of the involved layers. We would recommend holding off on creating MATLAB wrappers until the API is relatively stable.</li>
</ul>
</div>
<div class="paragraph">
<p>Finally, even though message passing systems are very widespread in the robotics community, they do have drawbacks and are not appropriate for every application. Future posts in this series will focus on some of the alternatives.</p>
</div>
</div>
</div>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Teaching ROS quickly to students</title>
		<link>https://robohub.org/teaching-ros-quickly-to-students/</link>
		
		<dc:creator><![CDATA[Ricardo Téllez]]></dc:creator>
		<pubDate>Fri, 09 Jun 2017 09:00:03 +0000</pubDate>
				<category><![CDATA[education]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[control]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[research]]></category>
		<category><![CDATA[ROS]]></category>
		<category><![CDATA[software]]></category>
		<guid isPermaLink="false">http://robohub.org/teaching-ros-quickly-to-students/</guid>

					<description><![CDATA[<p>&#160; Lecturer Steffen Pfiffner of University of Weingarten in Germany is teaching&#160;ROS to 26 students at the same time at a very fast pace. His students, all of them within&#160;the Master on Computer Science of University of Weingarten, use only a web browser. They connect to a web page containing the lessons, a ROS development</p>
<p>The post <a rel="nofollow external noopener noreferrer" href="http://www.theconstructsim.com/teaching-ros-fast-to-many-students/" data-wpel-link="external" target="_blank">Teaching ROS Fast To Many Students</a> appeared first on <a rel="nofollow external noopener noreferrer" href="http://www.theconstructsim.com/" data-wpel-link="external" target="_blank">The Construct</a>.</p>]]></description>
										<content:encoded><![CDATA[<img decoding="async" class="aligncenter size-full wp-image-79391" src="http://robohub.org/wp-content/uploads/2017/05/teach_ros_robot_ignite_academy_learn_ros_robots_robtoics_programming.jpg" alt="" width="900" height="571" srcset="https://robohub.org/wp-content/uploads/2017/05/teach_ros_robot_ignite_academy_learn_ros_robots_robtoics_programming.jpg 900w, https://robohub.org/wp-content/uploads/2017/05/teach_ros_robot_ignite_academy_learn_ros_robots_robtoics_programming-425x270.jpg 425w, https://robohub.org/wp-content/uploads/2017/05/teach_ros_robot_ignite_academy_learn_ros_robots_robtoics_programming-768x487.jpg 768w" sizes="(max-width: 900px) 100vw, 900px" />
<p>Lecturer Steffen Pfiffner of University of Weingarten in Germany is teaching ROS to 26 students at the same time at a very fast pace. His students, all of them within the Master on Computer Science of University of Weingarten, use only a web browser. They connect to a web page containing the lessons, a ROS development environment and several ROS based simulated robots. Using the browser, Pfiffner and his colleague Benjamin Stähle, are able to teach how to program with ROS quickly and to many students. This is what Robot Ignite Academy is made for.<span id="more-79167"></span></p>
<p>“With Ignite Academy our students can jump right into ROS without all the hardware and software setup problems. And the best: they can do this from everywhere,&#8221; says Pfiffner.</p>
<p>Robot Ignite Academy provides a web service which contains the teaching material in text and video format, the simulations of several ROS based robots that the students must learn to program, and the development environment required to build ROS programs and test them on the simulated robot.</p>
<p><img decoding="async" class="aligncenter size-full wp-image-79392" src="http://robohub.org/wp-content/uploads/2017/05/robot-ignite.png" alt="" width="1024" height="640" srcset="https://robohub.org/wp-content/uploads/2017/05/robot-ignite.png 1024w, https://robohub.org/wp-content/uploads/2017/05/robot-ignite-425x266.png 425w, https://robohub.org/wp-content/uploads/2017/05/robot-ignite-768x480.png 768w" sizes="(max-width: 1024px) 100vw, 1024px" /><hr class="xh2  "></p>
<h3>Student&#8217;s point of view</h3>
<p>Students bring their own laptops to the class and connect to the <a href="http://robotignite.academy" target="_blank" rel="noopener noreferrer follow external" data-wpel-link="external">online platform</a>. From that moment, their laptop becomes a ROS development machine, ready to develop programs for many simulated real robots.</p>
<p>The Academy provides the text, the videos and the examples that the student has to follow. Then, the student creates her own ROS program and makes the robot perform a specific action. The student develops the ROS programs as if she is in a typical ROS development computer.</p>
<p>The main advantage is that students can use a Windows, Linux or Mac machine to learn ROS. They don’t even have to install ROS in their computers. The only prerequisite of the laptop is to have a browser. So students do not mess with all the installation problems that frustrate them (and the teachers!), especially when they are starting.</p>
<p>After class, students can continue with their learning at home, library or even the beach if there is a wifi available! All their code, learning material and simulations are stored online so they can access them from anywhere, anytime using any computer.</p>
<hr class="xh2  ">
<h3>Teacher&#8217;s point of view</h3>
<p>The advantage of using the platform is not only for the students but also for the teachers. Teachers do not have to create the material and maintain it. They do not have to prepare the simulations or work on multiple different computers. They don’t even have to prepare the exams!! (which are already provided by the platform).</p>
<p>So what are the teachers for?</p>
<p>By making use of the provided material, the teacher can concentrate on guiding the students by explaining the most confusing parts, answer questions, suggest modifications according to the level of each student, and adapt the pace to the different types of students.</p>
<p>This new method of teaching ROS is exploding among the Universities and High Schools that want to provide the latest and most practical teachings to their students. The method, developed by Robot Ignite Academy, combines a new way of teaching based on practice and an online learning platform. Those two points combined make the teaching of ROS a smooth experience and can potentially see the students&#8217; knowledge base skyrocket.</p>
<p>As user Walace Rosa indicates in his video comment about Robot Ignite Academy:</p>
<blockquote><p>It is a game changer [in] teaching ROS!</p></blockquote>
<p>The method is becoming very popular in the robotics circuits too, and many teachers are using it for younger students. For example, High School Mundet in Barcelona is using it to teach ROS to 15 years old students.</p>
<p>Additionally, the academy provides a free online certification exam with different levels of knowledge certification. Many Universities are using this exam to certify that their students did learn the material since the exam is quite demanding.</p>
<p><img decoding="async" class="aligncenter size-full wp-image-79393" src="http://robohub.org/wp-content/uploads/2017/05/ROS-classroom-teaching.jpg" alt="" width="1024" height="768" srcset="https://robohub.org/wp-content/uploads/2017/05/ROS-classroom-teaching.jpg 1024w, https://robohub.org/wp-content/uploads/2017/05/ROS-classroom-teaching-425x319.jpg 425w, https://robohub.org/wp-content/uploads/2017/05/ROS-classroom-teaching-768x576.jpg 768w" sizes="(max-width: 1024px) 100vw, 1024px" /><hr class="xh2  "></p>
<h3>Some examples of past events</h3>
<ul>
<li><span class="s2"> 1 week ROS course in Barcelona for <em><a href="http://smart-e-mariecurie.eu/" target="_blank" rel="noopener noreferrer follow external" data-wpel-link="external">SMART-E project</a></em> team members. This is a private course given by Robot Ignite Academy at Barcelona for 15 members of the SMART-E project that need to be up to speed with ROS fast. <strong>From 8th to 12nd of May 2017</strong></span></li>
<li> 1 day ROS course for the <em><a href="http://www.enginyersbcn.cat/" target="_blank" rel="noopener noreferrer follow external" data-wpel-link="external">Col·legi d’Enginyers de Barcelona</a></em>. <strong>The 17th of May 2017</strong>.</li>
<li> 3 months course for <em><a href="http://www.salleurl.edu/" target="_blank" rel="noopener noreferrer follow external" data-wpel-link="external">University of La Salle</a></em> in Barcelona within the <em><a href="http://www.beslasalle.net/portal/masters/masters-electronica-madr-barcelona" target="_blank" rel="noopener noreferrer follow external" data-wpel-link="external">Master on Automatics, Domotics and Robotics</a></em>. <strong>From 10th of May to 29th of June 2017</strong>.</li>
<li> 1 weekend ROS course for teenagers in Bilbao, Spain. <strong>The 20th and 21st of May 2017</strong>.</li>
<li> We can also organize a special event like these for you and your team.</li>
</ul>
<hr class="xh2  ">
<h3>Helpful ROS videos</h3>
<div class="keep-aspect"><iframe title="ROS BASICS IN 5 DAYS #1 - Course Overview &amp; Introduction" width="500" height="281" src="https://www.youtube-nocookie.com/embed/DBFYZRMLr70?list=PLK0b4e05LnzaOZxQt0OwMRwIa8ysYG9_a" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe></div>
<p></p>
<div class="keep-aspect"><iframe title="3 reasons why students struggle with ROS" width="500" height="281" src="https://www.youtube-nocookie.com/embed/XUwREG8ZOgc?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe></div>
<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Smart Grasping System available on ROS Development Studio</title>
		<link>https://robohub.org/smart-grasping-system-available-on-ros-development-studio/</link>
		
		<dc:creator><![CDATA[Ruben Alves]]></dc:creator>
		<pubDate>Wed, 10 May 2017 08:15:54 +0000</pubDate>
				<category><![CDATA[education]]></category>
		<category><![CDATA[tutorials]]></category>
		<category><![CDATA[actuation]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[control]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[ROS]]></category>
		<category><![CDATA[sensing]]></category>
		<category><![CDATA[software]]></category>
		<guid isPermaLink="false">http://robohub.org/smart-grasping-system-available-on-ros-development-studio/</guid>

					<description><![CDATA[Would you like to make a robot to grasp something, but you think that is impossible to you just because you can’t buy a robot arm? I’m here to tell that you can definitely achieve this without buying a real robot. Let&#8217;s see how: How is that possible? The Smart Grasping Sandbox built by Shadow [&#8230;]]]></description>
										<content:encoded><![CDATA[<img decoding="async" class="aligncenter size-full wp-image-78051" src="http://robohub.org/wp-content/uploads/2017/05/sgsmain.png" alt="" width="657" height="485" srcset="https://robohub.org/wp-content/uploads/2017/05/sgsmain.png 657w, https://robohub.org/wp-content/uploads/2017/05/sgsmain-425x314.png 425w" sizes="(max-width: 657px) 100vw, 657px" />
<p>Would you like to make a robot to grasp something, but you think that is impossible to you just because you can’t buy a robot arm? I’m here to tell that you can definitely achieve this without buying a real robot. Let&#8217;s see how:<span id="more-78045"></span></p>
<div class="keep-aspect"><iframe title="[ROS Q&amp;A] Smart Grasping Sandbox online Testbed by Shadow Robot" width="500" height="281" src="https://www.youtube-nocookie.com/embed/uAz3oAseIjQ?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe></div>
<p></p>
<hr class="xh2  ">
<h3>How is that possible?</h3>
<p>The <a href="https://medium.freecodecamp.com/an-open-sandbox-for-robot-grasping-cee467a3fabb" target="_blank" rel="noopener noreferrer follow external" data-wpel-link="external">Smart Grasping Sandbox</a> built by <a href="http://www.shadowrobot.com/" target="_blank" rel="noopener noreferrer follow external" data-wpel-link="external">Shadow Robotics</a> is now available for everybody on the <a href="http://rds.theconstructsim.com/" target="_blank" rel="noopener noreferrer follow external" data-wpel-link="external">ROS Development Studio</a> – a system that allows you to create and test your robot programs through simulations using only a web browser.</p>
<h3>Wait, what is the Smart Grasping Sandbox?</h3>
<p>The Smart Grasping Sandbox is a public simulation for the <a href="https://www.shadowrobot.com/shadow-smart-grasping-system/" target="_blank" rel="noopener noreferrer follow external" data-wpel-link="external">Shadow’s Smart Grasping System</a> with the<a href="https://www.universal-robots.com/products/ur10-robot/" target="_blank" rel="noopener noreferrer follow external" data-wpel-link="external">UR10 robot from Universal Robots</a>. It allows you to make a robot to grasp something without having to learn everything related to Machine Learning, and being available on the ROS Development Studio, it allows you to test it without the hassle of installing all the requirements.</p>
<p>As Ugo Cupcic <a href="https://medium.freecodecamp.com/an-open-sandbox-for-robot-grasping-cee467a3fabb" target="_blank" rel="noopener noreferrer follow external" data-wpel-link="external">said</a>:</p>
<blockquote><p>I don’t want to have to specify every aspect of a problem — I’d rather the system learn the best way to approach a given problem itself.</p></blockquote>
<h3>Using the Development Environment for Grasping</h3>
<p>In order to user the Smart Grasping Sandbox on <a href="http://rds.theconstructsim.com/" target="_blank" rel="noopener noreferrer follow external" data-wpel-link="external">ROS Development Studio</a>&#8212;also known as RDS&#8212;just go to <a href="http://rds.theconstructsim.com/" target="_blank" rel="noopener noreferrer follow external" data-wpel-link="external">http://rds.theconstructsim.com</a> and Sign In. Once logged in, go to the Public Simulations, select the Smart Grasping Sandbox simulation and press the red <strong>Launch this simulation</strong> button.</p>
<img decoding="async" class="aligncenter size-full wp-image-78047" src="http://robohub.org/wp-content/uploads/2017/05/smart-grasping.png" alt="" width="360" height="660" srcset="https://robohub.org/wp-content/uploads/2017/05/smart-grasping.png 360w, https://robohub.org/wp-content/uploads/2017/05/smart-grasping-232x425.png 232w" sizes="(max-width: 360px) 100vw, 360px" />
<p>After pressing the <strong>Launch this simulation</strong>, a new screen will appears asking you to select the <strong>launch file</strong>. Just keep the default <strong>main.launch</strong> and press the red <strong>run</strong> button.</p>
<img decoding="async" class="aligncenter size-full wp-image-78048" src="http://robohub.org/wp-content/uploads/2017/05/select-launch.png" alt="" width="469" height="644" srcset="https://robohub.org/wp-content/uploads/2017/05/select-launch.png 469w, https://robohub.org/wp-content/uploads/2017/05/select-launch-310x425.png 310w" sizes="(max-width: 469px) 100vw, 469px" />
<p>After a few seconds, the simulation will be loaded and you will be able interact with the simulation.</p>
<p>Once the simulation is loaded, you can see the instructions about how to control it on the left side.</p>
<p>In the center you have the simulation itself, and on the right side you can see the <strong>Integrated Development Environment</strong> and the <strong>Web Shell</strong> that allows you to <strong>modify the code</strong> and send <strong>Linux</strong>commands to the simulation respectively.</p>
<p>You can modify, the simulation, the control programs or even create your own manipulation control programs, make the grasping system learn using deep learning or else. This is up to you as developer!</p>
<img decoding="async" class="aligncenter size-full wp-image-78049" src="http://robohub.org/wp-content/uploads/2017/05/shadow-robot-simulation.png" alt="" width="1364" height="678" srcset="https://robohub.org/wp-content/uploads/2017/05/shadow-robot-simulation.png 1364w, https://robohub.org/wp-content/uploads/2017/05/shadow-robot-simulation-425x211.png 425w, https://robohub.org/wp-content/uploads/2017/05/shadow-robot-simulation-768x382.png 768w, https://robohub.org/wp-content/uploads/2017/05/shadow-robot-simulation-1024x509.png 1024w" sizes="(max-width: 1364px) 100vw, 1364px" />
<p>You can also see what the robot sees using the online ROS 3D Visualizer (RViz) typing the following command on the <strong>Web Shell</strong>:</p>
<p><code>$ rosrun rviz rviz</code></p>
<p>After running <strong>Rviz</strong>, you press the red <strong>Open ROS Graphic Tools</strong> button on the bottom left side of the system and a new tab should appear with Rviz.</p>
<p><img decoding="async" class="aligncenter size-full wp-image-78050" src="http://robohub.org/wp-content/uploads/2017/05/rviz.png" alt="" width="1149" height="712" srcset="https://robohub.org/wp-content/uploads/2017/05/rviz.png 1149w, https://robohub.org/wp-content/uploads/2017/05/rviz-425x263.png 425w, https://robohub.org/wp-content/uploads/2017/05/rviz-768x476.png 768w, https://robohub.org/wp-content/uploads/2017/05/rviz-1024x635.png 1024w" sizes="(max-width: 1149px) 100vw, 1149px" /><hr class="xh2  "></p>
<h3>Conclusion</h3>
<p>Here we have seen how to use a simulation to programme a robot to grasp something.</p>
<p>The simulation uses <em><a href="http://ros.org/" target="_blank" rel="noopener noreferrer follow external" data-wpel-link="external">ROS</a></em> as the middleware to control the robot.</p>
<p>If you want to learn ROS or master your ROS Skills, we recommend you to give a try to <em><a href="http://www.robotigniteacademy.com/" target="_blank" rel="noopener noreferrer follow external" data-wpel-link="external">Robot Ignite Academy</a></em>.</p>
<p>If you are a robot builder and want to have your own simulation available for everybody on RDS, or you want to have a course specifically for your robot, contact us through the email <em><a href="mailto:info@theconstructsim.com" target="_blank" rel="noopener noreferrer">info@theconstructsim.com</a></em>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Programming your NAO robot for human interaction</title>
		<link>https://robohub.org/programming-your-nao-robot-for-human-interaction/</link>
		
		<dc:creator><![CDATA[Philip English]]></dc:creator>
		<pubDate>Tue, 09 May 2017 08:15:19 +0000</pubDate>
				<category><![CDATA[education]]></category>
		<category><![CDATA[tutorials]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[control]]></category>
		<category><![CDATA[household]]></category>
		<category><![CDATA[human-robot interaction]]></category>
		<category><![CDATA[humanoids]]></category>
		<category><![CDATA[NAO]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[video]]></category>
		<guid isPermaLink="false">http://robohub.org/programming-your-nao-robot-for-human-interaction/</guid>

					<description><![CDATA[Today we are looking at how to program your NAO Robot for Human Interaction. Watch the video and follow the steps below to get interactive with your robot pal!  Create an animation of movements Right click, select “Create a new box” Select “Timeline” We want the robot to do 3 things, a five high, a [&#8230;]]]></description>
										<content:encoded><![CDATA[<img decoding="async" class="aligncenter size-full wp-image-78026" src="http://robohub.org/wp-content/uploads/2017/05/programming-nao-human-interaction.jpg" alt="" width="900" height="600" srcset="https://robohub.org/wp-content/uploads/2017/05/programming-nao-human-interaction.jpg 900w, https://robohub.org/wp-content/uploads/2017/05/programming-nao-human-interaction-425x283.jpg 425w, https://robohub.org/wp-content/uploads/2017/05/programming-nao-human-interaction-768x512.jpg 768w" sizes="(max-width: 900px) 100vw, 900px" />
<p>Today we are looking at how to program your NAO Robot for Human Interaction. Watch the video and follow the steps below to get interactive with your robot pal!</p>
<div class="keep-aspect"><iframe title="NAO Robot Human Interaction Tutorial" width="500" height="281" src="https://www.youtube-nocookie.com/embed/fT8rNQEs-_w?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe></div>
<p></p>
<ol>
<li> Create an animation of movements
<ul>
<li>Right click, select “Create a new box”</li>
<li>Select “Timeline”</li>
</ul>
</li>
</ol>
<p>We want the robot to do 3 things, a five high, a hello, and a goodbye move:</p>
<ul>
<li>On the Timeline Edit Box
<ul>
<li>Name: High Five</li>
<li>Image: Click “Edit”
<ul>
<li>On the Edit box image</li>
<li>Click “Browse” and select a file</li>
</ul>
</li>
<li>Click “OK”</li>
</ul>
</li>
</ul>
<p>Now, as you can remember, if we take it to the box, we can get access to the NAO’s Timeline. Mine now is connected to the PC. So what I’m going to do is I’m going to set some points of the NAO to do some movements. As I have said before on one of my tutorial I’m going to make it set all the joints to the whole body.</p>
<p>We want to make him look like he is doing a high five:</p>
<ul>
<li>Right click the arm
<ul>
<li>Click “Stiffen chain on/off”</li>
<li>Raise his arm up</li>
</ul>
</li>
<li>Set joints and keyframe
<ul>
<li>Select “Arms”</li>
</ul>
</li>
<li>Click “Play” on the Motion Controller</li>
</ul>
<p>That’s a quite quick high five actually. What we want to do is to actually give him a pause when he got his arm in the air. So, the way we do that is to copy and paste the keyframe.</p>
<p>Grab a few already built in animation, just to show you how much it works:</p>
<ul>
<li>Go to Motions&gt;Animations
<ul>
<li>Drag a “Hello” box to the workspace</li>
<li>Drag a “Wipe Forehead” box for a goodbye move to the workspace</li>
</ul>
</li>
</ul>
<p>We want to hear him speak, so:</p>
<ul>
<li>Go to Voice
<ul>
<li>Drag a “Speech Recognition” box to the workspace</li>
</ul>
</li>
<li>Drag a “Switch Case”
<ul>
<li>Connect the “Speech Recognition” box to the “Switch Case” box</li>
<li>On the first case, write “Hello” and connect to the “Hello” box</li>
<li>On the second case, write “High Five” and connect it to the “High Five” box</li>
<li>On the third case, write “Goodbye” and connect it to the “Wipe Forehand” box</li>
</ul>
</li>
<li>Set parameters of Speech Recognition
<ul>
<li>Word list: Hi; High Five; Goodbye;</li>
<li>Play with the threshold to see what works better</li>
<li>Click “OK”</li>
</ul>
</li>
</ul>
<p>So there we have a speech recognition, he will listen to what I am saying and then we will act a motion. Now, what we need to do is to make sure that the robot doesn’t repeat it, so you know, it doesn’t loop back. Before we do that, we are going to:</p>
<ul>
<li>Drag 3 “Say” box to the workspace so he can  speak back to us
<ul>
<li>On the “Switch case”, connect the “Hello” case on the “Say” box
<ul>
<li>Localized Text
<ul>
<li>Change the language to English(United States)</li>
<li>Write “Hi” on the textbox</li>
</ul>
</li>
</ul>
</li>
<li>Connect the “High Five” case on the “Say (1)” box
<ul>
<li>Localized Text
<ul>
<li>Change the language to English(United States)</li>
<li>Write “High Five” on the textbox</li>
</ul>
</li>
</ul>
</li>
<li>Connect the “Goodbye” case on the “Say(2)” box
<ul>
<li>Localized Text
<ul>
<li>Change the language to English(United States)</li>
<li>Write “Goodbye” on the textbox</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<p>So, here’s what we are saying, he recognizes it, says a word and does an animation, now what we want to do is we don’t want him to loop, as in he keeps hearing the same sound and maybe he starts to hear himself and repeat himself, so to stop that we need to connect the end of the motion boxes back to the “Speech Recognition” box. A simple output to the input speech.</p>
<p>I am going to make a little change actually, instead of “Hello”, we should put “Hi” here and I’m going to put “Hi” in there which is already done because they have to match otherwise if it doesn’t match he won’t recognize it. So if he hit “Load”</p>
<p><strong>Philip</strong>: High Five!</p>
<p><strong>Nao</strong>: High Five!</p>
<p><strong>Philip: </strong>Goodbye!</p>
<p><strong>Nao: </strong>Goodbye!</p>
<p><strong>Philip: </strong>Hi!</p>
<p><strong>Nao: </strong>Hello!</p>
<p>Brilliant! So that looks likes he’s working very well, so again if we says “Hi”, “High Five” or “Good bye” then he will greet you. If you walk in to room and you say “Hi” to a robot, obviously, he will do his animation and say a speech. Here you can use your imagination and try different things, different animations.</p>
<hr class="xh2  ">
<p><em>If you liked this article, you may also enjoy these from Robo-Phil:</em></p>
<ul>
<li><a href="http://robohub.org/python-programming-your-nao-robot/" target="_blank" rel="noopener noreferrer" data-wpel-link="internal">Python programming your NAO robot</a></li>
<li><a href="http://robohub.org/hard-at-work-a-review-of-the-laevo-exoskeleton/" target="_blank" rel="noopener noreferrer" data-wpel-link="internal">Hard at work: A review of the Laevo Exoskeleton</a></li>
</ul>
<p><em>See all <a href="http://robohub.org/" target="_blank" rel="noopener noreferrer" data-saferedirecturl="https://www.google.com/url?hl=en-GB&amp;q=http://robohub.org/&amp;source=gmail&amp;ust=1477500783522000&amp;usg=AFQjCNFmCoRAKHuz2BWNf-njm6KSkgAacA" data-wpel-link="internal">the latest robotics news</a> on Robohub, or <a title="" href="http://eepurl.com/t-UEf" target="_blank" rel="external follow noopener noreferrer" data-saferedirecturl="https://www.google.com/url?hl=en-GB&amp;q=http://eepurl.com/t-UEf&amp;source=gmail&amp;ust=1477500783522000&amp;usg=AFQjCNGjDpzB3aAol7pCzSfh7VU9iN6oQQ" data-wpel-link="external">sign up for our weekly newsletter</a>.</em></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Machine Learning with OpenAI Gym on ROS Development Studio</title>
		<link>https://robohub.org/machine-learning-with-openai-gym-on-ros-development-studio/</link>
		
		<dc:creator><![CDATA[Ricardo Téllez]]></dc:creator>
		<pubDate>Mon, 08 May 2017 08:15:37 +0000</pubDate>
				<category><![CDATA[education]]></category>
		<category><![CDATA[control]]></category>
		<category><![CDATA[machine learning]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[ROS]]></category>
		<guid isPermaLink="false">http://robohub.org/machine-learning-with-openai-gym-on-ros-development-studio/</guid>

					<description><![CDATA[<p>Imagine how easy it would be to learn skating, if only it doesn&#8217;t&#160;hurt everytime you fall. Unfortunately, we, humans, &#160;don&#8217;t have that option. Robots, however, can now &#8220;learn&#8221; their skills on a simulation platform without being afraid of crashing into a wall. Yes, &#8220;it learns&#8220;! This is possible with the reinforcement learning algorithms provided by</p>
<p>The post <a rel="nofollow external noopener noreferrer" href="http://www.theconstructsim.com/machine-learning-openai-gym-ros-development-studio/" data-wpel-link="external" target="_blank">Machine Learning with OpenAI Gym on ROS Development Studio</a> appeared first on <a rel="nofollow external noopener noreferrer" href="http://www.theconstructsim.com/" data-wpel-link="external" target="_blank">The Construct</a>.</p>]]></description>
										<content:encoded><![CDATA[<img decoding="async" class="aligncenter size-full wp-image-77885" src="http://robohub.org/wp-content/uploads/2017/05/comp.jpg" alt="" width="900" height="600" srcset="https://robohub.org/wp-content/uploads/2017/05/comp.jpg 900w, https://robohub.org/wp-content/uploads/2017/05/comp-425x283.jpg 425w, https://robohub.org/wp-content/uploads/2017/05/comp-768x512.jpg 768w" sizes="(max-width: 900px) 100vw, 900px" />
<p>Imagine how easy it would be to learn skating, if only it doesn’t hurt everytime you fall. Unfortunately, we, humans,  don’t have that option. Robots, however, can now “<strong>learn</strong>” their skills on a simulation platform without being afraid of crashing into a wall. Yes, “<strong>it learns</strong>“! This is possible with the reinforcement learning algorithms provided by <a href="https://gym.openai.com/" target="_blank" rel="noopener noreferrer follow external" data-wpel-link="external">OpenAI Gym</a> and the ROS Development Studio.<span id="more-77736"></span></p>
<p>You can now train your robot to navigate through an environment filled with obstacles just based on the sensor inputs, with the help of OpenAI Gym. In April 2016, OpenAI introduced “Gym”, a platform for developing and comparing reinforcement learning algorithms. Reinforcement learning is an area of machine learning that allows an intelligent agent (for example, robot) to learn the best behaviors in an environment by trial-and-error. The agent takes actions in an environment so as to maximize its rewards. We have deployed the <a href="https://github.com/erlerobot/gym-gazebo" target="_blank" rel="noopener noreferrer follow external" data-wpel-link="external">gym_gazebo</a> package from <a href="http://erlerobotics.com/" target="_blank" rel="noopener noreferrer follow external" data-wpel-link="external">Erle Robotics</a>. in the ROS Development Studio. It enables the users to test their reinforcement learning for their robots in Gazebo.</p>
<hr class="xh2  ">
<h2>How to Train your Robot</h2>
<div id="attachment_5866" class="wp-caption aligncenter">
<a href="http://www.theconstructsim.com/wp-content/uploads/2017/04/Maze1.png" rel="attachment wp-att-5866 follow external noopener noreferrer" data-wpel-link="external" target="_blank"><img decoding="async" class="size-medium wp-image-5866" src="http://www.theconstructsim.com/wp-content/uploads/2017/04/Maze1-300x127.png" sizes="(max-width: 600px) 100vw, 600px" srcset="http://www.theconstructsim.com/wp-content/uploads/2017/04/Maze1-300x127.png 300w, http://www.theconstructsim.com/wp-content/uploads/2017/04/Maze1-768x324.png 768w, http://www.theconstructsim.com/wp-content/uploads/2017/04/Maze1-280x118.png 280w, http://www.theconstructsim.com/wp-content/uploads/2017/04/Maze1.png 922w" alt="Robot training to navigate through an environment with obstacles" width="600" height="254" /></a>
<p class="wp-caption-text">Robot training to navigate through an environment with obstacles</p>
</div>
<p>In this example we will be seeing how a turtlebot is able to learn navigating through an environment without hitting an obstacle. The turtlebot will use a reinforcement learning method known as Q-learning.</p>
<p>There are four environments already available for the user to test their simulations with. These environments can be launched using the respective launch files:</p>
<ul>
<li>GazeboCircuitTurtlebotLidar_v0.launch</li>
<li>GazeboCircuit2TurtlebotLidar_v0.launch</li>
<li>GazeboRoundTurtlebotLidar_v0.launch</li>
<li>GazeboMazeTurtlebotLidar_v0.launch</li>
</ul>
<p>The images of the different environments are given below:</p>
<table>
<caption>The various environments already available:</caption>
<colgroup>
<col width="20%" />
<col width="20%" /></colgroup>
<tbody>
<tr class="odd">
<td align="center">Circuit<br />
<img decoding="async" src="http://www.theconstructsim.com/wp-content/uploads/2017/04/circuit.png" alt="" /></td>
<td align="center">Circuit2<br />
<img decoding="async" src="http://www.theconstructsim.com/wp-content/uploads/2017/04/circuit2.png" alt="" /></td>
</tr>
<tr class="even">
<td align="center">Round<br />
<img decoding="async" src="http://www.theconstructsim.com/wp-content/uploads/2017/04/round.png" alt="" /></td>
<td align="center">Maze<br />
<img decoding="async" src="http://www.theconstructsim.com/wp-content/uploads/2017/04/maze.png" alt="" /></td>
</tr>
</tbody>
</table>
<p>The user is requested to try out the existing environment before developing their own environments for training the robot. An environment is where the robot’s possible actions and rewards are defined. For example, in the available environments, there are three possible actions for the Turtlebot robot:</p>
<p>– Forward ( with a reward of 5 points)<br />
– Left ( with a reward of 1 point)<br />
– Right ( with a reward of 1 point)</p>
<p>If it collides into the walls, then the training episode ends (with a penalty of 200 points). The turtlebot has to learn to navigate through the environment, based on the rewards obtained from different episodes. This can be achieved using the Q-learning algorithm. Let us see, how it can be done using the ROS Development Studio.</p>
<hr class="xh2  ">
<h2>Using the ROS Development Studio for training the robot</h2>
<p>First, we have to set the path in the jupyter-notebook as given below:</p>
<h4><code>import sys<br />
sys.path.append("/usr/local/lib/python2.7/dist-packages/")<br />
sys.path.append("/home/ubuntu/gym-gazebo")<br />
sys.path.append("/home/user/catkin_ws/src/gym_construct/src")<br />
%matplotlib inline<br />
</code></h4>
<p>The python scripts in the folder <code>gym_construct/src/</code> help us simulate the reinforcement learning techniques for a Turtlebot. Currently, the number of episodes has been set to 20.<br />
Feel free to increase the number of episodes in the python scripts (usually up to 5000) to actually train the robot to navigate the environment completely.Run the  only the script corresponding to the environment:</p>
<p>Run the python corresponding to the environment:</p>
<h4><code>## Circuit-2 Environment --&gt; Q-learning<br />
%run /home/user/catkin_ws/src/gym_construct/src/circuit2_turtlebot_lidar_qlearn.py<br />
</code></h4>
<p>The robot undergoes several training episodes and each of these episodes are rewarded based on the number of steps taken by the robot before hitting the environment. We will be able to see that the robot incrementally increases its rewards over time compared to its previous versions. With a very large number of episodes, the robot will learn to navigate the environment without hitting the obstacle.</p>
<hr class="xh2  ">
<h2>Plotting the learning curve of the robot</h2>
<p>The machine learning algorithm generates the output files in the output directory specified in the python script file. In order to plot the curve, we run the <code>display_plot.py</code>. But before that, don’t forget to restart the kernel and set the path once again.</p>
<img decoding="async" class="aligncenter size-medium wp-image-5904" src="http://www.theconstructsim.com/wp-content/uploads/2017/05/download2-300x207.png" alt="download2" width="450" height="307" />
<p>As the number of episodes increases, we will see that the robot’s mean rewards also increases. The user can choose his own robot, environments, action and rewards for testing his reinforcement learning algorithms in OpenAI Gym and RDS. Watch the video below for more on this.</p>
<hr class="xh2  ">
<h2>Video describing the procedure to run OpenAI Gym on RDS</h2>
<div class="keep-aspect"><iframe title="[ROS tutorial] OpenAI Gym For ROS based Robots 101. Gazebo Simulator" width="500" height="281" src="https://www.youtube-nocookie.com/embed/o9FpZ1QQqcc?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe></div>
<p></p>
<p>I hope you were able to follow the tutorial.  So, that’s all folks. It’s now up to you to develop and test reinforcement learning algorithms in OpenAI Gym and RDS.</p>
<p>Have fun training your robot!</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>ROS robotics projects</title>
		<link>https://robohub.org/ros-robotics-projects/</link>
		
		<dc:creator><![CDATA[Lentin Joseph]]></dc:creator>
		<pubDate>Tue, 04 Apr 2017 08:00:58 +0000</pubDate>
				<category><![CDATA[education]]></category>
		<category><![CDATA[announcements]]></category>
		<category><![CDATA[books]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[ROS]]></category>
		<guid isPermaLink="false">http://robohub.org/ros-robotics-projects/</guid>

					<description><![CDATA[A new book by Lentin Joseph, ROS Robotics Programming, outlines more than 14 robotics projects using ROS that can be engaged with without requiring a lot of hardware. The book starts with an introduction to ROS and its installation procedure. After discussing the basics, you’ll be taken through great projects such as building a self-driving car, an [&#8230;]]]></description>
										<content:encoded><![CDATA[<img decoding="async" class="aligncenter size-full wp-image-75227" src="http://robohub.org/wp-content/uploads/2017/04/B03525_PrintCover-04_3.png" alt="" width="900" height="525" srcset="https://robohub.org/wp-content/uploads/2017/04/B03525_PrintCover-04_3.png 900w, https://robohub.org/wp-content/uploads/2017/04/B03525_PrintCover-04_3-425x248.png 425w, https://robohub.org/wp-content/uploads/2017/04/B03525_PrintCover-04_3-768x448.png 768w" sizes="(max-width: 900px) 100vw, 900px" />
<p>A new book by Lentin Joseph, <a href="https://www.amazon.com/ROS-Robotic-Projects-Lentin-Joseph/dp/1783554711" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">ROS Robotics Programming</a>, outlines more than 14 robotics projects using ROS that can be engaged with without requiring a lot of hardware. The book starts with an introduction to ROS and its installation procedure. After discussing the basics, you’ll be taken through great projects such as building a self-driving car, an autonomous mobile robot, and image recognition using deep learning and ROS. You can find ROS robotic applications for beginner, intermediate, and expert levels inside.<span id="more-75226"></span></p>
<p>This book is unique in that it focuses on ROS via the lens of robotics projects only. Lentin is the CEO/Founder of Qbotics Labs and the author of Learning Robotics using Python and Mastering ROS for Robotics Programming.</p>
<div class="keep-aspect"><iframe title="#ROSBooks | ROS tutorials | ROS Projects | ROS Robotics Project New book ROS Robotics Projects" width="500" height="281" src="https://www.youtube-nocookie.com/embed/hi-U_XgA2qU?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe></div>
<p></p>
<hr class="xh2  ">
<p>Below is an overview of the chapters in the book:</p>
<p><em><strong>Chapter 1</strong></em>, Getting Started with ROS Robotics Application Development, is for absolute beginners to ROS. No need to worry if you don’t have experience in ROS; this chapter will help you give you an idea of the ROS software framework and its concepts.</p>
<p><em><strong>Chapter 2</strong></em>, Face Detection and Tracking Using ROS, OpenCV and Dynamixel Servos, takes you through a cool project that you can do with ROS and the OpenCV library. This project basically creates a face tracker application in which your face will be tracked in such a way that the camera will always train on your face. We will use intelligent servos such as Dynamixel to rotate the robot on its axis.</p>
<p><strong><em>Chapter 3</em></strong>, Building a Siri-Like Chatbot in ROS, is for those of you who want to make your robot interactive and intelligent without much hassle. This project creates a chatterbot in ROS that you can communicate with using text or speech. This project will be useful if you&#8217;re going to create social or service robots.</p>
<p><em><strong>Chapter 4</strong></em>, Controlling Embedded Boards Using ROS, helps you build a robot using Arduino, an embedded compatible board, Raspberry Pi, or Odroid and an interface to ROS. In this chapter, you will see a wide variety of embedded boards and the interfacing projects made with them.</p>
<p><em><strong>Chapter 5</strong></em>, Teleoperate a Robot Using Hand Gestures, will teach you how to build a gesture control device using Arduino and IMU. The gestures are translated into motion commands by ROS nodes.</p>
<p><em><strong>Chapter 6</strong></em>, Object Detection and Recognition, has an interesting project for detecting objects. You will learn both 2D and 3D object recognition using powerful ROS packages.</p>
<p><em><strong>Chapter 7</strong></em>, Deep Learning Using ROS and TensorFlow, is a project made using a trending technology in robotics. Using the TensorFlow library and ROS, we can implement interesting deep-learning applications. You can implement image recognition using deep learning, and an application using SVM can be found in this chapter.</p>
<p><strong><em>Chapter 8</em></strong>, ROS on MATLAB and Android, is intended for building robot applications using ROS, Matlab, and Android.</p>
<p><em><strong>Chapter 9</strong></em>, Building an Autonomous Mobile Robot, is about creating an autonomous mobile robot with the help of ROS. You can see how to use packages such as navigation, gmapping, and AMCL to make a mobile robot autonomous.</p>
<p><em><strong>Chapter 10</strong></em>, Creating a Self-driving Car Using ROS, is one of the more interesting projects in this book. In this chapter, we will build a simulation of the self-driving car using ROS and Gazebo.</p>
<p><em><strong>Chapter 11</strong></em>, Teleoperating Robot Using VR Headset and Leap Motion, shows you how to control a robot&#8217;s actions using a VR headset and Leap Motion sensor. You can play around with virtual reality (a trending technology these days).</p>
<p><em><strong>Chapter 12</strong></em>, Controlling Your Robots over the Web, we will see how to build interactive web applications using rosbridge in ROS.</p>
<p>The book uses ROS Kinetic and Indigo installed on latest Ubuntu L.T.S 16.04.01. The codes are also compatible with <a href="https://github.com/qboticslabs/ros_robotics_projects" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">ROS Jade</a>.</p>
<p>A basic knowledge in R.O.S, GNU/Linux, and C++ programming concepts is recommended.</p>
<p>The book is published by PACKT and can be purchased at <a href="https://www.amazon.com/ROS-Robotic-Projects-Lentin-Joseph/dp/1783554711" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Amazon Global</a> and <a href="https://www.packtpub.com/hardware-and-creative/ros-robotics-projects" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">PACKT Publishing</a>.</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Classroom robotics: Training teachers to code</title>
		<link>https://robohub.org/classroom-robotics-training-teachers-to-code/</link>
		
		<dc:creator><![CDATA[Amanda Jaakkola]]></dc:creator>
		<pubDate>Wed, 22 Mar 2017 14:00:11 +0000</pubDate>
				<category><![CDATA[articles]]></category>
		<category><![CDATA[education]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[Robohub focus on Robotics Education]]></category>
		<category><![CDATA[robots]]></category>
		<guid isPermaLink="false">http://robohub.org/classroom-robotics-training-teachers-to-code/</guid>

					<description><![CDATA[*All images credit: ROBBO 30 teachers arrived, excited to learn. They rolled up their sleeves and placed laptops and Robot kits on the floor. The room filled with excitement (and laughter!) as everyone tried to come up with different solutions on how to create different programs. The results were hilarious; a robot inspired by Darth [&#8230;]]]></description>
										<content:encoded><![CDATA[<a href="http://robohub.org/wp-content/uploads/2017/03/Helsinki_Robbo_high5.jpg" data-wpel-link="internal"><img decoding="async" class="aligncenter size-full wp-image-73817" src="http://robohub.org/wp-content/uploads/2017/03/Helsinki_Robbo_high5.jpg" alt="" width="1000" height="667" srcset="https://robohub.org/wp-content/uploads/2017/03/Helsinki_Robbo_high5.jpg 1000w, https://robohub.org/wp-content/uploads/2017/03/Helsinki_Robbo_high5-425x283.jpg 425w, https://robohub.org/wp-content/uploads/2017/03/Helsinki_Robbo_high5-768x512.jpg 768w, https://robohub.org/wp-content/uploads/2017/03/Helsinki_Robbo_high5-450x300.jpg 450w" sizes="(max-width: 1000px) 100vw, 1000px" /></a>
<p><strong>*All images credit: ROBBO</strong></p>
<p>30 teachers arrived, excited to learn. They rolled up their sleeves and placed laptops and Robot kits on the floor. The room filled with excitement (and laughter!) as everyone tried to come up with different solutions on how to create different programs. The results were hilarious; a robot inspired by Darth Vader, a robot that asked everyone to turn the lights off when it was too bright in the room, and a robot that tricked the teacher to leave the classroom during an exam.</p>
<div class="sprfocus4"><a class="sprfocusl" href="/tag/robohub-focus-on-robotics-education/" data-wpel-link="internal"> </a></div>
<p>Not bad for a day of &#8220;work!&#8221;</p>
<p>Training, like above, is what we&#8217;re all about at ROBBO. <a href="http://robbo.world/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">ROBBO</a> is a fun and simple way for absolutely anyone to get introduced to the world of robotics and coding. As a part of one of our many projects, we organized a training weekend for the single purpose of introducing teachers to programming and robotics. The teachers started with simple exercises in RobboScratch, a visual programming environment; moving the character, creating series of multiple commands, and learning the advantages of the infinite loop when making programs.</p>
<p>So, what do we mean about classroom robotics? Our educational robotics consist of two different robots; the Robot kit and the Lab. Both robots are ideal for learning programming, robotics as well as skills in problem-solving, mathematics and physics while working in interactive teams. The Lab includes a microphone, LED-lights, light sensor and a slider and is great for experimenting with different elements such as sound or light and numeric values. Our other robot is the Robot kit, equipped with a motor, which is a fun way to explore everyday technology using a touch sensor, proximity sensor, light sensor, line sensors and an LED-light. Our robots are programmed in the visual programming environment RobboScratch, an adapted version of Scratch developed at MIT.</p>
<a href="http://robohub.org/wp-content/uploads/2017/03/Helsinki_Robbo_working2.jpg" data-wpel-link="internal"><img decoding="async" class="aligncenter size-full wp-image-73869" src="http://robohub.org/wp-content/uploads/2017/03/Helsinki_Robbo_working2.jpg" alt="" width="1000" height="667" srcset="https://robohub.org/wp-content/uploads/2017/03/Helsinki_Robbo_working2.jpg 1000w, https://robohub.org/wp-content/uploads/2017/03/Helsinki_Robbo_working2-425x283.jpg 425w, https://robohub.org/wp-content/uploads/2017/03/Helsinki_Robbo_working2-768x512.jpg 768w, https://robohub.org/wp-content/uploads/2017/03/Helsinki_Robbo_working2-450x300.jpg 450w" sizes="(max-width: 1000px) 100vw, 1000px" /></a>
<p>In our earlier example, teachers were divided into separate workshops, working in pairs, or teams of three. We believe it is important to communicate and discuss with others to better understand different programs and come up with alternative solutions if the program doesn’t work in the desired way. The workshops are all based on the exercises from our pedagogical guide, and teachers were given a copy of the guide for their own use. Our guide provides instructions and multiple exercise card (with solutions!) and is free to download here (<a href="http://robbo.world/support/)" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">http://robbo.world/support/</a>).</p>
<p>Our teaching guide is for anyone who wants to learn the basics of programming with the help of ROBBO<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2122.png" alt="™" class="wp-smiley" style="height: 1em; max-height: 1em;" /> robotics and RobboScratch. Our pedagogical guide is a comprehensive educational tool with instructions, exercise cards and ideas for creating the ultimate learning experience. It has been developed together with Innokas Network at the University of Helsinki and Finnish teachers and students. The majority of the teachers that participated in the training had only limited knowledge of Scratch or Scratch Junior and, therefore, we started from the beginning.</p>
<a href="http://robohub.org/wp-content/uploads/2017/03/Helsinki_Robbo_working.jpg" data-wpel-link="internal"><img decoding="async" class="aligncenter size-full wp-image-73870" src="http://robohub.org/wp-content/uploads/2017/03/Helsinki_Robbo_working.jpg" alt="" width="1000" height="667" srcset="https://robohub.org/wp-content/uploads/2017/03/Helsinki_Robbo_working.jpg 1000w, https://robohub.org/wp-content/uploads/2017/03/Helsinki_Robbo_working-425x283.jpg 425w, https://robohub.org/wp-content/uploads/2017/03/Helsinki_Robbo_working-768x512.jpg 768w, https://robohub.org/wp-content/uploads/2017/03/Helsinki_Robbo_working-450x300.jpg 450w" sizes="(max-width: 1000px) 100vw, 1000px" /></a>
<p>The pedagogical guide includes an introduction to RobboScratch, Lab and Robot kit as well as up to 28 exercise cards to help you along the way. The exercises are designed to develop necessary programming skills step by step, teaching children to think logically as a software developer would do, which may also be useful in many everyday situations. These are, in particular, the ability to understand the whole, to split a problem into smaller parts, and to develop a simple program to perform an operation. In the initial exercises, students will make a program using a predefined model, but as the practice progresses, they will have more and more space for their own ideas.</p>
<a href="http://robohub.org/wp-content/uploads/2017/03/Helsinki_Robbo_ground_robot.jpg" data-wpel-link="internal"><img decoding="async" class="aligncenter size-full wp-image-73871" src="http://robohub.org/wp-content/uploads/2017/03/Helsinki_Robbo_ground_robot.jpg" alt="" width="900" height="1350" srcset="https://robohub.org/wp-content/uploads/2017/03/Helsinki_Robbo_ground_robot.jpg 900w, https://robohub.org/wp-content/uploads/2017/03/Helsinki_Robbo_ground_robot-283x425.jpg 283w, https://robohub.org/wp-content/uploads/2017/03/Helsinki_Robbo_ground_robot-768x1152.jpg 768w, https://robohub.org/wp-content/uploads/2017/03/Helsinki_Robbo_ground_robot-683x1024.jpg 683w, https://robohub.org/wp-content/uploads/2017/03/Helsinki_Robbo_ground_robot-200x300.jpg 200w" sizes="(max-width: 900px) 100vw, 900px" /></a>
<p>By developing new skills, users are encouraged to plan and develop innovations in robotics. The training goal is to learn understand and use technology to invent something new. As the final assignment of the teachers’ training, we asked teachers to form teams of four and come up with a small prank using the different capabilities and sensors of either Robot kit or Lab or simultaneous use of both robots.</p>
<p>If you&#8217;d like to to learn more about ROBBO or download our free guide, visit our website: <a href="http://robbo.world/support/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">http://robbo.world/support/</a></p>
<hr class="xh2  ">
<p><strong>Comments from teachers:</strong></p>
<p>“The teaching guide is a great support when learning coding. And I can just hand out these ready-made exercise cards to my students as well!”</p>
<p>“The exercise in the guide are good for understanding the different possibilities you have with the robots, because when you start doing an exercise you come up with more ideas on how to develop a more complicated program.”</p>
<p>“The robots emphasized practicality in the learning process. In addition to programming, ROBBO teaches environmental studies and all-around useful skills, in particular when the exercises of the pedagogical guide are being utilized.”</p>
<hr class="xh2  ">
<p><em>If you&#8217;d like to learn more about classroom robotics, check out these articles:</em></p>
<ul>
<li><a href="http://robohub.org/how-to-get-started-and-progress-in-robotics-a-quick-guide-for-kids-and-adults/" target="_blank" data-wpel-link="internal">How to get started (and progress) in robotics: A quick guide for teens and adults</a></li>
<li><a href="http://robohub.org/teaching-the-teachers-study-focuses-on-how-teachers-perceive-educational-robots-in-classrooms/" target="_blank" data-wpel-link="internal">Teaching the teachers: Study focuses on how teachers perceive educational robots in classrooms</a></li>
<li><a href="http://robohub.org/jade-robot-hands-on-stem-for-kids-and-classrooms/" target="_blank" data-wpel-link="internal">Jade Robot: Hands on STEM for kids and classrooms</a></li>
<li><a href="http://robohub.org/classroom-robotics-motivating-independent-learning-and-discovery/" target="_blank" data-wpel-link="internal">Classroom robotics: Motivating independent learning and discovery</a></li>
<li><a href="http://robohub.org/classroom-robots-a-great-way-to-get-young-people-started/" target="_blank" data-wpel-link="internal">Classroom robots: A great way to get young people started</a></li>
</ul>
<p><em>See all <a href="http://robohub.org/" target="_blank" data-saferedirecturl="https://www.google.com/url?hl=en-GB&amp;q=http://robohub.org/&amp;source=gmail&amp;ust=1489662621661000&amp;usg=AFQjCNGECLz81Fl__K55cioyxYXXFxPtVg" data-wpel-link="internal">the latest robotics news</a> on Robohub, or <a title="" href="http://eepurl.com/t-UEf" target="_blank" rel="external follow noopener noreferrer" data-saferedirecturl="https://www.google.com/url?hl=en-GB&amp;q=http://eepurl.com/t-UEf&amp;source=gmail&amp;ust=1489662621661000&amp;usg=AFQjCNGAMxeQb74Ng6vYQ3oIA-zZBZLkfQ" data-wpel-link="external">sign up for our weekly newsletter</a>.</em></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Developing ROS programs for the Sphero robot</title>
		<link>https://robohub.org/developing-ros-programs-for-the-sphero-robot/</link>
		
		<dc:creator><![CDATA[Ricardo Téllez]]></dc:creator>
		<pubDate>Mon, 13 Mar 2017 15:30:40 +0000</pubDate>
				<category><![CDATA[education]]></category>
		<category><![CDATA[tutorials]]></category>
		<category><![CDATA[control]]></category>
		<category><![CDATA[household]]></category>
		<category><![CDATA[how-to]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[ROS]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[Sphero]]></category>
		<guid isPermaLink="false">http://robohub.org/developing-ros-programs-for-the-sphero-robot/</guid>

					<description><![CDATA[You probably know the Sphero robot. It is a small robot with the shape of a ball. In case that you have one, you must know that it is possible to control it using ROS, by installing in your computer the Sphero ROS packages developed by Melonee Wise and connecting to the robot&#160;using the bluetooth]]></description>
										<content:encoded><![CDATA[<img decoding="async" class="aligncenter size-full wp-image-73660" src="http://robohub.org/wp-content/uploads/2017/03/sphero-robotic-ball-5-1024x736.jpg" alt="" width="1024" height="736" srcset="https://robohub.org/wp-content/uploads/2017/03/sphero-robotic-ball-5-1024x736.jpg 1024w, https://robohub.org/wp-content/uploads/2017/03/sphero-robotic-ball-5-1024x736-425x305.jpg 425w, https://robohub.org/wp-content/uploads/2017/03/sphero-robotic-ball-5-1024x736-768x552.jpg 768w, https://robohub.org/wp-content/uploads/2017/03/sphero-robotic-ball-5-1024x736-417x300.jpg 417w" sizes="(max-width: 1024px) 100vw, 1024px" />
<p>You probably know the Sphero robot. It is a small robot with the shape of a ball. In case that you have one, you must know that it is possible to control it using ROS, by installing in your computer the Sphero ROS packages developed by Melonee Wise and connecting to the robot using the bluetooth of the computer.<span id="more-73602"></span></p>
<p>Now, you can use the ROS Development Studio to create ROS control programs for that robot, testing as you go by using the integrated simulation.</p>
<p>The ROS Development Studio (RDS) provides off-the-shelf a simulation of Sphero with a maze environment. The simulation provides the same interface as the ROS module created by Melonee, so you can test your develop and test the programs on the environment, and once working properly, transfer it to the real robot.</p>
<p>We created the simulation to teach ROS to the students of the Robot Ignite Academy. They have to learn ROS enough to make the Sphero get out of the maze by using odometry and IMU.</p>
<p><img decoding="async" class="aligncenter size-full wp-image-73661" src="http://robohub.org/wp-content/uploads/2017/03/Screenshot-from-2017-03-09-192857-1024x529.png" alt="" width="1024" height="529" srcset="https://robohub.org/wp-content/uploads/2017/03/Screenshot-from-2017-03-09-192857-1024x529.png 1024w, https://robohub.org/wp-content/uploads/2017/03/Screenshot-from-2017-03-09-192857-1024x529-425x220.png 425w, https://robohub.org/wp-content/uploads/2017/03/Screenshot-from-2017-03-09-192857-1024x529-768x397.png 768w, https://robohub.org/wp-content/uploads/2017/03/Screenshot-from-2017-03-09-192857-1024x529-500x258.png 500w" sizes="(max-width: 1024px) 100vw, 1024px" /><hr class="xh2  "></p>
<p><strong>Using the simulation</strong></p>
<p>To use the Sphero simulation on RDS go to rds.theconstructsim.com and sign in. If you select the Public simulations, you will quickly identify the Sphero simulation.</p>
<p><img decoding="async" class="aligncenter size-full wp-image-73662" src="http://robohub.org/wp-content/uploads/2017/03/Screenshot-from-2017-03-09-192251.png" alt="" width="717" height="554" srcset="https://robohub.org/wp-content/uploads/2017/03/Screenshot-from-2017-03-09-192251.png 717w, https://robohub.org/wp-content/uploads/2017/03/Screenshot-from-2017-03-09-192251-425x328.png 425w, https://robohub.org/wp-content/uploads/2017/03/Screenshot-from-2017-03-09-192251-388x300.png 388w" sizes="(max-width: 717px) 100vw, 717px" />Press the red Play button. A new screen will appear giving you details about the simulation and asking you which launch file you want to launch. The main.launch selected by default is the correct one, so just press Run.</p>
<p><img decoding="async" class="aligncenter size-full wp-image-73663" src="http://robohub.org/wp-content/uploads/2017/03/Screenshot-from-2017-03-09-192318.png" alt="" width="815" height="704" srcset="https://robohub.org/wp-content/uploads/2017/03/Screenshot-from-2017-03-09-192318.png 815w, https://robohub.org/wp-content/uploads/2017/03/Screenshot-from-2017-03-09-192318-425x367.png 425w, https://robohub.org/wp-content/uploads/2017/03/Screenshot-from-2017-03-09-192318-768x663.png 768w, https://robohub.org/wp-content/uploads/2017/03/Screenshot-from-2017-03-09-192318-347x300.png 347w" sizes="(max-width: 815px) 100vw, 815px" />After a few seconds the simulation will appear together with the development environment for creating the programs for Sphero and testing them.</p>
<p><img decoding="async" class="aligncenter size-full wp-image-73664" src="http://robohub.org/wp-content/uploads/2017/03/Screenshot-from-2017-03-09-193415-1024x528.png" alt="" width="1024" height="528" srcset="https://robohub.org/wp-content/uploads/2017/03/Screenshot-from-2017-03-09-193415-1024x528.png 1024w, https://robohub.org/wp-content/uploads/2017/03/Screenshot-from-2017-03-09-193415-1024x528-425x219.png 425w, https://robohub.org/wp-content/uploads/2017/03/Screenshot-from-2017-03-09-193415-1024x528-768x396.png 768w, https://robohub.org/wp-content/uploads/2017/03/Screenshot-from-2017-03-09-193415-1024x528-500x258.png 500w" sizes="(max-width: 1024px) 100vw, 1024px" />On the left hand side you have a notebook containing information about the robot and how to program it with ROS. This notebook contains just some examples, but it can be completed and/or modified at your will. As you can see it is an iPython notebook and follows its standard. So it is up to you to modify it, add new information or else. Remember that any change you do to the notebook will be saved in a simulation in your private area of RDS, so you can come back later and launch it with your modifications.</p>
<img decoding="async" class="aligncenter size-full wp-image-73665" src="http://robohub.org/wp-content/uploads/2017/03/Screenshot-from-2017-03-09-193920-1024x705.png" alt="" width="1024" height="705" srcset="https://robohub.org/wp-content/uploads/2017/03/Screenshot-from-2017-03-09-193920-1024x705.png 1024w, https://robohub.org/wp-content/uploads/2017/03/Screenshot-from-2017-03-09-193920-1024x705-425x293.png 425w, https://robohub.org/wp-content/uploads/2017/03/Screenshot-from-2017-03-09-193920-1024x705-768x529.png 768w, https://robohub.org/wp-content/uploads/2017/03/Screenshot-from-2017-03-09-193920-1024x705-436x300.png 436w" sizes="(max-width: 1024px) 100vw, 1024px" />
<p>You must know that the code included in the notebook is directly executable by selecting the cell of the code (do a single click on it) and pressing the small play button at the top of the notebook. This means that, once you press that button, the code will be executed and start controlling the Sphero simulated robot for a few time-steps (remember to have the simulation activated (Play button of the simulation activated) to see the robot move).</p>
<p>On the center area, you can see the IDE. It is the development environment for developing the code. You can browse there all the packages related to the simulation or any other packages that you may create.</p>
<p><img decoding="async" class="aligncenter size-full wp-image-73666" src="http://robohub.org/wp-content/uploads/2017/03/Screenshot-from-2017-03-09-194132.png" alt="" width="959" height="912" srcset="https://robohub.org/wp-content/uploads/2017/03/Screenshot-from-2017-03-09-194132.png 959w, https://robohub.org/wp-content/uploads/2017/03/Screenshot-from-2017-03-09-194132-425x404.png 425w, https://robohub.org/wp-content/uploads/2017/03/Screenshot-from-2017-03-09-194132-768x730.png 768w, https://robohub.org/wp-content/uploads/2017/03/Screenshot-from-2017-03-09-194132-315x300.png 315w" sizes="(max-width: 959px) 100vw, 959px" />On the right hand side, you can see the simulation and beneath it, the shell. The simulation shows the Sphero robot as well as the environment of the maze. On the shell, you can issue commands in the computer that contains the simulation of the robot. For instance, you can use the shell to launch the keyboard controller and move the Sphero around. Try typing the following:</p>
<ul>
<li><em>$ roslaunch sphero_gazebo keyboard_teleop.launch</em></li>
</ul>
<p>Now you must be able to move the robot around the maze by pressing some keys of the keyboard (instructions provided on the screen).</p>
<img decoding="async" class="aligncenter size-full wp-image-73667" src="http://robohub.org/wp-content/uploads/2017/03/Screenshot-from-2017-03-09-194551.png" alt="" width="500" height="987" srcset="https://robohub.org/wp-content/uploads/2017/03/Screenshot-from-2017-03-09-194551.png 500w, https://robohub.org/wp-content/uploads/2017/03/Screenshot-from-2017-03-09-194551-215x425.png 215w, https://robohub.org/wp-content/uploads/2017/03/Screenshot-from-2017-03-09-194551-152x300.png 152w" sizes="(max-width: 500px) 100vw, 500px" />
<p>You can also launch there Rviz, and then watch the robot, the frames and any other additional information you may want of the robot. Type the following:</p>
<ul>
<li><em>$ rosrun rviz rviz</em></li>
</ul>
<p>Then press the Screen red icon located at the bottom-left of the screen (named the graphical tools). A new tab should appear, showing how the Rviz is loading. After a while, you can configure the Rviz to show the information you desire.</p>
<p><img decoding="async" class="aligncenter size-full wp-image-73668" src="http://robohub.org/wp-content/uploads/2017/03/Screenshot-from-2017-03-09-195210-1024x768.png" alt="" width="1024" height="768" srcset="https://robohub.org/wp-content/uploads/2017/03/Screenshot-from-2017-03-09-195210-1024x768.png 1024w, https://robohub.org/wp-content/uploads/2017/03/Screenshot-from-2017-03-09-195210-1024x768-425x319.png 425w, https://robohub.org/wp-content/uploads/2017/03/Screenshot-from-2017-03-09-195210-1024x768-768x576.png 768w, https://robohub.org/wp-content/uploads/2017/03/Screenshot-from-2017-03-09-195210-1024x768-400x300.png 400w" sizes="(max-width: 1024px) 100vw, 1024px" />There are many ways you can configure the screen to provide more focus to what interests you the most.</p>
<p><img decoding="async" class="aligncenter size-full wp-image-73669" src="http://robohub.org/wp-content/uploads/2017/03/Screenshot-from-2017-03-09-200711-1024x527.png" alt="" width="1024" height="527" srcset="https://robohub.org/wp-content/uploads/2017/03/Screenshot-from-2017-03-09-200711-1024x527.png 1024w, https://robohub.org/wp-content/uploads/2017/03/Screenshot-from-2017-03-09-200711-1024x527-425x219.png 425w, https://robohub.org/wp-content/uploads/2017/03/Screenshot-from-2017-03-09-200711-1024x527-768x395.png 768w, https://robohub.org/wp-content/uploads/2017/03/Screenshot-from-2017-03-09-200711-1024x527-500x257.png 500w" sizes="(max-width: 1024px) 100vw, 1024px" /><img decoding="async" class="aligncenter size-full wp-image-73670" src="http://robohub.org/wp-content/uploads/2017/03/Screenshot-from-2017-03-09-200744-1024x531.png" alt="" width="1024" height="531" srcset="https://robohub.org/wp-content/uploads/2017/03/Screenshot-from-2017-03-09-200744-1024x531.png 1024w, https://robohub.org/wp-content/uploads/2017/03/Screenshot-from-2017-03-09-200744-1024x531-425x220.png 425w, https://robohub.org/wp-content/uploads/2017/03/Screenshot-from-2017-03-09-200744-1024x531-768x398.png 768w, https://robohub.org/wp-content/uploads/2017/03/Screenshot-from-2017-03-09-200744-1024x531-500x259.png 500w" sizes="(max-width: 1024px) 100vw, 1024px" />To end this post, I would like to indicate that you can download the simulation to your computer at any time, by doing right-click on the directories and selecting Download. You can also clone the The Construct simulations repository to download it (among other simulations available).</p>
<hr class="xh2  ">
<p><em>If you liked this tutorial, you may also enjoy these:</em></p>
<ul>
<li><a href="http://robohub.org/ugcs-photogrammetry-technique-for-uav-land-surveying-missions/" target="_blank" data-wpel-link="internal">UgCS photogrammetry technique for UAV land surveying missions</a></li>
<li><a href="http://robohub.org/programming-for-robotics-introduction-to-ros/" target="_blank" data-wpel-link="internal">Programming for robotics: Introduction to ROS</a></li>
<li><a href="http://robohub.org/python-programming-your-nao-robot/" target="_blank" data-wpel-link="internal">Python programming your NAO robot</a></li>
<li><a href="http://robohub.org/robotics-maths-python-a-fledgling-computer-scientists-guide-to-inverse-kinematics/" target="_blank" data-wpel-link="internal">Robotics, maths, python: A fledgling computer scientist’s guide to inverse kinematics</a></li>
<li><a href="http://robohub.org/3-d-printing-hydraulically-powered-robots-no-assembly-required/" target="_blank" data-wpel-link="internal">3-D printing hydraulically-powered robots, no assembly required</a></li>
</ul>
<p><em>See all <a href="http://robohub.org/" target="_blank" data-saferedirecturl="https://www.google.com/url?hl=en-GB&amp;q=http://robohub.org/&amp;source=gmail&amp;ust=1477500783522000&amp;usg=AFQjCNFmCoRAKHuz2BWNf-njm6KSkgAacA" data-wpel-link="internal">the latest robotics news</a> on Robohub, or <a title="" href="http://eepurl.com/t-UEf" target="_blank" rel="external follow noopener noreferrer" data-saferedirecturl="https://www.google.com/url?hl=en-GB&amp;q=http://eepurl.com/t-UEf&amp;source=gmail&amp;ust=1477500783522000&amp;usg=AFQjCNGjDpzB3aAol7pCzSfh7VU9iN6oQQ" data-wpel-link="external">sign up for our weekly newsletter</a>.</em></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Programming for robotics: Introduction to ROS</title>
		<link>https://robohub.org/programming-for-robotics-introduction-to-ros/</link>
		
		<dc:creator><![CDATA[Péter Fankhauser]]></dc:creator>
		<pubDate>Tue, 07 Mar 2017 15:15:39 +0000</pubDate>
				<category><![CDATA[education]]></category>
		<category><![CDATA[tutorials]]></category>
		<category><![CDATA[control]]></category>
		<category><![CDATA[household]]></category>
		<category><![CDATA[how-to]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[ROS]]></category>
		<category><![CDATA[software]]></category>
		<category><![CDATA[video]]></category>
		<guid isPermaLink="false">http://robohub.org/programming-for-robotics-introduction-to-ros/</guid>

					<description><![CDATA[This handy video-tutorial course gives an introduction to the Robot Operating System (ROS), including many of the available tools that are commonly used in robotics. With the help of different examples, the tutorials offer a great starting point to learn programming robots. You will learn how to create software including simulation, to interface sensors and actuators, [&#8230;]]]></description>
										<content:encoded><![CDATA[<img decoding="async" class="aligncenter size-full wp-image-73310" src="http://robohub.org/wp-content/uploads/2017/03/bigstock-156822308.jpg" alt="" width="900" height="600" srcset="https://robohub.org/wp-content/uploads/2017/03/bigstock-156822308.jpg 900w, https://robohub.org/wp-content/uploads/2017/03/bigstock-156822308-425x283.jpg 425w, https://robohub.org/wp-content/uploads/2017/03/bigstock-156822308-768x512.jpg 768w, https://robohub.org/wp-content/uploads/2017/03/bigstock-156822308-450x300.jpg 450w" sizes="(max-width: 900px) 100vw, 900px" />
<p>This handy video-tutorial course gives an introduction to the Robot Operating System (ROS), including many of the available tools that are commonly used in robotics. With the help of different examples, the tutorials offer a great starting point to learn programming robots. You will learn how to create software including simulation, to interface sensors and actuators, and to integrate control algorithms.<span id="more-73240"></span></p>
<p>The course consists of a guided tutorial and exercises with increasing level of difficulty working with an autonomous robot. We provide recordings of the lectures and give an introduction to the exercises. From the course website, you can download all the material including exercise sheets and templates, and use the provided Virtual Machine (VM) image to start programming right away.</p>
<p><strong>Objectives:</strong></p>
<ul>
<li>ROS architecture: Master nodes, topics, messages, services, parameters and actions</li>
<li>Console commands: Navigating and analyzing the ROS system and the catkin workspace</li>
<li>Creating ROS packages: Structure, launch-files, and best practices</li>
<li>ROS C++ client library (roscpp): Creating your own ROS C++ programs</li>
<li>Simulating with ROS: Gazebo simulator, robot models (URDF) and simulation environments (SDF)</li>
<li>Working with visualizations (RViz) and user interface tools (rqt)</li>
<li>Inside ROS: TF transformation system, time, bags</li>
</ul>
<hr class="xh2  ">
<p><strong>Course 1:</strong></p>
<div class="keep-aspect"><iframe title="Programming for Robotics (ROS) Course 1" width="500" height="281" src="https://www.youtube-nocookie.com/embed/0BxVPCInS3M?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe></div>
<p></p>
<hr class="xh2  ">
<p><strong>Course 2:</strong></p>
<div class="keep-aspect"><iframe title="Programming for Robotics (ROS) Course 2" width="500" height="281" src="https://www.youtube-nocookie.com/embed/jYqDnuxTwK8?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe></div>
<p></p>
<hr class="xh2  ">
<p><strong>Course 3:</strong></p>
<div class="keep-aspect"><iframe title="Programming for Robotics (ROS) Course 3" width="500" height="281" src="https://www.youtube-nocookie.com/embed/_GgHFuib_LU?start=6&#038;feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe></div>
<p></p>
<hr class="xh2  ">
<p><strong>Course 4:</strong></p>
<div class="keep-aspect"><iframe title="Programming for Robotics (ROS) Course 4" width="500" height="281" src="https://www.youtube-nocookie.com/embed/feXC7aQrkeM?start=33&#038;feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe></div>
<p></p>
<p>Download the <a href="https://www.researchgate.net/publication/314101187_Programming_for_Robotics_-_Introduction_to_ROS" target="_blank" rel="noopener follow external noreferrer" data-wpel-link="external">full presentation here.</a></p>
<p>P. Fankhauser, D. Jud, M. Wermelinger, M. Hutter, “Programming for Robotics – Introduction to ROS”, ETH Zurich, 2017. DOI: 10.13140/RG.2.2.14140.44161<br />
<hr class="xh2  "></p>
<p><em>If you liked this tutorial, you may also enjoy these:</em></p>
<ul>
<li><a href="http://robohub.org/python-programming-your-nao-robot/" target="_blank" rel="noopener" data-wpel-link="internal">Python programming your NAO robot</a></li>
<li><a href="http://robohub.org/robotics-maths-python-a-fledgling-computer-scientists-guide-to-inverse-kinematics/" target="_blank" data-wpel-link="internal" rel="noopener">Robotics, maths, python: A fledgling computer scientist’s guide to inverse kinematics</a></li>
<li><a href="http://robohub.org/sticky-business-five-adhesives-tested-for-3d-printing/" target="_blank" data-wpel-link="internal" rel="noopener">Sticky business: Five adhesives tested for 3D printing</a></li>
<li><a href="http://robohub.org/adjust-how-you-learn-and-quickly-pick-up-robotics-programming/" target="_blank" data-wpel-link="internal" rel="noopener">Adjust how you learn and quickly pick up robotics programming</a></li>
<li><a href="http://robohub.org/3-d-printing-hydraulically-powered-robots-no-assembly-required/" target="_blank" data-wpel-link="internal" rel="noopener">3-D printing hydraulically-powered robots, no assembly required</a></li>
</ul>
<p><em>See all <a href="http://robohub.org/" target="_blank" data-saferedirecturl="https://www.google.com/url?hl=en-GB&amp;q=http://robohub.org/&amp;source=gmail&amp;ust=1477500783522000&amp;usg=AFQjCNFmCoRAKHuz2BWNf-njm6KSkgAacA" data-wpel-link="internal" rel="noopener">the latest robotics news</a> on Robohub, or <a title="" href="http://eepurl.com/t-UEf" target="_blank" rel="external follow noopener noreferrer" data-saferedirecturl="https://www.google.com/url?hl=en-GB&amp;q=http://eepurl.com/t-UEf&amp;source=gmail&amp;ust=1477500783522000&amp;usg=AFQjCNGjDpzB3aAol7pCzSfh7VU9iN6oQQ" data-wpel-link="external">sign up for our weekly newsletter</a>.</em></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Python programming your NAO robot</title>
		<link>https://robohub.org/python-programming-your-nao-robot/</link>
		
		<dc:creator><![CDATA[Philip English]]></dc:creator>
		<pubDate>Thu, 09 Feb 2017 12:05:44 +0000</pubDate>
				<category><![CDATA[education]]></category>
		<category><![CDATA[tutorials]]></category>
		<category><![CDATA[Aldebaran]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[control]]></category>
		<category><![CDATA[NAO]]></category>
		<category><![CDATA[open source]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[video]]></category>
		<guid isPermaLink="false">http://robohub.org/python-programming-your-nao-robot/</guid>

					<description><![CDATA[These videos aim to teach you how to begin programming your NAO with Python. The NAO can be programmed using several programming languages, including C++, MATLAB, JAVA, LabVIEW and Python. Instead of using the drag and drop boxes in the Choreograph, we&#8217;re going to get our NAO robot walking and talking using coding. Tutorial 1: Speech [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img decoding="async" class="aligncenter size-full wp-image-71578" src="http://robohub.org/wp-content/uploads/2017/02/programmable-humanoid-nao-evolution-robot.jpg" alt="" width="900" height="707" srcset="https://robohub.org/wp-content/uploads/2017/02/programmable-humanoid-nao-evolution-robot.jpg 900w, https://robohub.org/wp-content/uploads/2017/02/programmable-humanoid-nao-evolution-robot-425x334.jpg 425w, https://robohub.org/wp-content/uploads/2017/02/programmable-humanoid-nao-evolution-robot-768x603.jpg 768w, https://robohub.org/wp-content/uploads/2017/02/programmable-humanoid-nao-evolution-robot-382x300.jpg 382w" sizes="(max-width: 900px) 100vw, 900px" />These videos aim to teach you how to begin programming your NAO with Python. The NAO can be programmed using several programming languages, including C++, MATLAB, JAVA, LabVIEW and Python. Instead of using the drag and drop boxes in the Choreograph, we&#8217;re going to get our NAO robot walking and talking using coding.</p>
<p><strong>Tutorial 1: Speech</strong></p>
<div class="keep-aspect"><iframe title="Python Programming your NAO Robot Tutorial Video 1" width="500" height="281" src="https://www.youtube-nocookie.com/embed/Djzb8c41qbk?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe></div>
<p></p>
<p><strong>Helpful hints:</strong></p>
<p>Follow these steps to create a box that we could put our python code into, and have our robot speak: <em>“Hello”. “Hello I am a robot”.</em></p>
<ol>
<li>Right click the main section box and go to “add new box”</li>
<li>Create a name for the box</li>
<li>Input main image</li>
<li>Select the type of box</li>
</ol>
<p>Now we&#8217;re having a look at the script. Go into the scripts and click ok. And there we have our NAO little box. If we click into it, we have the python code. What we are going to do is change some of the codes to get our robot to speak.</p>
<ol>
<li>Double click the box</li>
<li>Select the piece of code you need to alter to get our robot to speak(“def onInput_onStart(self)”)</li>
<li>Take out the pass section</li>
<li>Type in “ttsproxy = ALProxy(“ALTextToSpeech”)”. (Make sure you get the comment in there).</li>
<li>Underneath that, we are going to put “ttsproxy.say” and add the comment “Hello, I am a robot”.</li>
</ol>
<p>The first line could create an object that gives us access to the robot’s text to speech capabilities. This object is assigned to the variable ttsProxy. We can access the object later through the name ttsProxy. I am going to mount the top line, and the alspeech is there. The second line calls a different function site. This function takes an argument “Hello, I am a robot” and then he uses a string or sequence of characters between two double quoted marks. The robot will speak the string that will pass to the say message aloud.  There are your simple first steps into python and choreograph.</p>
<p>You can now, hopefully, get your NAO robot to talk by using your python programming skills. Now have a play with it’s behavior to see if you can get your NAO to say a longer sentence, or maybe even sing a song. Have a play, and use your imagination!</p>
<hr class="xh2  ">
<p><strong>Tutorial 2: Walking</strong></p>
<div class="keep-aspect"><iframe title="Python Programming Your NAO Robot Tutorial Video 2" width="500" height="281" src="https://www.youtube-nocookie.com/embed/ykss9i1hjgo?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe></div>
<p></p>
<p><strong>Helpful hints:</strong></p>
<p>No we&#8217;re going get your robot to walk using Python. The NAO can be program to walk to any point using the in-build Python Programming Language instead of using the drag and drop boxes in the choregraphe. Python is more expressive and allows you to do things like computing trigonometric calculations on the robot.</p>
<ol>
<li>Right click the main section box and go to &#8220;add new box&#8221;</li>
<li>Create a name for the box</li>
<li>Input main image</li>
<li>Select the type of box</li>
</ol>
<p>First, we want our robot to stand up. Drag a stand up icon into the box. I am actually using the NAO key so the 3D robot in the robot view, and this because we need to put the robot on connecting so we can see what&#8217;s going on quite clearly. Oversee when you are using this on the real robot and never forget to trigger on the motors and connect everything up properly.</p>
<p>Open the Code Box</p>
<ol>
<li>Go to &#8220;def onInput_onStart(self):&#8221;</li>
<li>Write &#8220;motionProxy = ALProxy(&#8220;ALMotion&#8221;)&#8221;</li>
<li>On the next line write &#8220;walkTo(0.2,0.0,0.0)&#8221;</li>
<li>End it with &#8220;self.onStopped()&#8221;</li>
</ol>
<p>The first line is a proxy called ALmotion, which what is we created here, which allows us to call the motion functions up. The second line is the walkTo, which moves the robot to a specific distance. Now, look on the decimal places: see that .2 is X and Y and the radius, so he&#8217;s going to move .2 forward. Then if I start playing with the other numbers here, he&#8217;ll move to the Y radius and then to the other turning point as well. The final bit is the self.on. To stop this, we will call and tell the choregraphe to stop the procedure when it is at the end and just simple loop and loop and loop.</p>
<p>If we are good, we should see this now on the 3D NAO. So if I hit play, we can see it walking along. Well done guys, you can now get your NAO Robot to walk by using<br />
your Python programming skills. Tread carefully!</p>
<hr class="xh2  ">
<p><em>If you liked this article, you may also enjoy these:</em></p>
<ul>
<li><a href="http://robohub.org/robotics-maths-python-a-fledgling-computer-scientists-guide-to-inverse-kinematics/" target="_blank" data-wpel-link="internal">Robotics, maths, python: A fledgling computer scientist’s guide to inverse kinematics</a></li>
<li><a href="http://robohub.org/sticky-business-five-adhesives-tested-for-3d-printing/" target="_blank" data-wpel-link="internal">Sticky business: Five adhesives tested for 3D printing</a></li>
<li><a href="http://robohub.org/meet-robogabby-shes-on-a-mission-to-teach-more-girls-about-robotics/" target="_blank" data-wpel-link="internal">Meet RoboGabby: She’s on a mission to teach more girls about robotics</a></li>
<li><a href="http://robohub.org/adjust-how-you-learn-and-quickly-pick-up-robotics-programming/" target="_blank" data-wpel-link="internal">Adjust how you learn and quickly pick up robotics programming</a></li>
<li><a href="http://robohub.org/3-d-printing-hydraulically-powered-robots-no-assembly-required/" target="_blank" data-wpel-link="internal">3-D printing hydraulically-powered robots, no assembly required</a></li>
</ul>
<p><em>See all <a href="http://robohub.org/" target="_blank" data-saferedirecturl="https://www.google.com/url?hl=en-GB&amp;q=http://robohub.org/&amp;source=gmail&amp;ust=1477500783522000&amp;usg=AFQjCNFmCoRAKHuz2BWNf-njm6KSkgAacA" data-wpel-link="internal">the latest robotics news</a> on Robohub, or <a title="" href="http://eepurl.com/t-UEf" target="_blank" rel="external follow noopener noreferrer" data-saferedirecturl="https://www.google.com/url?hl=en-GB&amp;q=http://eepurl.com/t-UEf&amp;source=gmail&amp;ust=1477500783522000&amp;usg=AFQjCNGjDpzB3aAol7pCzSfh7VU9iN6oQQ" data-wpel-link="external">sign up for our weekly newsletter</a>.</em></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Artificial intelligence and ethics: Who does the thinking?</title>
		<link>https://robohub.org/artificial-intelligence-and-ethics-who-does-the-thinking/</link>
		
		<dc:creator><![CDATA[Alex Kirkpatrick]]></dc:creator>
		<pubDate>Fri, 27 Jan 2017 14:30:19 +0000</pubDate>
				<category><![CDATA[education]]></category>
		<category><![CDATA[news]]></category>
		<category><![CDATA[AI]]></category>
		<category><![CDATA[coding]]></category>
		<category><![CDATA[culture & philosophy]]></category>
		<category><![CDATA[ethics]]></category>
		<category><![CDATA[events]]></category>
		<category><![CDATA[machine learning]]></category>
		<category><![CDATA[policy]]></category>
		<category><![CDATA[politics]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[roboethics]]></category>
		<category><![CDATA[video]]></category>
		<guid isPermaLink="false">http://robohub.org/artificial-intelligence-and-ethics-who-does-the-thinking/</guid>

					<description><![CDATA[On the 15th November 2016, the IEEE’s AI and Ethics Summit posed the question: “Who does the thinking?” In a series of key-note speeches and lively panel discussions, leading technologists, legal thinkers, philosophers, social scientists, manufacturers and policy makers considered such issues as: The social, technological and philosophical questions orbiting AI. Proposals to program ethical algorithms [&#8230;]]]></description>
										<content:encoded><![CDATA[<div id="attachment_69958" style="width: 910px" class="wp-caption aligncenter"><a href="http://robohub.org/wp-content/uploads/2017/01/IEEE-main-AI-ethics-2016.jpg" data-wpel-link="internal"><img decoding="async" aria-describedby="caption-attachment-69958" class="wp-image-69958 size-full" src="http://robohub.org/wp-content/uploads/2017/01/IEEE-main-AI-ethics-2016.jpg" alt="IEEE-main-AI-ethics-2016" width="900" height="600" srcset="https://robohub.org/wp-content/uploads/2017/01/IEEE-main-AI-ethics-2016.jpg 900w, https://robohub.org/wp-content/uploads/2017/01/IEEE-main-AI-ethics-2016-425x283.jpg 425w, https://robohub.org/wp-content/uploads/2017/01/IEEE-main-AI-ethics-2016-450x300.jpg 450w" sizes="(max-width: 900px) 100vw, 900px" /></a><p id="caption-attachment-69958" class="wp-caption-text">Image: IEEE</p></div>
<p>On the 15th November 2016, the <a href="http://ieee-summit.org/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">IEEE’s AI and Ethics Summit</a> posed the question: “Who does the thinking?” In a series of key-note speeches and lively panel discussions, leading technologists, legal thinkers, philosophers, social scientists, manufacturers and policy makers considered such issues as:</p>
<ul>
<li>The social, technological and philosophical questions orbiting AI.</li>
<li>Proposals to program ethical algorithms with human values to machines.</li>
<li>The social implications of the applications of AI.</li>
</ul>
<p><span id="more-69947"></span></p>
<p><a href="http://ieee-summit.org/wp-content/uploads/2017/01/IEEE_AI_SUMMIT_Report.pdf" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Click here to read the final report</a>, and enjoy a selection of videos from the conference below.</p>
<hr class="xh2  ">
<p>Welcome: <a href="https://hr.linkedin.com/in/delimar" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Marko Delimar</a><br />
Keynote Speaker: <a href="http://fra.europa.eu/en/person/wiewiorowski-wojciech" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Wojciech Wiewiórowski</a></p>
<p><iframe class="youtube-player" src="https://player.vimeo.com/video/192816493" width="300" height="150" frameborder="0" allowfullscreen="allowfullscreen"></iframe></p>
<hr class="xh2  ">
<p>Panel 1: Autonomous Systems – Managing Risk and Reward<br />
Panel Members: <a href="http://www.isir.upmc.fr/?op=view_profil&amp;id=229" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Raja Chatila</a>, <a href="https://www.linkedin.com/in/kay-firth-butterfield-b5b3853a" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Kay Firth-Butterfield</a>, <a href="https://fi.linkedin.com/in/juhamheikkila" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Juha Heikkilä</a>, <a href="http://ieee-summit.org/jerome-perrin/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Jérôme Perrin</a></p>
<p><iframe class="youtube-player" src="https://player.vimeo.com/video/192894316" width="300" height="150" frameborder="0" allowfullscreen="allowfullscreen"></iframe></p>
<hr class="xh2  ">
<p>Panel 2: Programming Human Ethics: Cui Bono?<br />
Panel Members: <a href="http://ieee-summit.org/joanna-bryson/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Joanna Bryson</a>, <a href="http://ieee-summit.org/mady/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Mady Delvaux</a>, <a href="http://ieee-summit.org/sarah-spiekermann/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Sarah Spiekermann</a>, <a href="http://ieee-summit.org/corrine-cath/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Corrine Cath</a></p>
<p><iframe class="youtube-player" src="https://player.vimeo.com/video/192898762" width="300" height="150" frameborder="0" allowfullscreen="allowfullscreen"></iframe></p>
<hr class="xh2  ">
<p>Panel 3: Social Implications – Perils &amp; Promises of AI<br />
Panel Members: <a href="http://people.eng.unimelb.edu.au/gadamson/greg_adamson.htm" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Greg Adamson</a>, <a href="http://ieee-summit.org/nikolaos-mavridis/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Nikolaos Mavridis</a>, <a href="http://ieee-summit.org/paul-nemitz/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Paul Nemitz</a>, <a href="http://ieee-summit.org/aurelie-pols/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Aurélie Pols</a></p>
<p><iframe class="youtube-player" src="https://player.vimeo.com/video/192929270" width="300" height="150" frameborder="0" allowfullscreen="allowfullscreen"></iframe></p>
<hr class="xh2  ">
<p>Closing Remarks: <a href="https://www.linkedin.com/in/johnchavens" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">John C. Havens</a></p>
<p><iframe class="youtube-player" src="https://player.vimeo.com/video/195541924" width="300" height="150" frameborder="0" allowfullscreen="allowfullscreen"></iframe></p>
<hr class="xh2  ">
<p><em>You might also enjoy the following articles about AI and AI/robotics policy:</em></p>
<ul>
<li><a href="http://robohub.org/mit-media-lab-to-participate-in-27-million-initiative-on-ai-ethics-and-governance/" target="_blank" data-wpel-link="internal">MIT Media Lab to participate in $27 million initiative on AI ethics and governance</a></li>
<li><a href="http://robohub.org/how-artificial-intelligence-is-changing-our-christmas-shop/" target="_blank" data-wpel-link="internal">How artificial intelligence is changing our Christmas shop</a></li>
<li><a href="http://robohub.org/white-house-report-artificial-intelligence-automation-and-the-economy/" target="_blank" data-wpel-link="internal">White House report: Artificial intelligence, automation, and the economy</a></li>
<li><a href="http://robohub.org/white-house-launches-public-workshops-on-ai-issues/" target="_blank" data-wpel-link="internal">White House launches public workshops on AI issues</a></li>
<li><a href="http://robohub.org/white-house-releases-reports-focusing-on-opportunities-and-challenges-of-ai/" target="_blank" data-wpel-link="internal">White House releases reports focusing on opportunities and challenges of AI</a></li>
</ul>
<p><em>See all <a href="http://robohub.org/" target="_blank" data-saferedirecturl="https://www.google.com/url?hl=en-GB&amp;q=http://robohub.org/&amp;source=gmail&amp;ust=1476529719528000&amp;usg=AFQjCNGLNF8DZi4cv1N5lXD3vSC5TalLrQ" data-wpel-link="internal">the latest robotics news</a> on Robohub, or <a title="" href="http://eepurl.com/t-UEf" target="_blank" rel="external follow noopener noreferrer" data-saferedirecturl="https://www.google.com/url?hl=en-GB&amp;q=http://eepurl.com/t-UEf&amp;source=gmail&amp;ust=1476529719528000&amp;usg=AFQjCNH5It7fNAV7LLvSQqZD8MtbAG4Htg" data-wpel-link="external">sign up for our weekly newsletter</a>.</em></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Mastering ROS for robotics programming</title>
		<link>https://robohub.org/mastering-ros-for-robotics-programming/</link>
		
		<dc:creator><![CDATA[Lentin Joseph]]></dc:creator>
		<pubDate>Tue, 19 Jan 2016 14:46:03 +0000</pubDate>
				<category><![CDATA[education]]></category>
		<category><![CDATA[books]]></category>
		<category><![CDATA[programming]]></category>
		<category><![CDATA[ROS]]></category>
		<guid isPermaLink="false">http://robohub.org/mastering-ros-for-robotics-programming/</guid>

					<description><![CDATA[A new book by Lentin Joseph, Mastering ROS for Robotics Programming, discusses advanced concepts in robotics and how to implement them using ROS. Readers will learn how to build models of complex robots, and how to simulate and interface their robots using the ROS MoveIt! and the ROS navigation stack. Just released this past December, this 481-page book is one of [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img decoding="async" class="aligncenter size-full wp-image-58758" src="http://robohub.org/wp-content/uploads/2016/01/Lentin_Joseph_Mastering_ROS_for_Robotics_Programming.jpg" alt="Lentin_Joseph_Mastering_ROS_for_Robotics_Programming" width="973" height="568" srcset="https://robohub.org/wp-content/uploads/2016/01/Lentin_Joseph_Mastering_ROS_for_Robotics_Programming.jpg 973w, https://robohub.org/wp-content/uploads/2016/01/Lentin_Joseph_Mastering_ROS_for_Robotics_Programming-425x248.jpg 425w, https://robohub.org/wp-content/uploads/2016/01/Lentin_Joseph_Mastering_ROS_for_Robotics_Programming-500x292.jpg 500w" sizes="(max-width: 973px) 100vw, 973px" /><em>A new book by Lentin Joseph, <a href="https://www.packtpub.com/hardware-and-creative/mastering-ros-robotics-programming" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Mastering ROS for Robotics Programming</a>, discusses advanced concepts in robotics and how to implement them using ROS. Readers will learn how to build models of complex robots, and how to simulate and interface their robots using the ROS MoveIt! and the ROS navigation stack. Just released this past December, this 481-page book is one of the most advanced books on ROS currently available. Joseph is the CEO/Founder of <a href="http://www.qboticslabs.com/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Qbotics Labs</a>, and the author of <i><a href="http://robohub.org/learning-robotics-using-python/" target="_blank" data-wpel-link="internal">Learning Robotics using Python</a></i>.</em><span id="more-58757"></span></p>
<p>This book begins with a deep overview of the ROS framework, discusses robot manipulation and navigation, and covers how ROS interfaces with I/O boards, sensors, and actuators. Vision sensors are essential ingredients in robotics, and so an entire chapter is dedicated to how they interface with ROS. The book also explores hardware interfacing and the simulation of complex robots in ROS and ROS Industrial, and finishes with a chapter on best practices to follow while programming in ROS.</p>
<p>Below is an overview of the chapters in the book:</p>
<ol>
<li>Introduction to ROS and its package management</li>
<li>Working with 3D robot modeling in ROS</li>
<li>Simulating  robots using ROS and Gazebo</li>
<li>Using the ROS MoveIt! and Navigation stack</li>
<li>Working with Pluginlib, Nodelets and Gazebo plugins</li>
<li>Writing ROS controllers and visualization plugin</li>
<li>Interfacing I/O boards, sensors and actuators to ROS</li>
<li>Programming Vision sensors using ROS, Open-CV and PCL</li>
<li>Building  and interfacing differential drive mobile robot hardware in ROS</li>
<li>Exploring the advanced capabilities of ROS MoveIt!</li>
<li>ROS for Industrial Robots</li>
<li>Troubleshooting and best practices in ROS</li>
</ol>
<p>The book uses ROS Indigo installed on latest Ubuntu L.T.S 14.04.03. The codes are also compatible with ROS Jade. <a href="https://github.com/qboticslabs/mastering_ros" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">https://github.com/<wbr />qboticslabs/mastering_ros</a></p>
<p>A basic knowledge in R.O.S, GNU/Linux, and C++ programming concepts is recommended.</p>
<p>The book is published by PACKT and can be purchased at <a href="http://amzn.com/B0198DXFEW" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">Amazon Global </a> and <a href="https://www.packtpub.com/hardware-and-creative/mastering-ros-robotics-programming" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">PACKT Publishing</a>. More information can be found on the <a href="http://mastering-ros.com/" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer">book website </a>and<a href="http://wiki.ros.org/Books/MasteringROSforRoboticsProgramming" target="_blank" data-wpel-link="external" rel="follow external noopener noreferrer"> Wiki page</a>.</p>
<hr class="xh2  ">
<p><i>If you liked this post, you may also be interested in:</i></p>
<ul>
<li><a title="Permanent Link: Learning robotics using Python" href="http://robohub.org/learning-robotics-using-python/" rel="bookmark" data-wpel-link="internal">Learning robotics using Python</a></li>
<li><a title="Book Review: Implementation of Robot Systems, by Mike Wilson" href="http://robohub.org/book-review-implementation-of-robot-systems-by-mike-wilson/" rel="bookmark" data-wpel-link="internal">Book Review: Implementation of Robot Systems, by Mike Wilson</a></li>
<li><a title="Arduino for Makers #2: Deconstructing Arduino programs" href="http://robohub.org/arduino-for-makers-2-deconstructing-arduino-programs/" rel="bookmark" data-wpel-link="internal">Arduino for Makers #2: Deconstructing Arduino programs</a></li>
<li><a title="Arduino for Makers #1: Setting up a development station" href="http://robohub.org/arduino-for-makers-1-setting-up-a-development-station/" rel="bookmark" data-wpel-link="internal">Arduino for Makers #1: Setting up a development station</a></li>
<li><a title="MATLAB Robotics System Toolbox and ROS" href="http://robohub.org/matlab-robotics-system-toolbox-and-ros/" rel="bookmark" data-wpel-link="internal">MATLAB Robotics System Toolbox and ROS</a></li>
</ul>
<p><i>See all </i><a href="http://robohub.org/" data-wpel-link="internal"><i>the latest robotics news</i></a><i> on Robohub, or </i><a class="ext-link" title="" href="http://eepurl.com/t-UEf" target="_blank" rel="external follow noopener noreferrer" data-wpel-link="external"><i>sign up for our weekly newsletter</i></a><i>.</i></p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Page Caching using Disk: Enhanced 

Served from: robohub.org @ 2026-10-28 08:31:12 by W3 Total Cache
-->