# Dora Calibration Node

Minimal eye-in-hand calibration node for a camera mounted on the robot gripper.

## Inputs

- `image` (configurable via `IMAGE_INPUT`): image stream with metadata containing `encoding` and `shape` or `width/height`.
- `camera_info` (optional): `[fx, fy, cx, cy]` float array with distortion in metadata.
- `tcp_pose`: `[x, y, z, roll, pitch, yaw]` from `dora_ulite6` in mm/deg.

## Controls (OpenCV Window)

- `q` quit
- `r` restart calibration (clear observations and start over)

## Environment Variables

| Variable | Default | Description |
| --- | --- | --- |
| `IMAGE_INPUT` | `image` | Image input name |
| `CAMERA_INFO_INPUT` | `camera_info` | Camera info input name |
| `POSE_INPUT` | `tcp_pose` | Robot pose input name |
| `STATUS_INPUT` | `status` | Robot status input name (used for command completion) |
| `COMMAND_OUTPUT` | `robot_cmd` | Output name for robot command messages |
| `POSES_FILE` | `config/calibration_poses.yml` | YAML file path for calibration poses |
| `POSE_UNITS` | `m` | Units for poses file (`m` or `mm`) |
| `MOVE_SPEED` | _(unset)_ | Move speed override (mm/s) |
| `OUTPUT_FILE` | `calibration.npz` | Output calibration file (observations saved as `{name}_observations.npz`) |
| `METHOD` | `TSAI` | Hand-eye method (TSAI, PARK, HORAUD, ANDREFF, DANIILIDIS) |
| `SQUARES_X` | `4` | ChArUco board squares X |
| `SQUARES_Y` | `6` | ChArUco board squares Y |
| `SQUARE_LENGTH` | `0.04` | Square length (m) |
| `MARKER_LENGTH` | `0.03` | Marker length (m) |
| `AUTO_RUN` | `true` | Automatically iterate poses and capture |
| `WAIT_AFTER_MOVE` | `2.0` | Seconds to wait after a move before capture |
| `MOVE_HOME_ON_START` | `true` | Move to calibration home when starting |
| `HOME_X` | `200` | Calibration home X (mm) |
| `HOME_Y` | `0` | Calibration home Y (mm) |
| `HOME_Z` | `300` | Calibration home Z (mm) |
| `HOME_ROLL` | `180` | Calibration home roll (deg) |
| `HOME_PITCH` | `0` | Calibration home pitch (deg) |
| `HOME_YAW` | `0` | Calibration home yaw (deg) |
| `MIN_CORNERS` | `6` | Minimum ChArUco corners required for pose |
| `LOG_INTERVAL` | `2.0` | Seconds between console detection logs |
| `AUTO_SOLVE` | `true` | Automatically solve and save after last pose |

## Notes

- Calibration runs automatically: moves through poses, captures, and saves results.
- For safe operation, keep a clear workspace around the robot.
