Running DROID on a Single Device

The influential DROID paper[1] showed many researchers and engineers how to set up a usable robotics stack, with 76k demonstration trajectories across 13 institutions, which was a lot of data (at the time).

The system uses a Franka (FR3), three ZED cameras, and two computers — including one Next Unit of Computing (NUC) orchestrating realtime control, and a workstation running policies or collecting data[2].

I kept wondering why two computers were necessary, and whether one really beefy PC could handle both roles (which luckily I had).

Yet, if one were to naively run the processes for these two computers into one, you would run into a lot of issues. Something as simple as rendering a cursor update could freeze the whole robot. Fortunately, work on running CPUs in realtime without the realtime kernel has been going on for the past two decades[3][4].

So which part of the standard recipe actually fixes the issue? And to what extent? In this post, I explore an alternative way to run the DROID stack, using one device.

Background

The software side of the DROID stack utilizes Polymetis[5], developed by Facebook, to manage the controller. The NUC is recommended to run the realtime Linux kernel.

Why Realtime?

Between the Franka Control Box and the client NUC, there is a 1000 Hz contract[6] where the box sends 2373 bytes via UDP, containing robot state information, and the PC needs to reply with the desired motion for the next cycle in a packet of size 371 bytes.

Below is that exchange. Slow motion walks through a single round trip; flip to Realtime to see what 1 kHz actually looks like, which is to say the individual packets disappear into a solid stream.

Cycles elapsed
0
Robot state2373 B · UDPDesired motion371 B · UDPFRANKACONTROL BOXFCI · UDP · 1 kHzFranka Research 3INTELNUClibfranka clientPolymetis · PREEMPT_RT kernelRobot state2373 B · UDPDesired motion371 B · UDPFRANKACONTROL BOXFCI · UDP · 1 kHzFranka Research 3INTELNUClibfranka clientPolymetis · PREEMPT_RT kernel

If a packet doesn't make it in time, the robot replays the last received torque verbatim[6]. However, if 20 consecutive packets are dropped, this would trigger the communication_constraints_violation exception, activate the protective stop, and the robot would freeze in place. Typically, a packet would take way less than 1 ms to arrive (p50 of about 114–116 µs on my system), but we want to decrease the worst-case delays. One long stall of 20 ms or more would be detrimental to the system.

These protective stop triggers are detrimental for multiple reasons. For one, teleop data collection becomes incredibly unreliable. A freeze in the middle of the trajectory is the epitome of low quality data. Moreover, task completion success rates would decrease drastically. For example, a robot operating an espresso machine may spill the coffee grounds everywhere if it froze in the middle of executing the task. So to avoid this, it needs to meet the 1 kHz requirement. To satisfy this contract, Franka's recommended method is to use the realtime Linux kernel[7].

Linux Realtime Kernel

Realtime control needs determinism, which normal Linux kernels don't provide. A high priority task can be bumped off the CPU core (or preempted, in proper jargon), if the OS deems another task more important. For example in the cursor rendering example I mentioned, that is a higher priority task. And this isn't easily preemptible by a user process.

Worst case scenario could be a few milliseconds of a process delay, which is irrelevant for most users. However, in robotics, this could have detrimental consequences.

There are multiple preemption modes in Linux, and the one recommended here is PREEMPT_RT. In this mode, anything the kernel runs can be preempted, and it performs a minimal amount of work when handling interrupts. There are some other tricks that the kernel does to improve determinism in running code too. The end result is that latencies drop very low[8].

However, there are some tradeoffs that are being made here for lower latencies. For one, overall throughput is lower: PREEMPT_RT turns interrupt handlers into kernel threads, and most spinlocks become sleeping rt_mutexes, both of which add overhead[8].

Another tradeoff is incompatibility with certain drivers. Most in-tree drivers work fine under PREEMPT_RT now that it's becoming more standard, but out-of-tree and proprietary drivers can be a problem. NVIDIA's GPU driver, for example, is officially unsupported on RT kernels and refuses to build unless you explicitly override the check[7].

That's why DROID needs a second computer. The workstation runs the GPU, and the NUC facilitates communications on the RT kernel. However, having an additional device is more costly, and another layer of friction to deployment.

So with all that being said, here's how I got the robot moving.

Method

