NexArm 3D view Loading the robot model…
B-spline Policy inference on the NexArm The cameras and the joint state go into an ACT-style regression network, as on the ACT page. Its head predicts 16 knots and their control points instead of 16 actions; together they define one cubic B-spline segment. The curve is a weighted sum of basis functions, each non-zero over only four knot spans, so a control point moves the curve only locally. The controller samples the curve at 100 Hz and can traverse it n times faster, a(nt). When the next segment arrives, it is entered at the point t-star that best matches the last executed action, so consecutive segments join without a jump. BSP predicts a curve, not a list of actions. 1 · observe camera views I1​ … IV​ front wrist top (if recorded) the same frames and statistics as ACT joint state st​ j1 j2 j3 j4 j5 grip absolute joint positions the action space the paper uses on real arms two clocks policy 10 Hz · one segment control 100 Hz · one sample the next segment is inferred while the arm is still running the current one 2 · ACT-style network the regression backbone from the ACT page "Reg.+BSP": only the output head and its targets change image encoder · DINOv2 in the paper's real runs joint state → one token transformer encoder → memory M decoder · 16 query slots Linear → 16 × 7: knot + 6-D control point (layout assumed) [Û ; Ĉ] · 16 × (1 + 6) a fixed-size output, so any chunking backbone can take it 3 · B-spline parameters 16 knots and their control points one local piece of the motion; knots may be unevenly spaced support support 10 inner knots · the 6 support drawn 3 + 3 ci​ ∈ ℝ⁶ control point a(u) action curve ui​ knot ui​ ← max(ui​, ui−1​ + δ) keeps the knots in order 4 · the curve is a weighted sum a(u) = Σ Ni,3​(u) · ci​ each cubic basis function is non-zero over only 4 knot spans 1 0 Nk,3​ one basis function move ck​ by +0.12 rad (dashed): the curve changes only inside the shaded span 4 knot spans the rest is untouched a wrong control point bends one piece; it cannot distort the whole segment 5 · sample at 100 Hz, n × faster aexec​(t) = a(n t) same path, traversed n times faster 1× 94 samples · 0.93 s 2× 47 samples · 0.47 s time the policy is not retrained per speed 6 · join the next segment enter the new segment where it matches the arm t* = argmin MSE(Snew​(t), alast​) over 0 ≤ t ≤ λTinf​ · λTinf​ = umax​(S) / 2 on the real arm Speed Stacking at 4×, Diffusion+BSP: 35 % success with it, 15 % without (Fig. 6) alast​ t* best match search window executed source · Han, Xiong et al. 2026, B-spline Policy (arXiv 2607.09648) · toy joint trajectory · click a block or use the arrow keys
B-spline Policy training Each discrete demonstration is fitted with a cubic B-spline by inserting knots where the error is largest until the error is below a tolerance; knots cluster where the motion bends. At every observation the target is the next 16 knots and their control points, which cover a short time where the motion is fine and a long time where it is fast. The ACT-style network regresses these parameters. A looser tolerance compresses the demonstrations more with little change in score (Push-T, paper Table 3). BSP learns the curve behind each demonstration. 1 · demonstrations a demonstration is a list of joint targets one joint shown, 50 Hz, 8 s; the paper records 200 to 300 per task reach grasp lift · carry place retreat 2 · adaptive B-spline fit insert knots where the error is largest until max |a(ti​) − ai​| ≤ ε · here ε = 0.004 rad, 41 knots for 401 samples 12 knots · grasp 7 knots · carry 3 · fixed-size target the target is the next 16 knots observations do not line up with knots: take the nearest future 16 window over the carry 16 knots · 3.04 s window over the place 16 knots · 2.03 s same output size, different time horizon: fine where it needs to be 4 · regress the parameters predict [U ; C] like an ACT chunk the baselines predict 16 actions with the same encoder and epochs observation ACT-style network [Û ; Ĉ] · 16 × 7 [U ; C] from the fit loss 16 knot values and 16 control points per sample, 6 numbers each the paper does not state the loss; ACT's L1 is the drop-in 5 · 16 actions vs 16 knots a chunk spends its 16 steps evenly knots spend them where the motion needs detail chunk16 actions at 10 Hz · always 1.60 s knots41 interior knots, dense at the grasp 6 · fit tolerance ε a looser fit compresses more; the score barely moves Push-T, paper Table 3 · ratio = actions per knot–control-point pair 1.12× ε = 0.5 0.52 1.34× ε = 1 0.65 1.73× ε = 2 0.62 2.36× ε = 4 0.63 3.34× ε = 8 0.65 ratio score real robot tasks use ε = 0.002 to keep precise motions source · Han, Xiong et al. 2026, B-spline Policy (arXiv 2607.09648), Alg. 1, App. A.1, Table 3 · toy joint trajectory
Contents

    BSP on the NexArm

    B-spline Policy, ACT with a B-spline action head

    Inference · 7 steps

    1. One control cycle

      B-spline Policy (BSP) keeps the network from the ACT page and changes what comes out of it. Instead of a list of future joint targets, the head predicts the parameters of a curve: 16 knots and their control points, which define one cubic B-spline segment. The controller samples that curve at 100 Hz. It can also move along it n times faster, and when the next segment arrives it is joined at the point that matches where the arm actually is. This page follows the paper’s “Reg.+BSP” setup, the ACT-style variant; it has not been trained on the NexArm yet.

      [\hat U ;\ \hat C] = \pi_\theta\big(I_t^{1..V},\ s_t\big) \in \mathbb{R}^{16 \times (1 + 6)}
      a(u) = \sum_i N_{i,3}(u)\, c_i

      Û are 16 knot values and Ĉ the matching control points, one six-number joint target each. Ni,3 are the cubic B-spline basis functions those knots define.

      images V × 3×H×W · state 6 → segment 16 × (1 knot + 6)
    2. Observe

      The inputs are the same as for ACT: one frame per camera and the six-number joint state. The paper uses absolute joint positions as actions on its real arms, which matches the NexArm’s joint-target interface. Two clocks run at once. The policy produces a new segment about 10 times a second, and the controller sends a command 100 times a second by sampling the current segment.

      f_{\text{policy}} = 10\ \text{Hz},\qquad f_{\text{control}} = 100\ \text{Hz}

      The next segment is inferred asynchronously while the arm is still running the current one.

      observation.images.* · observation.state 6
    3. ACT-style network

      The backbone is a regression transformer like the one on the ACT page. In the paper’s real-robot runs the image encoder is DINOv2. The head now outputs 16 knot values and their 6-D control points instead of 16 actions. The paper does not say how this maps onto the query slots; the figure shows one natural layout, one knot and one control point per slot. Either way the output is a fixed-size tensor, so a chunking backbone can take it with little change.

      \hat y_k = W_{\text{out}}\, q_k \in \mathbb{R}^{7},\qquad k = 1, \dots, 16
      [\hat u_k ;\ \hat c_k] = \hat y_k

      qk is the decoder output for slot k; the first number is the knot, the other six the control point.

      16 query slots → Linear → 16 × 7
    4. Knots and control points

      The knots set where in time each piece of the curve begins and ends, and they do not have to be evenly spaced. The control points set where the curve goes: it follows them without passing through them. A cubic segment needs neighbouring knots for support, and 6 of the 16 are boundary-support knots; the inner ones bound the part that runs. The paper gives only the total, so the figure draws them as 3 on each side, the usual split for a cubic. A regressor does not guarantee ordered knots, so any knot that would go backwards is pushed just past its neighbour.

      u_i \leftarrow \max(u_i,\ u_{i-1} + \delta)

      δ is a small positive constant. In practice the paper finds that predicted knots are almost always in order already.

      U 16 non-decreasing · C 16 × 6
    5. A weighted sum with local support

      Each control point is weighted by a basis function that is non-zero over only four knot spans. Moving one control point therefore reshapes only that part of the curve, which the lower plot shows. An error in one predicted parameter bends one piece and leaves the rest of the segment unchanged. Cubic pieces also meet with continuous velocity and acceleration, so the commanded motion has no corners.

      N_{i,0}(u) = \begin{cases} 1 & u_i \le u < u_{i+1} \\ 0 & \text{otherwise} \end{cases}
      N_{i,p}(u) = \frac{u - u_i}{u_{i+p} - u_i} N_{i,p-1}(u) + \frac{u_{i+p+1} - u}{u_{i+p+1} - u_{i+1}} N_{i+1,p-1}(u)

      The Cox–de Boor recursion, with p = 3. Ni,3 is zero outside [ui, ui+4).

      a(u) ∈ ℝ⁶ for any u in the segment
    6. Sample at 100 Hz, run n× faster

      The curve is defined for every u, not only at the recorded steps. The controller can therefore sample it as densely as it likes, and it can speed the motion up by scaling time. At 2× the arm follows the same path in half the time with half as many samples. The policy is not retrained for each speed. The limit is the hardware: at 4× the paper’s low-cost arms could no longer track the bimanual Speed Stacking task.

      a_{\text{exec}}(t) = a(n\,t)

      n is the speedup factor and t is real time since the segment started.

      1× · 100 samples per second of curve · n× · 100 / n
    7. Join the next segment smoothly

      By the time a new segment arrives, the arm has moved on, and noise and tracking error mean the new curve does not start exactly where the old one is. Switching at a fixed time would make the command jump. BSP instead searches the start of the new segment for the point closest to the last executed action, and continues from there. Without this step, Speed Stacking success at 4× falls from 35 % to 15 % in the paper’s ablation, which uses the Diffusion backbone.

      t^{\star} = \arg\min_{0 \le t \le \lambda T_{\text{inf}}} \operatorname{MSE}\big(S_{\text{new}}(t),\ a_{\text{last}}\big)

      Tinf is the measured inference latency and λ > 1 widens the window. On the real arms the window is half the segment: λTinf = umax(S) / 2.

      no jump at segment boundaries

    Training · 7 steps

    1. One training step

      Training is ordinary behaviour cloning with different targets. Every demonstration is first converted into a B-spline with an adaptive fit. At each observation the target is the next 16 knots and their control points, and the network regresses them. The figures use a toy single-joint trajectory; the fitting, the windows and the basis functions are computed from it, not drawn by hand.

      \min_\theta\ \mathbb{E}_{(o, U, C)}\ \mathcal{L}\big(\pi_\theta(o),\ [U ; C]\big)

      The paper does not state the loss ℒ for the regression variant; ACT’s L1 is the natural drop-in.

    2. Demonstrations

      A demonstration is a list of joint targets at a fixed rate. The paper records 200 to 300 teleoperated demonstrations per real task. A pick-and-place has fast, coarse parts (reach, carry, retreat) and slow, precise parts (grasp, place). A fixed-rate chunk spends the same resolution on both.

      toy · one joint · 50 Hz · 8 s · 401 samples
    3. Adaptive B-spline fit

      Algorithm 1 of the paper starts with no interior knots and fits a cubic B-spline by least squares. It checks the largest error and, if it is above the tolerance, inserts a knot where the residual is largest (the FITPACK criterion), then repeats. Knots end up where the motion bends and are sparse where it is simple.

      E = \max_i \lVert a(t_i) - a_i \rVert \le \varepsilon

      The paper uses ε = 0.002 on its real tasks to keep precise motions. The toy fit uses ε = 0.004 rad and needs 41 knots for 401 samples.

    4. Fixed-size targets

      Observations do not line up with knots, so at each observation step the target is the nearest future window of 16 knots and their control points. Because knot spacing varies, 16 knots can cover a long time where the motion is simple and a short time where it is detailed. Near the end of an episode the last control point is repeated to fill the window.

      16 knots + 16 control points per sample
    5. Regress the parameters

      The network predicts the 16 × 7 parameters and is trained against the fitted ones, exactly where ACT would be trained against a 16-step action chunk. For a fair comparison, the paper’s chunking baselines also predict 16 future actions, with the same visual encoder and the same number of epochs.

    6. 16 actions vs 16 knots

      A 16-step chunk at 10 Hz always covers 1.6 s at an even spacing. The 16 knots of a segment are placed by the fit, so detail goes where the trajectory needs it. This is the “adaptive temporal resolution” the paper argues fixed chunks lack.

    7. Fit tolerance

      A looser tolerance needs fewer knot–control-point pairs. On Push-T the compression ratio rises from 1.12× at ε = 0.5 to 3.34× at ε = 8, while the score stays between 0.52 and 0.65. Performance is not very sensitive to ε within a sensible range. These are the paper’s numbers (Table 3); Push-T actions are pixel positions up to about 512, which is why ε is so much larger there.

    Training details

    The ACT network with a different output. Instead of 16 actions it predicts 16 knots and control points of a cubic B-spline, which the controller samples at 100 Hz and can run several times faster.

    • 16 · knots per segment
    • cubic · spline degree
    • 10 Hz · policy rate
    • 100 Hz · control rate
    • 16 × 7 · output per segment
    • 0.002 · fit tolerance ε

    Architecture

    BSP is a change of action representation, not a new network. The paper adds it to two backbones, Diffusion Policy (“Diff.+BSP”) and an ACT-style regression transformer (“Reg.+BSP”). This page follows the second, because it is the closest to the ACT policy already on the NexArm.

    Part Setting in the paper
    Backbone ACT-style regression transformer; DINOv2 image encoder on real robots
    Output 16 knots and their control points, 6 of the knots are boundary support
    Spline cubic (degree 3) B-spline
    Action space absolute joint positions on the real arms
    Rates policy about 10 Hz, controller samples the curve at 100 Hz
    Speedup a_exec(t) = a(n t), n = 1, 2 or 4 in the experiments
    Segment join align to the last executed action within half a segment
    Knot validity u_i ← max(u_i, u_{i-1} + δ)

    Training

    Demonstrations are converted once, before training: each trajectory is fitted with a cubic B-spline by adaptive knot insertion until the largest error is below ε = 0.002. The network then regresses the next 16 knots and their control points at every observation step, in the same place where ACT regresses its action chunk.

    Setting Value
    Fit FITPACK-style knot insertion, ε = 0.002 (Push-T: ε = 1)
    Target nearest future 16 knots + control points, last point repeated
    Baselines 16-action chunks, same encoder, same number of epochs
    Real tasks Cube Picking, Table Cleaning, Speed Stacking; 200–300 demos each
    Simulation Push-T, RoboMimic, RoboCasa

    Not trained on the NexArm yet. The architecture, the rates and the numbers on this page come from the paper. The figures use a toy single-joint trajectory: the fit, the knot windows, the basis functions and the alignment are computed from it, but it is not a NexArm recording.

    Results

    Evaluation status

    Not yet measured

    BSP has not been trained or run on the NexArm yet. The planned evaluation is the same as for ACT and TurboVLA, plus the speedup at which success starts to fall. For reference, the paper reports results on 6-DoF ARX5 arms. With the ACT-style backbone at 4×, BSP halved the average Table Cleaning time from 23.57 s to 11.80 s (14/20 vs 13/20 successes). At 1×, it raised Speed Stacking success from 8/20 to 16/20, but at 4× the bimanual task failed completely because the arms could not track the faster commands.

    Metric Value How it is measured
    Stacking success rate — Fraction of trials that end with the bowls nested and released, judged from the front camera.
    Time to stack — Seconds from the first action to the gripper opening over the stack, successful trials only.
    Achieved speedup — Time to stack at 1× divided by time to stack at the target speedup (2×, 4×).
    Command smoothness — Peak joint acceleration of the executed commands, BSP vs the ACT chunk baseline at the same speed.

    Protocol

    1. Fixed bowl start poses drawn from the recorded workspace, the same list for every policy.
    2. Each policy is run at 1×, 2× and 4×; for ACT the baseline speedup is a faster command rate.
    3. A trial ends at success, at a collision, or after 60 seconds.

    Code and data

    3D model: NexArm MJCF and meshes from khanhthanhdev/lerobot-nexarm, rendered with three.js. The motion is a scripted bowl-stacking demo solved with inverse kinematics in the browser; the dots show how long one BSP action chunk is, not a recorded policy rollout.