August 2026: Sanbot Native ROS Driver

Hello and welcome to another Burf Update. This was another active month on the robotics side, with the creation of the first native ROS2 driver for the Sanbot Elf and lots of refinements to the Platform.

Sanbot — a native ROS 2 driver, no bridge

The Sanbot Elf used to reach ROS through a bridge: a Python node on a laptop, polling the robot and republishing everything, so the laptop was on the network on the robot’s behalf. It now speaks DDS itself — the robot is the node. There’s no rclcpp for Android, so the transport is hand-written in Kotlin: discovery, serialisation, reliability, fragmentation, about 2,800 lines, talking to stock ROS 2 with nothing special on the other end. The driver also works with the USB Lidar that I attached to the robot, however, SLAM and Nav2 still need to run on another machine, but I am fine with that.

Keecker — hacking a dead robot back to life

The Keecker is a rolling home projector from a French company that folded years ago — Android inside, no SDK, never meant to be opened. Getting in was the whole job: in device mode its USB port answers Android Open Accessory, so my Mac registered itself as a USB keyboard and mouse and drove the robot’s on-screen menus by remote until I could turn on USB debugging and drop to plain ADB. A small voice-activated driver app now rides on top and re-pairs itself on boot, so the hack was the way in, not the way it runs.

Burf Platform — it docks itself, and drives around things

The Platform gained the two things that separate a demo from something you can leave running. It charges itself: a robot on a route watches its own battery, breaks off when it’s low, docks, charges, and resumes — all afternoon, no human. Both bugs on the way were the robot being correct: it kept undocking because voltage sags twenty points under load, so it charged to 82%, drove off, watched itself read 60%, and reasonably went back; and obstacle avoidance wouldn’t let it dock at all, because the dock is against a wall.

And it drives around things that weren’t on the map. Bumper or LiDAR trips, stop, wait thirty seconds, and if it’s still there mark a robot-sized no-go zone and replan around it. It failed on hardware six different ways against a pair of shoes — a bumper that cancelled its own countdown, a bumper that bounces ten times in two seconds, a released switch mistaken for a clear path — until I made myself write proper unit tests, which caught a seventh bug at the desk. This morning it worked end to end: one bump, one clean hold, a back-off, “New path found around it — 4 leg(s)”, and a neat arc around the shoes.

I had looked to run Nav2 on the TurtleBot, however, it seemed to push the robot past its Jetson Nano limits, which I did find odd.

Robotic Hand

So I have started work on building my own robot. I remodeled an unfinished robotic hand and got a basic demo working which I am happy about.

InMoov — teleoperated from a VR headset

A quieter month after July’s, but the Meta Quest teleop got real use — headset on, move your arms, the humanoid copies you. It’s worked since the end of July.

Plan for 2026 — honest scorecard

  • Strengthen Burf Robotics — steady. Consultancy delivering.
  • Launch Burf Platform as MVP — it docks itself and avoids obstacles now. Still no price and no first customer, which is the real bottleneck, and entirely mine.
  • Continue learning ROS 2 — best month yet: a hand-written RTPS transport on Android, running against stock ROS 2.
  • InMoov Robots — driver and VR teleop both working.
  • Continue Brilliant learning — ongoing.
  • Build my own robot product — already started.

What’s next

I really need to make sure the platform is working well and then focus on building my own robot.

June 2026: The Robot That Could Strafe (and Never Said So)

Hello again. Last month was about getting the foundations in shape; this month was about wheels turning and maps building. June was a hardware month — the kind where you spend an evening with a multimeter and a servo that’s spinning the wrong way, and then suddenly a robot does the thing.

The wheelchair robot (built from scratch)

This one ran away from me in the best way. The plan was modest — “mount the Pi, do one RC-driven test run.” Instead, I built the whole robot.

It’s an electric wheelchair turned into a tank-drive robot. Arduino running a DBH-12V dual motor driver (with a verified pin map, which took a couple of goes), RC tank-drive on the sticks, and — the part I’m most pleased with — a latching e-stop with a 300 ms watchdog. If the control link drops, it stops. If you hit the e-stop, it stays stopped until you deliberately reset it. When you’re building something that weighs as much as a person and can pull away from you, that’s not a nice-to-have.

All of it runs through one control daemon: e-stop, RC drive, and onboard journey recording (LiDAR, IMU, GPS, camera) in a single process. The recording side reuses the pipeline I built for the G-Wiz telemetry rig last month — record a run, upload it, replay it in the browser on a map ready for some AI processing.

TurtleBot2 / Kobuki — SLAM on a Jetson, driven through the platform

