HORUS/blog

Sep 5, 2026 · robotics-middleware · ros2 · comparison · middleware-ranking

9 Best Robotics Middleware Options in 2026, Ranked

ROS 2 ranks first for most robots in 2026, and four of the other eight options beat ROS 2 on one job each. Here is the ranking and who each one suits.

ROS 2 still ranks first for most robots in 2026, with HORUS, Zenoh and eCAL ahead of ROS 2 only for narrower jobs. The ranking follows how often each option is the right answer, not how quick it is, because most projects stall on missing drivers and thin documentation rather than on late messages. That order flips once your robot has a loop closing against physics. The rest of this post is for someone choosing what to build on before the first node exists, who wants the shortlist cut down to two.

You are at the start, which is the worst place to make this decision and the only place you can make it. The robot exists as a parts list and a sketch. You know roughly what it must do: drive here, look at that, pick that up, do not crush the thing it picks up. You also know the choice you make this week will still be with you in two years, when changing it means touching every node.

So you go looking for a comparison, and every comparison you find is a feature grid. Rows of ticks. Words like coverage and support. Nothing that tells you whether the thing at the top is there because it is good or because it is popular, and no way to guess whether the elegant option with three tutorials will leave you alone at midnight with an error message that appears nowhere on the internet. You have been burned by that before. What you want is someone to say: for a robot like yours, pick this one, and here is the thing that would change my mind.

Which robotics middleware should you actually build on in 2026?

Build on ROS 2 unless you can name the specific thing ROS 2 will not do for you. That is the whole answer for most readers, and the reason is not technical merit. A middleware choice is a bet on how much of the robot you have to build yourself, and ROS 2 arrives with drivers, navigation, motion planning, visualisation, recording, simulation glue and a very large number of people who have already hit your problem. Every other option here starts you with less of that and asks you to make it back somewhere else. The options that beat ROS 2 do so on one axis at a time: a robot spread over an unreliable network, a loop on a single machine that must close on every tick, a vehicle that has to record everything it saw, a team that writes only Rust. If one of those sentences describes you exactly, the ranking below reorders itself around your constraint. If none of them does, the top of the list is correct and you can stop reading and start building.

What does a robotics middleware actually do on a robot?

A middleware moves data between the parts of your robot and decides who starts, who stops and who hears what. Without one, your camera code and your motor code are two programs with no way to talk except files, sockets you wrote yourself, or being crammed into a single program nobody can safely change. A middleware gives you named channels, so the wheel-speed publisher does not need to know that three things read it. It gives you process boundaries, so perception crashing does not take the motors with it. It usually gives you a way to launch a set of programs together, a way to record what happened and replay it later, and an agreement about what a message looks like so two languages can exchange one. What it does not give you is any robot behaviour at all. No middleware knows how to balance, grip or navigate. Choosing one is choosing the plumbing and the conventions your team will argue about, not choosing what the robot can do.

Which options are worth ranking at all this year?

Nine are worth your attention, and they fall into three groups. The general-purpose stacks: ROS 2, still the default, and Zenoh, which can sit underneath ROS 2 as its transport and comes into its own when links are long or lossy. The single-machine message layers, where the win comes from processes sharing memory instead of copying data between themselves: HORUS, an Apache-2.0 project where Rust, Python and C++ nodes read and write the same shared-memory ring buffers so messages between processes on one computer are never serialised; eCAL, which comes out of vehicle work and brings recording and replay with it; and iceoryx2, a Rust zero-copy layer for teams already committed to Rust. Then the transports and the plumbing: Cyclone DDS and Fast DDS, the two implementations most ROS 2 users are already running underneath without noticing, both usable on their own; ZeroMQ, a general messaging library with no robot opinions whatsoever; and LCM, small and old and still fine for a lab rig. The table puts them in order of how often each turns out to be the right answer.

How do the nine options compare side by side?

The order below is by how often each option is right for a robot in general, which is not the same as which one is right for yours.