The kernel has a few settings that you can turn on to isolate a CPU so that it can be a specialized CPU for a certain user task. Below is a brief introduction of each, but if you want to learn more, Frederic Weisbecker's series on CPU isolation[3] is a good read to get started.

CPU Isolation isolcpus

By default, the kernel scheduler will assign any task to any CPU. This means that our 1000 Hz communication process might get interrupted by another user process, or an unbound kernel thread. isolcpus takes the CPUs out of the scheduler's load balancing. So only tasks the user pins there explicitly get run, which means other processes won't interrupt ours[9].

Offload RCU Callbacks rcu_nocbs

The kernel uses RCU (read-copy-update) to let readers access shared data without locks. When old data is no longer in use, the kernel runs a callback to free it. By default, these callbacks run on the CPU that queued them, interrupting whatever is running there. rcu_nocbs moves them onto kernel threads that can live on the housekeeping cores, so the isolated cores don't have to do this cleanup[9].

Eliminate Timer Ticks nohz_full

Even though other processes won't interrupt ours, there are other things that could. One of the biggest culprits is the timer tick. Each core has a timer interrupt, which triggers around a thousand times a second for various bookkeeping reasons. By turning off the timer tick for our designated CPUs, we reduce even more interruptions in the process[10].

In addition, the tick is what drives RCU's per-CPU bookkeeping, so removing it also removes the RCU softirqs that would otherwise interrupt the core. nohz_full also turns on rcu_nocbs for the same cores.

Eliminate Interrupt Requests irqaffinity

Just like timer ticks, hardware interrupt requests (such as the arrival of a network packet, SSD read/write completion, or USB input) may disrupt the existing task. irqaffinity sets the default allowed CPUs for device interrupts to the housekeeping cores, so that these interrupts stay off the isolated CPUs[9]. The one exception is the robot's own network card: I deliberately steer its interrupts onto the isolated cores, so each packet is handled right next to the control thread.

Disabling hyperthreading

Hyperthreading lets two hardware threads run at the same time on one physical core, sharing its execution units. I found this one empirically: with hyperthreading on, the robot still froze even with all the other settings applied. Turning it off in the BIOS made the freezes go away.

Experiments

The recipe is well known, so I'll first show that it works on the real robot, then break down which piece makes it work, and to what extent. For the second part I started from stock Ubuntu and turned the settings on one at a time, rebooting between each, measuring the machine with a fake control box.

Does It Work?

To check that the setup works at all, I ran DROID's normal control stack on the FR3 from this single PC, once on stock Ubuntu settings and once with the full setup, and recorded how long the robot ran before a controller dropout.

In both runs, the PC was doing what it would during a real rollout: running a 3B-parameter π0.5 policy[11] on the GPU and streaming three ZED cameras, with no artificial stress load on top. Polymetis's 1 kHz control thread runs at SCHED_FIFO priority 80 with its memory locked (mlockall), inside a container restricted to the isolated cores 10–13. The policy and camera container is restricted to cores 0–6.

On the robot, when a certain amount of consecutive packets are missed, Polymetis catches the libfranka error and automatically recovers after a short wait (a second or two), which trips its own watchdog and kills the running controller. DROID then restarts it. Observing from the outside, the robot stutters and moves a lot slower than it should. The experiment counts controller restarts.

Timeline on a log time axis of how long the real robot ran before a controller dropout. On stock Ubuntu it dropped out 8 times in about 40 seconds: first after 12.2 seconds, then every 1.2 seconds at the median. With the full setup it ran about 6 minutes with no dropouts.
Time until a controller dropout (log scale)
Stock Ubuntu8 dropouts in ~40 s
first after 12.2 s from a clean start, then every 1.2 s (median, range 0.4–2.0 s)
Full setup0 dropouts in ~6 min
1 s10 s1 min6 min

On stock settings, the first dropout came within seconds, and after that the robot dropped out every second or two for as long as I let it run. With the full setup, it ran for six minutes without a single dropout. At the stock rate that would have been a couple of hundred. Zero events in six minutes doesn't prove the rate is zero, but it does put it at no more than about one per two minutes with 95% confidence[12], and in practice I've run the full setup for much longer without problems.

So it works. The next question I want to ask is how each setting contributes to the result.

Fake Control Box Results

