<?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>Neya Systems LLC - Leaders in Unmanned Systems Technologies</title>
	<atom:link href="http://www.neyasystems.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.neyasystems.com</link>
	<description>Leaders in Unmanned Systems Technologies.</description>
	<lastBuildDate>Tue, 14 May 2013 14:29:25 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.4.1</generator>
		<item>
		<title>Why use a build server?</title>
		<link>http://www.neyasystems.com/build-server/</link>
		<comments>http://www.neyasystems.com/build-server/#comments</comments>
		<pubDate>Tue, 14 May 2013 14:28:50 +0000</pubDate>
		<dc:creator>jeffh</dc:creator>
				<category><![CDATA[Blog]]></category>

		<guid isPermaLink="false">http://www.neyasystems.com/?p=1873</guid>
		<description><![CDATA[This blog will focus on the why&#8217;s (and a cursory bit of how&#8217;s) of using a continuous integration system in robotics.  What is continuous integration?  Well, it encompasses a general set of principles and the idea that you can have automated builds and tests on your code base running behind the scenes. When I first [...]]]></description>
			<content:encoded><![CDATA[<p>This blog will focus on the why&#8217;s (and a cursory bit of how&#8217;s) of using a continuous integration system in robotics.  What is continuous integration?  Well, it encompasses a general set of principles and the idea that you can have automated builds and tests on your code base running behind the scenes. When I first began my career in robotics, this wasn&#8217;t even something on the radar anywhere I went.  Much of the robotics community is very much an offshoot of the university research community, and many projects are worked on by a single person as a one-off prototype with very tight deadlines.  This naturally can lead to a lack of rigorous software engineering principles during development.  One of those is the idea of an automated build server.  I will address that issue in this blog.  Deadlines and projects come and go (sometimes very quickly), but the time saved by setting up a build server is magnified over every project and employee using it.</p>
<p>At Neya, we have set up a build server using Jenkins (http://jenkins-ci.org/).  Easily installable through apt on a Linux box or a basic download/install process, Jenkins has straightforward setup instructions.  The base platform will allow you to automate builds running on the machine it was installed on.  I recommend creating a simple hello world project using your company standard build system (cmake, ros, visual studio, etc) and using that as a setup to test the build server.  Preferably something that compiles relatively quickly.  Using an existing project with a multiple-minute compile time will greatly increase your down time while doing the basic setup.</p>
<p>Using the basic setup with just a build script doesn&#8217;t seem at first glance to be all that particularly useful.  You&#8217;d have to have a separate build machine for every platform type, and you have to go to your build server page and click to start a build, or put it on a simple automated schedule.  That doesn&#8217;t really get you what you want.  Fortunately, Jenkins also allows plug-in development, and while you can always make a plug-in for your particular build system, there are already quite a few plug-ins developed for the more common ones.   For instance, if you use cmake, there is a plug-in for cmake builds that correctly automates the cmake/make process for you.  If you use subversion or git, there are plug-ins to link your projects to those servers.  You can then set up your projects to automatically build any time someone does a check-in.  Don&#8217;t want to go to the build server page to check your build status?  Well, there is a plug-in that will allow you to set up email lists for whenever the build status changes.</p>
<p>Finally, and most importantly, there are plug-ins to integrate the build server to various types of virtual machine systems, including both virtualbox and vmware.  Setting these up allows your build server to compile the software for multiple platforms simultaneously.  I&#8217;ve found this to be one of the most useful tolls available on a build server (beyond automated testing, which I will hit on in my next blog).  Writing software that can run on multiple architectures is not that hard, but maintaining it through months of development and different developers is.  A simple automated process that tells a developer that they broke the windows build with a change they made that worked on their Linux system can save hours and hours of headaches with developers and even customers later on down the road.</p>
<p>While sometimes it may seem to be superfluous and time consuming to set up, I can attest that setting up and managing  a basic build management system is not only easy to do, but saves way more time in the long run that it takes to set up.  You will have a project that is being developed for deployment to multiple different architectures.  The first time someone makes a change they think works because it compiled on their machine and the build server blasts out an email saying it failed on the other 3 architectures is a thing of beauty.  You will have not only saved time, but you may have not found out that bug for weeks.  Whenever someone forgets to add a new file to the repository, you find out immediately, instead of a month later when you give a new employee repository access and they try to do an install.  Have a bug fix on something you sent out 3 months ago that your customer finally got around to testing?  Well, now you can have the build server automatically tee a new release up on command, instead of having to make sure you&#8217;ve still got that setup correctly for a project you haven&#8217;t compiled in months.  It is clearly worth the day or two of initial setup and day or two a month of maintenance required.  Now, making sure the engineers who have deadlines  use it for their projects is another story entirely!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.neyasystems.com/build-server/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Cross Compiling 101</title>
		<link>http://www.neyasystems.com/cross-compiling-101/</link>
		<comments>http://www.neyasystems.com/cross-compiling-101/#comments</comments>
		<pubDate>Fri, 26 Apr 2013 18:16:23 +0000</pubDate>
		<dc:creator>constantins</dc:creator>
				<category><![CDATA[Blog]]></category>

		<guid isPermaLink="false">http://www.neyasystems.com/?p=1827</guid>
		<description><![CDATA[In this blog post, I hope to provide some introductory stepping stones to cross-compiling and working with embedded systems. Use this post as a guide for themes to research and get you started on your way. I am by no means an embedded expert, but I have learned a great deal during my time working [...]]]></description>
			<content:encoded><![CDATA[<p>In this blog post, I hope to provide some introductory stepping stones to cross-compiling and working with embedded systems. Use this post as a guide for themes to research and get you started on your way. I am by no means an embedded expert, but I have learned a great deal during my time working with a few different embedded systems.</p>
<p><span style="text-decoration: underline"><strong>Motivation<br />
</strong></span>Why does a roboticist need embedded systems? These days mobile chips are becoming powerful enough to run a variety of algorithms, from control to sensor analysis to communication. Some mobile boards are beginning to offer dedicated GPUs with support for GPGPU languages (CUDA and OpenCL). The advantages of these full systems is their light weight, decent power, and tiny power requirements. For our hands on, we will focus on SECO&#8217;s new <a title="Carma DevKit" href="http://shop.seco.com/carma-devkit.html?___store=eu_en&amp;___from_store=eu_en" target="_blank">Carma DevKit</a>. This board has a quad core Tegra 3 along with a Quadro dedicated gpu. There are tons of other well supportedrry Pi&#8217;s and TI&#8217;s OMAP boards. <img class="alignright" src="http://www.neyasystems.com/wp-content/uploads/2013/04/carma_kit_new.jpg" alt="Carma Kit" width="240" height="240" /></p>
<p>&nbsp;</p>
<p><span style="text-decoration: underline"><strong>Standard Embedded System<br />
</strong></span>Many roboticists have installed an OS (ubuntu, mint) and found it to be easy. With embedded systems, things are little more complicated in that you must compile a a kernel image for your specific system. That kernel image must be loaded by a boot loader with correct kernel arguments, which differs from our standard BIOS based PC boot loaders. Finally, we need to load the drivers(modules) we compiled against our kernel image. I am still learning this process myself, but lucky for us tons of documentation and tools exist on this subject. However, sometimes it helps to have a general overview of what we&#8217;re working with and how it works. So we&#8217;ll examine the basic steps behind setup.</p>
<p>The standard boot loader for embedded systems is <a title="U-Boot" href="http://www.denx.de/wiki/U-Boot" target="_blank">U-Boot</a>. This boot loader is small enough to fit on most boards memory, advanced enough to be compiled with basic drivers for our system and offers a configuration console. When booting, U-Boot allows a user to interrupt the boot process and configure the boot parameters. Boot parameters control a variety of settings for the system itself. We can set video memory for cards with gpu chips, enable or disable specific drivers, the device and memory location of our kernel image,  and/or the device and memory location of our root file system. Once the kernel image is loaded, the boot loader will attempt to load a root filesystem. There&#8217;s a few approaches to this, the most common I&#8217;ve seen are NFS (Network Filesystem) and SD card based.  With a NFS approach, tftp is used to transfer necessary files from a host computer to the board which is booting. This may include the kernel image itself! With an SD card, typically we use &#8220;dd&#8221; to specifically write the U-Boot binary in the correct memory locations (usually described in your systems manual), add the kernel image using dd, set its location in U-Boot and go from there. An indepth example of these approaches can be found on <a title="U-Boot" href="http://www.denx.de/wiki/U-Boot" target="_blank">U-Boot</a>&#8216;s webpage. An even more indepth tutorial on U-Boot and embedded system setup can be found at this <a title="Linux U-Boot" href="http://www.linuxfordevices.com/c/a/Linux-For-Devices-Articles/Introduction-to-Das-UBoot-the-universal-open-source-bootloader/" target="_blank">website</a>.</p>
<p><span style="text-decoration: underline"><strong>Cross-Compiling</strong></span><span style="text-decoration: underline"><strong> Background<br />
</strong></span>The basis of cross compiling is compiling for a TARGET machine on a HOST machine. Typically the TARGET machine will differ in platform than the HOST (for example, compiling for ARM on an x86). The HOST machine usually installs a prebuilt binary cross-compiler (you can also build it yourself). If installed through a package manager, the package manager will install some basic cross compiler libraries for you as well. You will also sometimes get cross-compilers with Board Support Packages.The combination of a cross compiler, linker, and associated libraries is called our toolchain. Many build environments will take advantage of toolchains to cross compile for you. For example <em>autoconf</em> and <em>cmake</em> will both cross compile for you.</p>
<p>Autoconf is tricky, in that the flags you use have been revamped to do what you want. You would use the <em>&#8211;target</em> option. However <strong>carefully examine</strong> the output of the script, it will tell you if it found your cross-compile toolchain. (It looks for [type]-gcc <strong>NOT</strong> [type]-gcc-4.5, so <strong>set up your softlinks</strong>!) CMake makes it extremely easy, you simply specify a toolchain file. A more indepth explanation can be found <a title="CMake Cross Compiling" href="http://www.vtk.org/Wiki/CMake_Cross_Compiling">here</a> as well as in CMake&#8217;s documentation.</p>
<p>The major difficulty with cross compilation is dealing with symbols and libraries. Our HOST compiler uses the typical ld search paths (/lib, /usr/lib, /usr/local/lib), but our cross-compiler needs cross-compiled libraries and symbols. <strong>When cross compiling, the difficulty really lies in cross linking, using the correct libraries for your TARGET.</strong> There are tons of tiny assumptions that can create errors which make no sense to someone entering the cross compiling world! We&#8217;re going to go over a few debugging techniques here as well as some important flags.</p>
<p><span style="text-decoration: underline"><strong>Cross Compiling Headaches</strong></span><br />
The most important thing in cross linking is to know what libraries are being used; to examine the search paths of your <span style="font-family: georgia, palatino">compiler </span>you can use the<span style="font-family: 'andale mono', times"> <tt>-print-search-dirs</tt></span>:</p>
<pre>arm-linux-gnueabi-gcc -print-search-dirs</pre>
<p>Second, use linking flags to correctly specify linking behavior. You should already be aware of the <em>-L</em> flag&#8217;s use in specifying new search directories, but more importantly you should be aware of the <em>-Wl</em> flag. This flag allows you to pass flags to your linker, this is useful when you&#8217;re using a compiler that also calls the linker for you on the object files. There are tons of linker flags, but there are only two main ones you needs to know <em>-rpath</em> and <em>-rpath-link</em>. These two flags help specify the runtime path of your binary object, in other words where it should look for dynamic libraries it needs to load. The <em>-rpath</em> flag will help remove &#8220;undefined symbol&#8221; messages at runtime when you&#8217;ve obviously linked the library.</p>
<p>But wait, if I&#8217;m compiling a binary that runs on another system I can&#8217;t set the <em>-rpath</em> to the location of my toolchain, it won&#8217;t be right on the TARGET system! That&#8217;s correct, which is why <em>-rpath-link</em> exists. This flag allows us to tell the linker that we only wish to use this<em> </em>runtime path while linking and resolving dependencies, but use the standard runtime paths. For example, our <em>libcudart.so</em> is in <em>/home/constantin/workspace/linux_tool_chain/lib</em> on our HOST machine but in the standard <em>/usr/local/lib</em> on our TARGET machine. So our compile line would be:</p>
<pre>arm-linux-gnueabi-g++ -o test_cuda test_functions.cpp 
  -L/home/constantin/workspace/linux_tool_chain/lib -lcudart</pre>
<p>or, if we are linking a dynamic library cross compiled for our cross-compiled <em>libcudart.so</em></p>
<pre>arm-linux-gnueabi-g++ -o test_cuda test_functions.cpp 
  -L/home/constantin/workspace/linux_tool_chain/lib 
  -Wl,-rpath-link,/home/constantin/workspace/cross_compiled_opencv/lib 
  -lcudart -lopencv_core -lopencv_gpu</pre>
<p>In order to link in our lib<em>opencv_gpu.so</em>, which has symbols from <em>libcudart.so,</em> we need to tell it what library has the CUDA symbols and the runtime path of the library but ONLY at link time.</p>
<p>There are a few interesting libraries that you need to watch out for: <strong>libpthread.so</strong> and <strong>libc.so</strong>. These are no normal shared objects, they&#8217;re scripts (do a less on /lib/libc.so)! So when you get Board Support Packages and you link directly to the TARGET filesystem&#8217;s<strong> </strong>directory, you might end up with errors. This often occurs when you have an NFS filesystem and you link directly to the root filesystem which exists on the same harddrive as your cross compile environment. The scripts execute and they instead link with your HOST&#8217;s system libraries. A great explanation on this topic can be found at this <a title="Special Libs" href="http://stackoverflow.com/questions/7476625/set-global-gcc-default-search-paths">Stack Overflow</a> question.</p>
<p>Hopefully that&#8217;s enough to get you started or help you deal with some very obscure bugs! Next time, we&#8217;ll focus directly on the CARMA Seco Board, as well as how to compile using CMake.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.neyasystems.com/cross-compiling-101/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Reasonable Person Principle</title>
		<link>http://www.neyasystems.com/reasonable-person-principle/</link>
		<comments>http://www.neyasystems.com/reasonable-person-principle/#comments</comments>
		<pubDate>Thu, 18 Apr 2013 17:29:21 +0000</pubDate>
		<dc:creator>parag</dc:creator>
				<category><![CDATA[Blog]]></category>

		<guid isPermaLink="false">http://www.neyasystems.com/?p=1833</guid>
		<description><![CDATA[As readers of this blog are probably noticing, we are trying to keep a mix of technical and non-technical postings related to robotics, our company, and general small business issues. This week, I&#8217;d like to talk about something non-technical, that is very near and dear to me. The Carnegie Mellon Reasonable Person Principle (RPP). The [...]]]></description>
			<content:encoded><![CDATA[<p>As readers of this blog are probably noticing, we are trying to keep a mix of technical and non-technical postings related to robotics, our company, and general small business issues. </p>
<p>This week, I&#8217;d like to talk about something non-technical, that is very near and dear to me. The Carnegie Mellon Reasonable Person Principle (RPP). The RPP is a set of very basic rules that were originally developed to govern usage of CMU&#8217;s computing network, and are as follows (taken from <a href="http://www.irc.perl.org/reasonable_person.html" target="_blank">http://www.irc.perl.org/reasonable_person.html</a>):</p>
<p>    1. Everyone will be reasonable.<br />
    2. Everyone expects everyone else to be reasonable.<br />
    3. No one is special.<br />
    4. Do not be offended if someone suggests you are not being reasonable.</p>
<p>These four very simple rules apply to all areas of life, including business, and is one of the most valuable lessons I learned in my time at CMU. We try very hard to run Neya by these rules, in how we deal with each other, our customers, and our competitors. Here&#8217;s what this means to me.</p>
<p>The easiest case in applying RPP is in dealing with each other within the company. We treat each other with respect. We work as a team. We don&#8217;t allow company politics. We try to be as transparent about projects and business operations as possible. This is the normal stuff that all small businesses tend to be good at &#8211; especially ones that follow the &#8220;no jerk rule&#8221; (also known by a different name, but this is a family friendly blog&#8230;)</p>
<p>We also apply RPP to our customers. We go in and work to make sure that we and our customers are on the same page and the same team. We assume that they are not out to &#8220;get&#8221; us. In return, when a customer does ask for something that may go above and beyond, we accomodate it. We&#8217;ll go the extra mile to handle customer requests. This actually works really well and builds mutual trust. It&#8217;s another thing that small businesses can do that larger organizations may have trouble emulating at times.</p>
<p>The hardest one is applying RPP to competitors. However, I think it&#8217;s the most important, especially in a relatively small industry like the robotics community. While we push hard to win projects and proposals, we try hard to do so by promoting our strengths rather than other&#8217;s weaknesses. One of the great things about our industry is that sometimes we work on the same team with folks we may compete against in other efforts. That means it&#8217;s important to maintain bridges and cordial relationships. In addition, there is fluidity in the robotics job market, just like in any industry. Someone who may have worked for a competing company one day, may be your customer at a new organization. Reputation matters. Being an honest broker matters. Treating people well, and with respect, matters. </p>
<p>So we treat our competitors reasonably. We don&#8217;t bad-mouth them to customers. We look for ways to work with them when we can find complimentary strengths. We most especially do not take any joy in their misfortunes. Robotics is a small community, of usually like-minded individuals who have a deep interest in developing innovative technology to help alleviate the dull, dirty, and dangerous work that others do on our behalf. Especially for those of us in DoD Robotics, we are *all* working for not only the taxpayer, but more importantly, our soldiers in the field. I&#8217;d rather spend my time fighting our adversaries, than fighting competitors, who, at their core, tend to be very much like us. </p>
<p>The above isn&#8217;t meant to be an earth shattering revelation. It&#8217;s just a reminder that ultimately we are all on the same side. We need to pay attention to our businesses, and ensure their growth, and develop useful technology. However, it&#8217;s in everyone&#8217;s interest if we can do it <em>reasonably</em>.  </p>
]]></content:encoded>
			<wfw:commentRss>http://www.neyasystems.com/reasonable-person-principle/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>04/16/13 &#8211; Neya Systems Featured in Robotics Tomorrow</title>
		<link>http://www.neyasystems.com/041613-neya-systems-featured-robotics-tomorrow/</link>
		<comments>http://www.neyasystems.com/041613-neya-systems-featured-robotics-tomorrow/#comments</comments>
		<pubDate>Wed, 17 Apr 2013 00:32:38 +0000</pubDate>
		<dc:creator>parag</dc:creator>
				<category><![CDATA[News]]></category>

		<guid isPermaLink="false">http://www.neyasystems.com/?p=1830</guid>
		<description><![CDATA[Please check out an article on Neya Systems, and the state of the unmanned systems community, in Robotics Tomorrow.]]></description>
			<content:encoded><![CDATA[<p>Please check out an article on Neya Systems, and the state of the unmanned systems community, in <a href="http://roboticstomorrow.com/emagazine/2013/04/the-unmanned-systems-industry/1852">Robotics Tomorrow</a>. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.neyasystems.com/041613-neya-systems-featured-robotics-tomorrow/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JAUS, Interoperability, and Custom Services</title>
		<link>http://www.neyasystems.com/jaus-interoperability-custom-services/</link>
		<comments>http://www.neyasystems.com/jaus-interoperability-custom-services/#comments</comments>
		<pubDate>Mon, 15 Apr 2013 18:44:45 +0000</pubDate>
		<dc:creator>davem</dc:creator>
				<category><![CDATA[Blog]]></category>

		<guid isPermaLink="false">http://www.neyasystems.com/?p=1817</guid>
		<description><![CDATA[In my last blog (http://www.neyasystems.com/dispelling-myths-jaus/), I talked about several of the ‘myths’ that I hear about JAUS, and tried to debunk them a bit.  As noted in that article, one common complaint is that SAE JAUS doesn’t cover every possible interoperability issue; there will always be some new function, new sensor, or new actuator that [...]]]></description>
			<content:encoded><![CDATA[<p>In my last blog (<a href="http://www.neyasystems.com/dispelling-myths-jaus/">http://www.neyasystems.com/dispelling-myths-jaus/</a>), I talked about several of the ‘myths’ that I hear about JAUS, and tried to debunk them a bit.  As noted in that article, one common complaint is that SAE JAUS doesn’t cover every possible interoperability issue; there will always be some new function, new sensor, or new actuator that the committee hasn’t considered.  Given the rapid pace of unmanned systems development, there is simply no way for the committee to stay ahead.</p>
<p>That doesn’t mean, however, that JAUS is useless in these situations.  In this article, I’ll focus on two ways we can maintain run-time interoperability even if existing, published services don’t cover your exact need.</p>
<p>The most obvious approach is to use the HMI Service Set.  This is a set of published JAUS services which effectively enable a “remote desktop”-like environment.  Rather than the display/OCU pulling information from the vehicle/sensor like it does in most JAUS implementations, the HMI Service Set allows a vehicle/sensor to push data directly to the display.  There are JAUS services running on both the display side as well as the vehicle/sensor side to negotiate mouse and button clicks, some simple widgets, and other common display tools.  Since the display becomes basically a dummy terminal, it’s assumed that a human operator is available to interpret and act on the data being sent.</p>
<p>The second approach to interoperability in the face of specialized requirements is through service inheritance.  SAE JAUS introduced inheritance that follows a model very similar to class inheritance in object-oriented programming languages like C++ and JAVA.  By inheriting from a parent service, a child service agrees to implement, and potentially extend, the interface offered by the parent.  There are some very specific rules about what a child service can do, but basically: Adding behavior is okay, changing parent behavior is not allowed.  When these rules are followed, a child service perfectly mimics the interface of the parent.  At run-time, a client service can’t tell if it’s talking to the parent or the child service.</p>
<p>We can make use of service inheritance to add functionality and behavior that’s close to a published service while still maintaining some level of interoperability.  Let’s consider an example in which we want to add arrival time to a waypoint.  Published JAUS services allow for specification of waypoints (Global or Local Pose Driver), but timing is controlled purely by setting a travel speed.  In our case, we want to explicitly define the time of day for the vehicle to arrive at the waypoint, and let the vehicle plan the best way to achieve those goals.  We therefore define the “Arrival Time Waypoint Driver” which inherits from Global Waypoint Driver.  Furthermore, we’ll define our own custom message that includes both the position of the waypoint as well as the arrival time.  Since all services are unique, we’ll also need to give our new service a unique urn, like urn:jaus:dave:blog:ArrivalTimeWaypointDriver.</p>
<p><a href="http://www.neyasystems.com/wp-content/uploads/2013/04/inheritance1.jpg"><img class="size-full wp-image-1820 aligncenter" src="http://www.neyasystems.com/wp-content/uploads/2013/04/inheritance1.jpg" alt="" width="548" height="230" /></a></p>
<p align="center">Figure 1. Example Service Inheritance Chain</p>
<p>So how does our new service achieve interoperability?  By exploiting the inheritance relationship!  Since the child interface must adhere that of the parent, our new service can register with the discovery service as *both* a Global Waypoint Driver and an Arrival Time Waypoint Driver.  For clients that only speak pure JAUS, they can still talk to our implementation using the standard published waypoint messages and travel speeds.  Sure, they aren’t taking advantage of the full functionality of the service, but at least we’re getting some interoperability.  For clients that are aware of our custom Arrival Time Waypoint Driver interface and the new message we created, they can use the arrival time message to take advantage of the new functionality.</p>
<p>Of course, the best way to achieve interoperability is to get new services published.  I strongly encourage folks to get engaged with the Committee.  If something is lacking, bring it to our attention.  Give us your interfaces (not your implementations!) and we’ll do our best to incorporate into the published sets.</p>
<p>Thanks for reading!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.neyasystems.com/jaus-interoperability-custom-services/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A Perspective on Company Culture</title>
		<link>http://www.neyasystems.com/perspective-company-culture/</link>
		<comments>http://www.neyasystems.com/perspective-company-culture/#comments</comments>
		<pubDate>Tue, 09 Apr 2013 02:44:06 +0000</pubDate>
		<dc:creator>tomih</dc:creator>
				<category><![CDATA[Blog]]></category>

		<guid isPermaLink="false">http://www.neyasystems.com/?p=1796</guid>
		<description><![CDATA[If someone were to tell me 15 years ago at my college graduation that I would one day be contributing to a robotics company’s blog, I would have laughed incredibly hard and suggest that this person was crazy. And here I am, willingly and excitedly writing about my experiences with Neya Systems. This idea in [...]]]></description>
			<content:encoded><![CDATA[<p>If someone were to tell me 15 years ago at my college graduation that I would one day be contributing to a robotics company’s blog, I would have laughed incredibly hard and suggest that this person was crazy.  And here I am, willingly and excitedly writing about my experiences with Neya Systems.  This idea in and of itself speaks to the unique culture found here at Neya, where everyone is challenged to pursue not only their careers but also to develop their individual strengths and curiosities.  </p>
<p>I am a self-proposed outsider to the robotics industry.  I am an accountant and have worked in various areas of the financial world, including the auditing and advisory services group for a large CPA firm, the accounting department of a Fortune 500 company, and have managed numerous financial consulting engagements.  I was in the depths of the Sarbanes-Oxley craze and learned about the significant importance of sound internal controls and compliance.  This was my career “pre-kids.”  Once I became a mom, I was looking for a job that would allow for a flexible schedule and a lower stress level.  That’s how I became the part-time administrative assistant and bookkeeper at Neya Systems. </p>
<p>While I consider myself to be an educated professional (I have a B.S. in accounting and a CPA license), I am amazed each and every time I walk through Neya’s doors and am surrounded by conversations that I am unable to comprehend in the slightest.  Robotics engineering phrases abound, and I smile to myself before I even reach my desk.  I think, “Wow…I am surrounded by smart people…I mean really, really intelligent folks.”  And while all of the employees here have the degrees, experience and innate intelligence to back it up, it is so refreshing to be greeted with cheerful hellos and genuine smiles.  These guys love what they do, and they sincerely enjoy for Neya, a small company where all ideas are considered, brainstorming occurs on a daily, if not hourly, basis and management is truly invested in ensuring the success of both the company and the employees.  This is a place where everyone learns from each other, helps each other, relies on each other and laughs with each other.  I find the sense of humor here to be hysterical and often hear and engage in bellowing laughs as we all joke with each other and discuss a range of topics (including my one C++ class that I took in college at which everyone loves to poke fun!)</p>
<p>I am only in the office one day per week.  I take on various tasks ranging from ordering supplies and putting together lunch meetings to maintaining a sound DCAA-compliant accounting system and providing accurate project costing forecast models and indirect rates tracking spreadsheets (stay tuned for a future blog on the extreme importance of these!)  While these robotics engineers work on writing detailed code for unmanned systems and various technologies, I have to keep them on track administratively and ensure that they correctly complete timesheets and expense reports and maintain all receipts for project purchases.  While our interactions may seem mundane in the exciting world of robotics, I have come to form sincere friendships with these people.  And in comparison to other jobs I have held, I have never met more sincerely appreciative people who consistently tell me “thank you” for even the smallest offer of help (new supplies and office treats go a long way with these guys!)</p>
<p>These days, I really do get a good laugh every time I work at Neya’s offices&#8211;mostly due to the tidbits of comic relief offered by these robotics geniuses throughout the day, but also partly because of my own realization into the irony of how much I truly enjoy the opportunity to experience a small part of the robotics world. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.neyasystems.com/perspective-company-culture/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Machine Learning and Biometrics</title>
		<link>http://www.neyasystems.com/machine-learning-biometrics/</link>
		<comments>http://www.neyasystems.com/machine-learning-biometrics/#comments</comments>
		<pubDate>Sat, 23 Mar 2013 17:43:59 +0000</pubDate>
		<dc:creator>mikeh</dc:creator>
				<category><![CDATA[Blog]]></category>

		<guid isPermaLink="false">http://www.neyasystems.com/?p=1773</guid>
		<description><![CDATA[In the last decade, there has been a major shift in robot perception toward using machine learning. So when is it appropriate to apply machine learning techniques to your robot perception problem? Rather than tackle this head-on, I will ask this question for a different domain and then try to tie it back to robotics. [...]]]></description>
			<content:encoded><![CDATA[<p>In the last decade, there has been a major shift in robot perception toward using machine learning. So when is it appropriate to apply machine learning techniques to your robot perception problem? Rather than tackle this head-on, I will ask this question for a different domain and then try to tie it back to robotics. Machine learning techniques have become standard for most areas of computer vision, so why is it that they are so seldom used in the iris recognition domain? This may seem an odd question coming from a robotics company, but our work at Neya spreads out beyond just robotics to the various sub-disciplines that make up the field, including computer vision. We have our toe in the iris recognition arena and have been struck by this aspect of it.</p>
<p>Some caveats are in order, of course. There are a number of researchers who have used machine learning to improve their iris recognition results or tackle related problems such as iris image quality: Arun Ross at WVU, Tienjui Tan and colleagues at Beijing and Elham Tabassi at NIST spring to mind. But the temptation to just find the perfect feature for what you are trying to do is overwhelming for a number of reasons. First, the application is nicely constrained: controlled lighting, a static target, the distance to the target known, etc. Second, the structure of the eye is fairly uniform. Irises and pupils are circular&#8230; well sort of. The eyelid shape doesn&#8217;t vary too much&#8230; more or less, probably more. And so on. It is a matching problem in the end, so why not just devise a way to create a unique code for each iris? But the final, most important reason is the dramatic success of the initial algorithms that gave birth to the field, algorithms that had little to do with machine learning. Where else in computer vision do you see an idea taken to market so quickly and work so well? There are iris recognition systems fielded all over the world making millions of identifications with few false recognitions or rejects. And they all stem from the work of John Daugman, and, in fact, mostly employ his algorithms. </p>
<p>The base Daugman algorithm is ingenious for its simplicity. Detect the outlines of the iris and pupil; transform the extracted iris using a polar-to-Cartesian transformation; apply a bank of Gabor filters to extract phase information; encode this phase information in a bit pattern; match bit patterns. There are lots of little things to do along the way and clever ways of doing them, but that is the crux of it. So where is the need for machine learning here given the success of this method and its variants? That brings us back to what made this domain so attractive: the constraints and a priori knowledge. If we now want to loosen those constraints and deal with the outliers that defy our a priori assumptions, we have to become more flexible. And that is where machine learning comes in. Thus the slow drift in the iris recognition community toward machine learning as customers express the desire to recognize irises at a distance in less than ideal lighting conditions with the target moving. It is extremely hard to devise an algorithm to handle all the possible variations. This is in part due to the fact that it is extremely hard to imagine all the possible variations. So being of limited imagination, we simply go out and collect many examples of these new conditions. We could then comb through the data and try to figure out the correct rule for handling each particular case and hope that we had covered them all. Or&#8230; we could let a machine learning algorithm discover the best way to weight each feature and save ourselves this tedium and likely failure.</p>
<p>One reason that many don&#8217;t take the plunge is that there is an upfront cost to machine learning: the accumulation of a representative set of labeled examples. There is also a looming unknown: how many and how widely must we sample to get a representative set? The rule-based approach also has these costs attached to it, but it is on the back-end. Using a handful of examples, you devise your rule. Then you try it on some more, modify it accordingly, and continue trying it on further examples. Rinse and repeat. You still have to make the decision as to when you have evaluated it on enough examples, and to do that, you still have to label data. You just don&#8217;t have to do that before you can apply your algorithm, so the cost goes unnoticed initially. We have been through this cycle in the field in the early days of robotics and it has convinced us that it isn&#8217;t worth it. And the results are poorer.</p>
<p>Another reason to take the plunge is that, well, not everyone is as smart as Daugman. His algorithm took insight and ingenuity. Its simplicity convinces us that we all could have seen it. Perhaps given enough time and thought this is true. Perhaps. But we don&#8217;t have unlimited time to devise the perfect algorithm. So it makes sense to sink the time into the tedious collecting and labeling of examples. There still is room for creativity: machine learning isn&#8217;t a panacea for bad features. You still need to figure out how best to represent and reduce your data. The domain expert is not banished from the scene. But there is no reason to believe that he can know the best weighting of the features he has extracted. The combinatorics of the domain prohibit this.</p>
<p>The tedium of labeling is slowly being alleviated by services such as Mechanical Turk. Or rather, shifted to others who are willing to do it for little money. What is needed are better tools for doing the labeling, tools that make the labelers more productive. We have some ideas along this line that we are developing and will hopefully become a product. But until then, it still makes sense to invest the time into collecting and labeling, because you will do it in the end regardless of the approach you take.</p>
<p>So when is machine learning appropriate for robot vision, our main area of interest? I would argue that unless your application is more constrained than iris recognition, it always makes sense.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.neyasystems.com/machine-learning-biometrics/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Lessons from an experiment with ROS navfn integration</title>
		<link>http://www.neyasystems.com/lessons-experiment-ros-navfn-integration/</link>
		<comments>http://www.neyasystems.com/lessons-experiment-ros-navfn-integration/#comments</comments>
		<pubDate>Fri, 15 Mar 2013 19:43:19 +0000</pubDate>
		<dc:creator>marko</dc:creator>
				<category><![CDATA[Blog]]></category>

		<guid isPermaLink="false">http://www.neyasystems.com/?p=1727</guid>
		<description><![CDATA[Some of you are probably familiar with ROS – an open-source set of libraries and tools for robotic applications. We use pieces of it regularly around here.  One of the nice features about ROS software is that you can make use of it in a variety of ways: ROS offers many of the features of [...]]]></description>
			<content:encoded><![CDATA[<p>Some of you are probably familiar with ROS – an open-source set of libraries and tools for robotic applications. We use pieces of it regularly around here.  One of the nice features about ROS software is that you can make use of it in a variety of ways: ROS offers many of the features of a full robot architecture, but because it is open source you can integrate with individual components at the level appropriate for your application. For us at Neya, that often means grabbing pieces of individual algorithms rather than entire ROS packages. I wanted to discuss one example briefly because it highlights some of the advantages and dangers of pulling in this kind of open-source code; and because it covers some bugs in the current version of the ROS “navfn” package that may be used by others in the community.</p>
<p>In this particular case we had an application where we needed to compute a quick lowest-cost path from start to goal, given a small terrain costmap, for a customer application where use of company-proprietary algorithms would have caused headaches. No problem – ROS provides an A* and a Dijkstra path search algorithms as part of their “NavFn” package. We grab the package, integrate, and move on.</p>
<p>Later when testing we find odd behavior when computing minimum-cost paths on some types of noisy cost maps. Every once and a while, calcNavFnDijkstra is unable to find a path when a valid path clearly exists. Since Djikstra is not a complex algorithm it is not high on our initial list of suspects, and, it takes us a little while to determine that the error isn’t in our code (by providing a badly-formed costmap, for example). Finally we take the time to read through the ROS file navfn.cpp.<span style="color: #ff0000;"> (In this case we&#8217;re using the ROS fuerte distribution &#8212; comments on the latest Groovy distribution are below).</span></p>
<p>The problem turns out to be, not in the underlying cost calculation (which appears to work just fine), but rather in the “calcPath” routine which extracts a path from the Djikstra-labeled potential matrix. At a high level, the navfn calcPath works as follows:</p>
<p><span style="font-family: 'courier new', courier;">Begin at start location</span></p>
<p><span style="font-family: 'courier new', courier;"> While (cycle-limit not exceeded)</span></p>
<p style="padding-left: 30px;"><span style="font-family: 'courier new', courier;"> If (at goal)</span></p>
<p style="padding-left: 60px;"><span style="font-family: 'courier new', courier;">return success</span></p>
<p style="padding-left: 30px;"><span style="font-family: 'courier new', courier;"> If (any of the cells surrounding the current position have infinite potential)</span></p>
<p style="padding-left: 60px;"><span style="font-family: 'courier new', courier;"> take a step in the 8-connected space towards the lowest potential.</span></p>
<p style="padding-left: 30px;"><span style="font-family: 'courier new', courier;"> Else</span></p>
<p style="padding-left: 60px;"><span style="font-family: 'courier new', courier;">Compute a numerical approximation to the potential gradient</span></p>
<p style="padding-left: 60px;"><span style="font-family: 'courier new', courier;">If (gradient is 0)</span></p>
<p style="padding-left: 90px;"><span style="font-family: 'courier new', courier;"> return failure</span></p>
<p style="padding-left: 60px;"><span style="font-family: 'courier new', courier;">Take a half-cell step along the maximum-gradient-descent direction</span></p>
<p style="padding-left: 30px;"><span style="font-family: 'courier new', courier;"> Endif</span></p>
<p><span style="font-family: 'courier new', courier;">Endwhile </span></p>
<p>The goal of the routine is clear: to follow the gradient in potential from the start to the goal, resulting in nice, smooth paths rather than the 8-connected zigzags which will result from simply jumping from each cell to the lowest-cost neighbor. There are problems, here, though, and they’re tied to the gradient approximation. Not the specific method &#8212; there are many ways to estimate gradient from a discrete grid of samples, and the one used is as good as any. The issues are that:</p>
<p>1. The approximated gradient could be 0 even when one or more of the surrounding cells has lower potential. In that case, the routine will fail unnecessarily.</p>
<p>2. Taking a finite-sized step along a numerically-approximated gradient will generally take the system to a lower potential when the costmaps are nice and smooth, but there’s no guarantee: it can easily move to an equal or higher potential, particularly if at or near a saddle point in the potential – this can lead to all kinds of problems (such as infinite cycling).</p>
<p>What was causing the problem for us was case (2) &#8212;  the system got into a state where taking a step along the numerically-estimated gradient took the system to a higher potential instead. It then went into a loop, jumping between two potentials, and eventually failed.</p>
<p>The rewrite was simple: for case (1), check to make sure there isn’t an 8-connected step which will reduce the potential before returning 0, and for case (2) check for the case when moving along the approximate gradient actually moves to a higher potential and handle it appropriately.</p>
<p>That solved our problem, and we were able to move on.We were actually about to post the fix to ROS when we checked the latest Groovy distribution from February 2013, which has made some improvements to the original routine: 1 and 2-length cycles in case (2) are now trapped and handled.  It&#8217;s unclear whether cycles of longer length can occur, so we&#8217;re sticking with our fix for now, which will catch cycles of all lengths; will actually remove the cycles, rather than leaving them in the resulting path; and handles and the 0 gradient case as well. There&#8217;s no downside to the extra checks, since path extraction is quick anyway.</p>
<p>This experience is characteristic of some of the underappreciated dangers of re-using code from other programs or groups. Bugs will always occur, of course, in your own code, those of other team engineers, and in software provided by others in your company or the community &#8212; but bugs from outside-program and outside-company software can be particularly challenging, because they must be found in software where you have</p>
<p>1. limited access to the code author to ask questions,</p>
<p>2. limited knowledge of the conditions under which the code was written (last-second demo rush?) and</p>
<p>3. little knowledge of the degree and type of testing which that code has encountered.</p>
<p>Open-source code is a wonderful thing, and ROS has definitely help us accelerate application development. We&#8217;re grateful to all the ROS contributors, appreciate their contributions, and we&#8217;ll continue to leverage it wherever we can &#8212; and to make our own contributions as well (we&#8217;ve posted this fix to the navfn FAQ, for example).  Just make sure,  when using open source code from ROS or anywhere else,   that you’re prepared to dive in if you need to, and that the value of the piece you want to use makes up for the added debugging complexity.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.neyasystems.com/lessons-experiment-ros-navfn-integration/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>03/10/13 &#8211; Neya Announces new Principal Engineer of Architectures and UAVs</title>
		<link>http://www.neyasystems.com/neya-announces-principle-engineer-architectures-uavs/</link>
		<comments>http://www.neyasystems.com/neya-announces-principle-engineer-architectures-uavs/#comments</comments>
		<pubDate>Sun, 10 Mar 2013 15:17:48 +0000</pubDate>
		<dc:creator>parag</dc:creator>
				<category><![CDATA[News]]></category>

		<guid isPermaLink="false">http://www.neyasystems.com/?p=1723</guid>
		<description><![CDATA[Neya Systems is happy to announce that we have hired Doug Gregory as our new Principal Engineer focusing on Open Architectures and UAV systems. Doug has spent the last 10 years as Distinguished Member of Technical Staff at GD-AIS where led multiple Open Architecture standards groups, such as the UAS Control Segment Architecture, SAE-ASD which [...]]]></description>
			<content:encoded><![CDATA[<p>Neya Systems is happy to announce that we have hired Doug Gregory as our new Principal Engineer focusing on Open Architectures and UAV systems. Doug has spent the last 10 years as Distinguished Member of Technical Staff at GD-AIS where led multiple Open Architecture standards groups, such as the UAS Control Segment Architecture, SAE-ASD which is the top-level organization under which JAUS resides, and chair of NATO NIAGs 72 and 97 on Weapons Interoperability and 125 on UAS Weaponiazation.</p>
<p>Doug&#8217;s expertise in UAS Interoperability and Architectures will allow us to expand our growing expertise in this area. Neya has been a strong supporter of open architecture efforts since our founding, and we strongly believe in the technical and business merits of OAs. Doug shares a similar viewpoint, and brings to Neya decades of experience in this area, concentrating on the actual deployment of these technologies with Army and Navy customers. </p>
<p>At Neya, Doug will maintain his leadership role within the UCS Working Group (www.ucsarchitecture.org), and will also focus on growing Neya&#8217;s OA capabilities with an emphasis on deployment of our OA-based software capabilities. </p>
]]></content:encoded>
			<wfw:commentRss>http://www.neyasystems.com/neya-announces-principle-engineer-architectures-uavs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Transitioning from a Large Company to the First Employee at Small Company</title>
		<link>http://www.neyasystems.com/transitioning-large-company-employee-small-company/</link>
		<comments>http://www.neyasystems.com/transitioning-large-company-employee-small-company/#comments</comments>
		<pubDate>Tue, 05 Mar 2013 22:35:09 +0000</pubDate>
		<dc:creator>jordans</dc:creator>
				<category><![CDATA[Blog]]></category>

		<guid isPermaLink="false">http://www.neyasystems.com/?p=1713</guid>
		<description><![CDATA[Most of us have been in this position at some point in our lives: You know the ropes at your current job; you are deeply involved in several projects there, have great friends at the office and are generally pleased with the work environment. However, despite the fact that you are content with your position, [...]]]></description>
			<content:encoded><![CDATA[<p>Most of us have been in this position at some point in our lives: You know the ropes at your current job; you are deeply involved in several projects there, have great friends at the office and are generally pleased with the work environment. However, despite the fact that you are content with your position, it isn’t giving you everything that you want out of your career.</p>
<p>There is no doubt that considering an employment change can be very stressful for a person. The fact is that in today’s job market it can be very easy to get comfortable in the position you are currently at. The thought of potentially moving to another city or state, knowing you will have to acclimate yourself with a new company and new projects…these are all things that can make a job change seem to be more hassle than it is worth.</p>
<p>About three years ago, I was in this position. I was working for a large government contractor that employs over 70,000 people across the country. Things were going very well for me at the company. I had just received a promotion, and I was excelling at the projects I was working on. Life was very good. However, I still felt like something was missing. In my case, working for a large, very mature company, meant that I would mostly be contributing to large, very mature projects. Many of the tasks that I was assigned revolved around project maintenance, bug fixes, and add-on feature implementation. There is nothing wrong with this type of work, they are all completely necessary parts of any project’s lifecycle. However, in my case, I wanted to feel like I was truly innovating, and I didn’t feel like I was getting that at my current position.</p>
<p>At this point, I decided to start doing some research to see what other, more fulfilling jobs, might be out there. Because of my current position, I was hesitant to look for open positions at other large companies. This led me to Neya Systems.</p>
<p>Parag and I had previously been introduced to one another through a mutual business contact. I knew that he was heavily involved in the robotics industry, and since I had previous robotics experience I thought I would reach out to him to see if he knew of any open positions in the field. It just so happened he was just starting to spin up Neya when I contacted him, and few short months later I was signed on to start as Neya Systems’ first employee.</p>
<p>So what made me take the plunge and accept a position as the first employee at a company? Here are some of the key points that helped me make a decision.</p>
<p><strong>Transparency.</strong> Joining a small company can be scary, joining a company as the first employee can even be scarier. The financial viability, the reputation, and even the management of the company can all be cause for concern in a small business. From day one, I felt as though I had a clear idea of the fiscal health of the company, how it is being managed now and will be in the future. It is this kind of transparency that helped me to feel extremely comfortable joining.</p>
<p><strong>Work-life balance.</strong> This is a slightly personal one. Joining Neya Systems was going to allow me to move back to my home town of Pittsburgh which was something that I really wanted to do. However, I knew that working for a very small company would require hard work that might even extend beyond normal business hours. This was something that I was completely alright with, I have never had a problem working hard, and living in your ideal city, in my case, was worth a lot to me.</p>
<p><strong>Technology.</strong> I was looking for innovative work, and the robotics industry is the place to find it. After speaking with Parag, I knew that I would be able to contribute to some amazing projects. In addition, since the company and projects were young, I would be able to get in on the ground floor and help to shape the way they are developed. As a software developer, this is something I find very appealing.</p>
<p>The transition from working for a large company to working at Neya Systems has truly been a smooth one. While the work environment is obviously very different, the benefits of joining have greatly outweighed the risks. As the company continues to grow, it has truly been a pleasure to watch it evolve from two people in a two room office to eleven people in three different states, and I look forward to seeing what the future brings.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.neyasystems.com/transitioning-large-company-employee-small-company/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
