28 Dec 2019
Before starting my master's degree in robotics at UPenn, I had many unanswered questions about what a master's degree would be like. I was certain that it would be considerably more difficult than undergrad but inspite of asking many current masters' students, I didn't have an idea of what to expect. As with many considering a master's degree abroad, my main concerns were not knowing how hard the coursework was going to be and adapting to the cultural differences in the US. I was also anxious about not having an exit plan figured out before starting my degree. Fortunately, each of my concerns were unfounded throughout the course of my first semester, and with this blog post, I want to share the key differences I experienced between undergraduate education in India with my first semester at UPenn.
For my first semester, I registered for the three courses - Introduction to Robotics, Computer Vision and Computational Photography, and Machine Learning. Though these courses are considered to be relatively heavy (even by UPenn's standards), I found it hard to believe that three courses with ten hours of classes a week could be stressful, especially when we were required to handle more than double the number of courses in undergrad.
It didn't take long to realise why though. Compared to undergrad in India, master's coursework in the US places a heavy emphasis on homework and assignments. The weekly individual assignments for each course I had in my first semester at UPenn are comparable to the monthly "group" programming assignments we used to have in undergrad. Evaluation policies for assignments are strict and late submissions for two of my courses were penalized at a 25% deduction in the maximum score per late day.
A master's degree will test the limits of your throughput and the rapid succession of assignment deadlines can easily lead to burnout. With the end of semester final project submissions, the last four weeks of the semester are particularly brutal for everyone. I don't think I would've made it through without compromising on sleep and inadequately compensating for it with the free coffee available at the Grad Students' Center. That said, the struggle wasn't for nothing. I feel that the knowledge I've gained through this process is much more durable than the kind gained for getting through a couple of semester exams. As an aside, the three courses I took this semester were not math heavy beyond needing to know some linear alegbra properties and solving the occasional differential equation.
The grading itself is not difficult - in most courses, scoring above the median will land you an A and scoring below will give you a B. C's and D's are only given if you neglect to turn in multiple assignments. Since the level of competition is high, even crossing the median score can be a challenge!
The atmosphere at UPenn is more collaborative than what I had experienced before. You will frequently need to approach professors, TA's, and other students for help. Collaboration in projects here goes beyond the division of labour of work as it even involves finding solutions to problems for which there aren't any right answers. I also found other students to be more competitive and motivated. It's the norm to spend several hours a day banging one's head against figurative walls. A master's degree is also a significant financial commitment and it also comes with the opportunity cost of working for two years. This tradeoff is a good reason to be diligent about the coursework.
The pace of instruction is faster as well and it requires much more attentiveness in class. In the first four weeks of the Machine Learning course at UPenn, I learned more than I had in the entire semester of the Machine Learning course in undergrad.
Due to the heavy coursework, household chores (especially cooking!), and part-time TA jobs that most students end up doing, free time ends up becoming quite limited. One of my gripes so far is that I haven't been able to explore research outside of my coursework despite the ample opportunities for the taking at UPenn's numerous robotics labs. It is possible to manage three courses with research, but I feel taking an independent study or equivalent course is more sustainable.
I think it's a good idea to brush up on the tools you will need before starting a master's degree in engineering. First year fundamental math courses are important. Gilbert Strang's textbook and OCW series are good resources for linear algebra. There is a good chance that you will need to use LaTeX for homework and scientific software such as MATLAB and Python with
pytorch among many others. Learning to use these tools effectively can save you a lot of time later. Though I feel it isn't required to prepare beforehand, you can find most of the course material of graduate courses online if you wish to preview the course content. However, the best way to know what you're getting into is by asking a helpful senior at the college you're planning to attend :-)
26 Aug 2019
On the eve of the day I start my masters degree in Robotics, I am definitely in a better state of mind than I was when I started undergrad.
I have to start by saying that the last year was blissful. My last semester on campus had very little in the way of any academic pressure and my thesis in Singapore at the ARL was everything I wanted it to be and much, much more. It has given me cold feet about whether the sharp dip in academic workload from my third to fourth year will become a detriment to how I will be able to handle the high workload of a master's degree. On the other hand, the break from frantically jumping from project to another has given me ample time to relax and evaluate what I want from this degree. Despite speaking with many people who are treading the same path, my goal of what a career in robotics will look like isn't entirely clear to me. Yet, I have high hopes that this industry will be entering a golden era not long after I graduate.
I expect a lot of changes in doing a program which demands exacting knowledge of three major fields of engineering, but there is plenty in the comfort zone of computer science that I can sink my teeth into. I am excited to see what the University of Pennsylvania and its Robotics program has to offer.
One of the few pictures I have of Penn's lovely campus
It's quite different from how I felt when starting undergrad in 2015, when there was some negativity in the air, a sentiment which was often shared with several batchmates who felt they could've gone to other colleges or taken other branches had things gone their way. That said, BITS Pilani's vision and policies awed many an impressionable fresher, me being one of them. Unfortunately, it can't be said that anyone graduating now would look back as fondly on their alma mater now as they did back then. It's clear that the academic utopia presented to us during the orientation was indeed too good to be true. It's not for lack of trying on the part of faculty or administration however, but instead of a combination of pedagogy not being able to keep up with the times and the difficulty in filling academic positions with highly qualified professors in India. For whatever reason, the students and the faculty were always at odds with one another and that has been detrimental in developing a healthy campus culture. Giving credit where it's due, college gave me the freedom to try out, succeed and fail at a number of pursuits with very little impact to future prospects. This is not a luxury I can take for granted anymore, for now the costs are far greater.
My priorities changed the most in my first year of college and I'm glad that I didn't fixate on any goal till I had a visceral feeling that a good idea (read GSoC) could work out. I had initially fancied myself graduating with a 9+ CGPA at the end of college, but my first semester's result made that vision a little too ambitious. Winning (yes, winning) the ACM-ICPC was another fascination I had during my first semester, but after a few months of grinding through various online archives, I realised that the pressure of competitive coding wasn't for me. There was still magic in programming for me and I had an idea during the previous summer vacation that I felt could realistically turn into a GSoC project. But that kernel of an idea only flourished when I pulled an all nighter coding a prototype of my idea during my first Diwali vacation on campus. From there on, I wasn't chasing an abstract idea, I was doing something far more tangible and that gave me the thrust I needed to get in touch with numerous KDE developers to put in a solid proposal and formally become a GSoC student that very year.
However, that led to hubris in my second year where I felt that any project could be conquered. I then later learning the hard way that perhaps I need to be a bit more discerning about my own capabilities after having wasted a lot of time working on projects that had little to show in the end. I think that in the most general sense, college is a good time to figure out your personality traits and to see what works and what doesn't. Time is usually abundant and the repercussions of bad decisions are temporary. It's hard to imagine any other time one would get a chance to explore like this. Looking back, there is plenty I will cringe about the 2016 version, or heck, even the 2018 version of me. But isn't that what personality development is all about? I would say that cringing on a past version of yourself (while uncomfortable), is a good thing because it shows that you are able to identify undesirable traits about yourself that you couldn't previously.
I would be remiss not to mention all the awesome people I've met along the way. Much of what I've been able to achieve in college and what has been crucial in bringing me to UPenn is because of these experiences of building strong connections with people who have gone out of their way to help me. I'm also eternally grateful to those people who told me when I was out of line or when I wasn't thinking rationally. It's also been great to have the privilege to travel the world during undergrad thanks to a couple of KDE conferences. My time with the ARL in Singapore was a distillation of everything I could have wanted from an internship and I feel much more prepared for master's after my time there.
In conclusion, I am quite looking forward to my time as a master's student and getting back on the treadmill of academic productivity. Graduate school will be another major reset of sorts, of the same kind as which happened when switching from school to undergrad. I hope that it won't be long before I develop some perspective on what life as a graduate student is like so that I can share it here. I also look forward to getting reacquainted to life in the US and seeing all that this country has to offer. Above all, I'm looking forward to seeing what education is like when done at its highest level.
22 Jul 2019
This has been the first summer vacation in a while in which I've had absolutely nothing to do. It's a far cry from the last three summers which had been filled with (at least in 2016 and 2018) interesting projects to do.
I have a tremendous opportunity waiting for me on the other side of this vacation – pursuing my Masters in Robotics degree at UPenn. It is remarkable that with hardly a month to go to MS, the specifics of life after graduation are still hazy. That said, if undergrad has taught me anything, perhaps things are best left unplanned. It's not to say that I haven't had my concerns about MS, but my initial trepidation is gradually turning into excitement.
One of the main reasons which made shift from CS to Robotics was that the greater interdisciplinary focus in Robotics would give me more options to figure out where I would really want to do. In some sense, it is giving me a second chance at postponing an important decision of which path of engineering to go down.
It's nice to be back at home after the internship in Singapore and it's been great to catch up with people from school and college. If anything though, this summer was the Summer of Pokemon. I was lucky to snag a used 3DS XL in near mint condition for S$45 on my last day in Singapore and it's made playing my library of 3DS games a joy.
For the first time ever with my Pokemon game collection, I deleted my old save and replayed Pokemon Moon from the beginning till the end of the postgame. Shortly after that, I borrowed a friend's cartridges to finish off Pokemon X and Pokemon White 2, to bring my count of completed Pokemon games to nine. Or rather 8.5 because I only vicariously played through about half of the Kanto part of SoulSilver. With this experience, I think it can be said that Pokemon is not a series to be binged. It is to be enjoyed slowly, one bit at a time. The three games which I played over the summer felt very similar and by the end, I blitzed through the last third of White 2 in a five hour marathon.
My second playthrough of Moon only supported the opinion I had after finishing my first playthrough - that the series was heading down a troubling path. Even after trying to make the game harder for myself through a Nuzlocke, it was hardly a challenge because of the change in the X-item mechanics. The story wasn't bad, but it felt very hamfisted and I dreaded the repetitive cutscene interruptions on going to each flag on the map. Speaking of the map, Alola looks a lot larger than it really is because the beautiful but short routes do not lend themselves to the same half an hour exploration fests that Platnium used to have. Also, the less said about the performance of this game, the better. After a hundred battles the delay between turns becomes less apparent but it's impossible to go back to Moon after experiencing how fluid Gen V was on the DS. Double battles are so poorly optimised that I couldn't bring myself to do more than ten battles of the Battle Tree before just switching to another game.
First impressions of Pokemon X were more positive. The game's performance was markedly better than Moon. X was also one of the more traditional Pokemon games with plot and objectives, only having Mega Evolutions thrown into the mix. Kalos reminded me a lot about Unova. X also tried to make better use of the 3DS's superior 3D capabilities over the DS, but the implementation left much to be desired. The camera angles were always off in Lumiose city and only certain areas of the map supported the 3DS's 3D mode which was very confusing. Unlike the O3DS, the 3DS XL doesn't have a 3D mode indicator LED so it requires pure guesswork to figure out which parts supported the 3D effect. Meaningful NPC dialogue in this game is hilariously lacking and it's left me wondering if the translation effort to make the worldwide release was using a briefly edited version of Google Translate. Random trainer battles felt obstructive and barring a few well produced cutscenes, netither the story nor the rivals are nothing to write home about. Another pain point were all the Battle Frontier references in X, which as we now know, never materialised and doesn't look like it will in the near future either. My personal theory is that the Battle Frontier was intended in a third version of XY, but the game was cancelled to make way for Gen VII.
After finishing X, I had high hopes for White 2. Pokemon Black has always been my favourite Pokemon generation, although some part of that can be attributed to the fact that 14-year old me could finally relate to a Pokemon game which didn't treat its players like small kids. It took me some time to get used to the DS era graphics, though this game made the best use of the console it was released on among all Pokemon games. It was so nice to see a new Unova after a two year absence (well, eight years for me anyway). I have to say, I did really like White 2. The handholding and cutscene spam which plagued Gen VII is much reduced and the difficulty of the game (even on Normal mode) is quite enjoyable. I suspended my Nuzlocke for a normal play after getting wiped out by Burgh's Leavanny. It was the first time I had to actually strategise and make a suitable team for a gym leader ever since FireRed which I played back in 2005. I found a Darumaka outside Castelia who fit the bill and swept Burgh in no time. I didn't find an EXP Share for some reason and the game was all the better for it. The regional Pokemon selection is excellent and there are plenty of great Gen V Pokemon to use. The story was not quite on the same level of the revelation the first Gen V games had, but after playing through X and Moon, this was a forgivable shortcoming for the better gameplay it had. There are a lot of subtle nods to the previous Gen V games through NPC dialogue which is miles ahead of what X has.
This little discourse on Pokemon games is years out of date, though it has been pretty interesting to play through half the series in reverse order to figure out where GameFreak started regressing on its best features to give us what looks like a rather uninspired effort for Sword & Shield. I do hope for the best, but I am not holding my breath for these games and I have no plans to invest in a Switch based on what I've seen so far.
27 Jun 2019
I really like the DJI/Ryze Tello.
It's a great nano drone and its feature list is hard to match at its price point. The camera/video quality is very good and for a drone which solely relies on its WiFi hotspot for control and video streaming to a smartphone, the range is pretty decent as well. It's impressively stable outdoors and the 10-15 minute battery life is adequate. As a trainer drone for new pilots, there's very little to complain about.
However, the main thing which drew to me to buy the Tello on impulse was its marketing with an emphasis on being "programmable". Unfortunately, I bought it without really looking into what this meant. I blindly assumed the Tello was hackable, but it turns out that the "programmable" features of the drone are limited to a few Scratch commands for writing basic scripts for movement. I wanted more control over the drone and initial impressions suggest that it has the technology to do a lot more than what the Scratch API exposes. The tiny drone has an infrared sensor for autonomous landing and uses optical flow for maintaining its position, which makes its sensor array unmatched for its price point.
The onboard Intel Myriad 2 SoC is advertised to have "14 Programmable SHAVE cores" but details on how to develop for this SoC are scarce. It's a shame, because I would've really loved to see the autonomous capabilities of drone by implementing my own algorithms for it. The Tello uses this SoC for its Visual Processing Unit to keep it stable in flight, so I think it's reasonable to speculate that this chip could be used for a larger variety of image processing applications. Moreover, the drone is clearly tuned for stability and this makes it feel sluggish despite the drone having the hardware to be much more nimble.
But I digress. I spent some time playing with different approaches to reverse engineer the Tello, and the main Python projects I found were:
Tello-Python: DJI's official Python API for interacting with the Tello. Promising, but I found their sample apps glitchy.
TelloPy: This library is amazing. It appears to be a port of some of the reverse engineering work on the Tello conducted by the Gobot folks. The API supports everything offered in Tello-Python and much more. To top it off, I found the sample TelloPy apps far more reliable than their Tello-Python counterparts
I also suggest checking tellopilots.com for more mods and discussion about hacking the Tello.
The nice thing about TelloPy is its controller support using
pygame. However, this is limited to the PS4, PS3, XBOne, and Taranis controllers in gamepad mode. My Logitech F310 wired controller wasn't supported, so I figured out the button mappings in
pygame and added it to the source of the
joystick_and_video.py sample app. I've created a pull request for the same too. To download my fork of TelloPy, clone it from GitHub here:
git clone https://github.com/shortstheory/TelloPy/tree/F310
After this, build and install
tellopy. The one currently available on
pip seems to be outdated .
python setup.py bdist_wheel
pip install dist/tellopy-*.dev*.whl --upgrade
Now switch on the Tello and connect your computer to its WiFi hotspot. The Tello can be controlled using the F310 joystick using:
Press RB to takeoff and LB to land! The left stick is used for yaw and altitude control and the right stick handles roll and pitch.
Raspberry Pi Controller
It would be nice if this could work without the need of a laptop. I tested this by following the same installation steps on a Pi Zero W running Raspbian Lite and the setup works well. I added the script to the Pi's
crontab so it would start on every boot of the Pi:
Followed by adding:
@reboot python /home/pi/TelloPy/tellopy/examples/joystick_and_video.py
To make the Pi Zero W automatically connect to the Tello when switched on, add the following lines to your
/etc/wpa_supplicant.conf on the Pi:
The Pi Zero is small enough to be tucked in behind the controller, even with a small Li-ion battery for power. However, I imagine the range of the Pi Zero W's Wi-Fi connection would only make it suitable for indoor flight. Fortunately, this can always be fixed by using a USB Wi-Fi dongle.
Things to be done
While the TelloPy API supports the directional flip capability of the Tello, it doesn't map these controls to the joystick. I plan on dedicating the D-Pad for directional flips. I would also want the video streamed to the Tello to be saved directly to the Pi's internal storage. It would also be interesting to see if I could get the Pi to handle the image processing tasks and control the Tello remotely.
19 Jun 2019
A big change that I've realised during undergrad is that engineering doesn't feel 'magical' anymore.
One of my favourite school projects: Wireless Electricity!
Of course, a vague term like 'magic' isn't very expository, so let me start with where I'm coming from. In school I was completely besotted with every piece of technology with a screen on it. I might have spent more time caressing my Nintendo 3DS than I played on it. Hyperbole aside, I marvelled its glasses free 3D screen and it felt like its hardware had limitless potential applications if only I knew how to program for it. Of course, now that the Nintendo 3DS has been hacked, I am aware that its capabilities are far more limited than what I imagined in 2011. But at the time, the perception that smartphone class hardware could do incredible things was very exciting and it's a big part of the reason I got into programming with a bit of electronics projects on the side.
So much was expected from this venerable console
I had the same feeling when we bought our first home laptop in 2013 (which is now lying unpowered and unused near my study table). My head was dizzy with possibilities and this was before I had an inkling of knowing anything about how to code. Cliche as it sounds, I felt a spark when I implemented a prime sieve to bring my runtime for a Project Euler question from two hours to a few seconds. This was reinforced by a delightfully geeky friends circle in school.
Arduino Temperature Display - displaying a balmy 24 degrees C
I experienced it again when I got to play with an Arduino a year later. It did blow my mind in the beginning that I could write C code to turn an LED on and off. One of my first Arduino projects during that time was to interface my UNO with a microphone to view the waveform on a screen using Processing. There was something very satisfying about practically understanding how sensors worked. In the end, I repurposed my UNO to function as a 7 LED binary display for my TMP36 ambient temperature sensor.
However, I think the turning point was during my first GSoC project after my first year of college. While learning how to develop good quality software for a terrific open source org like KDE was very inspiring in the beginning, I realised that the magic which I used to feel when programming was slowing being snuffed out the more I understood what I was doing. Once I had a robust mental model of the problem and its solution, writing code for it just felt like a perfunctory task. I was no longer fascinated by the fact that the code I was writing was arcanely converted to binary and executed on a billion transistors at its lowest level of abstraction. In the remaining three years of undergrad, I was fortunate to get the chance to work on some awesome projects, but the magic which I used to feel with doing something new is replaced with a wary feeling of knowing that I would need to figure out how to solve some pressing technical issue in the project. In that sense, I have developed a much better eye for spotting technical solutions.
Knowledge is a double-edged sword. Things were far more exciting when I was a brand-new, bright-eyed programmer, but it's only because of the experience I have gleaned from one project that I have been able to do another. I could blame it on burnout earlier, but having had a very relaxed final year, I can't say that's the case anymore. It has led me to think that the exciting part was never the actual implementation (or coding in this case), but figuring out the solution instead. I am rather glad that this is how things have turned out, for I think an 18 year old version of me would've rather chased a failed start in GUI building/frontend web development if the coding part was what I enjoyed. All my reservations aside, I still loved the things I have worked on and the people I have met along the way. Yet, I wouldn't mind treading some unfamiliar ground for rediscovering the magic which drew me to engineering in the first place.
The related discussion on Hacker News for this post can be found here: https://news.ycombinator.com/item?id=20222096
A Russian translation of this blog post can be found here: https://mygpstools.com/kuda-ischezla-magiya