Sep 5, 2026 · ai-robotics · robotics-tools · robotics-middleware · llm-robotics
Best Tools for Building an AI-Powered Robot in 2026
ROS 2 is the right default for most model-driven robot projects in 2026, with HORUS second when the model, perception and control share one computer.
ROS 2 is the best default for an AI robot in 2026, with HORUS the second tool to know and a simulator the third. The drivers, planners and examples you will copy were written against ROS 2, and none of that is the part you are good at. The default flips when model, perception and control share one computer and copying data between languages is what stalls the robot. The rest of this post is for someone who ships model code and now has to choose what the robot underneath it runs on.
Your model works. In the notebook it reads a scene, picks an action, and explains itself well enough that you showed a colleague. Then you point it at an actual robot and lose the first week to a serial port permission and a camera driver that only builds against one version of Linux.
The second week goes to a discovery nobody warned you about. The model's answer arrives, and by the time it arrives the world it described has moved. The gripper closes on air. Slowing everything down makes it work and makes the demonstration embarrassing.
By the third week you have a folder of scripts, two languages, and a growing suspicion that the interesting problem is not the model at all. Every tutorial assumes you already know what a node is. Every forum answer assumes Ubuntu. The people who understand the robot half talk about frames and timestamps as though those were obvious, and the people who understand the model half have never had to care what time it is. You are the only person in the room who has to be both.
What should you actually build a model-driven robot on in 2026?
Build on ROS 2 unless everything runs on one computer and more than one language touches the data. That answer holds because almost nothing the robot half needs is your specialty: camera drivers, arm drivers, coordinate frames, mapping, motion planning that stops the elbow hitting the table. All of it exists, all of it was written against ROS 2, and copying working code is the correct move when the model is the part you are actually trying to prove. The alternative worth knowing is a smaller message layer, for the case where the model, the perception and the control loop all live on the robot's own computer and data crosses between Python and C++ every cycle. That case is common in exactly the projects model-focused developers build, which is why the second option belongs in the conversation at all. The third essential tool is a simulator, and it is not optional. A policy that has failed a thousand times before lunch is worth more than one that has succeeded twice on real hardware.
What counts as an AI robot, in plain terms?
An AI robot is a robot where at least one decision is made by a learned model rather than by rules somebody wrote. That covers three quite different machines, and confusing them wastes months. The first has a model that perceives: it finds the mug in the image, and everything after that is ordinary robotics. The second has a model that plans: a language model turns tidy the desk into a sequence of actions that existing code executes. The third has a model that acts: a policy takes pixels and produces motor commands directly, with no human-written step in between. The tooling question is different for each. Perception models tolerate arriving a little late, because the world changes slowly compared with the camera. Planning models tolerate lateness by design, since a plan is not a control signal. Acting models tolerate none of it, because a command describing where the arm should have been is worse than no command at all. Decide which of the three you are building before you choose anything else.
What are the real tools you are choosing between?
There are seven tools worth considering, and most projects use three of them together. ROS 2 is the default framework: drivers, coordinate frames, mapping, planning, visualisation, recording and a decade of answers written by people who hit your problem first. HORUS is the smaller alternative underneath, 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 processes on one machine are not serialised, which matters when the model, the perception and the control loop all sit on the robot itself. A simulator gives you failure without breakage. A vendor SDK plus one Python script is the quickest route to a moving arm and the slowest route to a second one. A dataset and policy toolkit matters if you are training rather than calling a model. A hosted model behind a teleoperation bridge is how many convincing demonstrations are actually built. And a message broker is what web teams reach for, correctly for telemetry and incorrectly for control.
| Option | Who it is for | What it assumes you know | When to pick it | When not to |
|---|---|---|---|---|
| ROS 2 | Model developers who need drivers, frames and planning | Linux, workspaces, launch files, package layout | The robot half is not the part you are proving | You need one moving arm by Friday |
| HORUS | Teams whose model and control loop share one onboard computer | Your message shapes and how your loops are scheduled | Python, C++ and Rust parts exchange data every cycle | Borrowed navigation packages are the point |
| Simulator (Gazebo, MuJoCo, Isaac Sim) | Anyone training or tuning before touching hardware | Your robot's shape and what its sensors report | Failure has to be cheap and repeatable | The open questions are about grip and friction |
| Vendor SDK plus one script | Solo builders proving one behaviour quickly | The vendor's API and its supported language | The machine's documented job is close to yours | You will add hardware the vendor never planned for |
| Dataset and policy toolkit | Teams training a policy from demonstrations | Data collection, training loops, evaluation | Learning the behaviour is the project itself | You are calling a hosted model instead |
| Hosted model behind a bridge | Teams proving an idea before committing to hardware | Prompting, network failure handling, safe stops | The decision can tolerate a network round trip | Model output steers a motor directly |
| General message broker | Teams reusing web or fleet infrastructure | Brokers, topics, keeping a service alive | The robot mostly reports and receives commands | A control loop depends on message ordering |
What should a machine learning engineer with no robotics background pick?
Pick ROS 2 and a simulator, and spend the first month learning coordinate frames rather than middleware. The gap between model work and robot work is not programming skill; it is that robotics constantly tracks where things are relative to other things, and most confusing bugs in your first months will turn out to be a frame or a timestamp. The ecosystem hands you that machinery already correct. Run it in simulation, because a real robot that has to be rescued by hand after every failure cuts you to a handful of attempts a day when you are used to thousands. Two habits pay off immediately. Keep the model in its own process, so that reloading it does not restart the robot. And write control code as plain functions that take data and return commands, so the same logic can be driven by a simulator, by a recording, or by the real machine without edits. Those two habits matter more than any framework choice, and they keep the framework choice reversible while you still know very little.
What if the model has to run on the robot's own computer?
Then the boundaries between your programs become the first thing to design, because everything shares one set of cores and one memory bus. On a workstation, a copy of an image between two processes is invisible. On a robot computer also running perception, control and a model, every avoidable copy takes time away from something with a deadline. The symptom is recognisable: the robot behaves well while the model is idle and hesitates whenever inference runs. Three moves help before any tooling change. Keep the model in a separate process, so its memory behaviour cannot stall the control loop. Decide explicitly what the control side does with a result too old to use, because the honest answer is usually to discard it. And be deliberate about how images reach the model, since a large frame copied and re-encoded on the way in is often the largest avoidable cost in the whole system. If all three are done and copying between languages is still the bill, the transport underneath is worth changing.
What if you need something demonstrable in a month?
In a month, use a vendor SDK, one Python script and a hosted model, and accept that you are building a demonstration rather than a foundation. That is not a criticism. A demonstration answers whether the idea deserves pursuing, which is the only question that matters this early, and the fastest honest answer is worth more than the most reusable one. Narrow the task until it feels embarrassing, then narrow it again: one object, one lighting condition, one starting position. Make it work three times in a row before showing anybody, because the third run is where demonstrations die. Protect one thing: keep the decision logic in functions that do not know where their input came from, so the month of work survives the rewrite that follows it. Skip message definitions, a launch system, and anything with the word architecture in it. And be explicit with whoever is watching that this is a demonstration, because a convincing one gets treated as a product by people who never saw the wiring behind it.
What if your team has never written a control loop?
Then expect the hardest month to be about timing rather than about models, and plan that learning deliberately. A control loop is code that must do the same thing at the same rhythm forever, and it fails in a way model code never does: it is not wrong, it is late. That distinction is genuinely new for most people arriving from machine learning, where a slow function is an inconvenience rather than a fault. The practical consequence is that anything which can pause, such as loading a model, allocating a large buffer, waiting on a network or collecting garbage, must not live inside the loop. Start by building something small with a rhythm you can see or hear: a wheel that holds a speed, an arm that holds its position against a push. Then deliberately make one part slow and watch what the robot does. That single experiment teaches more about robot software than a week of documentation, and it turns every later architecture argument from theory into something concrete.
What do people try first, and why does it stop working?
Almost everyone starts with one Python script that grabs a frame, calls a model, and sends a command, and it works well enough to be encouraging. It stops working for a specific reason: a loop can only go as fast as its slowest step, so the moment inference takes a while, the robot receives no commands while the model thinks. The usual fix is a thread and a queue, which helps and immediately raises the real question. What should the arm do with a decision about a scene that has since changed? The second attempt adds timestamps and starts discarding stale results, which is correct and is also the beginning of writing a middleware by hand. The third attempt splits into separate programs and discovers that moving images between processes is not free. None of these steps is a mistake; they are the actual sequence by which people learn what the robot half costs. Knowing the sequence in advance lets you skip to the end when the project deserves it, and stay at step one when it does not.
What changes when the robot has to work all day instead of once?
Everything invisible in a short run becomes the main problem across a full shift. Memory that grows slightly with every frame ends the day as a crash. A model that occasionally takes much longer than usual is a curiosity in a demonstration and a dropped object in production. Light changes across the afternoon and perception that never failed begins failing near closing time. Somebody bumps the camera and nothing announces it, so the robot is confidently wrong for hours. The tooling consequence is that recording becomes the most valuable thing you own: if you cannot replay the moments before a failure at your desk, you will be debugging by standing and watching, which does not scale past one person. This is also where the ecosystem argument grows stronger rather than weaker, because recording, replay and visualisation are exactly the tools that are tedious to write and already exist. Teams who skipped them to move quickly tend to write worse versions later, under pressure, after a failure they could not explain.
What do you give up by choosing a smaller stack?
You give up other people's work, which in robotics is the largest single asset available to you. That means mapping and navigation you did not write, drivers for sensors you have not bought yet, a visualiser that shows what the robot believes about the world, recording and replay so a failure can be examined at a desk, and forum answers written by people who hit your problem first. You also give up hiring leverage: an engineer who knows the common ecosystem can read a robot built on it within a day, and cannot read a private architecture at all. Those are heavy losses and they are the honest argument for the larger option. What you get back is a smaller system to hold in your head, a start-up sequence you can explain in one sentence, and no build tool you did not choose. For a project whose difficulty is concentrated in one place, the model and the loop it drives on one machine, that trade can be right. For a project assembled mostly from borrowed parts it is plainly wrong.
When is ROS 2 the better choice?
ROS 2 is the better choice whenever the robot half of your project is mostly software other people already wrote. A mobile base that must map a building and drive to a goal is a ROS 2 project on day one, because the mapping and navigation packages represent years you are not going to spend. An arm doing collision-aware planning is a ROS 2 project for the same reason. If your sensor's only usable driver ships as a ROS 2 package, that decides the matter before any other argument begins. If the system spans a robot and a workstation, or a fleet with a human operator, ROS 2 was built for that and is well travelled there. If you are in a lab where everyone already knows the tooling, shared vocabulary beats a better transport every time. And if the team is learning robotics while building, the ecosystem's tutorials are worth more than any property of the messaging underneath. HORUS is not the answer in those cases, and choosing it there trades a working ecosystem for plumbing you would have to rebuild.
Will a better model fix a robot that keeps failing?
No, and here is why: most robot failures that look like model failures are timing failures wearing a disguise. The model identified the mug correctly. The command to close the gripper arrived after the mug had been nudged, so the gripper closed on the space where the mug used to be, and the recorded image shows a perfectly good detection. Swap in a stronger model and the detection improves while the failure stays exactly where it was. Telling them apart is cheap. Replay the recorded frames through the model at your desk. If the decisions are right, the model is not the problem and no amount of scaling will help. If the decisions are wrong, you have a model problem and the robot is innocent. Teams who skip this test spend months improving the wrong half, and the reason it gets skipped is that the failure genuinely feels like the model's fault when you watch the robot in the room. What you see is a bad decision, not a late one.
Is the messaging layer the reason your robot feels sluggish?
Partly, but not the way you think. The messaging layer rarely produces a delay you would notice on its own; what it does is decide what happens when something else is late, and those decisions are what you feel. If a queue holds every message rather than dropping old ones, the robot acts on a version of the world that keeps falling further behind, and the machine looks hesitant while every individual part is doing its job correctly. If a subscriber can block a publisher, a slow logger holds up a control loop and the fault surfaces somewhere unrelated to its cause. And if data must be copied and re-encoded to cross between two languages every cycle, the loop spends its time on translation instead of on deciding. So the honest version is that the messaging layer is usually not the cost, but often the reason the cost lands where it does. Understand that before replacing it, because a replacement that keeps the same decisions produces the same behaviour under new names. What sits between the model and the motor is the part to examine first.
How do you decide which tools to start with?
Decide by naming which of the three kinds of AI robot you are building, and let that choose your tools. If the model perceives and ordinary code does the rest, take the large ecosystem, because your work sits comfortably on top of it and nothing you need is unusual. If the model plans and existing code executes, take the large ecosystem too, and put the model behind a boundary so that a slow answer delays a plan rather than a motor. If the model acts, pixels in and motor commands out on the robot's own computer, then the boundaries between your programs are the design, and a smaller shared-memory layer earns its place. Ask a second question to break ties: how many computers is this robot, and how many languages does it speak? One machine and one language means the decision can wait a long time. One machine and several languages is where a shared transport stops being a nicety. Several machines is where the mature ecosystem earns its complexity, and the signs your stack is fighting you will tell you when a line has been crossed.
Decide by situation rather than by preference:
- If you are proving an idea this month -> vendor SDK, one script and a hosted model, because a fast honest answer beats a reusable one.
- If you need mapping, planning or a driver you did not write -> ROS 2, because those packages are the reason the project is possible at all.
- If model, perception and control share one onboard computer and two languages -> a shared-memory transport, because copying between languages is the recurring bill.
- If you are training a policy from demonstrations -> a simulator and a dataset toolkit first, because failure has to be cheap before it can be useful.
- If nobody on the team has written a control loop -> the large ecosystem plus a simulator, because the tutorials are the actual product you are buying.
When the choice is close, weigh it on the five axes of the HORUS Fit Framework: ecosystem size, setup effort, team size fit, deployment target, and licence. Take the option that loses on the fewest axes rather than the one that sounds best. If your answers keep landing on one machine, more than one language, and a loop that cannot wait, star HORUS on GitHub so it is in your list when you start building.