--- title: National Youth Tech Championship 2025 type: Achievement --- +-+-+- [← Return to About Me](/about/) # National Youth Tech Championship 2025 {: .heading }
![National Youth Tech Championship 2025 banner, Season 3: AI Drone Derby.](https://www.imda.gov.sg/-/media/imda/images/content/news-and-events/upcoming-events/2025/nytc-2025/national-youth-tech-championship-2025-banner-desktop.webp)
The official banner for NYTC 2025, Season 3: AI Drone Derby. Image courtesy of IMDA. {: .img-caption } Visit their official site [here](https://www.imda.gov.sg/activities/activities-catalogue/national-youth-tech-championship)! {: .info-box } National Youth Tech Championship (NYTC) is the premier tech competition in Singapore organised jointly by IMDA and Google for Infocomm (and Robotics) CCA students. {{{
![July 18 2025 Issue of The Straits Times. Page A18, section Singapore, Headline: "ROBOT WARS: AI drones, land rover robots battle it out in youth tech championship"](https://files.altafcreator.com/media/ROBOT%20WARS_cropped.png) }}} Page A18, the headline page of Singapore section of July 19 2025 Issue of The Straits Times. Courtesy of The Straits Times. {: .img-caption }
The 2025 edition of NYTC last year, the third season, focused more on robotics, drones, and AI. Participants were required to code land robots and drones to navigate an obstacle course while completing AI-related tasks like computer vision. This was the year where me and my team participated when we were in Secondary 3. I was one of the main developers/coders of Ngee Ann Secondary’s team of four. That year, someway somehow we won as the champion (1st Place) of NYTC 2025! Continue Here are some things I've learnt along the way.
-+-+-+ +=+=+= # Adapting and Solving Problems The night before the final day we were testing and refining our drone’s code. A usual occurrence for these past few weeks. Drones have this very annoying issue of being quite unreliable. Major issues include where they drift around while idle, and that movement commands are not consistent. Despite the documentation saying that the input parameter for movement commands are in centimetres, in practice it doesn’t seem like it. We’ve tried recalibrating it multiple times, but the issue seems to persist.  Accurate measurements from the drone are pretty important in the context of this competition. For this edition of NYTC, participants are required to control their drones via code through an obstacle course. Before each round, they published the measurements for each obstacle course. That way, we can code our drone in accordance with the measurements. That is where we decided to run some tests and experiments. From that, we found out about the [drone’s actual unit scale to centimetres](https://github.com/leejiaq/nytc/blob/bf147375b8c2810f188a451dcfd51aecc599621a/2.2.py#L11), and we found that the scale is quite consistent across reboots and recalibrations (which is great, since we won’t need to find out about the scale each time we want to start flying). We tried applying this new scale into our existing code that uses the obstacle course’s measurements, and it seems like it’s working pretty well. In fact, it worked very well during the actual finals! We got some pretty good scores for 2 of the obstacles, and somehow a full score for one obstacle about pushing balls around (I’ll elaborate on this more). ## Lessons Learnt So, this moment did teach me the lesson of how to adapt properly, which is a form of problem solving. Generally, the process of problem solving is pretty iterative. First steps usually involve observing the current situation, then looking more into the details, and come up with possible solutions based on the details we know. So, in the context practical engineering and problem solving, adaptation means finding out how things really work and adjust our actions based on that. We can do this by testing true behaviour multiple times by isolating one variable at a time. Hopefully from that, relationships between other variables can emerge. Then, we can finally adjust our solutions from real-world, empirically tested behaviour that will work better. # Simple solutions are often good enough {{{ Drawing here On the finals, there was this one obstacle where we had to use drone's downwash (that is, the wind currents created by the drone's propellers) to push coloured balls into the correct colour-coded holes. There were three balls—red, yellow, and blue—and these balls were placed on top of a square platform 1.7 m-wide on each side. I think the main challenge of this obstacle is two of the balls need to go diagonally across the whole platform to get into its correct hole, as seen in my beautiful drawing. {: .flex-flex } }}} Our code was very simple. ```{ .py .long-code } # ... uapi.single_fly_takeoff() uapi.single_fly_Qrcode_align(0, 0) uapi.single_fly_up(int(70 / CM)) time.sleep(2) uapi.single_fly_left(int(70 / CM)) uapi.single_fly_forward(int(75 / CM)) uapi.single_fly_down(int(40 / CM)) uapi.single_fly_up(int(40 / CM)) uapi.single_fly_back(int(75 / CM)) time.sleep(3) uapi.single_fly_right(int(70 / CM)) uapi.single_fly_right(int(70 / CM)) uapi.single_fly_forward(int(85 / CM)) uapi.single_fly_down(int(40 / CM)) uapi.single_fly_up(int(50 / CM)) uapi.single_fly_back(int(85 / CM)) time.sleep(2) uapi.single_fly_left(int(60 / CM)) uapi.single_fly_Qrcode_align(0, 0) uapi.single_fly_up(15) uapi.single_fly_forward(int(120 / CM)) uapi.single_fly_down(int(40 / CM)) uapi.single_fly_up(int(40 / CM)) uapi.single_fly_back(int(65 / CM)) uapi.single_fly_touchdown() ``` Source: [/leejiaq/nytc/2.2.py](https://github.com/leejiaq/nytc/blob/bf147375b8c2810f188a451dcfd51aecc599621a/2.2.py#L39-L64) {: .img-caption} In fact, it was just a hard-coded step-by-step movement instructions based on the given obstacle measurements. Fly up, left, forward, down, up, go back, right, forward, down, up, go back, forward, down, up, and you're done. The only slightly more complicated feature we used is aligning to QR code at the start. Yet somehow, we scored full credits on this obstacle, meaning that we successfully moved all three balls into the correct holes. If I may compare, when I talked to other teams, they described that their code involves much more complicated systems/methods, like aligning the drone to the ball to minimise drifting errors, or using the detected drone speed to calculate distance travelled. To be fair, their code may actually work much better in a wider array of circumstances, unlike our code where it's only written for this specific case. Yet, if my memory doesn't fail me, we were the only ones who got a full score for this obstacle, somehow. ## Lessons Learnt So, I guess from here, we can learn that we don't always need to come up with the best and most fancy solutions. In some cases, especially when we need to come up with a solution of a one-off problem, a simple solution is good enough. But again, it depends, simple solutions that lack complexity usually can only do well in the circumstance it was developed for. Fancier and more complex solutions can be more comprehensive but may introduce unnecessary overhead for simpler circumstances. It's really a trade-off between our time and energy and the needed results and the nature of the problem. One would probably be better off spending less time creating quick and straightforward code for a problem they only need to solve once than writing a very sophisticated solutions. Of course, for higher-stakes situations like where a solution needs to be pushed into production, where there will be a wide variety and complexity of situations that our solution will be subjected to, it is best to come up with the most sophisticated solutions that are more adaptive and reliable. -+-+-+