Trajectory Optimization
The main entry point is generate_trajectory. It adapts a demonstration
trajectory to a requested start and goal pose, then reports which backend was
requested and which solver path actually ran.
Backend Selection
Use backend="auto" for normal single-trajectory generation. It prefers FATROP
when the optional Rockit/FATROP stack is importable. Fallback to slower IPOPT or
interpolation is disabled by default; set allow_fallback=True only when an
exploratory run should continue after a preferred backend is unavailable.
| Backend | Use when | Notes |
|---|---|---|
auto |
Production default | Uses FATROP when available. |
fatrop |
Require the structured OCP solver | Raises unless FATROP succeeds or allow_fallback=True. |
cusadi |
Boundary adaptation plus fixed-horizon CusADi decode | Exact GPU decode is optional and falls back to CPU by default. |
ipopt |
Legacy CasADi/IPOPT behavior | Useful for comparisons and fallback studies. |
interpolation |
Deterministic resample/decode baseline | No nonlinear solver dependency. |
from dhb_xr.optimization import generate_trajectory
result = generate_trajectory(
demo_positions,
demo_quaternions,
pose_target_init={"position": start_pos, "quaternion": start_quat},
pose_target_final={"position": goal_pos, "quaternion": goal_quat},
traj_length=100,
backend="auto",
)
print(result["requested_backend"], result["solver"])
CusADi Decode Policy
CusADi decode is fixed-horizon by design. DHB-XR ships artifacts and generated
CUDA source for sample horizons 50, 80, 100, 150, and 200. Build
compiled libraries only when the machine needs GPU decode:
python -m dhb_xr.optimization.build_cusadi_decode --horizons 50 80 100 150 200
Runtime controls:
cusadi_decode="auto": use GPU decode when all assets are available, otherwise use CPU fallback.cusadi_decode="gpu_required": require a matching compiled library and CUDA execution.cusadi_decode_horizon="auto": select the exact sample horizon fromtraj_length.cusadi_decode_horizon=100: require a specific fixed sample horizon.cusadi_decode_fallback="cpu": default CPU fallback.cusadi_decode_fallback="error": raise instead of falling back.cusadi_decode_library_dir=...: load prebuilt libraries from a custom directory instead of the default dhb_xr cache.
result = generate_trajectory(
demo_positions,
demo_quaternions,
pose_target_init={"position": start_pos, "quaternion": start_quat},
pose_target_final={"position": goal_pos, "quaternion": goal_quat},
traj_length=100,
backend="cusadi",
cusadi_decode="gpu_required",
cusadi_decode_horizon=100,
)
print(result["cusadi_decode"])
print(result["cusadi_decode_library_path"])
The result metadata includes requested_backend, solver, optimizer_solver,
cusadi_decode, cusadi_decode_requested_horizon,
cusadi_decode_artifact_horizon, cusadi_decode_artifact_path,
cusadi_decode_library_path, and cusadi_decode_fallback_reason when that path
runs.
See GPU Decode for install, build, cache, and troubleshooting details.
API Surface
Public facade:
dhb_xr.optimization.generate_trajectorydhb_xr.optimization.get_optimizer
FATROP path:
dhb_xr.optimization.fatrop_solver.generate_trajectory_fatropdhb_xr.optimization.fatrop_solver.FatropTrajectoryGeneratordhb_xr.optimization.fatrop_solver.ConstrainedTrajectoryGenerator
CusADi path:
dhb_xr.optimization.cusadi_solver.CusadiDecodeSpecdhb_xr.optimization.cusadi_solver.CusadiTrajectoryOptimizerdhb_xr.optimization.cusadi_solver.batched_decode_dhb_drdhb_xr.optimization.build_cusadi_decode.build_cusadi_decode_libraries