Collision environment#

Collision is URDF-driven. The robot’s covering spheres and self-collision ranges are baked into the generated grid.cuh as GRiD’s grid_collision namespace (pass --collision to scripts/codegen/generate_grid.py); the kernel scores them post-solve via grid_collision::collision_distance (soft penetration cost) and, in hard mode, filters with grid_collision::config_free (see Solver kernel). There is no hand-written per-robot collision header. Supported fixed-base serial arms get FK and collision from one codegen step; see Custom robot (GRiD codegen workflow) for the solver’s model restrictions.

The obstacle set (spheres / cuboids / cylinders from a MotionBenchMaker-style problem JSON) is parsed and uploaded to the device by grid_env.cuh, then passed by value into the scoring kernel as a grid_collision::Environment.

The default collision_mode="hard" checks self-collision and the environment, then excludes colliding candidates. It can return zero solutions. soft only ranks by environment penetration cost and offers no collision-free guarantee; both ranks and strictly filters. Collision checking is post-solve and does not certify a motion path or guarantee that the returned candidate reaches the requested pose.

Each selected problem must explicitly describe its obstacles. Use "obstacles": {} for an empty environment (self-collision is still checked). Supported obstacle keys are sphere, cuboid, cylinder, and legacy box; unknown keys are rejected. Dimensions, radii, and lengths must be positive finite numbers; poses use meters and [x,y,z,qw,qx,qy,qz] with a nonzero quaternion. Cylinders are conservatively represented as capsules. Guarantees are relative to the generated sphere model, which excludes the fixed Panda base geometry.

Scene caching#

The solver retains one parsed problem document and one uploaded environment per CUDA device and precision specialization. Repeated text is compared byte-for-byte without allocating a combined key; changing only the selected scene reuses the parsed document. Changing the JSON contents invalidates the uploaded scene, even with the same set/index. Invalid input and failed uploads cannot silently reuse stale geometry. Access is serialized by the solver lock. The cache is bounded by the last document, not the number of scenes.

The convenience API still converts/compares the JSON text on each call. Passing a compact document containing only the needed scenes avoids needless input handling; adjust problem_idx to that document’s indexing. Performance should be measured separately for scene changes and repeated solves in one scene.

Default Panda geometry#

The compiled Panda retains fixed finger-joint origins at y = +/-40 mm in the hand frame. Foam supplies sphere-local centers and radii; the kinematic URDF supplies fixed-link transforms. The historical paper reference instead has +/-65 mm finger origins, shifting four finger spheres by 25 mm. These are explicitly different models, not a GRiD FK defect.

benchmark/panda_collision.py defaults to model="paper" for historical cross-solver comparisons. Use model="hjcd" for the current URDF-derived geometry. Both CPU helpers check environment collisions only; their boolean result does not certify self-collision freedom or reproduce the compiled self-pair exclusion policy. The legacy reference and production geometry are intentionally unchanged.