LeRobot documentation
Robotlar ve Teleoperatörler için İşlemciler
Robotlar ve Teleoperatörler için İşlemciler
Bu kılavuz, teleoperatörleri (ör. telefon) robotlara ve veri setlerine bağlayan işleme hatlarının nasıl oluşturulup değiştirileceğini gösterir. Hatlar, farklı eylem/gözlem uzayları arasındaki dönüşümleri standartlaştırır; böylece yapıştırıcı kodu yeniden yazmadan teleop ve robotları değiştirebilirsiniz.
Somutluk için Phone to SO‑100 takipçi örneklerini kullanıyoruz, ancak aynı kalıplar diğer robotlara da uygulanabilir.
Öğrenecekleriniz
- Mutlak ve göreli EE kontrolü: Her birinin ne anlama geldiği, artıları ve eksileri ve göreviniz için nasıl seçim yapacağınız.
- Üç boru hattı deseni: Teleop eylemlerinin → veri seti eylemlerine → robot komutlarına ve robot gözlemlerinin → veri seti gözlemlerine nasıl eşlenmesi gerektiği.
- Adaptörler (
to_transition/to_output): Ham sözlükleriEnvTransitionnesnelerine ve geriye dönüştürerek gereksiz kodu azaltma yöntemi. - Veri seti özellik sözleşmeleri: Adımların
transform_features(...)aracılığıyla özellikleri nasıl beyan ettiği ve bunların kaydedilmek üzere nasıl toplanıp birleştirildiği. - Bir temsil seçimi: Eklem, mutlak EE pozları veya göreli EE deltalarının ne zaman saklanması gerektiği ve bunun eğitimi nasıl etkilediği.
- Pipeline özelleştirme yönergesi: Robot/URDF'lerin güvenli bir şekilde değiştirilmesi ve sınırların, adım boyutlarının ve IK başlatma gibi seçeneklerin ayarlanması.
Mutlak ve göreli EE kontrolü
Bu kılavuzdaki örnekler, akıl yürütmesi kolay olduğu için mutlak uç efektor (EE) pozlarını kullanır. Uygulamada, öğrenme özellikleri olarak göreli EE deltaları veya eklem konumu genellikle tercih edilir.
İşleyicilerle, politikanızda kullanmak istediğiniz öğrenme özelliklerini seçersiniz. Bunlar eklem konumları/hızları, mutlak EE veya göreli EE konumları olabilir. Eklem torkları, motor akımları gibi diğer özellikleri de depolamayı seçebilirsiniz.
Üç boru hattı
Genellikle üç pipeline oluştururuz. Kurulumunuza bağlı olarak, eylem ve gözlem uzayları zaten eşleşiyorsa bunlardan bazıları boş olabilir. Bu pipeline'ların her biri, farklı eylem ve gözlem uzayları arasındaki farklı dönüşümleri ele alır. Aşağıda her bir pipeline için kısa bir açıklama bulunmaktadır.
- Pipeline 1: Teleop action space → dataset action space (phone pose → EE targets)
- Pipeline 2: Veri seti eylem uzayı → robot komut uzayı (EE hedefleri → eklem)
- Pipeline 3: Robot gözlem uzayı → veri seti gözlem uzayı (eklemler → EE duruşu)
Aşağıda, telefon ile SO-100 takipçi örneklerinde kullandığımız üç hattın bir örneği verilmiştir:
phone_to_robot_ee_pose_processor = RobotProcessorPipeline[tuple[RobotAction, RobotObservation], RobotAction]( # teleop -> dataset action
steps=[
MapPhoneActionToRobotAction(platform=teleop_config.phone_os),
EEReferenceAndDelta(
kinematics=kinematics_solver, end_effector_step_sizes={"x": 0.5, "y": 0.5, "z": 0.5}, motor_names=list(robot.bus.motors.keys()),
),
EEBoundsAndSafety(
end_effector_bounds={"min": [-1.0, -1.0, -1.0], "max": [1.0, 1.0, 1.0]}, max_ee_step_m=0.20,
),
GripperVelocityToJoint(),
],
to_transition=robot_action_observation_to_transition,
to_output=transition_to_robot_action,
)
robot_ee_to_joints_processor = RobotProcessorPipeline[tuple[RobotAction, RobotObservation], RobotAction]( # dataset action -> robot
steps=[
InverseKinematicsEEToJoints(
kinematics=kinematics_solver, motor_names=list(robot.bus.motors.keys()), initial_guess_current_joints=True,
),
],
to_transition=robot_action_observation_to_transition,
to_output=transition_to_robot_action,
)
robot_joints_to_ee_pose = RobotProcessorPipeline[RobotObservation, RobotObservation]( # robot obs -> dataset obs
steps=[
ForwardKinematicsJointsToEE(kinematics=kinematics_solver, motor_names=list(robot.bus.motors.keys()))
],
to_transition=observation_to_transition,
to_output=transition_to_observation,
)to_transition / to_output neden
Robot/teleoperatörden pipeline'a ve geri dönüştürmek için to_transition ve to_output pipeline adaptörlerini kullanırız.
Bunlar, gereksiz kodu azaltmak için dönüşümleri standartlaştırır ve robot ile teleoperatörlerin ham sözlükleri ile pipeline'ın EnvTransition biçimi arasında köprü görevi görür.
Telefondan SO-100 takipçi örneklerinde aşağıdaki adaptörleri kullanıyoruz:
robot_action_observation_to_transition: bir(action, robot observation)çiftini pipeline geçişine dönüştürür (EE ve IK adımları robotun mevcut eklem konumlarına ihtiyaç duyar).transition_to_robot_action: pipeline geçişini robot eylemi sözlüğüne dönüştürür.observation_to_transition: robot gözlem sözlüğünü bir iş akışı geçişine dönüştürür.transition_to_observation: pipeline geçişini bir gözlem sözlüğüne dönüştürür.
Daha fazla ayrıntı için src/lerobot/processor/converters.py dosyasına göz atın.
Veri seti özellik sözleşmeleri
Veri seti özellikleri, veri setinde kaydedilen anahtarlar tarafından belirlenir. Her adım, transform_features(...) olarak adlandırılan bir sözleşmede değiştirdiği özellikleri beyan edebilir. Bir işlemci oluşturulduğunda, işlemci bu özelliklerin tümünü aggregate_pipeline_dataset_features() ile bir araya getirebilir ve birden çok özellik sözlüğünü combine_feature_dicts(...) ile birleştirebilir.
Aşağıda, telefon ile SO-100 takipçi örneklerinde transform_features yöntemiyle özellikleri nasıl beyan ettiğimize dair bir örnek yer almaktadır:
def transform_features(
self, features: dict[PipelineFeatureType, dict[str, PolicyFeature]]
) -> dict[PipelineFeatureType, dict[str, PolicyFeature]]:
# We only use the ee pose in the dataset, so we don't need the joint positions
for n in self.motor_names:
features[PipelineFeatureType.ACTION].pop(f"{n}.pos", None)
# We specify the dataset features of this step that we want to be stored in the dataset
for k in ["x", "y", "z", "wx", "wy", "wz", "gripper_pos"]:
features[PipelineFeatureType.ACTION][f"ee.{k}"] = PolicyFeature(
type=FeatureType.STATE, shape=(1,)
)
return featuresBurada bu adımda değiştirdiğimiz PolicyFeatures'ı bildiriyoruz, böylece işlemciyi çalıştırdığımızda hangi özellikleri bekleyebileceğimizi biliyoruz. Bu özellikler daha sonra toplanabilir ve veri seti özelliklerini oluşturmak için kullanılabilir.
Aşağıda, telefon kayıtlarını SO-100 kayıtlarıyla birleştirirken ve birleştirmede özellikleri nasıl topladığımızın bir örneği verilmiştir:
features=combine_feature_dicts(
# Run the feature contract of the pipelines
# This tells you how the features would look like after the pipeline steps
aggregate_pipeline_dataset_features(
pipeline=phone_to_robot_ee_pose_processor,
initial_features=create_initial_features(action=phone.action_features), # <- Action features we can expect, these come from our teleop device (phone) and action processor
use_videos=True,
),
aggregate_pipeline_dataset_features(
pipeline=robot_joints_to_ee_pose,
initial_features=create_initial_features(observation=robot.observation_features), # <- Observation features we can expect, these come from our robot and observation processor
use_videos=True,
patterns=["observation.state.ee"], # <- Here you could optionally filter the features we want to store in the dataset, with a specific pattern
),
),Nasıl çalışır:
aggregate_pipeline_dataset_features(...): pipeline boyuncatransform_featuresuygulayarak desenlere göre filtreler (use_videos=Trueolduğunda görüntüler,patternsbelirtildiğinde durum özellikleri dahil edilir).combine_feature_dicts(...): birden çok özellik sözlüğünü birleştirir.record_loop(...)ile kayıt yaparken, çerçeveleridataset.featuresile tutarlı olacak şekilde oluşturmak içinbuild_dataset_frame(...)kullanılır ve ardından çerçeveyi veri setine eklemek içinadd_frame(...)çağrılır.
Robot hatlarını özelleştirirken rehberlik
Aşağıdaki özelliklerden herhangi birini eylem/gözlem alanınız olarak saklayabilirsiniz:
- Birleşik konumlar
- Mutlak EE pozları
- Göreli EE farkları
- Diğer özellikler: ortak hız, torklar vb.
Politika eylem ve gözlem alanınızda kullanmak istediklerinizi seçin ve boru hatlarını ve adımları buna göre yapılandırın/değiştirin.
Farklı robotlar
- Hatta telefonla teleop kullanarak başka bir robotu kullanmak gibi durumlar için pipeline'ları kolayca yeniden kullanabilir, örnekleri düzenleyip kendi robotunuzu Phone teleop ile kullanmak için
RobotKinematics(URDF) vemotor_namesdeğerlerini değiştirebilirsiniz. Ayrıcatarget_frame_name'in kavrayıcınıza/bileğinize işaret ettiğinden emin olmalısınız.
Önce güvenlik
- Hattları değiştirirken, dar sınırlarla başlayın ve gerçek robotlarla çalışırken güvenlik adımlarını uygulayın.
- Önce simülasyonla başlamak, ardından gerçek robotlara geçmek önerilir.
Bitti! Bu rehberin robot hatlarınızı özelleştirmeye başlamanıza yardımcı olmasını umuyoruz. Herhangi bir noktada sorun yaşarsanız, destek için Discord topluluğumuza katılabilirsiniz.
Update on GitHub