# Camera Recorder

This recorder uses YOLO pose tracking from a camera or video source, then writes:

- `DataG1/<take>.jsonl`: replay-compatible G1 dataset with 29 joints
- `RawPose/<take>.pose.jsonl`: raw 2D pose keypoints and diagnostics
- `Models/yolo11n-pose.pt`: local bundled YOLO pose model
- `camera_recorder_config.json`: recorder defaults, runtime settings, and file locations
- `joint.json`: robot joint counts, waist indices, and joint limits
- `pose_mapping.json`: camera pose-to-joint mapping rules and gains

The generated G1 dataset is designed to work with the existing replay scripts in this project. Lower body joints stay at `arm_home.jsonl`, and the upper body is estimated from the visible 2D pose.

## Record From Camera

```bash
cd /home/zedx/Robotics_workspace/yslootahtech/G1_Lootah/Camera_Recorder
python3 g1_camera_pose_recorder.py --source ask --output hands_up_cam
```

Recorder defaults also come from `camera_recorder_config.json`. Right now the default output is `test_take`, and the default home pose is the local `DataG1/arm_home.jsonl`, so you can simply run:

```bash
cd /home/zedx/Robotics_workspace/yslootahtech/G1_Lootah/Camera_Recorder
python3 g1_camera_pose_recorder.py
```

The recorder asks for an `Enter` confirmation before it starts writing files. Use `--no-prompt` to skip that.

You can also use explicit aliases like `--output-file` and `--home-file`.

By default, the recorder now looks for `Models/yolo11n-pose.pt` first.

All operational defaults are now loaded from `camera_recorder_config.json`. CLI flags still work, but they override the JSON values for that run only. The mapper-specific data is split into `joint.json` and `pose_mapping.json`, which are referenced from `camera_recorder_config.json`.

Use a different config file:

```bash
python3 g1_camera_pose_recorder.py --config /path/to/camera_recorder_config.json --source 0 --output test_take
```

Fixed camera index:

```bash
python3 g1_camera_pose_recorder.py --source 0 --output hands_up_cam
```

Record for a fixed duration:

```bash
python3 g1_camera_pose_recorder.py --source 0 --output hands_up_cam --seconds 12
```

Skip the start confirmation prompt:

```bash
python3 g1_camera_pose_recorder.py --no-prompt
```

Use a custom YOLO model or custom home pose:

```bash
python3 g1_camera_pose_recorder.py \
  --source 0 \
  --output wave_cam \
  --model /home/zedx/Robotics_workspace/AI/YOLO/yolo11n-pose.pt \
  --home-pose /home/zedx/Robotics_workspace/yslootahtech/G1_Lootah/Manual_Recorder/DataG1/arm_home.jsonl
```

## Replay The Recorded Dataset

Because the file is saved under `Camera_Recorder/DataG1`, pass the full path to replay:

```bash
python3 /home/zedx/Robotics_workspace/yslootahtech/G1_Lootah/Camera_Recorder/g1_camera_pose_replay.py \
  enp3s0 \
  --input /home/zedx/Robotics_workspace/yslootahtech/G1_Lootah/Camera_Recorder/DataG1/hands_up_cam.jsonl \
  --home arm_home.jsonl
```

`g1_camera_pose_replay.py` also reads replay defaults from `camera_recorder_config.json`, so from inside `Camera_Recorder` you can run:

```bash
python3 g1_camera_pose_replay.py
```

Replay scripts also accept explicit aliases like `--iface`, `--input-file`, and `--home-file`.

Safer camera-aware replay:

```bash
python3 /home/zedx/Robotics_workspace/yslootahtech/G1_Lootah/Camera_Recorder/g1_camera_pose_replay_v2.py \
  enp3s0 \
  --input /home/zedx/Robotics_workspace/yslootahtech/G1_Lootah/Camera_Recorder/DataG1/hands_up_cam.jsonl \
  --home arm_home.jsonl \
  --speed 0.35
```

`g1_camera_pose_replay_v2.py` also reads replay defaults from `camera_recorder_config.json`. Right now those defaults are:

- `iface = enp3s0`
- `input = test_take.jsonl`
- `home = arm_home.jsonl`

So you can run:

```bash
cd /home/zedx/Robotics_workspace/yslootahtech/G1_Lootah/Camera_Recorder
python3 g1_camera_pose_replay_v2.py
```

## Notes

- `q` or `Esc` stops recording.
- `Ctrl+C` cleanly cancels camera selection or the start prompt, and stops recording if it is already running.
- Any joint that is not captured in a frame falls back to the `arm_home.jsonl` pose for that joint.
- The mapping is heuristic because a single 2D camera cannot recover full 3D shoulder and wrist orientation.
- On this machine, the default `python3` does not currently have `ultralytics`; run the recorder in the same Python environment you already use for `/home/zedx/Robotics_workspace/AI/YOLO/YOLO_Test_3.py`.
