Skip to content
Back to skills

Perception Geometry

ASecurity

"Route RGB-D projection, heightmap construction, rigid transforms,

  • 247 stars
  • 0 votes
  • 0 copies
  • 1 view
  • Added September 9, 2026
developmentpythonrustgobashapi

Works with

  • cli
  • api

Security analysis

A100/100

Pro scans all 5 files and shows the line behind each finding

Scanned September 9, 2026

npx -y skills add VectorSpaceLab/AREX-Skill --skill perception-geometry --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Perception Geometry?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Perception Geometry
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/vectorspacelab-perception-geometry/badge)](https://www.skillsdirectory.com/skills/vectorspacelab-perception-geometry)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: perception-geometry
description: "Route RGB-D projection, heightmap construction, rigid transforms,
  camera calibration data, workspace bounds, and depth-unit diagnostics for
  Visual Pushing and Grasping."
disable-model-invocation: true
metadata:
  disco-role: operating
license: BSD 2-Clause
---

# Perception and geometry

Use this route when a task starts with an RGB-D frame and needs camera-space
points, robot-frame points, a top-down heightmap, camera calibration files,
workspace clipping, or the repository's rigid-transform helpers. This skill
is an operating reference, not a replacement for a camera driver, robot
controller, simulator, or learning loop.

## Evidence and compatibility boundary

The contracts below are distilled from the historical source commit
`580e2334beec0d83b49e6ca89d7542b79d1d4350`, especially `utils.py`,
`robot.py`, `real/camera.py`, `calibrate.py`, `main.py`, `trainer.py`,
`logger.py`, and the README. Those filenames are source evidence labels, not
bundled runtime modules. The source is a Python 2/early-Python-3 project with
no package metadata. A bounded current-Python numerical-stack check is only a
compatibility diagnostic and does **not** establish modern full-loop
compatibility.

Let `<skill-root>` mean the directory containing the root `SKILL.md`. The
bundled smoke helper is deliberately standalone and does not import the
historical checkout. Run it before trusting a new fixture:

```bash
python <skill-root>/sub-skills/perception-geometry/scripts/geometry_smoke.py --help
python <skill-root>/sub-skills/perception-geometry/scripts/geometry_smoke.py
```

See [the API contracts](references/api-reference.md), [calibration and data
formats](references/data-and-calibration.md), [failure diagnosis](references/troubleshooting.md),
and the [standalone smoke helper](scripts/geometry_smoke.py).

## Route and execute

1. **Normalize the boundary.** Establish image height `H`, width `W`, RGB
   channel order, intrinsic matrix units, and whether depth is already in
   metres. The source formula has no shape or unit validation.
2. **Apply depth scale exactly once.** The RealSense TCP client first applies
   the per-frame wire scale to `uint16` depth. The operator-supplied application
   then applies the calibration scale from
   `<CALIBRATION_OUTPUT_DIR>/camera_depth_scale.txt`. Do not apply either
   factor a second time; the historical `real/` path is source evidence only.
3. **Project with `get_pointcloud`.** Supply RGB `(H,W,3)`, depth `(H,W)`, and
   a 3x3 pinhole matrix. The result is row-major camera points `(H*W,3)` and
   matching RGB rows `(H*W,3)`.
4. **Transform with the camera pose.** `cam_pose` is a homogeneous 4x4
   camera-to-robot/world pose: `p_robot = R @ p_camera + t`. It is not the
   inverse of the pose expected by `get_heightmap`.
5. **Rasterize with `get_heightmap`.** Bounds are robot-coordinate metres;
   resolution is metres per pixel. The map is indexed `[y,x]`, has shape
   `(round(y_span/res), round(x_span/res))`, and keeps the greatest-z point at
   a colliding pixel because points are sorted by increasing z before
   assignment.
6. **Handle empty cells at the model boundary.** `get_heightmap` uses NaN
   for empty cells in its usual negative-bottom workspace. The main loop
   copies the depth map and replaces NaN with zero before calling `Trainer`.
   Geometry itself must remain in metres and must not perform ImageNet-style
   normalization.

## Exact operational facts

- RGB is RGB, not BGR, at the geometry boundary. Simulation data is flipped
  horizontally and converted to `uint8`; the RealSense client returns
  `uint8` RGB. `get_pointcloud` preserves the three source channel values.
- `get_heightmap` filters x/y lower-inclusive and upper-exclusive, and z
  upper-exclusive. It does not explicitly filter z below the lower workspace
  bound; the post-rasterization subtraction clips values below the bottom to
  zero. Treat this historical behavior as an API quirk, not a general policy.
- `workspace_limits` is a 3x2 array ordered `[x, y, z]`, each row
  `[minimum, maximum]`. Main defaults are simulation
  `[[-0.724,-0.276],[-0.224,0.224],[-0.0001,0.4]]` and real
  `[[0.3,0.748],[-0.224,0.224],[-0.255,-0.1]]` metres. The calibration script
  uses a separate grid `[[0.3,0.748],[0.05,0.4],[-0.2,-0.1]]` and 0.05 m grid
  spacing; do not silently substitute it for the runtime workspace.
- The main default heightmap resolution is `0.002` metres/pixel. For either
  0.448 m by 0.448 m main workspace, the resulting map is 224 by 224.
- `euler2rotm` consumes `[rx,ry,rz]` radians and returns `Rz @ Ry @ Rx`.
  `rotm2euler` returns a length-3 radian array and asserts orthogonality.
  `angle2rotm` returns a 4x4 homogeneous matrix and requires a NumPy axis.

## Scope boundary

For TCP framing, RealSense server setup, robot motion, calibration execution,
or physical/simulator prerequisites, hand off to the repository's real-robot or
simulation route. For model inputs, rotations inside the network, rewards, or
training updates, hand off to training; this route only records the exact
RGB/depth normalization boundary needed to feed that route.

Files in this skill

  • SKILL.md5.1 KB
  • references/api-reference.md6 KB
  • references/data-and-calibration.md5.5 KB
  • references/troubleshooting.md5.3 KB
  • scripts/geometry_smoke.py8.9 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…