All Posts
build diaryroom-navjetsonros2

How We Built the Room-Nav Robot in 3 Weeks

A ground-truth build diary: every decision, mistake, and discovery from assembling the Soohoo Labs reference robot — from unboxing to autonomous navigation.

Spencer Soohoo·May 11, 2026· 12 min read

The Room-Nav kit exists because I built the robot first and documented it after. Three weeks, one office, and about 40 hours of actual work time. This is the real log — not the polished version.

Week 1: Parts Arrive, Plans Immediately Change

The Jetson Orin Nano dev kit shipped with JetPack 5.1 preflashed, not 6.0. I spent half a day reflashing because our ROS2 Humble packages require JetPack 6.0's updated CUDA runtime. Lesson one: always reflash on arrival, don't assume the shipping firmware matches your stack.

ATTENTION

JetPack 5.x ships with CUDA 11.4. JetPack 6.0 ships with CUDA 12.2. Several DepthAI dependencies require 12.x — catch this before you solder anything.

The OAK-D Lite arrived without issue but the RPLIDAR A1 had a bent motor housing — minor, and the scan quality was unaffected after I straightened it. The Cytron MDD10A was perfect, which wasn't surprising. They make good hardware.

The first surprise came with the chassis. The 'pre-drilled sensor mounts' description in the datasheet assumes a specific sensor footprint. RPLIDAR A1's mounting pattern is M3 at 46.5mm spacing — which didn't match. I drilled new holes. Budget 30 minutes for this regardless of your chassis.

Week 2: Wiring Hell and EMI Discovery

Motor wiring is where most builds die quietly. The Cytron MDD10A takes PWM input from the Jetson's GPIO pins. Straightforward in theory. In practice, the PWM signal from Jetson GPIO is 3.3V logic — and MDD10A is 5V logic tolerant but 3.3V drive. Works fine, but I didn't know that until I measured it.

bash
# Verify PWM output on Jetson GPIO pin 33
python3 -c "import Jetson.GPIO as GPIO; GPIO.setmode(GPIO.BOARD); GPIO.setup(33, GPIO.OUT); p = GPIO.PWM(33, 1000); p.start(50); import time; time.sleep(5); p.stop()"

The bigger issue: motor PWM noise on the USB bus. The first day of RPLIDAR data was garbage — scan dropouts every 3-4 seconds, exactly correlated with motor PWM duty cycle changes. This is the EMI problem we flagged in the engineering checklist. Fix: ferrite bead on the USB cable between RPLIDAR and hub, plus 10cm physical separation from motor leads.

TIP

Route sensor cables opposite to motor leads. Use the chassis frame as a natural shield. Physical separation beats ferrites when possible.

Week 3: Software Stack and First Navigation

The ROS2 Humble + nav2 bringup was actually the smoothest part. Luxonis has solid DepthAI-ROS2 integration docs. The rplidar_ros2 driver compiled cleanly. The hard part was tuning nav2's costmap parameters for our specific chassis width and LIDAR mount height.

  • robot_radius: 0.22 (our chassis is 280mm wide with a 22mm margin)
  • inflation_radius: 0.35 (tight office corridors)
  • obstacle_range: 3.0 (RPLIDAR A1 noise floor above 3.5m)
  • raytrace_range: 4.5 (stays within 5.5m max range)

First autonomous navigation: 14 days in. The robot mapped the office in ~8 minutes, saved the map with map_saver_cli, and navigated to 3 goal poses with zero collisions. I cried a little. I'm being honest.

What We Got Wrong

  • Bought one LiPo. Should have bought two. You want to keep building while one charges.
  • Underestimated chassis drilling time. It's always 30+ minutes.
  • Skipped the e-stop on the first iteration. Added it on day 15 after the robot pinned itself against a wall.
  • ReSpeaker driver compile time on Jetson is 22 minutes. Not 5.
NOTE

The BOM in the Room-Nav kit reflects everything above. All the 'lessons learned' are baked into the component choices, the checklist items, and the firmware notes.