Robotics · ROS2 · Computer VisionSHT 02 OF 06

Assistive Navigation Robot

A ROS2 robot that maps a home, localizes within it, and drives itself to a named room on command: planning around obstacles, flagging floor-level danger zones with computer vision, and confirming arrival by QR code. A proof-of-concept for an assistive smart wheelchair.

AISE 4020B capstone · ROS2 · Nav2 · OpenCV · Yahboom Raspberry Pi 5

As builtDesigned & built end-to-end
The robot mid-run inside a white foam-board test arena, with yellow QR waypoint markers on the walls and floor.

The robot mid-run in my test arena. The yellow markers are the QR checkpoints it scans to confirm which room it has reached.

Room-to-room planning
Nav2
a custom ROS2 node I wrote sends the destination to Nav2, which plans and drives the route over a pre-mapped home
Obstacle reaction
0.5 m
obstacle range at which Nav2's costmap flags it and re-plans the path around it rather than stopping dead
Danger detection
10 Hz
OpenCV red-tape detector flags floor-level hazards using dual HSV colour bands
Arrival check
QR
10-digit location IDs scanned at each room to confirm it arrived where it intended
Interactive sim · runs in your browserDrive the wheelchair to a room; it waits to scan each QR checkpoint before moving ona browser rebuild of the navigation-checkpoint simulation I wroteTRY IT ↓

System architecture

Platform hardware

Raspberry Pi 5
onboard compute: runs the full ROS 2 graph
Oradar MS200
360° 2D LiDAR: mapping + /scan for Nav2
Orbbec Astra
RGB-D camera: colour + depth for the CV detectors
Onboard IMU
fused with wheel odometry via an EKF
micro-ROS control board
real-time motor control + wheel-encoder odometry
Yahboom MicroROS-Pi5
the rover base platform I built the stack on

Navigation loop

  1. LOCALIZEAMCL · pre-mapped home
  2. PLANNav2 → the named room
  3. DRIVEDWB · re-plan on obstacles
  4. SENSEred-tape + furniture CV
  5. ARRIVEQR checkpoint · 10-digit ID
The high-level loop for one trip. Hazard and furniture detection actually run continuously alongside driving rather than as a discrete step; they're drawn inline here for readability.

The robot runs ROS 2 on a Raspberry Pi 5. I built the assistive-navigation layer (three application nodes) on top of the Yahboom platform's vendor stack (the sensor drivers, EKF localization, SLAM mapping, and the Nav2 navigation pipeline), which is what let me spend my effort on the navigation logic instead of re-solving mapping and motion control. room_navigator turns a named room into a Nav2 goal pose; red_tape_detector injects floor-hazard no-go regions into the costmap; and a furniture detector keys on room objects by colour, shape, and pattern.

ROS2 node graph

Sensor drivers

oradar_scan
MS200 2D LiDAR
astra_camera
Orbbec Astra RGB-D
base_node
wheel odometry + IMU
/scan · /camera/color · /camera/depth · odom_raw · /imu/data_raw

Localization & mapping · vendor stack

robot_localization
EKF · fuses odom + IMU → /odom
amcl
localize against the saved 2D map → /amcl_pose
/odom · /amcl_pose · /map · /tf

Application layer · my nodes

room_navigator
named room → Nav2 goal
red_tape_detector
HSV hazard mask · 10 Hz
furniture_detector
colour + shape + pattern
navigate_to_pose goal · costmap no-go regions

Nav2 navigation · vendor stack

bt_navigator
behavior-tree orchestration
planner_server
NavFn global plan
controller_server
DWB local controller
/cmd_vel

Base

base_node (micro-ROS)
drives the motors from /cmd_vel
The ROS 2 graph as I built it: the Yahboom platform supplies the vendor sensor, localization, and Nav2 layers (grey); my three application nodes (red) sit on top. /scan also feeds AMCL and the Nav2 costmaps directly, and the base node closes the loop: publishing odometry at the top and driving the motors from /cmd_vel at the bottom. Custom-node topics follow each node's role; the exact names live in the project code.

Problem

Navigating tight domestic spaces is hard for wheelchair users, and the repetitive trips (kitchen, bathroom, bedroom) add up to real daily strain. I set out to prototype the software for an assistive "smart wheelchair": a system that could map a home, localize within it, detect and route around obstacles, flag floor-level danger zones, and drive a user from wherever they are to a room they name, safely, and with a check that it actually arrived.

My role

I designed and built this end to end. I wrote the navigation system and the whole application layer on top of the robot's ROS2 stack: the room-to-room route planning, the computer-vision detectors for floor hazards and furniture, the QR-checkpoint arrival logic, and a parallel software simulation of the entire navigation loop. The workflow diagram below is mine.

I built on a standard robotics foundation. The Yahboom Raspberry Pi 5 platform ships a ready-made ROS2 stack (Nav2 navigation, SLAM mapping, the Astra depth-camera and lidar drivers, EKF sensor fusion), which is exactly what let me put my effort into the assistive-navigation logic instead of reinventing mapping and motion control.

