Whew, it's been a looong haul. I finally finished up CS373 on Udacity, Sebastian Thrun's class on programming a robotic car. I think I started in the second session; and they removed all time limits on the class shortly thereafter. Udacity realized that they had a lot of busy people, a lot of professionals, people already in the workforce, people like me taking their courses; and they wanted to make it easier for us to progress at a sustainable pace. Good thing too because real life has a way of intruding when you least expect it. So, kudos for that. I finished and got this spiffy certificate for my efforts!
CS373 is different than the Stanford AI course mainly in that it introduces programming assignments in Python. So, in addition to the videos and the interactive quizzes, they put up an interactive Python session with partial programs. Once you complete the program you can run it, view the results, and submit it for grading. It's really pretty slick. Later on, when the programs got more complex, I preferred to copy it into my own editor, then copy the final code back into the webpage; and that worked out fine.
The course starts with localization and tracking using histogram filters, particle filters, and Kalman filters. This section of the course is just a beautiful overview of the different filtering methods. You really come away with a nice perspective on the benefits and tradeoffs of each approach. Normally Sebastian presents topics with great intuition and a clear approach; and this course is no exception. Kalman filters can be particularly tricky to understand, but by focusing on the one dimensional case he was able to explain the intuition behind them too. The much more complicated equations of the two dimensional case were presented without really much justification and the programming assignment only tested that we were able to use them. It may have struck some folks as curious that he said we had just done the hardest bit of the whole course; and by doing so he kind of betrayed the underlying, hidden complexities of the subject. As presented, it definitely wasn't the hardest part of the course.
The session on search covered A* and dynamic programming with value policies and optimal policies. I thought the A* programming assignments were some of the hardest in the course, because of a trick that I won't reveal here. I will say that sometimes I felt like you had to be a mind reader to figure out what you were supposed to do. More than once I had to resort to advancing to the answer, then going back and submitting a program after seeing his solution. If you find that you have to do the same, don't feel bad. You won't be penalized for it.
The overall goal of the course was to teach all the main aspects of programming a robotic car. I think the course actually delivers on this promise by teaching on topics in localization, tracking, search, PID control, and SLAM. Of course there are many areas that were not covered, like vision, classification, LIDAR, and many other potential topics. The thing is, the devil is always in the details. I hope everyone realizes that you don't take a course like this and then go build the Google Car. But the core concepts are there!
The last section on SLAM is actually bonus material, and offers some of the most challenging programming assignments of the whole course. In teaching us graph SLAM, Thrun takes us beyond the scope of anything he taught in a single course at Stanford. I really enjoyed the course. Even though most people who take it won't actually be building robotic cars, there are lots of way to use these algorithms. Go and play, learn, and create.