# معالجات البيئة

تحوّل معالجات البيئة ملاحظات البيئة قبل معالجات السياسة الخاصة بها، وتحوّل إجراءات السياسة قبل البيئة. يعيد كل تكوين بيئة زوج المعالجات الخاص به من `get_env_processors()`، ويبني `make_env_pre_post_processors` هذه المعالجات للتقييم، وتقييم وقت التدريب، والروبوت المحاكي.

## لا تحتاج البيئات المحاكاة إلى أي شيء

تصل البيئات المحاكاة إلى السياسة (Policy) بشكل قياسي مسبقًا: الصور على شكل `observation.images.<camera>` (أو `observation.image`)، والحالة كمتجه مسطّح واحد `observation.state`، حيث يُعالج اتجاه الصور وتكوين الحالة الخاص بكل محاكي مرة واحدة عبر تكامله `src/lerobot/sim/integrations/<simulator>.py`، سواءً كان ذلك للتقييم أو النشر (Rollout) أو التسجيل، محليًا أو عبر خادم (انظر [المحاكاة: محليًا أو عبر خادم](./simulation)). فبالنسبة إلى LIBERO، على سبيل المثال، يقوم مُكيّف الملاحظات (Observation Adapter) الخاص به بقلب كلا الكاميرتين وبناء حالة بأبعاد ثمانية (موضع الطرف النهائي، الاتجاه بنظام المحور-الزاوية، مفاصل الماسك)، لذا فإن معالجات البيئة الخاصة به تكون هوية (Identity).

ضع خرائط الملاحظات لمحاكي جديد في تكامله، واتفاقيات التحكم الخاصة به في دالة `conventions()` لذلك التكامل، بدلاً من وضعها في معالج البيئة، بحيث يحصل روبوت المحاكاة والبيئة المُقدَّمة عليها أيضاً (انظر [إضافة معيار تقييم](./adding_benchmarks)).

## عندما يكون معالج البيئة هو الأداة

- **البيئات خارج `lerobot.sim`.** يعمل Isaac Lab Arena عبر `make_env` الخاص بمستودعه، مع ملاحظات torch مُجمَّعة؛ حيث يختار `IsaaclabArenaProcessorStep` مفاتيح الحالة الخاصة به ويلصقها، ويحوّل كاميراته.
- **تكييفات البيئة المحددة لكل سياسة.** يتيح `make_env_pre_post_processors` للسياسة استبدال زوج البيئة، كما تفعل XVLA وCosmos3 في LIBERO.

يتيح التقييم نقطة تفتيش على ما تنتجه معالجات البيئة: الملاحظة بعد المعالج المسبق والإجراء بعد المعالج اللاحق، وكلاهما يُقرأ من `transform_features`. لذلك، يُعلن كل خطوة عن مخرجه هناك كدالة لدخله، بالطريقة التي يتصرف بها وقت التشغيل، على سبيل المثال خطوة تبني الحالة فقط عندما يكون مفتاح المصدر موجوداً. لا يطبق الاستدلال عن بُعد أي معالجات بيئة، لذا يجب على نقطة التفتيش المُقدَّمة هناك أن تستقبل ملاحظة المحاكي وتصدر إجراءها بنفسها.

ترتيب المعالجة أثناء التقييم هو:

```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
```

## كتابة واحدة

معالج البيئة هو خطوة معالج عادية، تُعاد من الإعداد:

```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=[])
```

اجعلها محددة بالبيئة (تخطيطات المفاتيح، أطر الإحداثيات) واترك عمليات التطبيع والتحويلات الخاصة بالنموذج لمعالجات السياسة.

