Xarm-DataCollection/src/lerobot_robot_ufactory/__init__.py
Vinman 8c7cea1cb6 feat(robot): 增强 UMI SLAM 稳定性,支持相机画面缩放
将插件猴子补丁改为通过 UF_LEROBOT_PATCH_TYPE 环境变量按需触发;
SLAM 初始化增加就绪等待、重试及位姿置信度/时间戳校验;
新增 cameras_args 配置支持相机画面 resize;
修复遥操作 config parser 导入及多臂相机清理问题。
2026-07-21 18:59:17 +08:00

71 lines
3.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import os
# register plugin
import lerobot_robot_ufactory.cameras.umi_camera
import lerobot_robot_ufactory.robots.uf_robot
import lerobot_robot_ufactory.robots.uf_mock_robot
import lerobot_robot_ufactory.teleoperators.uf_mock_teleop
import lerobot_robot_ufactory.teleoperators.gello_teleop
import lerobot_robot_ufactory.teleoperators.pika_teleop
import lerobot_robot_ufactory.teleoperators.space_mouse
import lerobot_robot_ufactory.teleoperators.umi_teleop
def patch_lerobot_modules():
"""
Patch lerobot modules to use uFactory robot implementations.
This function replaces the default implementations of certain functions in the lerobot package
with the uFactory-specific implementations. It is intended to be called at the beginning of a script
that uses the lerobot package, before any other imports from lerobot are made.
"""
from lerobot_robot_ufactory.cameras.utils import make_cameras_from_configs as _uf_make_cameras_from_configs
from lerobot_robot_ufactory.robots.utils import make_robot_from_config as _uf_make_robot_from_config
from lerobot_robot_ufactory.teleoperators.utils import make_teleoperator_from_config as _uf_make_teleoperator_from_config
from lerobot_robot_ufactory.configs.parser import wrap as _uf_config_parser_wrap
import lerobot.cameras as _lerobot_cameras
import lerobot.robots as _lerobot_robot
import lerobot.teleoperators as _lerobot_teleoperators
import lerobot.cameras.utils as _lerobot_cameras_utils
import lerobot.robots.utils as _lerobot_robot_utils
import lerobot.teleoperators.utils as _lerobot_teleoperators_utils
import lerobot.configs.parser as _lerobot_configs_parser
# patch
_lerobot_cameras.make_cameras_from_configs = _uf_make_cameras_from_configs
_lerobot_robot.make_robot_from_config = _uf_make_robot_from_config
_lerobot_teleoperators.make_teleoperator_from_config = _uf_make_teleoperator_from_config
_lerobot_cameras_utils.make_cameras_from_configs = _uf_make_cameras_from_configs
_lerobot_robot_utils.make_robot_from_config = _uf_make_robot_from_config
_lerobot_teleoperators_utils.make_teleoperator_from_config = _uf_make_teleoperator_from_config
_lerobot_configs_parser.wrap = _uf_config_parser_wrap
_UF_LEROBOT_PATCH_TYPE = os.environ.get('UF_LEROBOT_PATCH_TYPE', '0')
if _UF_LEROBOT_PATCH_TYPE == '1':
print("Using UF_LEROBOT_PATCH_TYPE=1: patching lerobot modules for UFACTORY robot support.")
patch_lerobot_modules()
# # ── 重新装饰上游脚本中已用旧 wrap 装饰过的函数 ──
# # 因为 @parser.wrap() 在模块 import 时就执行了,
# # register_third_party_plugins() 触发本文件时 record() 已经是旧装饰器包好的。
# # 取出原始函数,用 _uf_config_wrap 重新包一次。
# import sys as _sys
# # 执行 python xxx.py 时模块名是 __main__console_scripts 入口时是完整路径
# _SCRIPTS_TO_REWRAP = (
# "__main__",
# "lerobot.scripts.lerobot_record",
# "lerobot.scripts.lerobot_teleoperate",
# "lerobot.scripts.lerobot_eval",
# )
# for _mod_name in _SCRIPTS_TO_REWRAP:
# _mod = _sys.modules.get(_mod_name)
# if _mod is None:
# continue
# _record_fn = getattr(_mod, "record", getattr(_mod, "teleoperate", getattr(_mod, "eval_main", None)))
# if _record_fn is None:
# continue
# _original = getattr(_record_fn, "__wrapped__", None)
# if _original is not None:
# if _mod_name == "__main__":
# _sys.modules[_mod_name] = _uf_config_wrap()(_original)
# else:
# setattr(_mod, _record_fn.__name__, _uf_config_wrap()(_original))
# break # 找到并处理后就退出,避免重复