This one was a resurrection. The Kobuki TurtleBot2 had been sitting unused for years — an ancient NVIDIA Jetson TK1 for a brain, Ubuntu 14, ROS1, the whole lot frozen in time. This month I dragged it into the present: a newer Jetson, and ROS2 Humble running in a Docker container — which is the neatest way to get a modern ROS2 onto older Jetson hardware without reflashing the whole board and fighting its ancient OS. From there, it’s wired into the same control stack as everything else, so I can drive it and watch its map from the browser. Xtion depth camera for the laser scan, slam_toolbox for mapping and multi-waypoint navigation. Driving it to a series of waypoints and watching the map fill in is genuinely satisfying.

Reviving it wasn’t free, though — and the camera is where it bit me. Depth-camera SLAM on the Jetson is right at the edge of what the hardware can do. A real LiDAR gives you a clean 360° scan; a depth camera gives you a narrow forward cone faked into a laser scan, and on a Nano, the whole pipeline is fighting for CPU. You lose the map the moment you turn too fast, and loop closure is fragile because the robot can’t see enough of the world at once. I got it mapping and navigating — but I also got a concrete feel for why people put a proper LiDAR on anything they’re serious about, and why a beefier compute brain (the Jetson Orin on my bench is the obvious upgrade) changes the game. That’s the kind of lesson you can’t read in a tutorial. You have to drive the thing into a wall a few times.

PiBob — ROS2 driver, hardware-verified end-to-end

PiBob (my Pi-brained humanoid) crossed the finish line in ROS2 this month. I went from a URDF that frankly didn’t look like the actual robot — arm meshes floating in the wrong places — to every part correctly seated and mirrored per side, and then I drove the real servos from the RViz sliders.

The hardware test more than earned its keep. It caught a driver bug where the bridge had never actually loaded the joints — so it was cheerfully POSTing nothing to the servos — plus three servos wired to turn the wrong way. None of that shows up in simulation. You only find it when a real arm moves and goes, “That’s not right.”

https://github.com/burf2000/PiBob/tree/main/ros2

The Sanbot turned out to be holonomic — and the SDK never said so

The biggest surprise of the month came from a robot I’ve owned for ages: the Sanbot Elf. I’m building a proper ROS2 driver for it — putting a vendor-locked Android humanoid onto the ROS2 graph with standard topics, so normal robotics tooling can drive it like anything else — and while reverse-engineering its OpenSDK I started poking at the wheel commands one at a time.

It has three omni wheels, and it turns out it can strafe sideways and spin on the spot — full holonomic motion — none of which is in any documentation I could find. The SDK just exposes a pile of motion codes with vague names, and the only way to learn what each actually did was to fire it at the real robot and watch. So I did: send code 3, it spins left on the spot; code 10, it slides sideways a metre and a half without rotating. Watching a service humanoid crab across the room when you had no idea it could is a proper “wait, it can do that?” moment.

I wrote the whole thing down — which code does what, plus the gotchas (the “turn” codes are actually orbits, not on-the-spot spins, and read reversed) — so the next person, probably future me, doesn’t have to rediscover it. The driver itself is still in development, but the hard part — knowing what the robot can actually do — is mapped. A robot is often far more capable than its own manual admits.

Honest scorecard

  • Sanbot ROS2 driver + holonomic discovery — ✅ driver built; omni motion (strafe/spin) mapped and documented.
  • Wheelchair robot — ✅ built and hardware-verified, way past plan.
  • TurtleBot2 SLAM + nav — ✅ mapping and navigating, with a clear-eyed view of the depth-cam limits.
  • PiBob ROS2 — ✅ done, real servos driven from RViz.
  • Heterogeneous fleet driver — safety-hardened, getting more solid each month.
  • Meta Quest teleop for PiBob / Inmoov — ❌ built but could be better, not fully tested with the Inmoov
  • Burf Platform improvements — Security fixes and simple SLAM / A* navigation added to Burf Platform

What’s next

First job is getting the wheelchair onto ROS2: sensors properly mounted, a URDF built from the real mounting positions, laser-odometry and slam_toolbox, so a driven journey turns into a live 2-D map in the browser. Drive it around a room, watch the map appear — that’s the satisfying full-circle moment. Then the fun part: run all that recorded trip data through some AI — every run captures LiDAR, IMU, GPS, and camera, and all that data is begging to be learned from rather than just replayed.

Alongside that, two longer threads. Keep building out the platform that ties these very different robots together — more of the control, telemetry, and fleet features that make a pile of one-off robots behave like one system. And keep levelling up my ROS2, which every one of these builds quietly pushes a bit further.

