Wednesday, August 30, 2017

One of the big questions that I get about coding for the team is why "Python and LabVIEW?” We could use Java or C++ instead.

The simple answer is the same for both languages. LabVIEW and Python are easy to learn.

When Mrs. E. and I came to the team in the 2008-9 school year, FIRST FRC was transitioning to an entirely new control system from National Instruments. From the beginning, it could be programmed in C++, Java, or LabVIEW. The previous controller used a derivative of C, so it was decided that we would use C++ to program the new system. It seemed that this would be the best fit.

Four weeks into the build season, our team programmer had spent a LOT of time trying to get the C++ framework to work. At that point, I was a bit worried that we wouldn’t have any working code ready for the robot. I sat one of the underutilized team members down at a computer, and in two hours, we were able to replicate everything in LabVIEW that the main programmer had struggled to get working in C++ over four weeks. On top of that, we even made a working vision system for that year’s game that could discern different colored balls.

Now, please understand, our main programmer was and is a very smart guy. He eventually got all of the code working in C++, but it took a huge investment on his part. Nobody else on the team had any hope of understanding how the code worked, as nobody had the time that he had spent on the code. LabVIEW was and is much easier to get up to speed with. We have mentors that know LabVIEW and we get sponsorship money from National Instruments for using it.

Our use of Python is a little more complex. We use it on the nVidia Jetson platform, which is an ARM architecture with a lot of GPU cores. We could use C++ on this, as OpenCV (the computer vision library we use) is written in C++. Why don’t we use C++ here instead?

As mentioned before, Python is easy to learn, but that isn’t the whole story. Python is Python is Python (within the same version). If you run it on Linux, Windows, or macOS, it works the same. C++ is NOT the same on those three platforms, as the compilers for C++ are different on each. Linux uses g++, macOS uses Xcode (llvm Clang underneath), and Windows uses Visual C++. They all compile C++ code, but do it very differently, and to varying levels of adherence to ANSI standards. This means that C++ code written on one operating system is not guaranteed to work on another without a lot of testing and re-writing.

Last year, we did encounter differences in how OpenCV that was called from Python behaved on different platforms. This was primarily due to the use of different compilers on different systems. The Python code we wrote, however, behaved the same on Windows, Linux, and macOS. As mentioned in the last e-mail, I am working on a virtual machine solution that we can all use to replicate running on the Jetson. We might be able to use C++ in this virtual machine, as the compiler will be the same as what the Jetson uses, although the underlying CPU’s will be different.

Perhaps the best reason I have found for using Python for vision is a site that is dedicated to using OpenCV with Python. Please visit PyImagesearch.com for the best guides I have found for learning computer vision topics. Adrian’s blog entries are way better than the books that I had found last year. He really does a good job in breaking things down to be much more understandable. He also covers topics that are extremely advanced (like machine learning).

I just realized that I didn’t address Java. Well, I don’t want to make anyone suffer that much. I’m told that Java 8 is not as bad, but bad is relative, and it is still Java. In all seriousness, Java is a third-class citizen for robot programming. The FRC Java framework is a wrapper on the C++ framework. The C++ framework is itself a second-class citizen, as it usually trails the LabVIEW framework when new features are introduced or bugs are fixed.

If you want to use Java or C++ (or Swift, or C#, etc) for a project, just reply privately and let me know. All computer languages are just tools, and one of them may be a better tool for something that we do. The more tools you have, the heavier your toolbox will be.

Tuesday, August 29, 2017

It was good to see some returning members and meet some new members at the Junior Robotics Kickoff meeting on Monday. We have a lot of new challenges ahead of us this fall, so I’d like to get a strong start to this semester.

Many of you know that we currently use two different languages or environments for programming the big robot. We use Python with OpenCV to code our vision system on the nVidia Jetson platform, and we use LabVIEW for the main robot and dashboard programming. This fall, we will also be investigating several different ways of programming an Android based controller for our First Tech Challenge (FTC) team. None of the FTC options are Python or LabVIEW, so it will be a great opportunity to learn something new.

This summer, we posted some mild programming challenges on the team website. The primary goal of the challenges was to develop problem-solving skills. Problem solving is what is really underneath all programming and engineering. The secondary goal was to get more exposure to working with either LabVIEW or Python. I encourage all new and existing team members to look at, and attempt these challenges, as it will really help in learning programming languages that may be new to you.

The lowest-cost of entry option for the programming contests is using Python, as it is free and works on Windows, macOS, and Linux. If your computer doesn’t already have it installed (this is mostly a Windows problem), you can download the appropriate package from http://python.org. We are currently using version 2.7.x.

I am putting together a virtual machine image for vision programming. This image will closely replicate the working environment on the Jetson, so that more work can be done without having to physically have access to the Jetson hardware. More details will be shared on Thursday night. If you want to get a head start, you can download and install Oracle’s VirtualBox software (free), which is available for Windows and macOS. It is available at https://www.virtualbox.org. I anticipate that the virtual machine image will take around 10 GB of space, when it is completed.