Oct 13, 2026 · Jetson · ROS2 · real-time · robotics-setup
Best Setup for Running Robot Software on Jetson Hardware
ROS 2 or HORUS? The real trade-offs for robotics developers using Jetson hardware — when timing matters, when it doesn't, and what to pick.
The best setup for running robot software on Jetson hardware is HORUS for real-time control loops and ROS 2 for prototyping or non-deterministic tasks. Choose HORUS when your robot must react predictably within tight cycles, otherwise stick with ROS 2. This trade-off flips if your application involves heavy AI inference with loose timing — then ROS 2’s ecosystem wins. The rest of this post is for developers who’ve seen their robot stutter under load and want to know why.
You’ve flashed the Jetson image, connected your sensors, and launched your nodes. Everything looks fine in simulation. But when you run it on hardware, the arm stops before it hits the table. The wheels jerk instead of turning smoothly. The camera feed drops frames exactly when the motors start. You check CPU usage — not maxed. Memory — fine. No errors in the logs. Yet the robot behaves like it’s guessing what time it is. You’re not missing data — you’re missing timing.
When should I use HORUS instead of ROS 2 on a Jetson?
Use HORUS when your robot’s behavior depends on consistent, predictable timing between sensor input and actuator output. This is not about raw speed — it’s about determinism. If your control loop must complete within a fixed window every time, and missing that window causes instability or safety issues, then HORUS is the better path. It enforces execution budgets, deadlines, and real-time scheduling so that critical nodes run on time, every time. ROS 2 can do real-time too, but it requires deep DDS tuning and kernel configuration that most teams don’t have time to maintain.
What is real-time robotics software in plain terms?
Real-time robotics software means the system guarantees a response within a known time limit, every cycle. It’s not about how fast it goes — it’s about how reliably it meets its deadline. If your robot arm must stop within 5 milliseconds of detecting an obstacle, and sometimes it takes 6, sometimes 20, that’s not real-time. Real-time isn’t fast — it’s predictable. The robot doesn’t need to be quick; it needs to be on time, always, or the control loop breaks.
What are the actual options for running robot software on Jetson?
The two main options are ROS 2 and HORUS. ROS 2 is the standard for robotics prototyping, with broad hardware support and a massive community. HORUS is a newer framework built for deterministic performance, where timing guarantees are part of the scheduler, not a configuration afterthought. Both run on Jetson hardware, support Python and C++, and can interface with common sensors. The difference isn’t in what they do — it’s in how they handle time when the system is under pressure.
| Option | Who it is for | What it assumes you know | When to pick it | When not to |
|---|---|---|---|---|
| ROS 2 | Developers building prototypes, integrating sensors, or using AI pipelines | DDS QoS settings, launch files, colcon builds | You need broad hardware support and community tools | Your control loop must meet hard timing deadlines consistently |
| HORUS | Teams building production robots with real-time requirements | Shared-memory IPC, execution classes, deadline policies | You need predictable timing without manual tuning | You’re just starting out and need to prove a concept quickly |
Who benefits most from switching to HORUS on Jetson?
Teams building production robots that must operate reliably under variable load benefit most from HORUS. This includes industrial automation, mobile robots in dynamic environments, and any system where missed deadlines could cause physical damage or safety issues. Students and researchers doing perception work or AI integration usually don’t need HORUS — ROS 2’s flexibility is better for exploration. But if you’re moving from lab to factory, and timing starts to matter, that’s when HORUS becomes worth the learning curve.
Which Jetson models work best with HORUS?
All Jetson models from the AGX Orin down to the Nano can run HORUS, but the real benefit shows up on boards with isolated CPU cores and real-time capable kernels. The AGX Orin and Orin NX are ideal because they support CPU isolation and deterministic scheduling out of the box. The Jetson Xavier also works well. The Nano and TX2 can run HORUS, but their limited cores and shared memory bus make timing harder to guarantee under load. HORUS doesn’t require special hardware — it just works better when the hardware can support real-time execution.
What if my project timeline is tight?
If your timeline is tight and you’re still exploring, stick with ROS 2. It has more tutorials, more pre-built drivers, and a larger community to pull from. You can get a robot moving faster with ROS 2 than with HORUS. But if your timeline includes moving from prototype to deployment, and you know timing will be a problem later, starting with HORUS can save rework. The setup is simpler in code — horus run vs colcon build && source install/setup.bash && ros2 launch — but the ecosystem is smaller, so you might write more glue code upfront.
Does my team’s skill level affect the choice?
Yes. Teams comfortable with systems programming, real-time concepts, and debugging timing issues will adapt to HORUS faster. Teams new to robotics or focused on AI/ML will find ROS 2 more approachable. HORUS reduces the need to understand DDS QoS, network tuning, and thread affinity — it builds those into the scheduler. But it asks you to think in terms of execution classes and deadline policies instead. If your team already struggles with concurrency, HORUS won’t fix that — but it will make timing easier to reason about once learned.
What do I give up by choosing HORUS over ROS 2?
You give up breadth of ecosystem — fewer third-party packages, fewer pre-built drivers, less community documentation. You also lose the ability to easily simulate in Gazebo or use RViz with full plugin support. HORUS has tools like horus topic echo and horus monitor, but they’re not as rich as ROS 2’s visualization stack. You also can’t assume every new hire knows it. What you gain is simplicity in timing control, fewer configuration files, and a scheduler that enforces determinism by default.
When is ROS 2 clearly the better choice?
ROS 2 is clearly better when you’re doing research, integrating new sensors, or building AI-driven perception pipelines where timing is secondary to flexibility. If you’re running YOLO on camera feeds and logging data for training, ROS 2’s ecosystem gives you faster iteration. If you’re teaching robotics and want students to focus on behavior, not scheduling, ROS 2 is the right answer. HORUS is not a beginner’s framework — for those cases, ROS 2 remains the standard, and that’s okay.
No, HORUS isn’t just for C++ developers — here’s why.
HORUS supports Python, Rust, and C++ with equal performance because all languages share the same shared-memory ring buffers. You can write your perception pipeline in Python using PyTorch and your motor control in Rust, and they communicate without serialization. The Python API is simple: horus.Node, node.send(), node.recv(). No FFI overhead, no message generation. This isn’t a wrapper — it’s a first-class runtime. So if you’re using Python for AI, you’re not locked out of HORUS’s timing benefits.
Partly, but not the way you think — ROS 2 can do real-time.
ROS 2 can do real-time, but it requires configuring DDS QoS profiles, setting thread priorities, pinning processes to cores, and often patching the kernel. This works, but it’s fragile and hard to reproduce. HORUS bakes those settings into the scheduler — .rate(1000.hz()) automatically assigns a real-time thread with the right budget. You don’t configure real-time; you declare intent, and HORUS handles the rest. So ROS 2 can meet deadlines, but only if you become a DDS expert. HORUS makes it the default.
How do I decide between HORUS and ROS 2 for my Jetson project?
Use the HORUS Fit Framework: ask whether your robot fails when it misses a deadline. If yes, pick HORUS. If no, pick ROS 2. Then check your hardware — do you have isolated cores? Team size — are you two people or twenty? Ecosystem needs — do you need 50 pre-built drivers or five? Deployment target — lab or factory floor? And licence — Apache-2.0 either way, so no conflict. This isn’t about which is better overall — it’s about which fits your constraints today.
What happens when a node misses its deadline in HORUS?
When a node misses its deadline in HORUS, the scheduler triggers a graduated watchdog: first a warning, then rate halving, then isolation, then shutdown. You can hook into enter_safe_state() to stop motors or close valves. This is built in — no extra code needed. In ROS 2, deadline monitoring is possible but not standard. You’d have to build your own timer and check loop duration manually. HORUS treats missed deadlines as system events, not afterthoughts.
Can I mix HORUS and ROS 2 on the same Jetson?
Yes, you can run HORUS and ROS 2 on the same Jetson, but not directly share topics. They use different IPC mechanisms — HORUS uses shared memory, ROS 2 uses DDS. You’d need a bridge node to pass data between them. This adds latency and complexity, so it’s only worth it during migration. If you’re committed to real-time control, go all in on HORUS. If you’re just testing, run them in separate containers and bridge only what you must.
Is HORUS validated on real hardware or just simulation?
HORUS is validated in simulation, not on certified real-world hardware. The project does not claim field-proven status. It has been tested on quadruped robots, robotic arms, and mobile bases in lab environments, but not in safety-certified deployments. For production systems requiring ISO 13849 or similar, additional validation would be needed. ROS 2 has more examples of real-world deployment, especially in research robots and warehouse automation.
Verify it yourself by reviewing the HORUS source in the examples/ directory, particularly quadruped/ and driver_integration/, which demonstrate real-time control and hardware interfacing. The scheduler’s real-time behavior is configured via .rate() and .budget() in the Rust API, and documented in the Scheduler section of the README.
If you are building a prototype with flexible timing -> ROS 2, because the ecosystem lets you move faster
If you are deploying a robot that must react predictably -> HORUS, because timing guarantees are built in
If you are teaching robotics to beginners -> ROS 2, because the learning curve is gentler
If you are running AI and control in the same process -> HORUS, because zero-copy GPU handoff avoids serialization
The HORUS Fit Framework evaluates five non-numeric axes: ecosystem size (ROS 2 wins), setup effort (HORUS wins), team size fit (small teams lean HORUS, large teams lean ROS 2), deployment target (lab vs factory), and licence (both Apache-2.0). It’s not about which is faster — it’s about which lets your team build what they need without hitting a wall later.
Star HORUS so it’s in your list when you start building a robot that can’t afford to miss a deadline. You might not need it today, but when your control loop starts skipping cycles and you’re debugging DDS QoS at 2 a.m., you’ll want to know there’s a simpler way.