For a part-time evenings-and-weekends operation, June was a good month: four very different robots, all moving, all talking through the same stack. That’s exactly the direction I wanted this to go. More next month.

August 2025: The ROS2 Edition


Hello and welcome to another Burf update! Sadly, I didn’t get a chance to publish a July post — it’s been full throttle on the robotics front. This year is really shaping up to be a robotics-heavy one, and I’m loving it.

MTC: Robotics and Automation Event
We attended the event, and the second InMoov robot did well playing Rock, Paper, Scissors. A few lessons were learned — notably, face detection struggled with different skin tones and people wearing glasses. I had (wrongly) assumed that the maturity of OpenCV would have eliminated these kinds of biases by now.

As for the Sanbot robot — it didn’t get used much, so I need to think harder about a compelling use case for it.

Gwiz Update
Back in May, the G-Wiz passed its MOT, but unfortunately, the batteries were shot. Luckily, a kind soul from the G-Wiz forum donated some replacements (seriously nice of them), and now the car is up and running. The plan — once I clear the next few tasks — is to start recording data and begin training an AI to drive it.

ROS2, the Rover Robot and the Robotic Arms
This month has been packed with ROS2 learning. I’ve completed the ROS2 Manipulator course on Udemy (and I’m nearly done with the self-driving course). I’ve successfully controlled three different robotic arms using MoveIt, Gazebo, and RViz.

Massive thanks to Compsoft for giving me time to dive deep into ROS2 — they had a cool idea involving it, which gave me the perfect excuse to learn. I still have plenty to master, but I’m feeling far more confident than I did a few months ago.

AI
ChatGPT has been incredibly helpful throughout the ROS2 journey. Sure, it’s made its share of mistakes — looping, incorrect suggestions, etc. — but it’s been a great learning tool. The bigger vision is to use AI to simplify robotic arm control, lowering the barrier to entry for others.

Burf.co
The main website has been updated to reflect my focus on robotics. The new goal is to offer consultancy and robot rentals — an exciting next step in the Burf journey!

Inmoov humanoid 3
Yes, somehow I’ve ended up with a third InMoov robot — rescued just before it was scrapped. It still needs a lot of work, but I’ve managed to piece it back together and source enough parts to upgrade the others. This one now has LCD eyes, which adds a fun new dimension.

The Plan
At the start of this year, I set myself three high-level goals:

  • MyRobotLab + The Inmoov + LLM
    (Rock paper Scissors demo)
  • ROS2 and the Rover Robot
    (ROS2-powered rover and MoveIt-controlled robotic arms)
  • Gwiz and predictive driving
    (Train an AI to drive the G-Wiz using collected data)

So far, I’ve successfully achieved the first two. The third — predictive driving with the G-Wiz — hasn’t really taken off yet, though it’s still on the roadmap.

In the meantime, I’ve also acquired a whole fleet of Sanbot Elf robots and rebranded Burf.co as a robotics-focused website.

Thanks to changes at work, I’m now spending a lot more time on robotics. That’s not only helped me hit my previous goals faster, but it’s also inspired and refined the next set of objectives I’m working towards

New Goals
These goals aren’t in priority order and will naturally evolve over time, but they represent the next phase in my robotics journey:

  • Create a Sanbot Remote Control App
    Design a controller that streams all sensor data from the Sanbot to a user interface, allowing remote movement and activation of functions.
    — Critical for the robotics rental business idea.
  • Continue to deepen my ROS2 knowledge — this remains vital for both work and personal robotics development.
    — Ongoing learning improves real-world application and problem-solving.
    • Fix bugs around MyCobot280/xArm hardware, so that API works well
    • Finish self-driving course on Udemy
    • Understand SLAM and mapping better so that a robot can travel between rooms
    • Add IMU support
  • Continue Developing the InMoov Humanoids
    These are great for showcasing my skills and drawing crowds at events.
    • Have an active one for improving Vision and LLM use. Think about using a Neural Net to give personality. Think about gestures.
    • Create a mobile Inmoov robot, even if its remote
    • Consider merging this with the Sanbot remote control app
  • Have Fun with the G-Wiz
    This one’s for fun, learning, and experimentation.
    • Design a remote-control system (concept-only for now)
    • Add sensors and record journey data
    • Use that data in a self-driving AI test
    • Explore ROS integration for car control

These are some pretty epic goals, and definitely enough to keep me both challenged and inspired. Each one strengthens my experience in robotics across multiple fronts — hardware, AI, mobility, UX, and control systems.

I’ll need to keep an eye on context switching to ensure I stay focused enough on one thing at a time to make meaningful progress.