# Pemroses Lingkungan

Environment processors mengubah observasi lingkungan sebelum prosesor milik policy, dan aksi policy sebelum lingkungan. Setiap konfigurasi lingkungan mengembalikan pasangannya dari `get_env_processors()`, dan `make_env_pre_post_processors` membangunnya untuk evaluasi, evaluasi saat pelatihan, dan robot simulasi.

## Lingkungan simulasi tidak memerlukan apa pun

Lingkungan simulasi mencapai kebijakan dalam bentuk kanonik: gambar sebagai `observation.images.<camera>` (atau `observation.image`), dan keadaan sebagai satu `observation.state` datar, dengan orientasi gambar dan komposisi keadaan masing-masing simulator ditangani sekali oleh integrasi `src/lerobot/sim/integrations/<simulator>.py`-nya, baik untuk evaluasi, rollout, maupun perekaman, secara lokal maupun yang disajikan (lihat [Simulasi: lokal atau disajikan](./simulation)). Untuk LIBERO, misalnya, adapter observasinya membalik kedua kamera dan membangun keadaan 8-D (posisi ujung efektor, orientasi sumbu-sudut, sendi gripper), sehingga pemroses lingkungannya bersifat identitas.

Letakkan pemetaan observasi simulator baru di integrasinya dan konvensi kendalinya di `conventions()` integrasi tersebut, bukan di environment processor, sehingga robot simulasi dan lingkungan yang disajikan juga menerimanya (lihat [Menambahkan benchmark](./adding_benchmarks)).

## Ketika pemroses lingkungan masih menjadi alat

- **Lingkungan di luar `lerobot.sim`.** Isaac Lab Arena dijalankan melalui `make_env` milik repositorinya sendiri, dengan observasi torch yang di-batch; `IsaaclabArenaProcessorStep` memilih dan menggabungkan kunci state-nya serta mengonversi kameranya.
- **Adaptasi lingkungan yang spesifik untuk kebijakan.** `make_env_pre_post_processors` memungkinkan kebijakan mengganti pasangan lingkungan, seperti yang dilakukan XVLA dan Cosmos3 untuk LIBERO.

Evaluation menerima checkpoint berdasarkan apa yang dihasilkan oleh environment processors-nya: observasi setelah preprocessor dan aksi setelah postprocessor, keduanya dibaca dari `transform_features` mereka. Oleh karena itu, sebuah step mendeklarasikan outputnya di sana sebagai fungsi dari inputnya, sesuai dengan perilakunya saat runtime, misalnya step yang membangun state hanya jika source key-nya ada. Remote inference tidak menerapkan environment processors, sehingga checkpoint yang disajikan di sana harus mengambil observasi simulator dan memerintahkan aksinya sendiri.

Urutan pemrosesan selama evaluasi adalah:

```python
observation = env_preprocessor(observation)   # environment-specific
observation = preprocessor(observation)       # policy's saved preprocessing (normalization, ...)
action = postprocessor(policy.select_action(observation))
action = env_postprocessor(action)            # environment-specific
```

## Menulis satu

Prosesor lingkungan adalah langkah prosesor biasa, yang dikembalikan dari konfigurasi:

```python
from dataclasses import dataclass

from lerobot.envs.configs import EnvConfig
from lerobot.processor import ObservationProcessorStep, PolicyProcessorPipeline, ProcessorStepRegistry

@dataclass
@ProcessorStepRegistry.register(name="myenv_processor")
class MyEnvProcessorStep(ObservationProcessorStep):
    def observation(self, observation):
        processed = observation.copy()
        processed["observation.state"] = processed.pop("observation.myenv_state")
        return processed

    def transform_features(self, features):
        return features  # update if names or shapes change

@EnvConfig.register_subclass("myenv")
@dataclass
class MyEnvConfig(EnvConfig):
    ...

    def get_env_processors(self):
        return PolicyProcessorPipeline(steps=[MyEnvProcessorStep()]), PolicyProcessorPipeline(steps=[])
```

Jadikan spesifik lingkungan (tata letak tombol, bingkai koordinat) dan serahkan normalisasi serta transformasi spesifik model ke prosesor kebijakan.

