Skip to content

feat: add model construction docs#405

Open
sdas-neuraco wants to merge 60 commits intomainfrom
feat/add-model-docs
Open

feat: add model construction docs#405
sdas-neuraco wants to merge 60 commits intomainfrom
feat/add-model-docs

Conversation

@sdas-neuraco
Copy link
Contributor

Features

  • Added documentation to explain how we auto-construct models.

muneebneura and others added 22 commits February 7, 2026 15:27
* fix: renaming of uploader to importer
Co-authored-by: Steven Jacobs <steven.jacobs@neuracore.com>
* feat: add local training metadata for local runs
Co-authored-by: favour-neuraco <favour@neurco.com>
Removed note about the 'main' branch being a development branch.
@github-actions
Copy link
Contributor

github-actions bot commented Feb 16, 2026

PR source branch is valid

  • Source: feat/add-model-docs
  • Target: develop

@sdas-neuraco sdas-neuraco self-assigned this Feb 16, 2026
@sdas-neuraco sdas-neuraco added the version:patch non-breaking bug fixes; no input/output changes (except defaults) label Feb 16, 2026
@sdas-neuraco sdas-neuraco requested review from kwangneuraco, mark-neuracore and stepjam and removed request for kwangneuraco February 16, 2026 15:06
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Both Franka and Kuka has 7 Dofs, so using Franka here is not appropriate, using UR-5 is good because it has 6 DoF

It usually begins with a single robot. You train a model on a Franka Emika Panda, define the input tensors, fix the output dimensionality, and everything works as expected. The model converges, inference is stable, and the system feels clean and well-structured. At this stage, the architecture appears robot-agnostic — but in reality, it is tightly coupled to one embodiment.

Then a second dataset is introduced, perhaps from a KUKA LBR iiwa. On the surface, the robots are similar: both are 7-DoF manipulators with wrist joints and RGB inputs. But under the hood, the differences begin to surface. Joint names differ. One robot has an extra joint. Camera placements are not identical. The ordering of data points in the logs does not match. Even wrist joint data may be represented differently.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

same as the pic, a bit confused, why one robot has an extra robot

## What Is a Cross Embodiment Description?

```python
EmbodimentDescription = dict[DataType, dict[int, str]]
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

dict[str, int]?


An `EmbodimentDescription` defines what data points exist for one robot and where each datapoint lives in index space.

Each `DataType` (for example `JOINTS`, `RGB_IMAGES`, `GRIPPER_JOINT_OPEN_AMOUNT`) maps to:
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

JOINT_POSITION? I feel it is better we can strictly match names in the doc to the code

0: "panda_joint_1",
1: "panda_joint_2",
2: "panda_joint_3",
3: "panda_joint_4",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I find it be better to put kuka first and franka second, otherwise the reader may feel confused why there is a missing without too much context

Different robots can have different numbers of joints, but training requires a **consistent tensor shape**.
In this example, the wrist joint value stays at its globally assigned index, even when some intermediate indices are empty for a given robot.

If one robot has fewer joints, Neuracore fills missing dimensions with `0` so all records align to the same width.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

To be more precise, it is 0.0, float

gtiboni-neuraco and others added 8 commits February 19, 2026 11:25
* refactor: encapsulate logic in main function

* chore: example script renamed and docs updated

---------

Co-authored-by: Gabriele Tiboni <gabriele.tiboni@neuraco.com>
Co-authored-by: Gabriele Tiboni <gabriele.tiboni@neuraco.com>
Co-authored-by: StevenJacobs61 <stevenjacobs61@gamil.com>

Then a second dataset is introduced, perhaps from a KUKA LBR iiwa. On the surface, the robots are similar: both are 7-DoF manipulators with wrist joints and RGB inputs. But under the hood, the differences begin to surface. Joint names differ. One robot has an extra joint. Camera placements are not identical. The ordering of data points in the logs does not match. Even wrist joint data may be represented differently.

At first, the solution is incremental. You reorder tensors. You insert padding. You add a mapping layer. You write conditionals in the inference code. The pipeline still runs. But now structure has started leaking. The model input definition is no longer cleanly separated from embodiment logic.
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

conditions?

@stepjam stepjam force-pushed the develop branch 3 times, most recently from 3982231 to e37ad91 Compare March 5, 2026 10:49
@stepjam stepjam deleted the branch main March 5, 2026 16:19
@stepjam stepjam closed this Mar 5, 2026
@stepjam stepjam reopened this Mar 5, 2026
@stepjam stepjam changed the base branch from develop to main March 5, 2026 16:31
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

version:patch non-breaking bug fixes; no input/output changes (except defaults)

Projects

None yet

Development

Successfully merging this pull request may close these issues.