2026
ROS2 · Computer Vision · TurtleBot3 · Human-Robot InteractionScout — Robot Guide Dog
Built Scout, a TurtleBot3-based robot guide dog with real-time crosswalk and traffic-light vision, LiDAR person-tracking, and a fail-safe velocity-gate stack — led perception and safety-control on a 4-person Human-Robot Interaction team.

01
Approach & key decisions
Crosswalk and traffic-light vision
A front-facing camera feeds two OpenCV nodes at ~5 fps. The crosswalk detector masks the floor ROI for bright bands, clusters them by vertical position, and only accepts a crosswalk when four or more bands widen consistently toward the bottom of the frame — mimicking the true perspective of tape strips receding into the distance. The traffic-light detector looks for a compact colored blob with a white 'signal housing' ring around it, which rejects any red or green object sitting on the floor that isn't an actual signal.
Layered, fail-safe velocity gating
Nav2 never talks to the wheels directly. Its command passes through a vision gate (stops on a latched red light), a rear LiDAR guard (stops if the person we're leading falls behind or leaves the sensor's cone), and a final safety controller that arbitrates all three. Every input topic carries its own staleness timeout, and the default state for a stale or missing topic is always 'stop' — a crashed camera node or a disconnected LiDAR fails toward safety, never toward silently passing the last known-good velocity through.
Expressive feedback and Scout Connect
A screen on the robot's head cycles through a 16-state expression set (default, happy, confused, angry, arrived, and more) driven by ROS2 events — traffic light color, obstacle detection, journey completion — so the robot's intent is legible without reading a screen. The companion app, Scout Connect, takes a spoken destination, announces route progress, and layers in haptic and audio cues so guidance doesn't depend on looking at a phone.
System spec
- Platform
- TurtleBot3 Burger on ROS2
- Vision
- OpenCV crosswalk + traffic-light detectors (Python)
- Safety
- Layered velocity gate: vision, rear LiDAR guard, arbiter
- Sensing
- Front/rear USB cameras + 360° LiDAR
- App
- Scout Connect — voice destination input, haptic/audio feedback
- Tools
- ROS2, Nav2, rclpy, OpenCV, Figma
02
Build gallery



03
Debugging timeline
Crosswalk detector
The first pass expected each crosswalk band to fill 30% of the frame width, so the narrow, distant stripes of the test crosswalk never triggered a detection.
Replaced the single-contour-width check with Hough-line band clustering: group contours and lines by vertical position, then require four or more bands that widen toward the bottom of the frame, matching the real perspective of tape receding into the distance.
Traffic-light detector
Ordinary red objects on the floor — a backpack, a shirt — were being read as a red stop light, and a single noisy frame could clear a latched red early.
Required a white ring around any colored blob before accepting it as a real signal housing, latched red immediately (fail toward stopping) but demanded three consecutive matching frames before accepting green, and only released a latched red after 1.5s of sustained absence.
Rear LiDAR guard
Treating every missed detection as 'person lost' made the robot stop constantly on ordinary follow jitter from someone walking a normal, uneven pace.
Tracked distance over a rolling 1.2s window and fit a linear rate; only declared PERSON_FALLING_BEHIND after a sustained 0.08 m/s recession held for 0.8s, so brief jitter no longer triggered a stop while an actual drop-back still did.
Safety arbitration
With three independent nodes each feeding the final velocity gate, a silently stale topic — a crashed camera node, a disconnected LiDAR — could be indistinguishable from 'all clear' if the gate just kept passing the last command through.
Gave every input source its own timeout and made 'stop' the default state until a fresh message arrived, so any dropped topic latched a hard stop instead of letting stale data pass as safe.
04
Results & final demo
- Fail-safe velocity gate stopped Nav2 output within one 20 Hz control tick of a latched red light, verified against a mock red/green signal rig with zero false passes.
- Crosswalk detector held a stable lock across the full test course after moving to multi-band clustering, versus missing distant stripes with the original single-contour approach.
- Rear guard distinguished genuine drop-back from normal walking jitter using the 0.8s confirmation window, cutting spurious stops during live demo runs.
05
The problem
A trained service dog costs $25,000-$50,000+ and a working lifetime of 6-8 years, so a user relying on one from age 15 to 80 may need at least nine different dogs. Most people who could benefit from that independence never get access to it. Group 5 (Katie Chen, Keito Suzuki, Benjamin Baugier, and I) set out to build an MVP of a wheeled robot guide dog on a TurtleBot3: leash-guided like a real dog, but with cameras and LiDAR standing in for the training, plus a companion app for voice destination input and accessible feedback.
Next project
Closed-Loop BLDC Driver
Designed a 24 V field-oriented BLDC driver board and control loop holding ±0.3° position error under a 0.4 Nm step load.
Handheld Signal Analyzer
Built a pocket 1 MS/s scope and logic analyzer with a custom analog front end and machined aluminum enclosure, validated against a bench Rigol to within 1.8%.
Precision Current Source
Built a 0–20 mA Howland current pump with 0.05% FS error for sensor excitation and calibration benches.
915 MHz Matching Network
Designed and measured a π-network matching a LoRa PA into a PCB antenna, cutting VSWR from 3.8 to 1.3.
Lab Power Rail Monitor
USB-C multi-rail logger that watches 3.3 / 5 / 12 V benches for droop and glitch events down to 20 µs.
Line-Following Robot
PID-tuned line follower that completed the course using seven photoresistors, a custom PCB, a 3D-printed chassis, and a light shield — finished the entire track with one manual nudge due to surface bumps.