Preparing for a career as a robotics engineer / preparing for the robotics engineering interview
Have you ever asked yourself how to get a robotics engineering job or how to prepare for a robotics engineering interview?
There are many online resources on how to interview for software engineering positions and learn the foundational skills for industry roles. However, there is very little information on #roboticsengineering roles which makes it challenging for #newgrads looking to land their first job. I would like to start a series on this and take step towards closing this gap with the help of YOU !
Regardless of your area of interest, there are some foundational skills that every robotics engineer is expected to have a solid grasp on. Here is what I have found to be important:
– C++/Python programming
– Working knowledge of ROS
– Working knowledge of at least one simulator (Gazebo, PyBullet, Isaac Gym, etc.)
– Understanding of coordinate frames/transformations, kinematics, and dynamics of multi-body systems
– Basics of optimization, linear algebra, statistics and probability
With the foundations in your toolkit, the next step is to develop deeper knowledge of at least a single area/role. Here is a list of common industry roles:
1. Motion Planning Engineer
2. Controls Engineer
3. Perception Engineer
4. Localization Engineer
5. Software Infrastructure Engineer
Note: Sometimes depending on the company/project motion planning/controls or perception/localization can be part of the same role.
Programming skills needed to be a robotics engineer
If you want to become a robotics engineer, having a strong software engineering foundation is a must.
C++ and Python are the most common languages used in most robotics projects. Some other languages like Go and Julia have also been getting some traction recently but I won’t comment on those as I do not have much experience working with them. My recommendation is to start focusing on C++ first as it is used in most large-scale robotics projects and covers the majority of technical interviews.
First, get comfortable working with the fundamental data structures including vectors, queues, maps, graphs, sets, and heaps. Most algorithms can be implemented with a combination of these data structures. I suggest taking “Mastering data structures and algorithms using C and C++” course on Udemy for a comprehensive overview.
Second, learn to use the standard template library (STL) instead of re-implementing common operations on containers. Things like searching for an object in a vector and deleting it, or filtering a container
based on some criteria. Do not get overwhelmed trying to learn everything STL does in one go, instead every time you need to implement a common operation on a data structure, see if STL has an implementation for it already.
Note: C++20 has brought the ranges library which offers more functionality than STL with cleaner syntax, but it has a bit of a learning curve, so STL is a good place to start (More on this in a later post).
Third, start implementing known algorithms in your area of interest with C++. I’ve found this method to work best for me personally as it helps with learning the nuances of the language by doing. For example, if you are interested in motion planning, try implementing RRT in C++. If you got stuck, look up on GitHub for an existing implementations (Checkout CppRobotics repo on GitHub as a solid reference) and find the missing piece in your code.
Fourth, write unit tests for every algorithm you implement. Learn to use Google test (gtest) framework for writing unit tests. There is plenty of online documentation on gtest and how to use all the functionality it offers.
At this stage, you should be comfortable implementing and testing algorithms in C++. Going from C++ to Python should not be difficult at all as you’ve already mastered the hard part. If you are doing machine learning / reinforcement learning work, Python may be more central to your dev process. Otherwise, I suggest using Python as a prototyping tool to quickly test ideas and analyze data before implementing your solution in C++.
Frameworks needed to be a robotics engineer
Learning ROS is particularly important as it teaches one to think at a macro-level about any given system. I suggest learning ROS even if the position you are targeting does not require it.
One common pitfall when learning ROS is trying to do too much at once. There are many different terms, concepts, and nitty gritty details which can be quite overwhelming for someone with no prior experience. “One bite at a time learning by doing” approach has been the most effective for me personally.
First, learn the alphabet of ROS by doing small demos. For example, setup your catkin workspace environment, write a rosnode that prints something and get it to build. Then define a topic of a certain type and publish a message to the topic. Have another node that subscribes to the same topic. Now, write a launch file that launches both nodes. Log the messages passed inside the topic in a rosbag file. This way, you will see tangible progress every step of the way. The key concepts to start focusing on are ros project structure, nodes, messages, topics, services, and bags. This should give you the necessary foundation to contribute to ROS projects.
Second, start taking on small features within a ROS project in your research group, class project, or any other open source project. This can be something like a node that handles data logging from different sensors, or writing launch files for better user interface. You will slowly start to piece together how a ROS project comes together. Do features that touch different parts of the project to understand the high-level connections better. You will be surprised how far this will take you if it is done consistently.
Note: Starting to contribute to ROS projects will also teach you how to ramp up on a new codebase, which is critical for industry roles.
Third, clearly define what you are trying to do before starting. It may sound obvious, but it is really easy to go down the rabbit-hole and jump around in documentation for hours. One thing that has helped me is to write down what I want my feature/program to do with great level of detail ahead of time. This keeps your attention focused on finding the info you need and eliminating the noise. A specific description can be something like “I want to write a node that takes in position measurements from motion capture, estimates velocity, and publishes that estimate to another topic”.
Fourth, rinse and repeat ! No matter how long you have been using ROS, there are still things you may not know. Nothing replaces the hours you spend debugging and learning the details !
This guest post brought to you by Ardalan Tajbakhsh