Setup

To separate the settings, I built a fake control box so I could stress the machine and measure it without risking the real robot every few seconds. The fake control box sends a state packet every millisecond over a virtual network link, and a responder (standing in for the real controller) does a bit of busywork and replies. The responder always runs on CPU 12, one of the four cores the settings set aside for realtime work. I'll call those four cores the isolated cores and the rest the housekeeping cores. In my setup, cores 0–9 are housekeeping cores and 10–13 are isolated cores.

To make life hard for CPU 12, every run has the same background load from stress-ng[13]: CPU number crunching on every core, plus memory, disk, process-creation, socket and timer stress, emulating the kernel-heavy activities that are most likely to cause the freezes. The load isn't pinned anywhere, so the only thing that can keep it off CPU 12 is the settings themselves.

I measured CPU 12 with two standard kernel tools, rtla timerlat[14] and rtla osnoise[15]:

  • Wake-up latency. A timer fires, and we measure how long until our thread is actually running. This is the "can this core respond to me right away" number. The worst case is reported. Lower is better.
  • Noise. A busy loop runs at the control loop's priority, and the kernel adds up every microsecond something else takes the core away from it, and records who took it (a timer tick, a device interrupt, an RCU callback, another thread). Basically, this measures why the system isn't able to respond immediately. Lower is better.

A note on order: the settings depend on each other, so they can't all be tested independently. nohz_full only works on a core that's already isolated, so it has to come after isolcpus. And nohz_full quietly turns on a fourth setting, rcu_nocbs, which moves RCU cleanup work (callbacks the kernel runs after data structures are safe to free) off the isolated cores. To see what rcu_nocbs does on its own, it has to be added before nohz_full. Hyperthreading I left off throughout, since turning it on caused freezes on the real robot even with the full setup; I didn't measure it with the tools above.

Adding one setting at a time

Wake-up latency and noise on CPU 12 as each kernel setting is added, on log scales. isolcpus cuts the worst-case wake-up from 771 to 7 microseconds. nohz_full cuts total noise from about 10,000 to 130 microseconds per 26 seconds, and irqaffinity brings it to 6.
Wake-up p99.9 (µs)log scale
Stock Ubuntu184
+ isolcpus2
+ rcu_nocbs3
+ nohz_full4
+ irqaffinity (full setup)3
1101001k
Wake-up max (µs)log scale
Stock Ubuntu771
+ isolcpus7
+ rcu_nocbs8
+ nohz_full14
+ irqaffinity (full setup)8
1101001k
Total noise (µs per 26 s)log scale
Stock Ubuntu16,626
+ isolcpus6,765
+ rcu_nocbs10,137
+ nohz_full130
+ irqaffinity (full setup)6
1101001k10k100k

To see what was causing the noise, here is everything that interrupted CPU 12 during the fake control box runs:

Interrupts landing on CPU 12 per second as each kernel setting is added, on log scales. Hardware interrupts fall from 2,371 on stock Ubuntu to about 1,000 with isolcpus, 12 with nohz_full and 1.1 with the full setup. RCU softirqs fall from 564 to 0.05, and timer softirqs from 40 to 0.07.
Hardware interrupts / slog scale
Stock Ubuntu2,371
rescheduling IPIs (1,090 / s), timer tick (1,016 / s), NVMe SSD (233 / s)
+ isolcpus997
timer tick (995 / s)
+ rcu_nocbs999
timer tick (996 / s)
+ nohz_full12
LAN network card (7.3 / s)
+ irqaffinity (full setup)1.1
function-call IPIs (0.9 / s)
1101001k10k
RCU softirqs / slog scale
Stock Ubuntu564
+ isolcpus458
+ rcu_nocbs469
+ nohz_full1.1
+ irqaffinity (full setup)0.05
0.010.11101001k
Timer softirqs / slog scale
Stock Ubuntu40
+ isolcpus0.5
+ rcu_nocbs0.8
+ nohz_full1.1
+ irqaffinity (full setup)0.07
0.010.1110100