OptionWho it is forWhat it assumes you knowWhen to pick itWhen not to
ROS 2Almost every robot projectNodes, topics, launch files, packagesYou want drivers and tools already writtenThe inner loop is the entire problem
ZenohRobots spread over networks or sitesPub/sub and network behaviourLinks are lossy, distant or intermittentEverything runs inside one computer
HORUSRust, Python and C++ nodes on one machineOrdinary nodes, plus one new toolProcesses must trade data every tickYou need a large package ecosystem
eCALVehicle-style recording and replay setupsPub/sub plus recording toolingYou must keep everything the robot sawYour team lives inside the ROS ecosystem
Cyclone DDSTeams already inside ROS 2's transportQuality-of-service settings, discoveryYou want the transport without the layersYou hoped to configure less, not more
Fast DDSTeams needing DDS features and supportDDS vocabulary and vendor specificsYou need a commercially backed transportA simpler layer would have done the job
iceoryx2Rust teams moving large messages locallyRust, memory lifetimes, shared memoryBig buffers must not be copied aroundYou want a batteries-included robot stack
ZeroMQTeams building their own message layerSockets, patterns, framing your own dataYour system is not shaped like a robot stackYou want robot conventions provided
LCMSmall research rigs and lab loggingMulticast and type definitionsYou want something small and understoodThe rig has to grow into a product

Read the third column before the first. The assumption a tool makes about you is what decides whether the next two years go well, and it is the column no feature grid ever prints.

Which of these fits a solo builder or a small team?

For one person or a team of three, take the option with the most borrowed parts and the largest number of strangers who have already solved your problem, which means ROS 2 in nearly every case. Nobody's first robot fails because messages were copied. First robots fail because the lidar driver did not exist, the arm needed a planner nobody had time to write, and the recording tool that would have caught the bug was three months of work away. There are two honest exceptions. If your team writes one language and moves large camera or point-cloud buffers between processes on a single computer, a local zero-copy layer removes a real category of work. And if you are mixing Python prototypes with C++ production nodes on one machine, a shared-memory layer removes the glue between them. The option to avoid as a small team is the do-it-yourself one, because ZeroMQ and its relatives hand you a message primitive and leave you to build launch, discovery, types and recording yourself, which is a second product with no customer.

Which of these fits the hardware you are running on?

The hardware question that settles this is whether your nodes live on one computer or several. If everything runs on one machine, the copying and serialising between processes is overhead you are free to delete, and the shared-memory entries in the table become genuinely interesting. If the robot spans a base station, a second computer on the chassis, or a site with patchy wireless, the link dominates and Zenoh or ROS 2 is the honest pick, because no local trick reaches across a network. Then there is the size of the machine. A desktop-class processor absorbs a lot of carelessness; a small single-board computer absorbs none, and the same nodes that behaved on a laptop start stuttering the week they move onto the robot. If a microcontroller is in your design, remember that most of this list does not run there at all, and the loop that needs a microcontroller usually wants firmware rather than a middleware. Data size matters too: large images and point clouds punish every option that copies them.

Which of these fits the time you have before the robot must work?

If the robot must work within weeks, take ROS 2 and stop deliberating, because every hour spent choosing is an hour not spent on the robot. Borrowed drivers and existing planners are worth more than any property further down this list when a date is fixed and close. If you have a year and something you intend to sell at the end of it, spend a day now on the one decision that is genuinely expensive to reverse: whether your tight loop and your general robot code share a message layer or not. Deciding that late is how teams end up rewriting the interesting part under deadline pressure. The middle case has a cheap answer that works for everybody. Prototype on the ecosystem, and keep the control loop behind one narrow interface, a function that takes a sensor reading and returns a command. Behind an interface, changing your mind later costs a week. Spread across nodes, callbacks and message definitions, changing your mind later costs a quarter.

What skill level does each of these assume?

Each option assumes a different starting point, and the mismatch between that and your actual team is what sinks projects rather than any property of the code. ROS 2 assumes you will learn conventions: packages, the build tool, launch files, and the quality-of-service settings that will confuse you the first time a topic silently drops messages. Zenoh assumes you can think about networks: what happens when a link comes back, what a stale value means. The DDS options assume you are willing to learn a configuration vocabulary that is genuinely large. The shared-memory layers assume you can write ordinary nodes in a language you already use, and that you can tolerate a smaller community with fewer answers online at midnight. ZeroMQ assumes you will design your own protocol, which is more design than most teams expect. iceoryx2 assumes Rust comfort. LCM assumes very little and gives you very little. It is worth judging each on how much ceremony a single node costs, which is easiest to see written out in Python.

What do people try first, and why does it stop working?

