~/kartikey
/projects/kdail/

a forklift that knows where it is

summer research internship at a defence company. autonomous forklift, naval dockyard, no GPS. we ended up writing our own radio ranging firmware.

may – jul 2025 · research intern · Krishna Defence, at IIT Gandhinagar · validated

The problem: a naval dockyard wants autonomous forklifts. GPS doesn’t work under all that steel. Wheel encoders drift every time a wheel slips. The forklift needs to know where it is, within a couple of centimeters, across a 200 × 200 m yard.

We looked at bluetooth, LoRa, RFID, radar, cameras — and landed on UWB: radio beacons that measure distance by timing the signal flight. Put three around the yard, do the math, you have a position.

The bot: a Raspberry Pi running ROS, a UWB tag, an IMU, LIDAR, SLAM and NAV2 on top.

UWB anchor
one of the anchors
early testing
indoor test with UWB + LIDAR

the firmware part

The stock firmware maxes out at 45 meters. A dockyard is 200. So we wrote our own ranging protocol (double-sided two-way ranging) and tuned the radio ourselves — switching between channel 5 and channel 9, adjusting preamble length and PAC size, re-deriving the timing delays for every configuration.

config preamble range accuracy
short 128 ~10 m ±2 cm
mid 256 ~50 m ±10 cm
long 512 315 m ±40 cm

Longer preamble, more range, slower updates. There’s no free lunch, only a trade — here, play with it:

instrument · drag the range, the physics answers

range
10 m
profile
short
preamble
128
accuracy
±2 cm
firmware
stock OK

We tested in stages: a 2×2 m room, then a 7×7 m yard with no encoders and no LIDAR, then 50×60 m at IIT Gandhinagar — where we checked our numbers against a surveyor’s total station instead of trusting our own code. Final result: 0.4% error across 10,000 m².

field testing
the 10×10 m test

What stuck with me: every time we made the test area 10× bigger, something new broke that the small test had hidden. And numbers only count when an independent instrument agrees with them.

made with

  • UWB (Qorvo DWM3001CDK)
  • custom DS-TWR firmware
  • ROS
  • SLAM + NAV2
  • Raspberry Pi 4B
  • IMU
  • LIDAR
occupancy grid · 0% mapped

rooms light up as you visit them · loop closure on revisit

↑↓ select · ↵ go · esc close