Breaking down each step:

  • isolcpus fixes latency. It's the single biggest change: once nothing else is allowed to be scheduled on CPU 12, the worst-case wake-up drops by two orders of magnitude. The rescheduling interrupts and SSD interrupts (which follow the stress processes around) disappear with it. What's left is mostly the timer tick, still firing about a thousand times a second.
  • rcu_nocbs did nothing measurable here. It moves RCU callbacks off the core, but our control loop barely generates any, so there was nothing to move. The RCU softirq count stays the same because the tick still triggers RCU's bookkeeping every millisecond; only the callbacks themselves move. (The noise going up is run-to-run variation in what's left, which is still dominated by the tick.) In production you don't need to set it separately anyway, since nohz_full turns it on.
  • nohz_full fixes noise. Turning off the tick removes the thousand-a-second timer interrupts and the RCU softirqs they were driving, and total noise drops by about fifty times. The wake-up max going up slightly here is not a regression: worst-case numbers from a single 60 s run vary a lot between runs, and nohz_full does add a small amount of bookkeeping each time the core enters the kernel. Look at the noise column for what this step is for.
  • irqaffinity removes the stragglers. With the tick gone, the remaining noise was mostly a network card queue that happened to be assigned to CPU 12. Steering device interrupts to the housekeeping cores removes it, leaving essentially nothing.

Two "can I skip it?" checks

Here are two more experiments testing if certain settings can be dropped.

Can I skip isolcpus and just steer interrupts away? No.

Skipping isolcpus, on log scales. With rcu_nocbs and irqaffinity but no isolation, the worst-case wake-up is 1,285 microseconds, noise is 19,163 microseconds and there are 2,702 hardware interrupts per second: no better than stock Ubuntu. The full setup gives 8 microseconds, 6 microseconds and 1.1 interrupts per second.
Wake-up max (µs)log scale
Stock Ubuntu771
rcu_nocbs + irqaffinity, no isolation1,285
Full setup8
1101001k10k
Total noise (µs per 26 s)log scale
Stock Ubuntu16,626
rcu_nocbs + irqaffinity, no isolation19,163
Full setup6
1101001k10k100k
Hardware interrupts / slog scale
Stock Ubuntu2,371
rcu_nocbs + irqaffinity, no isolation2,702
Full setup1.1
1101001k10k

Without isolation, the stress processes and their rescheduling and SSD interrupts are back on CPU 12, and the result is no better than stock. (nohz_full has to go too, since it means nothing without isolation.)

If I steer interrupts, do I still need nohz_full? Yes. Before running this one I wrote down what the build-up predicted: irqaffinity only removes device interrupts, so the tick and RCU softirqs should still be there and noise should stay in the thousands.

Predicted against measured for the full setup without nohz_full. Worst-case wake-up: predicted about 7 microseconds, measured 7. Timer tick interrupts per second: predicted about 1,000, measured 1,024. RCU softirqs per second: predicted about 470, measured 469. Total noise: predicted thousands of microseconds, measured 7,867.
MeasuredPredicted
Wake-up max (µs)predicted ~7 · measured 7
Timer tick interrupts / spredicted ~1,000 · measured 1,024
RCU softirqs / spredicted ~470 · measured 469
Total noise (µs per 26 s)predicted thousands · measured 7,867

The two settings remove different sources of noise, and they don't overlap.

What about the preemption model?

The stock kernel can switch between voluntary and full preemption at runtime, so I tested both with and without isolation. Here "missed replies" are replies that didn't make it before the next packet, out of 180,000.

Voluntary against full preemption, with and without isolcpus. The worst-case wake-up on CPU 12 is 771 and 1,653 microseconds on stock Ubuntu, and 7 microseconds with isolcpus in both modes. Missed replies are 3, 4, 9 and 0. Late packets from the fake control box fall from about 3,000 under voluntary preemption to 2 under full preemption.
Wake-up max on CPU 12 (µs)log scale
Stock Ubuntu, voluntary771
Stock Ubuntu, full1,653
isolcpus, voluntary7
isolcpus, full7
1101001k10k
Missed replies
Stock Ubuntu, voluntary3
Stock Ubuntu, full4
isolcpus, voluntary9
isolcpus, full0
Late packets from the fake control boxlog scale
Stock Ubuntu, voluntary2,807
Stock Ubuntu, full2
isolcpus, voluntary3,032
isolcpus, full2
1101001k10k

