A couple of months ago, while doing research for the Sparkfun AVC, I posed to the DIYRovers Google Group a question about the Kalman filter. I had discovered through reading that the Kalman filter is a popular algorithm in robotics and the more I read the more it seemed that the Kalman filter is the answer to just about any robotics problem out there. Unfortunately, I was unable to find any good learning resources for this algorithm that didn't require an undergraduate degree in mathematics.
One of the members of the group suggested that a good resource for learning the Kalman filter is the Udacity course "Artificial Intelligence for Robotics."
Udacity, for those who don't know, is a MOOC: A Massively Open Online Courseware site. Udacity hosts online classes that anyone can take free of charge. Udacity is a for-profit educational organization founded by Sebastian Thrun, David Stavens, and Mike Sokolsky. It is the outgrowth of free computer science classes offered in 2011 through Stanford University, where Sebastian is a professor. I'll talk about the for-profit part in a few paragraphs.
So, at the encouragement of another AVC'er, I started taking the course.
The course wasn't at all what I expected. The primary focus of the course is how to deal with uncertainty in robotics applications. For instance, a sensor might be noisy, or a command to move the robot might be affected by wheel slip. The entire course is an introduction to various methods and algorithms (including the Kalman filter) that can be used to deal with this type of uncertainty.
The course starts off with simple one-dimensional examples and considers noise and probability. That is, in the presence of noisy sensors and noisy movement commands, the robot cannot have absolute knowledge of its position. Instead, the course teaches how to track the probability of the robot being in any particular location, and the reliability of any probabilistic guess as to the robot's position.
The course advances into more complex algorithms and into two-dimensional examples. Bayes' Theorem is introduced and conditional probabilities are used. The course proceeds on to the Kalman filter, particle filters, the A* and other search algorithms, PID control, and SLAM algorithms.
The course is taught by Sebastian Thrun. Sebastian is a professor at Stanford, and was a member of the DARPA Grand Challenge winning team and a member of Google's self-driving car research team. Clearly, the guy has experience in robotics to be teaching this course. In fact, Sebastian uses his experiences with these projects to bring real-world examples to his lectures. This brings home the point that these algorithms are practical and applicable to real-world problems.
The course material proceeds logically and builds in sequential steps. Lessons are broken into short videos, typically 2-6 minutes, followed by a quiz, which is typically a Python programming exercise or a multiple choice question. In most cases, a skeleton Python program is given and the student must write a function to implement the concept just explained in the lecture. I found that the exercises complement the lectures quite well. Sebastian is an outstanding instructor, and the material was paced perfectly for me. The Python programming is done in an in-browser editor and is graded by an autograder in the course engine. Feedback on the exercises is immediate.
I found very few downsides with this class. I was a little disappointed that the Kalman filter wasn't discussed in as much depth as I would have liked. Also, the subtitles on many of the videos are very poor; whoever created the subtitles clearly was not familiar with the material. That combined with Sebastian's German accent make for some truly interesting subtitles.
Be warned that this is not an introductory course! This is the exact same course that Georgia Tech uses in its Online Master of Science in Computer Science program, and I assure you that this course really is graduate level coursework. You'll need to have a semester or two of college level statistics, exposure to linear algebra, and decent programming skills to complete this course. Having said that, it's been over 20 years since I've taken linear algebra and I did just fine.
You can take the course for free, or you can pay $150 a month to get a "certificate" for passing the course. The material is the same in both cases. The difference is that with the paid course you have access to "coaches" and are required to do a final project. As luck would have it, my employer amended our tuition reimbursement program as I was halfway through doing this course for free, which allowed me to get reimbursed for taking the paid version of the course. That was a no-brainer and I immediately signed up for the paid version of the course.
Before my first payment was due, my assigned coach scheduled a Google Hangouts videoconference to ensure that I had the necessary academic background to be successful in the course.
The entire coaching staff is available to answer questions via instant messaging or email. They respond to instant messages immediately in my experience.
The coaching staff was, in a word, fantastic. I was (and still am) simply blown away by these guys. The coaches not only understand the course material, they understand it well, and they understand the broader context of the course material as it applies to real world problems. I kind of think of the coaches as the Teaching Assistants that I had in some of my undergraduate courses at university. I can say that if the TA's in my undergrad career had been as amazing as the Udacity coaches, college would have been a much different experience for me. I cannot say enough good things about the Udacity coaching staff. I don't know where they find these people, or how much they're paid, but they are far and away the best asset for this course.
For example, when I contacted the coaches about a question I had on one of the exercises for the Final Project, the coach looked at my code and quickly observed that my code ran in n^2 time, when, with a little modification it could be made to run in linear n time. I did know this about my code before asking for help, but I was impressed that the coach pointed this out to me so quickly. And that observation had nothing to do with the question for which I was contacting the coaches for help!
It is not necessary to complete all of the lectures or exercises to 'pass' the course and get a certificate. Only completing the final project is required. The final project includes writing some code and writing a short narrative explaining certain features of your code and why you made certain design decisions. The first time I submitted my project it was kicked back to me because I had made some arbitrary decisions without explaining my reasoning in the code comments. The graders are thorough!
In summary, this course was an outstanding experience for me. I probably wouldn't have paid for this course if my employer didn't offer reimbursement, but knowing now what I know about the experience, it would totally have been worth it to pay this out of my own pocket.