- Add pick_test_tube task: USDC asset repackaging, grasp generation, task config - Add tools: usdc_to_obj.py, repackage_test_tube.py, fix_test_tube_materials.py - Add custom_task_guide.md: full Chinese documentation for creating custom tasks - Add crawled InternDataEngine online docs (23 pages) - Add grasp generation script (gen_tube_grasp.py) and pipeline config
188 lines
5.2 KiB
Markdown
188 lines
5.2 KiB
Markdown
# Source: https://internrobotics.github.io/InternDataEngine-Docs/concepts/cameras.html
|
||
|
||
# Cameras [](#cameras)
|
||
|
||
Cameras capture visual data from the simulation. InternDataEngine uses a unified `CustomCamera `class that can be fully configured via YAML.
|
||
|
||
## Camera Architecture [](#camera-architecture)
|
||
|
||
```
|
||
CustomCamera
|
||
├── Pose Configuration
|
||
│ ├── Translation
|
||
│ └── Orientation
|
||
├── Intrinsics
|
||
│ ├── Focal length
|
||
│ ├── Principal point
|
||
│ └── Resolution
|
||
├── Lens Settings
|
||
│ ├── f-number
|
||
│ ├── Focus distance
|
||
│ └── Aperture
|
||
└── Outputs
|
||
├── RGB image
|
||
└── Camera pose
|
||
```
|
||
1
|
||
2
|
||
3
|
||
4
|
||
5
|
||
6
|
||
7
|
||
8
|
||
9
|
||
10
|
||
11
|
||
12
|
||
13
|
||
14
|
||
15
|
||
|
||
## Camera Configuration [](#camera-configuration)
|
||
|
||
Camera configuration is split into two parts: **pose configuration **(in task YAML) and **intrinsic parameters **(in separate camera YAML files).
|
||
|
||
### Part 1: Pose Configuration (Task YAML) [](#part-1-pose-configuration-task-yaml)
|
||
|
||
Configure camera pose and randomization in task YAML files:
|
||
yaml
|
||
```
|
||
cameras:
|
||
- name: lift2_hand_left # Unique camera name
|
||
translation: [0.07, 0.01, 0.08] # Position offset [x, y, z] in meters
|
||
orientation: [0.62, 0.33, -0.33, -0.62] # Quaternion [w, x, y, z]
|
||
camera_axes: usd # Coordinate system (usd/ros/opencv)
|
||
camera_file: workflows/simbox/core/configs/cameras/realsense_d405.yaml # Path to intrinsic config
|
||
parent: "lift2/lift2/lift2/fl/link6" # Parent prim path (robot link or empty for world)
|
||
apply_randomization: True # Enable pose randomization
|
||
max_translation_noise: 0.02 # Max position noise (meters)
|
||
max_orientation_noise: 2.5 # Max rotation noise (degrees)
|
||
```
|
||
1
|
||
2
|
||
3
|
||
4
|
||
5
|
||
6
|
||
7
|
||
8
|
||
9
|
||
10
|
||
|
||
### Part 2: Intrinsic Parameters (Camera YAML) [](#part-2-intrinsic-parameters-camera-yaml)
|
||
|
||
Define camera intrinsics in a separate YAML file (e.g., `workflows/simbox/core/configs/cameras/realsense_d405.yaml `):
|
||
yaml
|
||
```
|
||
camera_type: "RealSense" # Camera model type
|
||
camera_params: [433.89, 433.38, 322.79, 243.14] # [fx, fy, cx, cy] intrinsic parameters
|
||
resolution_width: 640 # Image width in pixels
|
||
resolution_height: 480 # Image height in pixels
|
||
frequency: 30 # Capture frequency (Hz)
|
||
pixel_size: 3 # Physical pixel size (μm)
|
||
f_number: 2.0 # Lens aperture f-number
|
||
focus_distance: 0.6 # Focus distance (meters)
|
||
```
|
||
1
|
||
2
|
||
3
|
||
4
|
||
5
|
||
6
|
||
7
|
||
8
|
||
|
||
## Understanding Camera Parameters [](#understanding-camera-parameters)
|
||
|
||
### Intrinsic Matrix [](#intrinsic-matrix)
|
||
|
||
The camera intrinsic matrix K:
|
||
|
||
```
|
||
K = | fx 0 cx |
|
||
| 0 fy cy |
|
||
| 0 0 1 |
|
||
|
||
fx, fy = focal lengths (pixels)
|
||
cx, cy = principal point (pixels)
|
||
```
|
||
1
|
||
2
|
||
3
|
||
4
|
||
5
|
||
6
|
||
|
||
### Sensor Settings [](#sensor-settings)
|
||
|
||
- **resolution_width **( int ): Image width in pixels. Typical value: 640 - 1920.
|
||
- **resolution_height **( int ): Image height in pixels. Typical value: 480 - 1080.
|
||
- **pixel_size **( float ): Physical pixel size (μm). Typical value: 1.4 - 3.0.
|
||
- **f_number **( float ): Lens aperture. Typical value: 1.8 - 4.0.
|
||
- **focus_distance **( float ): Focus distance (m). Typical value: 0.3 - 1.0.
|
||
- **frequency **( int ): Capture frequency (Hz). Typical value: 15 - 60.
|
||
|
||
## Camera Mounting [](#camera-mounting)
|
||
|
||
### Robot-Mounted [](#robot-mounted)
|
||
|
||
Attach to robot link:
|
||
yaml
|
||
```
|
||
parent: "lift2/lift2/lift2/fl/link6" # End-effector link
|
||
translation: [0.07, 0.01, 0.08] # Offset from link
|
||
```
|
||
1
|
||
2
|
||
|
||
### World-Fixed [](#world-fixed)
|
||
|
||
Fixed in world frame:
|
||
yaml
|
||
```
|
||
parent: ""
|
||
translation: [0.5, 0.5, 1.2]
|
||
orientation: [0.707, 0.707, 0, 0] # Looking down
|
||
```
|
||
1
|
||
2
|
||
3
|
||
|
||
## Domain Randomization [](#domain-randomization)
|
||
|
||
Enable camera pose randomization with the `_perturb_camera() `method defined in `workflows/simbox/core/tasks/banana.py `:
|
||
yaml
|
||
```
|
||
cameras:
|
||
- name: head_camera
|
||
apply_randomization: true
|
||
max_translation_noise: 0.03 # ±3 cm
|
||
max_orientation_noise: 5.0 # ±5 degrees
|
||
```
|
||
1
|
||
2
|
||
3
|
||
4
|
||
5
|
||
|
||
## Camera Outputs [](#camera-outputs)
|
||
|
||
`CustomCamera.get_observations() `returns:
|
||
|
||
- **color_image **( ndarray ): RGB image with shape H×W×3 (float32).
|
||
- **camera2env_pose **( ndarray ): Camera to environment transform matrix with shape 4×4.
|
||
- **camera_params **( ndarray ): Intrinsic matrix K with shape 3×3.
|
||
|
||
## Key Files [](#key-files)
|
||
|
||
| File | Purpose |
|
||
| `cameras/custom_camera.py ` | CustomCamera implementation |
|
||
| `cameras/__init__.py ` | Camera registry |
|
||
|
||
## References [](#references)
|
||
|
||
- [Isaac Sim Camera Sensors Documentation](https://docs.isaacsim.omniverse.nvidia.com/4.5.0/sensors/isaacsim_sensors_camera.html)
|
||
- [Intel RealSense D415 Product Brief](https://simplecore.intel.com/realsensehub/wp-content/uploads/sites/63/D415_Series_ProductBrief_010718.pdf)
|
||
- [Intel RealSense D435 Product Brief](https://simplecore.intel.com/realsensehub/wp-content/uploads/sites/63/D435_Series_ProductBrief_010718.pdf)
|
||
- [Camera Frame Axes Reference](https://www.researchgate.net/figure/Axes-of-the-camera-frame-on-the-camera-CCD-and-lens_fig3_225025509) |