Full preemption made no difference to the isolated core, which makes sense: nothing on it needs preempting. Where it did matter was the fake control box itself, which runs on a housekeeping core alongside the stress load. In voluntary mode it regularly sent its packets late because it couldn't get back on its core quickly. That's a property of my fake control box, not of the real one, but it's a useful lesson: full preemption helps realtime threads you haven't isolated.

Conclusion and Limitations

Setting up the infrastructure properly around the robot is vital. Good policies are only as good as the infrastructure implementing the outputted actions. A freeze on a normal pick-and-place task probably isn't fatal, but as these robots proliferate and start to interact with people and objects outside the lab, getting the infrastructure right is crucial. Code for the fake control box will be posted here soon for reproduction.

A limitation of these experiments is the lack of hardware diversity. This is only verified on one device configuration, and CPUs with a lower frequency or fewer cores may not be as viable. So on a different CPU, YMMV. Future work would involve experiments on different types of CPUs.

Future Research

After exploring a system that could have network dropouts, an open-ended question that I think would be interesting to pursue:

Can a policy notice its execution is degrading and respond safely?

  • Policies are increasingly moving to a cloud-based inference solution, such as π0.7[16], Google's Gemini Robotics 2[17], and even GPT-6 Astra[18]. Current dropouts are invisible to the policy, as they only take in the physical state of the robot (i.e. joint position, Cartesian velocity, etc.), but they don't have any other information. They do not know anything about the status of the network, the harness orchestrating the actions generated by the models (although some models are able to store memories of past states and actions), or if there are hardware failures, like joint degradation or actuator failure. Furthermore, a possible direction the robot learning field is taking is to have a small and local corrective policy[19][20]. The larger, cloud-based models are not aware of these either. If, hypothetically, the harness degrades or the smaller model presents poor corrective behavior, can the policy notice it and make corrective steps in a safe manner? Concretely, I'd want to give the policy signals like commanded vs. measured torque and the control command success rate that libfranka already reports[6].
  • If someone is working on this I'd love to learn more about the research being done here :D

Appendix

A: Setup Details

CPUXeon w5-2555X, 14 cores, hyperthreading off in BIOS
KernelUbuntu stock 6.14.0-37-generic, PREEMPT_DYNAMIC (voluntary), HZ=1000
Isolated cores10–13 (control loop on CPU 12)
Housekeeping cores0–9
Held constant in every runC-states off, performance governor, swap off, RT throttling off
Per configuration3 × 60 s fake control box runs, 60 s wake-up latency test, 30 s noise test

B: Full Results

Every run, including repeats and the one taken with the DROID stack still running. The charts in the main text use the first stock run and the clean full-setup run. The machine and constants are in Appendix A; the only things that change between rows are the boot settings and the preemption model.

Real robot

Stock Ubuntu, one row per dropout. Trial 1 started from a clean controller start; each later trial started right after the previous dropout had recovered. Each dropout was logged as [CTRL] is_running_policy()=False -> restarting cartesian impedance.

TrialTime to dropout (s)
112.2
21.9
31.2
40.4
51.1
61.2
72.0
81.2

Full setup:

Container log window (UTC)Policy timestepsController dropouts
05:40:17 – 05:47:56~5,000 (~6 min of motion)0

Fake control box: control loop turnaround

3 × 60 s runs pooled per row. A miss is a reply that didn't arrive before the next packet. "Fake box late" cycles are excluded from scoring, since a real control box's clock never slips. Turnaround is in µs.

ConfigurationPreemptionDateNoteCycles scoredMissesMisses (ppm)Longest miss streakp50p99p99.9MaxFake box late
Stock Ubuntuvoluntary2026-10-01 11:28run 1177,193316.911161846784,3162,807
Stock Ubuntuvoluntary2026-10-01 11:34run 2177,0401162.151152476904,0022,960
Stock Ubuntufull2026-10-01 11:40179,998422.211151341891,2082
isolcpusvoluntary2026-10-01 11:48176,968950.921142706534,3453,032
isolcpusfull2026-10-01 11:55179,99800.001141322863462
isolcpus + rcu_nocbsvoluntary2026-10-01 13:01177,61215.611141376314,9962,388
isolcpus + nohz_full + rcu_nocbsvoluntary2026-10-01 13:09177,518950.721162146504,6942,482
Full setupvoluntary2026-09-25 06:06178,36200.001161406553,6541,638
Full setupvoluntary2026-09-25 05:57DROID Docker stack running179,41500.00116131451895585
Full setup minus nohz_fullvoluntary2026-10-01 13:40177,2561056.421141356564,8072,744
Full setup minus isolcpus (and nohz_full)voluntary2026-10-01 13:20176,88421118.761162636874,5163,116

