Demo Day: MentorPi-A1 Parks Itself in Front of the Team

Live, present tense, as it happens. One park_action() function, one Ackermann steering formula, and a room full of colleagues watching.
2:47 PM. Five people gathered loosely around the road mat someone's cleared a path for on the office floor, laptop open on a nearby desk with a terminal window already SSH'd into MentorPi-A1. This is the first time this specific demo runs in front of anyone other than me, and my hand is hovering over the enter key slightly longer than the command actually requires.
2:48 PM. ros2 launch example self_driving.launch.py — typed, checked once, sent. The terminal scrolls through node startup messages, and there's that particular few seconds of nothing visibly happening yet where I'm acutely aware of five people watching a robot that is, from the outside, currently just sitting there.
2:48:22 PM. The buzzer sounds. Startup confirmed. A small, audible sigh of relief from me that I don't think anyone else registers as anything, but I feel it.
2:49 PM. MentorPi pulls forward, tracking the lane cleanly — the line-follow logic doing exactly what it's supposed to, which after last week's tuning is no longer a surprise to me, but is clearly a small, genuine delight to the two people in the room who haven't seen this part run before. Someone quietly says "oh, that's smooth" to the person next to them.
2:50 PM. Approaching the section of the mat where I've placed a printed "park" sign beside the track. This is the part I actually built this demo to show off, and it's also the part with the most moving pieces, which means it's the part I'm most nervous about.
2:50:04 PM. Detected. The YOLOv5 model picks up the "park" sign cleanly, confidence comfortably high — no repeat of last weekend's confidence-threshold fight today, thankfully. The robot's speed begins tapering down, gradually, as the tracked crosswalk_distance value — how far it is from the marked crossing line near the parking bay — shrinks toward the threshold that hands control over from line-follow into the dedicated parking routine.
2:50:11 PM. Threshold crossed. Line-follow logic hands off, and park_action() takes over. This is genuinely the moment I'm proudest of in the whole demo, not because it looks dramatic, but because of what's happening under the hood: MentorPi-A1 runs an Ackermann chassis, not the Mecanum variant, which means it can't just slide sideways into the bay the way a Mecanum-based robot's parking routine would. The Ackermann version of park_action() has to actually steer — computing a steering angle from atan(-0.5061)/0.145, then executing a forward-then-reverse two-step maneuver to actually swing the chassis into the bay, geometrically closer to how a real car parks than a robot that can strafe sideways ever would need to.

2:50:16 PM. First step of the maneuver — forward arc, wheels turned in, the chassis angling itself toward the bay opening. Someone in the room says "wait, it's actually turning like a real car" with genuine surprise, which is exactly the reaction I was hoping this specific detail would get.
2:50:21 PM. Second step — reverse, straightening out, easing back into the bay.
2:50:24 PM. It stops. And it's wrong — not dramatically wrong, but visibly, unmistakably wrong to everyone watching: MentorPi has come to rest noticeably closer to the left boundary line of the parking bay than the right, close enough that the left side of the chassis is nearly touching the painted line rather than sitting centered in the bay the way the first, private test run yesterday afternoon had looked.

2:50:26 PM. A half-second of nobody saying anything, and then, instead of treating this as a failed demo, it turns into the actually interesting part. "Let's just look at it," someone says, already pulling a laptop over. This is the advantage of demoing in front of your own team instead of a room of strangers — nobody's expecting a flawless performance, and the room's energy shifts from "watching a result" to "watching a diagnosis" without any awkwardness at all.
2:51 PM. self_driving.py open on the laptop, right there on the table beside the robot, still sitting slightly off-center in the bay. We find it fast — the parameter controlling the distance at which the parking maneuver actually initiates relative to the detected crosswalk line was tuned, apparently, against yesterday's specific mat position, and today's mat — rolled out fresh this morning — sits a few centimeters differently relative to the wall reference we'd been using. A small positional shift, but exactly the kind of thing that turns a centered park into a left-biased one when the maneuver initiates a beat later than it should relative to the bay's actual position.
2:53 PM. Parameter adjusted, small change, saved. "Let's just run it again," and there's no hesitation in the room about wanting to — if anything, people seem more interested now than they were during the clean first run seconds ago, because now there's a specific thing to watch for.
2:54 PM. Reset to start position. Relaunch. Buzzer confirms startup again — this part, at least, never gets old to hear.
2:55 PM. Line-follow, sign detection, speed taper — all identical to the first run, exactly as expected since none of that logic changed. The actual test is still thirty seconds away, and somehow this second wait feels longer than the first one did.
2:55:40 PM. park_action() engages. Forward arc. Reverse. Straighten.
2:55:47 PM. It stops, centered, both side gaps in the bay looking visibly even for the first time today. A beat of quiet, and then actual applause — not loud, just the genuine, small round of clapping five people give a robot that just fixed its own parking job in front of them, six minutes after getting it slightly wrong.

2:56 PM. Someone's already asking whether the Mecanum version's sideways-slide parking routine would have been less sensitive to this exact kind of small positional shift, which is a genuinely good question and now next week's problem to actually go find out. For today, though, MentorPi-A1 parked itself, badly once and then correctly once, in front of the one audience that actually mattered for this demo — and watching the team go from "watching a result" to "diagnosing a robot together" to "clapping for it" inside of eight minutes is a much better outcome than a flawless first run would have given me a story about at all.