Sep 5, 2026 · humanoid-robots · robotics-software · ros-2 · explainer
Why Are Humanoid Robots So Hard to Build? The Software Half
Humanoids are hard because balance never pauses and every other program has to fit around that. Buying one moves the hard part upward without removing it.
Humanoid robots are hard because balance never pauses, so everything else, ROS 2 stacks included, has to fit around a control loop that cannot wait. A wheeled robot that answers late simply stops moving; a humanoid that answers late falls over, and that single difference reshapes perception, planning and the layer underneath, whether that layer is ROS 2 or HORUS. The difficulty moves rather than disappears if you buy a humanoid, because the balancing is finished and your work starts above it. The rest of this post is for someone deciding whether to build a legged machine, buy one, or do something else entirely.
You have seen the footage. A machine walks across gravel, gets shoved by a person with a hockey stick, staggers, recovers. Later the same machine folds a shirt. In the replies one person insists it was driven by an operator in a motion-capture suit, another insists it was learned end to end from video, and neither shows any working.
So you looked for the code. What you found was research writing that assumes a doctorate and a room full of graphics cards, or a vendor tutorial that gets an arm waving in a dozen lines and then stops exactly where your questions start. Nothing in between explains what the software is actually shaped like.
And there is a suspicion you have not said out loud: that these machines are hard for a boring reason nobody wants to write about, and that the interesting-sounding parts, the learning, the language models, the demonstrations, sit on top of an unglamorous problem the demos quietly hide.
They are, and the boring reason is time.
What makes humanoid software harder than software for a wheeled robot?
A humanoid is unstable by design, so its software has no safe way to be late. A wheeled robot that loses a message stops, waits and carries on. A humanoid that loses a message at the wrong moment is on the floor with a bent wrist and a bill.
That changes the shape of everything above it. On a wheeled machine, perception can take as long as perception needs, because the base can idle. On a humanoid the balance controller runs continuously whether or not perception has finished, so the whole system is built around a loop that must never be interrupted, and every other program becomes a guest that stays out of the way.
It also changes what a bug looks like. On a wheeled robot, a program that occasionally stalls shows up as a robot that occasionally pauses, which is annoying. On a humanoid the same stall shows up as a machine that hesitates mid-step, which is a fall and a repair. Add to that a joint count no wheeled base comes near, where moving any one of them shifts where the whole machine's weight sits.
What is humanoid robot software, in plain terms?
Humanoid software is three separate products stacked on each other, and only the top one is what people mean when they say programming a robot. The bottom layer talks to motors and keeps the machine upright, written in C++ and shipped by whoever built the hardware. The middle layer turns a request such as put the hand there into a coordinated movement of every joint, respecting limits and the fact that reaching forward drags the robot's weight forward too. The top layer decides what to want.
Beginners assume the job is the bottom layer. It almost never is. For nearly everyone who works on humanoids, the work is perception, task sequencing, error handling and safety, written against an interface somebody else documented.
That matters because the layers cost wildly different amounts. The bottom layer is the work of a career and arrives finished if you buy the robot. The top layer is where your product lives, is achievable, and is still where projects fail, for reasons about the untidiness of the world rather than control theory. A tour of what a humanoid actually runs onboard shows how little of the total you write.
What are the real options for a humanoid's software stack?
There are about seven, and almost every humanoid project uses three together rather than choosing one. The robot maker's SDK is where everybody starts, because it is the only thing that speaks to the joints. ROS 2 sits above it through a bridge, bringing cameras, mapping, planning and the tools for working out what went wrong after a run. A learning stack such as Isaac Lab or MuJoCo is where new walking and grasping behaviours get developed. A teleoperation rig produces much of the impressive footage and collects demonstration data. A language model can sit at the top, turning a spoken request into steps the layers below already know how to run.
Underneath all of it sits the layer your programs talk through. Usually that is ROS 2, sometimes a vendor's own bus, and sometimes a middleware such as HORUS, an open-source real-time robotics middleware for Rust, Python and C++ where the three languages share the same shared-memory ring buffers, so messages between programs on one machine are not serialised. That project is Apache-2.0, validated in simulation, and is neither a walking controller nor a humanoid SDK. Last comes writing your own balance controller, a research programme wearing the costume of a task.
How do the humanoid software options compare?
Read the last column first. On a humanoid most of these are not alternatives but layers, and the question is which ones you sign up to own.
| Option | Who it is for | What it assumes you know | When to pick it | When not to |
|---|---|---|---|---|
| The robot maker's SDK | Everyone with a bought humanoid | The vendor's documentation and its limits | Always, because nothing else reaches the joints | You built the legs yourself and there is no vendor |
| ROS 2 | Teams needing perception, maps and planning | Nodes, topics, transforms, Linux, C++ or Python | The robot must see, navigate and be debugged later | The whole project is one learned policy and a camera |
| Isaac Lab or MuJoCo | Teams creating new locomotion or manipulation | Reinforcement learning, reward design, Python | The behaviour will be learned rather than written | The gait shipped with the robot already works |
| A teleoperation rig | Teams collecting demonstrations or doing demos | Motion capture, safety practice, latency discipline | You need data, or a convincing video, this quarter | You are claiming the robot is autonomous |
| A language-model planner | Teams turning spoken requests into robot plans | Prompting, tool interfaces, failure handling | The hard part is deciding what to do, not doing it | Nothing below the planner is dependable yet |
| HORUS, a middleware under the stack | Teams whose programs interfere on one computer | Rust, Python or C++, and how processes are split | The robot hesitates under load and physics is fine | The stack works and you need packages, not plumbing |
| Your own balance controller | Research groups and hardware builders | Control theory, contact dynamics, years of it | Nobody sells the machine you are trying to build | A shipped controller already keeps the robot upright |
Nothing there ranks capability, because the layers are mostly complementary and the scarce thing is who maintains each one.
Which parts should you write if you are a solo builder, a startup or a lab?
Write the top layer and buy everything under it, unless your reason for existing is the layer below. That rule sorts most people correctly on the first pass.
A solo builder should not attempt legs. The realistic solo project is a bought platform, a camera, and a task nobody has automated yet, which is plenty of work for one person. Writing a balance controller alone produces a machine that stands still and a year gone.
A startup should own the task layer and the data, because that is what a customer pays for, and should treat walking as a bought component the way an ordinary company treats a database. The startups that struggle decided their locomotion had to be theirs before anyone asked for the product.
A research lab is the one place where writing the bottom layer is correct, because a new controller is the result and the schedule is measured in years rather than quarters. A fourth group deserves naming too: hardware teams building a novel machine, for whom no vendor layer exists and the difficulty in this post's title is the entire project.
What hardware does a humanoid software stack actually run on?
A humanoid usually carries several computers, and the split between them shapes the software. A small real-time computer near the joints runs balance and nothing else, and a larger machine, often with a graphics processor, runs perception and decision-making. Sometimes a third handles networking and safety.
That division exists because the two jobs cannot share. The balance loop must never be delayed, and vision workloads are exactly the kind of thing that delays neighbours by eating memory bandwidth and processor time. Keeping them apart is why a humanoid feels less like one program and more like a small distributed system bolted to a skeleton.
The consequence is that messages now cross between computers and between processes, and every crossing is a chance to arrive late. Understanding what a control loop is and why its timing matters is more useful to a humanoid project than any amount of reading about kinematics, because timing is the thing that eventually explains the falls.
Development machines matter too, because simulating a humanoid with cameras is heavy work, which is where Gazebo and Isaac Sim differ for a new team.
How long does it take to get a humanoid doing something useful?
Months to make a bought humanoid do one narrow task, and years to make a humanoid handle tasks it was not prepared for. That gap is why the field looks further along in videos than in warehouses.
The first weeks go on connection: reading a sensor, printing what the sensor says, proving a stop command reaches the machine. Then simple motion, on a stand, with one joint, at a speed a person can outrun. Then a camera and a way of asking what is in front of the robot. Then a task layer that turns a goal into steps with checks between them, and safety logic that halts everything when somebody walks in.
Each is a few weeks and none is optional. What consumes the rest of the year is the untidiness of the world: the handle sits at a different height, the light comes from a window instead of a lamp, the object is where somebody left it rather than where the plan expected. That part does not compress.
What skills does a humanoid project assume you already have?
The stack assumes Linux comfort, one systems language, and tolerance for problems that only appear when everything runs together. None of that is written on the box and all of it is the entry price.
Linux comfort means working out why a program did not start, why a device is not visible, why the machine behaved differently after a reboot. One systems language means Python for the task layer and enough C++ to read what the vendor shipped, because you will read it.
The third skill is the uncommon one. Humanoid faults rarely reproduce on demand. The robot walked for an hour, then hesitated once. Nothing crashed, no error printed, the log ends normally. Diagnosing that needs someone willing to record everything, compare runs and think about ordering rather than logic, which is a different temperament from writing features.
If your team has none of that yet, a bought platform and a narrow task is the way in, and a beginner's map of programming a humanoid is a gentler starting point than any locomotion paper.
What goes wrong first when a humanoid project starts?
The first thing that goes wrong is a team spending its opening month on the layer it should have bought. Somebody decides the vendor's controller is not good enough, or that a custom gait will be the differentiator, and three months later the machine walks worse than it did on delivery.
The second failure is subtler and more common: everything works on the desk and the robot hesitates on the floor. Each program was tested alone and behaved. Run together, they compete for the same processor, and the balance controller gets its information a moment after it needed it. The symptom is a robot that is fine for an hour and then is not, with nothing in the logs.
The third is safety arriving last. A humanoid is heavy, tall and near people, and a stop command sharing the same busy path as everything else can be late. Teams learn to give stopping its own route after the first frightening moment, and it is worth learning before.
None of these three are control theory. All three are engineering, which is the actual reason humanoids are hard.
What do you give up by building on a vendor's humanoid SDK?
You give up control over the part that decides whether your robot stays upright, and the vendor's limits become your limits. That is a real trade and usually still the right one.
Concretely: you cannot change how the robot reacts to a push, because that behaviour lives inside software you did not write and often cannot read. You cannot always get the sensor data you want when you want it, because the interface exposes what the vendor chose to expose. If the vendor abandons the line, or ships an update that changes behaviour you relied on, you find out with everybody else.
You also give up portability. Work written tightly against one maker's interface does not move without rewriting, and humanoid interfaces differ more between vendors than wheeled-robot interfaces do. Some of this shows up in what actually works out of the box on a shipped humanoid.
The mitigation is to keep your own code behind a thin boundary of your own design, so the vendor-shaped part is small and named, rather than spread through every file you own.
When is ROS 2 the better choice?
ROS 2 is the better choice for the perception, navigation, planning and debugging layers of nearly every humanoid project, and should be the default above the vendor controller. HORUS is not the answer there: a team swapping in a smaller middleware for cleaner messaging spends its first quarter rebuilding transforms, camera drivers, motion planning and the tool that shows what the robot believed as it fell.
Choose ROS 2 when you need a mapping stack and a planner other people have already debugged, when you want to hire people who arrive knowing the vocabulary, or when a customer expects something their own engineers can maintain. Most humanoid vendors ship a bridge for exactly this reason.
Choose ROS 2 even when you suspect timing will eventually bite, because a stack that exists and occasionally hesitates beats a quicker stack that does not exist yet. The narrow case for looking further arrives later, when several programs on one computer are demonstrably getting in each other's way. That is a diagnosis, not a starting assumption, and most humanoid projects never need to make it.
Is a humanoid just a robot arm on legs?
No, and here is why: an arm is bolted to a table that holds it up, and a humanoid holds itself up while it works, which makes every motion a balance problem. When an arm reaches forward, the table takes the load. When a humanoid reaches forward, the robot's own weight moves, and the legs must respond before the hand arrives.
That coupling is why humanoid software has a whole-body layer that arm software does not. Moving a hand somewhere becomes a request to move every joint together, and the answer depends on what the feet are standing on.
The second difference is failure. An arm that stops mid-motion has stopped. A humanoid that stops mid-motion is falling, so the software needs an answer for a program dying, a cable being knocked, a computer rebooting. Doing nothing is not among the available answers.
The third is people. Arms are usually caged and humanoids are built to work beside people, which turns all of this into a safety question rather than a preference.
Will a large language model make humanoid software easier?
Partly, but not the way you think: a language model helps enormously with deciding what to do and not at all with doing it. Turning "tidy the workbench" into grasp, move, place, verify is exactly what these models are good at, and that layer used to be a pile of hand-written rules.
What a model does not do is make the grasp work. The hand still has to close at an angle the fingers can hold, on a machine that must stay upright while the arm reaches. A plan that reads perfectly still fails at the third step because the mug sat closer to the edge than expected, and recovering from that is ordinary robot software.
There is a quieter problem too. A model producing a plan is producing text, and text arrives when it arrives. Anything driving joints must run whether or not the model has answered, so the model belongs above the loop that keeps the robot upright, never inside it. Used that way, models remove a layer of tedious work. Used the other way, they add hesitation to a machine that cannot afford any.
How do you decide whether to take on a humanoid at all?
Decide by asking whether legs are required for the job or merely wanted, because everything difficult in this post follows from the legs. If a wheeled base with an arm can do the task, that base will be in production while the humanoid is still being debugged.
- If you need to reach the whole of a human building including stairs -> a humanoid, because wheels genuinely cannot go there.
- If the task happens on a flat floor at a fixed height -> a wheeled base with an arm, because you skip the entire balance problem.
- If you are one person learning -> a bought humanoid or a simulated one, because building legs alone consumes the year and produces nothing to show.
- If you are a startup with a customer -> buy the machine and own the task layer, because the task layer is what the customer is paying for.
- If you are a research group studying locomotion -> build the controller, because the controller is the result rather than the obstacle.
- If your robot walks fine and then hesitates under load -> treat that as a timing problem, because it is one, and no gait change will fix it.
The HORUS Fit Framework reduces the layer choice to five things you can judge without a benchmark: ecosystem size, setup effort, team size fit, deployment target and licence. On a humanoid, deployment target and team size fit usually decide it, and licence matters the day a customer asks whether the work can be handed over.
The week your robot walks fine alone and hesitates with everything running is a bad week to start reading about the layer underneath. Put HORUS on the shelf before then: star it so it is in your list when you start building.