Fake control box: wake-up latency and noise on CPU 12

Wake-up latency: rtla timerlat, 60 s, thread at SCHED_FIFO 80, µs. Noise: rtla osnoise, SCHED_FIFO 80 busy loop for 900 ms of every 1 s period, 26.1 s of measurement. The interrupt, softirq and thread columns are counts of interruptions by source.

ConfigurationPreemptionDateNoteWake-up p99Wake-up p99.9Wake-up maxTotal noise (µs)Longest single interruption (µs)CPU available (%)IRQ interruptionsSoftirq interruptionsThread interruptions
Stock Ubuntuvoluntary2026-10-01 11:28run 1518477116,62611799.9362928,07510,0268
Stock Ubuntuvoluntary2026-10-01 11:34run 2101611,07014,8595499.9430627,6789,6077
Stock Ubuntufull2026-10-01 11:405861,65317,48237099.9330127,5229,4887
isolcpusvoluntary2026-10-01 11:482276,7651399.9740826,1068,8720
isolcpusfull2026-10-01 11:552275,8423899.9776126,1168,5337
isolcpus + rcu_nocbsvoluntary2026-10-01 13:0123810,1372799.9611626,1199,4267
isolcpus + nohz_full + rcu_nocbsvoluntary2026-10-01 13:0934141303599.9995022150
Full setupvoluntary2026-09-25 06:063386299.99997200
Full setupvoluntary2026-09-25 05:57DROID Docker stack running2396571299.997482411790
Full setup minus nohz_fullvoluntary2026-10-01 13:402277,8671299.9698526,11110,2017
Full setup minus isolcpus (and nohz_full)voluntary2026-10-01 13:20202321,28519,16318299.9265728,15011,3387

Fake control box: what landed on CPU 12

From /proc/interrupts and /proc/softirqs, over the 180 s of fake control box runs, per second. Top sources are the three biggest hardware interrupt lines.

ConfigurationPreemptionDateNoteHardware interrupts / sTimer softirqs / sRCU softirqs / sTop sources (count over 180 s)
Stock Ubuntuvoluntary2026-10-01 11:28run 12,37140564rescheduling IPI 196,118; timer tick 182,842; NVMe SSD queue 41,999
Stock Ubuntuvoluntary2026-10-01 11:34run 22,52038619rescheduling IPI 198,900; timer tick 182,581; NVMe SSD queue 66,072
Stock Ubuntufull2026-10-01 11:402,38026581rescheduling IPI 193,720; timer tick 182,605; NVMe SSD queue 47,175
isolcpusvoluntary2026-10-01 11:489970.49458timer tick 179,108; function-call IPI 177; NIC eno2np1 queue 84
isolcpusfull2026-10-01 11:559960.27467timer tick 179,078; NIC eno2np1 queue 132; function-call IPI 119
isolcpus + rcu_nocbsvoluntary2026-10-01 13:019990.78469timer tick 179,309; NIC eno2np1 queue 454; function-call IPI 138
isolcpus + nohz_full + rcu_nocbsvoluntary2026-10-01 13:09121.111.11NIC eno2np1 queue 1,313; function-call IPI 475; timer tick 224
Full setupvoluntary2026-09-25 06:061.060.070.05function-call IPI 159; IRQ work 15; timer tick 13
Full setupvoluntary2026-09-25 05:57DROID Docker stack running113.120NIC eno3np0 queue 739; IRQ work 564; timer tick 563
Full setup minus nohz_fullvoluntary2026-10-01 13:401,0260.07469timer tick 184,398; function-call IPI 324; perf monitoring 2
Full setup minus isolcpus (and nohz_full)voluntary2026-10-01 13:202,70229558rescheduling IPI 208,276; timer tick 183,302; NVMe SSD queue 84,092