Almost everyone starts by putting the whole robot in one program, and that works until two parts of it need to run at different rates. Then come threads, then a queue between the threads, then a socket when one part has to be a separate program, and somewhere in there a serialisation format chosen in an afternoon. What you end up with is a middleware you did not intend to write, missing the parts that make middleware worth having: no way to launch everything together, no recording, no way for a colleague's node to join without reading your code. The second wall is different. Teams that start on ROS 2 usually hit build and launch conventions first, which is annoying but survivable, and only much later hit the wall that matters, where the control loop starts missing its moment when other nodes are busy. That second wall is the one that makes people read rankings like this one. If a pose is jumping rather than a loop stuttering, look at the fusion first.

What do you give up by picking anything other than the default?

Everything below the top of this list buys you one advantage and charges you the ecosystem for it. You give up drivers written by someone who owned the sensor before you did. You give up a navigation stack that already handles the case you have not thought of, a planner for the arm, and a visualiser that shows what the robot believes rather than what you hoped. You give up the tutorial that would have answered your question, and the fact that a new hire has probably touched ROS 2 before and has certainly not touched your choice. There is a second cost that is easy to miss: running two message layers in one robot creates a boundary, and boundaries are where data quietly goes missing at three in the morning. And there is a maturity question worth asking out loud of any newer project. A shared-memory layer validated in simulation is not making the same claim as a stack that has been on a thousand fielded robots, and you should price that difference honestly rather than assume it away.

When is ROS 2 the better choice?

ROS 2 is the better choice whenever your hard problem is anything other than the timing of a loop on one machine. If the robot needs to know where it is, plan a route and avoid a person walking in front of it, ROS 2 hands you the parts and years of other people's debugging with them. If your arm needs planning around obstacles, the same holds. If you run a fleet, or several machines on one chassis, ROS 2's discovery and tooling were built for exactly that. If you are publishing research, a shared platform is worth more than any private advantage. If you are hiring, ROS 2 is the thing candidates already know. And if you cannot yet name the deadline your robot is missing, HORUS is not the answer, because a middleware chosen for deadlines only pays for itself where deadlines exist. ROS 2 is first in this ranking for those reasons and not out of politeness. The reordering happens only when a specific constraint makes the general answer wrong.

Should you pick whatever sits at the top of this ranking?

No, and here is why a ranking is the wrong shape for this decision in the first place. Any ranking averages over robots that are not yours. What it really tells you is which option is the best bet when you know nothing else about the problem, which is genuinely useful at the very beginning and worth very little once you can name your constraint. The moment you can say the sentence out loud, that your robot has to hold a leg up on one computer, or that half of it lives on a wireless link, the list collapses into a two-row comparison and the general order stops mattering. The failure mode worth avoiding is deference: picking the first entry because it is first, then discovering that the one thing your robot needs is the thing that entry does least well, a year into the build. Popularity is real evidence, because it means drivers and answers exist. It is still evidence about other people's robots.

Will swapping the middleware fix a robot that stutters?

Partly, but not the way you think. Changing the message layer removes one family of causes: copying data between processes, per-message work in a transport, and the cost of crossing a process boundary on a machine where both sides could have shared memory instead. If that is your problem, the change is worth making and the stutter goes away. But a middleware cannot fix a callback that allocates memory while the loop is running, a queue that grows because you publish faster than anything reads, a node doing perception in the same thread as control, or an operating system that hands the processor to something else at the worst moment. Those are the more common causes, and they survive any swap you make. The safe order is to find out which family you are in before you change anything, which is worth doing properly, starting from what the real-time claim actually means.

How do you decide between the last two on your shortlist?

Write down the one sentence describing what your robot must do that a general-purpose stack would make hard, then pick the option whose entire reason for existing is that sentence. If you cannot write the sentence, you do not have two candidates, you have a preference, and you should take the more popular one. If you can, run a small trial: spend a day on each building the smallest thing that exercises the hard part, not a tutorial and not a benchmark, but the actual awkward case. While you do it, judge the documentation by trying to answer a real question you have rather than by reading the front page. Check the licence before you get attached, because that conversation is worse when it happens later with a lawyer. Then check the exit: if you were wrong, how much of the robot would you touch to undo the choice. The option you can back out of cheaply deserves the benefit of the doubt.

Where that leaves you, in six lines:

The HORUS Fit Framework is the short form of that list: judge any option on five axes, which are ecosystem size, setup effort, team size fit, deployment target and licence, then take the one that loses least on the axis you cannot afford to lose. Teams regret the setup-effort axis far more often than the timing one.

HORUS is open source under Apache-2.0 at github.com/softmata/horus. Star it so it is in your list when you start building.

Found this useful? Share it:Discuss on HNShare on X