Packages

An Elixir wrapper of github.com/pzfreo/quiddity to bring feature extraction from CAD, with the geometry underneath it: rays, frames, meshes and surface samples. Wrapped via rustler.

Current section

Files

Jump to
ex_quiddity docs roadmap.md
Raw

docs/roadmap.md

# Roadmap

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_applied` and controls, reset, read contacts;
- ownership: an `mjModel`/`mjData` pair is mutable and not shareable, so one
  world per process behind a `Mutex` — 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.