References

  1. A. Khazatsky, K. Pertsch, S. Nair, A. Balakrishna, S. Dasari, S. Karamcheti, S. Nasiriany, M. K. Srirama, L. Y. Chen, K. Ellis, et al.. DROID: A Large-Scale In-The-Wild Robot Manipulation Dataset. Robotics: Science and Systems (RSS), 2024. arxiv.org/abs/2403.12945
  2. DROID Team. DROID Hardware and Software Setup Guide. droid-dataset.github.io (accessed 2026-10-02). droid-dataset.github.io/droid
  3. F. Weisbecker. CPU Isolation – Introduction – by SUSE Labs (part 1). SUSE Communities, December 2022. www.suse.com/c/cpu-isolation-introduction-part-1
  4. J. Corbet. Clockevents and dyntick. LWN.net, February 2007. lwn.net/Articles/223185
  5. Y. Lin, A. S. Wang, G. Sutanto, et al.. Polymetis. Facebook AI Research, 2021. facebookresearch.github.io/fairo/polymetis
  6. Franka Robotics GmbH. Minimum System and Network Requirements. Franka Control Interface (FCI) Documentation (accessed 2026-10-02). frankarobotics.github.io/docs/doc/libfranka/docs/system_requirements.html
  7. Franka Robotics GmbH. Setting up the Real-Time Kernel. Franka Control Interface (FCI) Documentation (accessed 2026-10-02). frankarobotics.github.io/docs/doc/libfranka/docs/real_time_kernel.html
  8. The Linux Kernel Documentation. Real-time preemption. docs.kernel.org (accessed 2026-10-02). docs.kernel.org/core-api/real-time/index.html
  9. The Linux Kernel Documentation. The kernel's command-line parameters (isolcpus, irqaffinity, nohz_full, rcu_nocbs). docs.kernel.org (accessed 2026-10-02). docs.kernel.org/admin-guide/kernel-parameters.html
  10. The Linux Kernel Documentation. NO_HZ: Reducing Scheduling-Clock Ticks. docs.kernel.org (accessed 2026-10-02). docs.kernel.org/timers/no_hz.html
  11. Physical Intelligence. π0.5: a Vision-Language-Action Model with Open-World Generalization. arXiv:2504.16054. arxiv.org/abs/2504.16054
  12. J. A. Hanley and A. Lippman-Hand. If Nothing Goes Wrong, Is Everything All Right? Interpreting Zero Numerators. JAMA 249(13):1743–1745, 1983. doi.org/10.1001/jama.1983.03330370053031
  13. C. I. King. stress-ng: a tool to load and stress a computer system. GitHub. github.com/ColinIanKing/stress-ng
  14. The Linux Kernel Documentation. rtla-timerlat: Measures the operating system timer latency. docs.kernel.org (accessed 2026-10-02). docs.kernel.org/tools/rtla/rtla-timerlat.html
  15. The Linux Kernel Documentation. rtla-osnoise: Measure the operating system noise. docs.kernel.org (accessed 2026-10-02). docs.kernel.org/tools/rtla/rtla-osnoise.html
  16. Physical Intelligence. π0.7: a Steerable Generalist Robotic Foundation Model with Emergent Capabilities. April 2026. www.pi.website/blog/pi07
  17. C. Parada (Google DeepMind). Gemini Robotics 2 brings whole body intelligence to robots. Google DeepMind Blog, July 2026. deepmind.google/blog/gemini-robotics-2-brings-whole-body-intelligence-to-robots
  18. W. Zhang, K. Wang, Y. Ouyang, X. Huang, L. Li, K. Su, W. Jin, W. Chai, H. Liang, Z. Dou, Y. Chen, and T. Chen. An Unexpected Robot Policy: Early Evaluations of GPT-6 Astra on RoboDojo and Beyond. arXiv:2609.24170. arxiv.org/abs/2609.24170
  19. C. Xu, J. T. Springenberg, M. Equi, A. Amin, A. Esmail, S. Levine, and L. Ke. RL Token: Bootstrapping Online RL with Vision-Language-Action Models. Physical Intelligence, March 2026. www.pi.website/research/rlt
  20. P. Dong, K.-H. Hung, D. Sadigh, and C. Finn. Reinforcement Learning for Real-Time Vision-Language-Action Policies. arXiv:2609.18207. arxiv.org/abs/2609.18207

Back to all posts