Architecture¶
Core idea¶
Mobile manipulation in unknown environments is hard because the robot cannot plan everything upfront — it discovers the world as it acts. TyGrit addresses this with a two-level hierarchical policy:
Subgoal generator (high-level) — decides what to do next: where to look, where to move, what to grasp. It re-evaluates every time the low-level policy finishes or the world model changes.
Low-level policy (planning + control) — decides how to get there: collision-free motion planning, trajectory tracking, gripper control.
The key insight is that progression is emergent, not scripted. The subgoal generator does not commit to a fixed sequence. It observes, picks the most ambitious feasible goal, and lets the low-level policy execute. When new information arrives (a better grasp candidate, an obstacle, a failed plan), the subgoal generator simply re-decides. This makes the system robust to the unknown — partial observability, moving objects, failed grasps — without explicit replanning logic.
Design principles¶
Principle |
How |
|---|---|
Protocol-first |
Every module defines a |
Config-driven dispatch |
TOML config selects the concrete implementation via factory functions |
Pure functions in |
No class state — data in, data out |
Result types for expected failures |
Exceptions only for programming errors |
No threads, no sleep |
Scheduler is strictly sequential — deterministic replay |
Module overview¶
Module |
Responsibility |
|---|---|
|
Frozen dataclasses — geometry, robot state, sensor snapshots, planning types |
|
Pure functions — math, transforms, pointcloud, depth |
|
Robot environment layer with two-level dispatch (robot → backend) |
|
IK and FK solvers (IKFast analytical, TRAC-IK numerical, batch FK) |
|
Motion planning ( |
|
Grasp prediction ( |
|
World model / belief state ( |
|
High-level goal selection ( |
|
Tracking control (MPC) and gripper commands |
|
Active gaze — where the head should look during trajectory execution |
|
Collision and self-occlusion checks |
|
Receding-horizon scheduler |
|
|
Factory pattern¶
All modules with multiple implementations follow the same pattern:
Protocol in
protocol.py— defines the interfaceConfig hierarchy in
config.py— base config with discriminator field, concrete subclass per implementationFactory function in
__init__.py— dispatches on the discriminator to build the right implementationTOML section — config loader auto-selects the concrete config subclass