Not built yet, in the order it would pay. Nothing here is a promise about dates.
1. A MuJoCo binding of its own
Quiddity.Mjcf writes a part as an MJCF model. A model is not a world: stepping
one, reading its state and rendering a camera from it needs MuJoCo itself, and
there is no maintained Elixir binding of the C API.
ex_mujoco, as a package beside this one:
- load an MJCF/XML model, step it, read
qpos/qvel/xpos/sensordata; - render a camera to RGBA and depth offscreen, with no display;
- apply
qfrc_appliedand controls, reset, read contacts; - ownership: an
mjModel/mjDatapair is mutable and not shareable, so one world per process behind aMutex— unlike the read-only B-rep handle here.
Not in scope: writing MJCF from Elixir structures (a file is the interface) and
any modelling. Quiddity.Mjcf already produces the part.
2. An instance's placement, applied to the rays
Quiddity.parts/1 reports where each instance of an assembly sits, but ray/4,
nearest/3 and frame/2 ask the question in the file's own coordinates, so a
caller that wants to sense instance three has to transform its ray into that
instance's frame and the answer back out. A :place option taking the matrix
parts/1 already reports would put that arithmetic on the side of the boundary
where the geometry is.
3. Registering a scan to the part
Quiddity.ray/4 against a B-rep is a perfect range image; a real sensor's is
noisy, partial, and in its own frame. Registering a point cloud to the part would
make the exactness usable on measured data rather than on drawings. It needs the
nearest point on a surface, which Quiddity.nearest/3 does not answer today —
it names the nearest faces with a distance and a normal, which is what naming the
feature at a coordinate wants and not what ICP does.
4. Written by hand, not generated
Quiddity.Api.operations/0 and Quiddity.Native are kept in step by a test that
calls every listed operation. That covers arity and existence; it does not cover
the argument validation each wrapper does, so a new operation is one table entry
and a written wrapper, and the test is what catches it when the two disagree.