diff options
| author | altaf-creator <dev@altafcreator.com> | 2026-06-26 12:06:38 +0800 |
|---|---|---|
| committer | altaf-creator <dev@altafcreator.com> | 2026-06-26 12:06:38 +0800 |
| commit | 3abcae19fefd11bbfba6cbf696b342ea72da6992 (patch) | |
| tree | 37fe730ff6b1475ea24eb0f04df200ef923461c7 /data/events/nytc.md | |
| parent | 1b14996290f228a329d83c164e50c27364cc0a22 (diff) | |
Diffstat (limited to 'data/events/nytc.md')
| -rw-r--r-- | data/events/nytc.md | 68 |
1 files changed, 64 insertions, 4 deletions
diff --git a/data/events/nytc.md b/data/events/nytc.md index aa74308..d8daae1 100644 --- a/data/events/nytc.md +++ b/data/events/nytc.md @@ -6,7 +6,7 @@ type: Achievement +-+-+- [← Return to About Me](/about/) -# National Youth Tech Championship 2025 { .heading } +# National Youth Tech Championship 2025 {: .heading } <div class="shadow-filter" markdown="1">  @@ -20,11 +20,11 @@ Visit their official site [here](https://www.imda.gov.sg/activities/activities-c National Youth Tech Championship (NYTC) is the premier tech competition in Singapore organised jointly by IMDA and Google for Infocomm (and Robotics) CCA students. -<div class="flex-container flex gap-row" markdown="1"> +{{{ <div class="flex-flex" markdown="1"> <div class="shadow-filter" markdown="1">  -</div> +}}} Page A18, the headline page of Singapore section of July 19 2025 Issue of The Straits Times. Courtesy of The Straits Times. {: .img-caption } @@ -45,7 +45,7 @@ Here are some things I've learnt along the way. +=+=+= -# Problem Solving, of course. +# 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. @@ -55,7 +55,67 @@ That is where we decided to run some tests and experiments. From that, we found 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() +``` +<i class="fa-solid fa-code"></i> Source: [<i class="fa-brands fa-github"></i>/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. -+-+-+
\ No newline at end of file |