Approach

Schematic floor plan of the L-shaped test course, with labelled rooms (bedroom, kitchen, bathroom, dining, living) and dimensions in centimetres.

The five-room test "house" I taped out and mapped: the layout the robot planned and navigated against.

The robot first builds a 2D map of the space with its onboard lidar, then localizes against it. On a "go to the bedroom" command, a custom ROS2 node I wrote looks up the room's recorded coordinates and hands them to Nav2 to plan the route, and when the lidar sees an obstacle within ~0.5 m of the planned path, Nav2's costmap flags it and the planner routes around it rather than stopping dead.

Navigation decision-logic flowchart: localization, QR scan, determine start node, fetch path, compute shortest route, drive, continuously read QR codes, and branch on deviation vs temporary/permanent obstacle.

The navigation decision logic I designed: localize → scan a QR code to fix the start → compute the shortest route → drive while continuously re-reading QR codes for drift, branching a detected obstacle into a small avoidance nudge (temporary) or a full re-plan (permanent).

Two computer-vision pieces run alongside the planner. A red-tape detector segments red floor tape (a stand-in for stair edges and other hazards) using two HSV colour bands (so it survives changing light) with morphological cleanup, at 10 Hz, so the planner can treat those regions as no-go. A furniture detector combines colour, shape, and pattern cues to identify objects in a room. And at each destination, the robot scans a wall QR code carrying a 10-digit location ID to verify it reached the room it was actually headed for.

Side-by-side view: the robot's raw camera frame with a green bounding box on the red floor tape (left), and the binary segmentation mask isolating that tape as white on black (right).

My red-tape detector segmenting the floor tape: the raw camera frame (left) and the binary mask it builds from two HSV colour bands (right), which the planner treats as a no-go region.

The furniture detector's view: a green bounding box and centre dot on the bedroom's bed prop, a 'Found furniture / Position' overlay, a small binary colour-mask panel, and HSV calibration sliders.

My furniture detector keying on the bedroom's bed: colour, aspect ratio, and the bed's flower pattern combine into a labelled hit, alongside the colour mask and the HSV controls I tuned it with.

I also built the whole navigation loop as a parallel software simulation: a turtle-graphics agent with an OpenCV / pyzbar barcode reader, running the scanner and the moving agent as concurrent processes so the agent pauses at each checkpoint until the right code is read. It gave me a clean, controllable testbed for the path-planning and checkpoint logic while the physical build fought real sensor noise.

Results

I delivered a working system on both fronts (a physical robot and the simulation) and recorded a demo of it driving the arena autonomously. In the taped-out five-room "house" I built, the robot localized, planned to named rooms, reacted to obstacles inside 0.5 m, flagged red-tape danger zones, and confirmed arrival by QR code.

TRY IT · RUNS IN YOUR BROWSER

Live simulation: runs in your browser
KITCHENLIVING ROOMBEDROOM 1BEDROOM 2BATHROOMLAUNDRYSTUDYENTRANCESTORAGEGYM ROOMOFFICE

Destination

Pick a room

Idle. Eleven rooms, each with the fixed route I defined for it.

Select a room on the plan

Fixed waypoint routes with QR-gated checkpoints, not live pathfinding. The chair drives to each corridor checkpoint, waits to scan the matching QR code, then continues to the next.

Status log

nav · readout
  1. Awaiting destination: select a room to begin.

Pick a room: the wheelchair drives the fixed route I defined for it, waiting to scan the right QR checkpoint at each stop before moving on.

NOTE: Honest scope

This is a capstone proof-of-concept, and I'd rather name its edges than oversell it. I settled real parameters (0.5 m obstacle range, dual HSV red bands, 0.05 m/px maps) and got repeatable behaviour, but I didn't formally measure a navigation success rate or localization error, which is the first thing I'd quantify next. The furniture-recognition-to-approach behaviour (driving up to a specific object like a bed) was designed but not fully implemented. And the hardest lessons were physical: the lidar struggled to read tall objects as in-bounds, so I kept the walls low; and red-tape detection failed against low-contrast flooring until I laid down a white poster-board floor for reliable contrast.

Tech stack

Software & CV

  • Python
  • OpenCV
  • pyzbar (QR / barcode)

Robotics & Navigation

  • ROS2
  • Nav2
  • SLAM (gmapping / Cartographer)
  • route planning
  • robot_localization (EKF)

Hardware & Sensors

  • Astra depth camera
  • 2D lidar
  • Raspberry Pi 5

Reflection

The instinct I'm proudest of here is leverage: building on a capable vendor platform let me put the effort where the actual problem was (the assistive-navigation logic, the hazard detection, the arrival guarantee) instead of re-solving mapping and motion control. It pairs with my RECLAIM capstone as a second robotics build around the same closed perception → planning → actuation loop, just aimed at helping a person move through their own home.