Obstacle Avoidance and Navigational Algorithm for UAVs

My final year project as part of my undergraduate degree.

Posted by Jet on December 01, 2019 · 4 mins read


This is a video! Click the picture!


All undergraduate engineering students have to complete a final year project as a prerequisite to graduating. This project ultimately culminates into the development of a thesis and/or conference paper and/or many other things.

My undergraduate degree was no different, and my project was titled “An Optimized Autonomous UAV with Obstacle Avoidance Capability”. I, for one, feel like the title itself only represented 50% of what I was doing correctly, and misrepresented another 50%. Let me explain.


The Algorithm


The UAV I used. It's a Tarot 650 platform with EMAX 4114 motors running 1555 carbon props. Controlling everything is a Pixhawk 4 flight controller hooked up to an Intel UP Squared companion computer. Everything is powered off a single 6S 5200 mAh lithium polymer battery.


What I was working on for the better part of 8 months was a massively scalable obstacle avoidance and navigational (OAN) algorithm for mobile robots. It can work on any robot, but is optimized for UAVs. I didn’t optimize the actual hardware on the UAV itself.

Part of the idea was that the algorithm had to be online, scalable, and lightweight. This meant that using any form of AI was out of the question, as such an implementation doesn’t grant me the scalability that I desired. It also had to be robust - reaching the target by any means necessary, and also smooth - allowing smooth UAV dynamics, such as those we have been accustomed to.

I won’t get into the specifics here, should you require more information, don’t hesitate to email me, view the conference publishing, or source code. Effectively, the task was accomplished using what could be described as a mish mash of vector and potential fields, coupled with a path finding implementation to eliminate any form of local minima.

The code in itself is implmented in ROS with C++, and my implementation is a tad clunky to say the least. A few improvements that I may work on in the future include changing the regular-schmegular A* algorithm to something like Theta*, improving the stuck check conditional, converting the whole algorithm to work in 3D (the current implementation is only 2D with a fixed ground clearance), implementing SLAM and perhaps a few more code optimizations. But as a functioning OAN algorithm, it works.


Thoughts

That aside, what I learnt the most about this project has nothing to do about the project itself. I learnt that the environment at which work is done has to first be very optimized for productivity (I see a lot of peers struggling with this, causing limited productivity). Also reinforced in belief is the fact that what I know is only the surface of what is out there. The latter of which is causing me to doubt my desires to pursue a PhD (if anyone has advice, do tell!). And to add a hint of cliche, I learnt the importance of friends and family. :)

All in all, this project is one that I’m proud of, but will always be just one project drowned among the many done before. It also won me an award, so there’s that!


Family. :)