Aerial manipulation: keep the arm pretrained, learn flight separately

Reuse a vision-language-action model (VLA) that already knows how to use an arm, let a small Flight DiT learn flight from the scarce aerial data, and fine-tune the VLA to listen to it.

Part 1

Introduction

Problem

  • Aerial data is scarce. Tabletop manipulation data can be collected at scale. Aerial manipulation data needs expert teleoperation or hand-coded scripts and MPC, which is not enough to train a whole-vehicle policy from scratch.
  • The arm is already solved elsewhere. A VLA pretrained on tabletop data already has the language understanding and fine arm control. Scarce flight data should not be spent retraining it.
  • Don't edit the arm's actions with flight constraints. Writing flight feasibility into one shared action chunk changes the pretrained arm behaviour, and ties the flight coupling to that one backbone, so upgrading the VLA later means rebuilding the constraint.

Idea

  • Two policies. A small Flight DiT handles flight. A mature VLA (π0.5) handles the arm. Flight is learned by the small model; the VLA only learns to take the flight into account.
  • Flight DiT. A lightweight diffusion Transformer, sized like RDT-170M to train on one 4090. It reads language, images and proprioception, and outputs a flight chunk aflight = [Δx, Δy, Δz, Δψ] plus a flight-intent token Fflight.
  • Arm VLA. Fflight is encoded by a small projector and injected into π0.5, at an intermediate transformer layer or at the action expert, so the flight intent is present at every denoising step. π0.5 is then fine-tuned with all of its parameters (not LoRA) on the aerial demonstrations with the token in place, and outputs aarm = [q1, q2, q3, q4, gripper] (FA-Hexa's arm: three pitch joints and a wrist roll).
  • Easy to swap. The two policies meet only at the injected token. Replacing the arm VLA means re-training the projector and the fine-tune on the new backbone; the Flight DiT and its data stay as they are.
  • Low level stays split. The flight controller tracks the flight chunk; joint servos track the arm.

Pipeline

Pipeline: inputs, encoding, Flight DiT, mature VLA arm policy, low-level tracking
Blue: Flight DiT. Green: the pretrained VLA. Orange: flight-to-arm conditioning. Inputs are a language instruction, forward / downward / wrist RGB, pose, velocity, arm joints and gripper. The figure still draws a quadrotor with a 3-DoF arm and labels Stage B as LoRA; the platform is now FA-Hexa with a 4-DoF arm and π0.5 is fully fine-tuned.
  • Stage A: flight only. Train the Flight DiT on aflight and extract Fflight.
  • Stage B: inject and fine-tune. Encode Fflight, inject it into π0.5 (intermediate layer or action expert) and fine-tune all of π0.5 on the same demonstrations.
  • Stage C: deploy. Run both chunks in sync; flight and arm are tracked by their own low-level controllers.

Related work

Models

  • Transformer (Vaswani et al., NeurIPS 2017): the backbone of both policies. Cross-attention is where language, images and Fflight enter.
  • DiT (Peebles & Xie, ICCV 2023): a Transformer inside diffusion. The Flight DiT uses the same idea to generate a short flight-action chunk.
  • RDT-1B / RDT-170M (Liu et al., ICLR 2025): a diffusion Transformer robot policy. RDT-1B fine-tuning costs about a week on 4×A100; RDT-170M (hidden 1024, depth 14, 64-step prediction) fits on one 4090 and is the starting point for the Flight DiT.

Aerial manipulation

  • Flying Hand (He et al., 2025): an end-effector-centric interface on a fully actuated hexarotor with whole-body MPC. The high level only talks about the end effector. FA-Hexa is the same class of vehicle.
  • Aerial Manipulation in the Wild (Zhan et al., 2026): a Diffusion Policy proposes end-effector motion and whole-body MPC executes it, outdoors. Here the upper model is a tabletop-pretrained VLA instead.
  • π, But Make It Fly / AirVLA (Tucker et al., 2026): visual features transfer to flight, control dynamics do not. Their fix writes payload guidance into the VLA's sampling (23% → 50% pick-and-place). This project keeps the lesson but not the mechanism: flight is a separate module and only a condition.
  • AC-DiT (Chen et al., 2025): extract base motion first, then condition the body on it. Fflight comes from this idea, but AC-DiT still predicts the whole body with one network (about two weeks on 8×A100).

Plan

  • Goal: ICML 2027. Dates are not out yet; going by the 2026 cycle, the abstract is due around 23 Jan and the full paper around 28 Jan 2027 (2026 dates). That is about 15 weeks from mid-October.
  • Done: the dataset. 4,800 verified demonstrations, 12 tasks × 5 conditions × 80, recorded with the upgraded specialists (Parts 2 and 3).
  • Next: the Flight DiT (Part 4). Stage A on the 120 Hz flight data, then Stage B: inject Fflight into π0.5 and fine-tune it fully.
  • Then: the benchmark (Part 5). Diffusion Policy, π0.5 fine-tuned with LoRA, and the Flight DiT + fully fine-tuned π0.5, all trained on the same demonstrations and evaluated with AM-Bench's success checks.
RouteComputeDecision
Full AC-DiT8×A100, about two weeksOut of scope
RDT-1B fine-tune4×A100, about a week (≈ $500 per run)Too expensive
Diffusion PolicyOne 4090, hours to a dayBaseline
π0.5 LoRAOne GPU with ≥ 24 GB, about 2–3 daysBaseline
Flight DiT (RDT-170M size), Stage AOne 4090, about a weekOurs
π0.5 full fine-tune with Fflight, Stage BOne 80 GB GPU (A100 / H100), about a day per runOurs
Part 2

Specialist trajectories

Specialist dataset on FA-Hexa

  • “Official” means AM-Bench. The unmodified tasks, scripted specialists and success checks of AM-Bench (paper, code). “Upgraded” is the same code with the changes below.
  • Why check the specialists. π0.5 is trained on their successful demonstrations, so a specialist that cheats a loose check or fails for unrelated reasons would go straight into the data. Every task was recorded and watched before recording at scale.
  • Setup. FA-Hexa (fully actuated hexarotor, 4-DoF arm), absolute end-effector targets, IK plus PID at 120 Hz. Clips are 1280×720, real time, and stop 5 s after success.
44 / 60official AM-Bench code
60 / 60after the upgrades
5 conditionsdefault, aero, wind 5 / 10 / 20%

All twelve tasks under five conditions

FA-Hexa after the upgrades, one recorded run per cell. Hover to play, click to enlarge.

Taskofficial → upgraded, default conditionAM-Bench defaultno thrust limits, no windAero + thrust limits23 N/rotor, ground and wall effects, dragWind 5%+ 3.3 N toward the surfaceWind 10%+ 6.5 NWind 20%+ 13.0 N
01 Press button5/5 → 5/5Unchanged
02 Peg in hole5/5† → 5/5Reset grasp fixed
03 Inspect surface (NDT)5/5 → 5/5Unchanged (follow camera)
04 Wipe window0/5 → 5/5New specialist
05 Cabinet pick and place5/5 → 5/5Unchanged
06 Frame assembly0/5 → 5/5Stricter check, new specialist
07 Harvest lemon4/5 → 5/5New specialist
08 Toss ball0/5 → 5/5New specialist
09 Rotate valve5/5 → 5/5Unchanged
10 Push slider5/5 → 5/5Unchanged
11 Pull lever5/5 → 5/5Unchanged
12 Open door5/5* → 5/5Handle latch in the check, new specialist

Counts are successes over five runs. * passes only the old check, by pushing the door with the vehicle. † 6 of 8 across all official runs. Wind is a constant force of 5, 10 or 20% of the 65 N weight. Specialists that differ under the disturbance conditions: peg PegInHoleAlignInsertPolicy, frame FrameAssemblyBarGraspWindPolicy (40 s episodes), lemon LemonHarvestingWindPolicy, toss at 20% TossBallReachDropPolicy (drops instead of throwing), valve RotateValveTrackHandlePolicy, lever PullLeverAlignPolicy, door OpenDoorHandleWindPolicy; see docs/disturbance-variants.md.

Before / after

Both sides are FA-Hexa. Left: official AM-Bench code. Right: upgraded. All clips play together on a loop.

Toss ball

Before0/5
After5/5 · ~5.2 s

What changed

  • New specialist TossBallLobPolicy: carry the ball level to a point behind the bin and move forward smoothly.
  • Predict the landing point from the ball's measured position and velocity; open the gripper when it reaches the bin centre.
  • Keep speed until the fingers have let go, then back off so the vehicle stays 0.7 m behind the bin. Success check unchanged.

Wipe window

Before0/5
After5/5 · 6–10 s

What changed

  • New specialist WipeWindowPressPolicy: line up 6 cm in front of each stain, press straight in, hold 0.3 s, back straight out.
  • Measure the sponge's position in the hand before every press.
  • Skip stains that are already gone. Success check unchanged.

Frame assembly

Before0/5
After5/5 · seated flush

What changed

  • New check: within 2 cm of flush against the wall, within 3 cm of the peg centre, under 10° to the wall, and still for 0.25 s.
  • New specialist FrameAssemblyBarGraspPolicy: roll the gripper 90° and clamp the top bar; approach from above so the frame is not knocked over.
  • Measure the frame in front of the pegs, align it, push it flush, release.
  • This task only: finger stiffness 100 → 1000, base x limit 1.0 → 1.25 m.

Open door

Before5/5* · pushes the door
After5/5 · via the handle

What changed

  • New check: the door starts latched and unlocks only after the gripper closes at the handle for 0.2 s.
  • New specialist OpenDoorHandlePolicy: align in closed loop in front of the handle, reach in, close, wait for the unlatch, then push along the hinge arc.
  • Limit: the handle in door.usd is flush with the door and has no collision body, so it cannot be pinched. Closing at the handle stands in for operating it.

Peg in hole

Beforethis run failed · 6/8 overall
After7/7 · ~8.9 s

What changed

  • At reset the fingers open to the object's width (width / 2 + 1 mm).
  • The object is seated against the palm instead of centred on the tool tip, so it is held deeper.
  • Specialist and check are official; 7 of 7 runs since.

Harvest lemon

Beforethis run failed · 16/17 overall
After15/15 · ~14.5 s

What changed

  • New specialist LemonHarvestingCenterDropPolicy: the same pick, then the lemon itself is steered, using its measured position, to 6 cm above the container centre.
  • The gripper opens once the lemon is within 2 cm of the centre and nearly still.
  • Lands within 2 cm of the centre in 10 of 10 probe runs; the official drop lands 6–16 cm from the back rim. Success check unchanged.

Notes

  • Disturbances. AM-Bench offers thrust saturation, ground and near-wall effects, drag, a constant wind force and sensor/actuator noise, all off by default; no gusts, wind torque or payload changes.
  • π0.5 data. 80 demonstrations per task at 20 Hz in LeRobot format (EE camera, 8- or 12-value state, 50-step action chunks); AM-Bench fine-tunes all parameters, which needs more than 70 GB of GPU memory (LoRA: more than 22.5 GB).
  • AC-DiT data. RDT-170M mobility head plus RDT-1B whole-body head, trained on ManiSkill-HAB HDF5 at 20 Hz (three cameras, point cloud, 128-value state vector). An aerial base needs new state slots.

Full notes with file paths and sources: docs/research/disturbances-pi05-acdit-data.md.

Related work

  • AM-Bench (Wang et al., 2026): a modular simulation suite and benchmark for aerial manipulation policy learning, built on Isaac Lab. It provides the vehicles (FA-Hexa among them), the 12 tasks and the scripted specialists used here. Project page · Documentation · Code.
  • Isaac Lab (NVIDIA): the GPU simulation framework AM-Bench runs on (Isaac Sim 5.1).
Part 3

Dataset generation

Demonstration dataset

We record 80 successful demonstrations for each of the 12 AM-Bench tasks under each of the 5 conditions of Part 2 (AM-Bench default; thrust limits with aerodynamic effects; the same with a wind of 5, 10 or 20 % of the vehicle's weight), using the upgraded scripted specialists on FA-Hexa. Every episode is verified individually before it enters the training set. The set is exported for π0.5 fine-tuning in the OpenPI format and kept, with a 120 Hz low-dimensional companion, for the Flight DiT. All data was recorded in one day on a single RTX 4080 SUPER.

4,800episodes: 12 tasks × 5 conditions × 80
1.24 Mimage frames at 20 Hz, two cameras
19 GB · 284 GBraw (AV1 video) · π0.5 export (PNG)

Pipeline

Six stages: scripted specialist, noise injection, FA-Hexa in Isaac Lab, recorder, verification, selection and export; rejected episodes are re-recorded.
Figure 1. From specialist to training set. The specialist's target is perturbed before execution while the unperturbed target is recorded as the label; the recorder keeps successful episodes only; each episode passes a fixed set of checks, and rejected ones are replaced until every task–condition pair has 80.
  • Specialists. The Part 2 specialists, one per task, run closed loop on the measured object state (peg tip, handle, lemon, ball) and output an absolute end-effector target and a gripper command. Two Wind 20 % variants were added for the recording noise (PushSlider pushes the knob with the side of the closed gripper; WipeWindow aligns before a gentle press); RotateValve gets 30 s episodes under the disturbance conditions.
  • Simulation. Isaac Lab at 120 Hz with inverse kinematics and PID control; cameras render every sixth step, so a 20 Hz image is the exact render of the state it is paired with. Four environments per process, 20 m apart, two processes per GPU.
  • Recording. LeRobot v3.0, successful episodes only: a 20 Hz set with both 384 × 384 cameras (AV1 video), the 35-D state, the label and the executed action, and a 120 Hz set with state and labels at every control step. The task prompt is stored with every frame.
  • Verification and selection. Each episode is checked (below); the first 80 valid episodes per pair are selected and the rest excluded. The π0.5 export (LeRobot v2.1, 20 Hz, lossless PNG) is itself checked frame by frame against the selected source episodes.

Noise injection

Following DART, the executed target is perturbed and the specialist's unperturbed target is kept as the label, so the demonstrations contain small deviations and the corrections back to the nominal path. Three noise processes with the same standard deviation (5 mm, 0.025 rad; half of AM-Bench's defaults) behave very differently on a hovering vehicle (Figure 2). AM-Bench's per-step noise shakes the tool without moving the robot off its path, and every toss failed; an Ornstein–Uhlenbeck drift still changes the target every step, which the PID's derivative term turns into thrust spikes, and in 20 % wind the rotors saturate (press button 0 / 8). The smooth drift used here draws a new offset every 0.5 s and joins consecutive offsets with a smootherstep, so the target never jumps.

Three traces of the target offset over three seconds: independent per step, Ornstein-Uhlenbeck, and smooth drift.
Figure 2. One axis of the position offset for the three noise processes, 3 s at 120 Hz, σ = 5 mm in each case. (a) Independent samples every step, as in AM-Bench's --inject_noise; (b) Ornstein–Uhlenbeck with a 0.5 s correlation time; (c) a new Gaussian offset every 0.5 s with smootherstep interpolation (used). The captions give the success counts that decided between them.

Recording settings

Vehicle, controlFA-Hexa (fully actuated hexarotor, 6.6 kg, 4-DoF arm), absolute end-effector targets, Pyroki IK + PID at 120 Hz
Conditionsdefault (all disturbance models off); aero (thrust limited to 0–23 N per rotor, ground and wall effects, drag); aero + constant wind of 3.3, 6.5 or 13.0 N along +x (5, 10, 20 % of the weight)
Episode limitthe task's own limit (10–60 s); FrameAssembly 40 s and RotateValve 30 s under the disturbance conditions
Noisesmooth drift on the executed target, σ = 5 mm and 0.025 rad, knot every 0.5 s; labels unperturbed
Observationsend-effector and body cameras, 384 × 384 RGB at 20 Hz; 35-D state (EE pose, gripper, arm joints, base pose, EE and base velocities, joint velocities) at 20 and 120 Hz
Actions8-D absolute EE target (position, quaternion, gripper); the executed, noisy target is stored alongside
Throughputtwo Isaac Sim processes with 4 environments each on one 16 GB GPU; 5,810 attempts in about 18 hours including re-recording

Verification

Every saved episode has to pass all of the following, and the two LeRobot sets are compared step by step. Rejected episodes stay on disk but are excluded from the selection and replaced by new recordings.

  • Success. The task's success check fired and every sub-criterion was true at termination (a lemon that reached the bin without a registered grasp is rejected).
  • Integrity. The 120 Hz episode has exactly the logged number of steps, the 20 Hz episode one frame per grid step, every video segment holds exactly its frames (LeRobot's streaming encoder silently drops a frame when its queue is full; the queue was enlarged after this was found), and the first, middle and last frames decode and differ.
  • Clean start. The robot does not move by itself in the first 0.2 s. OpenDoor's door is sometimes spawned inside the robot's reset footprint and knocks the arm at its velocity limit; about a quarter of its episodes were rejected for this.
  • Length. Within 0.6–1.5× the median of its task–condition pair, which excludes late or accidental successes.
  • Metadata. The prompt, the disturbance switches and the wind force match the condition; the noise spread matches the setting.
Funnel from 5,810 attempts to 4,800 selected episodes, and the counts of the five rejection reasons.
Figure 3. Left: recorded attempts, successes saved by the recorder, episodes that passed every check, and the final selection. Right: why the 282 rejected successes were excluded.

Specialist success under the recording noise

Successes over attempts per task and condition, all recordings included. The median episode lasts 8.8 s in the default condition and 11.2 s in 20 % wind.

TaskDefaultAeroWind 5 %Wind 10 %Wind 20 %
Press button100100999988
Peg in hole88100989891
Inspect surface (NDT)100100100100100
Wipe window100100999958
Cabinet pick and place10010010010061
Frame assembly8988949682
Harvest lemon7463617252
Toss ball1001001009873
Rotate valve861001009882
Push slider10092835856
Pull lever10098949187
Open door9210010010078

Table 1. Success rate in percent. Only successful episodes are stored; a low rate costs recording time, not data quality.

Data format

FeatureShapeContent
observation.images.ee_camera, base_camera384 × 384 × 3end-effector and body cameras, 20 Hz (AV1 in the raw set, PNG in the export)
observation.state35EE position and quaternion, gripper width, 4 arm joints, base position and quaternion, EE and base linear and angular velocities, joint velocities
action8the specialist's unperturbed EE target (position, quaternion, gripper): the training label
action_executed8the perturbed target that was executed
step_index1the frame's step in the matching 120 Hz episode
tasktextthe AM-Bench language instruction

Table 2. Features of the 20 Hz set; the 120 Hz set holds the same episodes without images. The export keeps ee_image, base_image, ee_pos, ee_quat, gripper_width, actions and task, the schema of OpenPI's AM-Bench configuration, where actions become end-effector-relative 50-step chunks.

Code

Everything that produced the results lives in the private repository Aerial_Manipulation_Code; this page only shows the results.

  • pipeline/datagen/: the batch recorder with GPU slot locks and re-recording, the per-episode verifier and selection, the OpenPI export and its check, and the one-command finish script.
  • ambench/DATAGEN_CHANGES.diff: the recorder and exporter changes on top of AM-Bench (video storage, 20 Hz images with a 120 Hz companion, clean labels, smooth noise, one-pass export).
  • docs/training-data.md: layout, features, rules and the full numbers. The data itself (303 GB) is not in the repository.

Related work

Part 4

DiT training

Flight DiT training

Coming soon.

Part 5

Benchmarking

Benchmark

Coming soon.