James Harton James Harton

November 2026: Donkey Work and a Summer Break

Lars gets a free Donkey Car moving with Beam Bots, actuator errors learn to tell the truth, and I'm taking an OSS break over summer.

This month's update is late because I've been completely burned out since getting back from Goatmire. Last month I blamed the jet lag. It turns out you can't fix all of this with a few early nights.

I'm taking the summer off from major open source work — Ash and Beam Bots included — until after the Christmas and New Year holiday. It's time for an actual break.

Meanwhile, there's been plenty going on in the Beam Bots Discord. Other people's robots continue to be a very good reason to open it.

A Donkey Joins the Herd

Lars Wikman got a free Donkey Car at a conference he was attending. There were some left over from a previous year's event, which is a much better class of conference leftover than another tote bag.

Lars's Donkey Car: an RC chassis with chunky tyres and a yellow frame carrying a Raspberry Pi and PCA9685 servo board Photo: Lars Wikman, Underjord. All Rights Reserved.

It's essentially a standard RC car chassis with a Raspberry Pi and a PCA9685 servo board mounted on top. Nothing particularly challenging in the kinematics department, but Lars seems to be having a great time getting it to drive around with BB. Getting the camera working is his next challenge.

We already have bb_policy, for running learned policies against a robot. As far as I know, nobody has actually used it yet. I plan to change that in the new year. For now, the donkey has wheels; the homework can wait.

A Late Command Is Still a Command

The main framework change since the October update is bb 0.33.0.

Previously, when an actuator was missing or took too long to answer a synchronous command, the call exited. Now those cases return structured errors:

  • ActuatorNotRunning means nothing received the command.
  • CommandPending means the caller stopped waiting, but the command is still queued and will most likely be applied.

That distinction matters when the thing on the other end is a robot. A timeout isn't a cancellation, and retrying can put another command behind the first one. The new errors let a controller or UI handle these cases without catching exits. An actuator that crashes while processing a command can still exit the caller.

This is a breaking change: code that relied on timeout or missing-process exits needs to handle error tuples instead. Actuator paths are also validated now: pass a bare actuator name or its full path from the root link. Partial paths raise an ArgumentError, rather than half-working and publishing to the wrong topic. The details are in #293.

bb_mcp 0.3.5 follows through on that distinction: send_joint_positions reports a late actuator as pending, with instructions to read joint state before sending another target. Telling an agent that a move failed while the arm is busy doing it was not a recipe for good decisions. bb_kino 0.4.5 displays the new errors too. The equivalent LiveView change is merged, but hasn't had a new release yet.

A Few Loose Ends Tied Up

bb 0.32 is out. The changes previewed last month shipped on 12 October in 0.32.0: arm epochs, the unified actuator delivery API, estimator freshness fixes and command-result validation. If you're upgrading from 0.31, last month's migration notes still apply. bb_ik_dls 0.6.1 and bb_ik_fabrik 0.8.1 update their trackers to use the new API.

Setting a Feetech servo ID works again. Damir Batinović fixed the pattern matches in mix feetech.set_id, which could crash on a perfectly successful :ok response. That's in feetech 0.4.1. Thanks, Damir!

Policy actuator targets got a fix on main. bb_policy was wrapping bare actuator names in lists, turning them into partial paths. That lost messages from the proper PubSub topic before, and raises under 0.33's stricter validation. It now passes targets through unchanged. There's no new GitHub release to announce for this one.

Tests are doing less sleeping. A sweep across core and the satellites replaced many sleeps and timing guesses with messages, monitors and explicit synchronisation. The core PR has the details. Waiting for evidence that something happened makes for a much more useful test than hoping the CI runner got round to it in 50 milliseconds.

See You After the Holidays

Thanks to everyone sharing builds, helping each other and finding the bits that don't quite work yet. It's lovely seeing people have fun with this stuff.

Keep posting your robots in Discord. I'm going to recharge the part of this project that doesn't have a USB port.