logo Mr.Robota 具身智能学习手册 中文
Chapter 10: Reproduction of RL Training for Heterogeneous Robots with UniLab + MotrixSim

Genie Sim is a simulation framework developed by AgiBot. It provides developers with efficient data generation capabilities and evaluation benchmarks to accelerate the development of embodied AI. Genie Sim establishes a comprehensive closed loop process, including trajectory generation, model training, benchmark testing, and deployment verification. Users can use this efficient simulation toolchain to quickly validate algorithm performance and optimize models. Whether it is a simple grasping task or complex manipulation, Genie Sim offers a highly realistic simulation environment and precise evaluation metrics, helping developers efficiently develop and iterate robot technologies. The Genie Sim Benchmark, as an open-source evaluation version of Genie Sim, aims to provide accurate performance testing and optimization support for embodied AI models.

Bashsudo apt install git-lfsgit lfs install# When prompted for a password, use an access token with write permissions.# Generate one from your settings: https://huggingface.co/settings/tokensgit clone https://huggingface.co/datasets/agibot-world/GenieSimAssets
Bash# Configure the repositorycurl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \    && curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \    sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \    sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list \    && \    sudo apt-get update# Install the NVIDIA Container Toolkit packagessudo apt-get install -y nvidia-container-toolkitsudo systemctl restart docker# Configure the container runtimesudo nvidia-ctk runtime configure --runtime=dockersudo systemctl restart docker# Verify NVIDIA Container Toolkitdocker run --rm --runtime=nvidia --gpus all ubuntu nvidia-smi

https://docs.isaacsim.omniverse.nvidia.com/latest/installation/requirements.html

2.2 Download scenarios and assets from Huggingface

Please visit https://huggingface.co/datasets/agibot-world/GenieSimAssets and follow the instructions.

2.3 Install

  1. Develop using Docker containers

  2. Prepare the Docker image

    bash
    
Plain# 进入 genie_sim 根目录并从 Dockerfile 创建 Docker 镜像docker build -f ./scripts/dockerfile -t registry.agibot.com/genie-sim/open_source:latest .

If you encounter network problems, my approach is:

baship addr show docker0 | grep "inet\s" | awk '{print $2}' | cut -d/ -f1DOCKER_HOST_IP="172.17.0.1" docker build \  --add-host=host.docker.internal:"$DOCKER_HOST_IP" \  --build-arg http_proxy="http://host.docker.internal:7890" \  --build-arg https_proxy="http://host.docker.internal:7890" \  --build-arg no_proxy="localhost,127.0.0.1" \  -f ./scripts/dockerfile \  -t registry.agibot.com/genie-sim/open_source:latest .
  • Run the Docker container and start the server
Bash# 在主目录中启动一个新容器# 你需要将 ~/assets 更改为 GenieSimAssets 文件夹SIM_ASSETS=~/17robo/GenieSimAssets/ ./scripts/start_gui.sh./scripts/into.sh# 启动服务器omni_python server/source/genie.sim.lab/raise_standalone_sim.py --enable_curobo True  # 此演示的抓取轨迹由 Curobo 生成

Execute the next step after the app is ready.

Then we see that if the supermarket demonstration completes, the simulation engine on this side will also exit.

Bash# start container in main directory./scripts/into.sh# start client in containeromni_python benchmark/task_benchmark.py --task_name=curobo_restock_supermarket_items --env_class=DemoEnvomni_python benchmark/task_benchmark.py --task_name=iros_open_drawer_and_store_items --env_class=DemoEnv  (暂时有报错)omni_python benchmark/task_benchmark.py --task_name=genie_task_home_microwave_food --env_class=DemoEnv (这个也是用不了的,只有输出step)geniesim2.1和2.0一样只给了一个curobo跑任务的示例,开源部分只配置了上货任务,其他iros任务需要模型推理或者遥操作

The green info appears again first.

Then wait for about 1 minute.

If you encounter errors related to gRPC, please refer to the issue for modification.

https://github.com/AgibotTech/genie_sim/issues/11

Note: The command line cannot set any proxy! Also, run sudo ufw allow 50051.

Bashmake sure your server is running (launched by omni_python server/source/genie.sim.lab/raise_standalone_sim.py --enable_curobo True in same container)make sure your port 50051 is not be used. You must kill other process on 50051 by sudo lsof -i :50051 and sudo kill -9 .

I encounter a problem here where I get stuck.

Pull the latest code from remote.

Then it won’t get stuck.

Meanwhile, if there are changes to large files, you can go to assets:

git lfs pull # Ensure all LFS files are up to date

https://github.com/AgibotTech/genie_sim/issues/29

2.3.2 Host

  1. We recommend that developers use our unified Docker container environment.

  2. If you want to use your own environment, refer to the dockerfile we provide and install the dependencies listed by us.

2.3.3 Developer Guide

2.3.4 Enable pre-commit hook (optional)

  1. Install and set up pre-commit to enable the automatic file formatting program, which is suitable for Python / JSON / YAML, etc.
Bash# 将 pre-commit 安装到你的 Python 环境sudo apt install python3-pippip3 install pre-commit# 在仓库中启用预定义的 pre-commit 钩子pre-commit install
  1. Run the file formatting program on all tracked files
Bashpre-commit run --all-files

2.4 Benchmarking task #### 2.4.1 Running the benchmark 1. Running the docker container

Plain# 在主目录中启动一个新容器# 需要将 ~/assets 更改为 GenieSimAssets 文件夹SIM_ASSETS=~/17robot/GenieSimAssets ./scripts/start_gui.sh
  1. Run the benchmark test

Execute the following command in the genie_sim root directory outside the Docker container

Auto run is quite useful. However, the infer parameter is required.

Plain./scripts/autorun.sh genie_task_home_pour_water infer

https://github.com/AgibotTech/genie_sim/issues/34

The following task names are supported:

Task Name

genie_task_cafe_espresso

genie_task_cafe_toast

genie_task_home_clean_desktop

genie_task_home_collect_toy

genie_task_home_microwave_food

genie_task_home_open_drawer

genie_task_home_pass_water

genie_task_home_pour_water

genie_task_home_wipe_dirt

genie_task_supermarket_cashier_packing

genie_task_supermarket_stock_shelf

genie_task_supermarket_pack_fruit


2.4.2 Baseline Evaluation Framework

Configuration

Evaluate the configuration using ADER (Action Domain Evaluation Rule).

Example

JSON

Plain{  "Acts": [    {      "ActionList": [        {          "ActionSetWaitAny": [            {              "Follow": "beverage_bottle_002|[0.2,0.2,0.2]|right"            },            {              "Timeout": 120            },            {              "Onfloor": "beverage_bottle_002|0.0"            }          ]        },        {          "ActionSetWaitAny": [            {              "PickUpOnGripper": "beverage_bottle_002|right"            },            {              "Timeout": 120            },            {              "Onfloor": "beverage_bottle_002|0.0"            }          ]        },        {          "ActionSetWaitAny": [            {              "Follow": "handbag_000|[0.4,0.4,0.4]|right"            },            {              "Timeout": 120            }          ]        },        {          "ActionSetWaitAny": [            {              "Inside": "beverage_bottle_002|handbag_000|1"            },            {              "StepOut": 1000            }          ]        }      ]    }  ],  "Init": [],  "Objects": [    {      "bottle": [        "beverage_bottle_002"      ],      "handbag": [        "handbag_000"      ]    }  ],  "Problem": "pack_in_the_supermarket"}

Current evaluation capabilities

Action Description Base Class Syntax
COMMON
ActionList Queue action: Internal actions are executed in order. ActionBase “ActionList”:[]
ActionSetWaitAny Conditional queue action: The action completes when any internal action finishes. ActionBase “ActionSetWaitAny”:[]
ActionWaitForTime Time-based wait action: Similar to sleep, but does not block the thread. ActionBase “ActionWaitForTime”: 3.0
TimeOut Timeout verification action: Checks for a timeout occurrence. ActionCancelBase “Timeout”: 60
StepOut Step limit verification action: Checks if the step limit has been reached. ActionCancelBase “StepOut”: 100
ActionSetWaitAll Exits when all conditions are met. ActionBase “ActionSetWaitAll”:[]
CUSTOM
Ontop One object is above another. EvaluateAction “Ontop”: "active_obj
Inside One object is inside another. EvaluateAction “Inside”: "active_obj
PushPull Checks if the sliding joint of the joint object is within [min, max]; used to determine whether a drawer-like object is open or closed. EvaluateAction “PushPull”: "obj_id
Follow Checks if the left/right gripper is following a specific object within the range [x, y, z] defined by the bounding box. EvaluateAction “Follow”: "obj_id
PickUpOnGripper The gripper grabs an object. EvaluateAction “PickUpOnRightGripper”: "object
OnShelf The object is within a specific area. EvaluateAction
Onfloor Checks if the specified object falls below the reference height ref_z; if so, exits. ActionCancelBase `“Inside”: "obj_id
Cover Object A covers Object B. EvaluateAction “Cover”: "active_obj

Evaluation output data structure

JSON

Plain//输出[  {    "task_type": "benchmark",    "model_path": "",    "task_uid": "13513cf3-2d88-421e-b3e5-dc0998a60970",    "task_name": "genie_task_supermarket",    "stage": "",    "result": {      "code": -1,      "step": 0,      "msg": "",      "progress": [],      "scores":[]    },    "start_time": "2025-06-05 15:04:31",    "end_time": "2025-06-05 15:05:40"  }]

Error Code

Python

Plainfrom enum import Enumclass ErrorCode(Enum):    INIT_VALUE = -1    SUCCESS = 0    ABNORMAL_INTERRUPTION = 1    OUT_OF_MAX_STEP = 2    UNKNOWN_ERROR = 500

2.5 AgiBot World Challenge Manipulation Task

2.5.1 Run the baseline model inference

  1. Download the Agibot World repository and baseline model from the following address:

  2. a. GitHub - OpenDriveLab/AgiBot-World at manipulation-challenge

After downloading, as long as docker does not update the build, the previous agibot-world will still be under docker/main.

Plain# 初始化 Agibot World 仓库以运行基线模型git clone -b git submodule update --init --recursive

You can pull and update it once every time later:

TypeScriptroot@ubuntu22:~/workspace/main/AgiBot-World# lsexperiments       InternVL             __pycache__       scriptsgenie_sim_ros.py  latent_action_model  README.mdhubconf.py        prismatic            requirements.txtroot@ubuntu22:~/workspace/main/AgiBot-World# git pullfatal: detected dubious ownership in repository at '/root/workspace/main/AgiBot-World'To add an exception for this directory, call:        git config --global --add safe.directory /root/workspace/main/AgiBot-Worldroot@ubuntu22:~/workspace/main/AgiBot-World# 需要git config --global --add safe.directory /root/workspace/main/AgiBot-World然后git pullgit submodule update --init --recursive

FileNotFoundError: [Errno 2] No such file or directory: ‘checkpoints/finetuned/action_decoder.pt’

There was an error running python

This is because a baseline model needs to be added.

  1. Move all baseline model files and code to the Agibot-World directory.
Bashcp -r UniVLA/latent_action_model/ ./latent_action_model/cp -r UniVLA/scripts/ ./scripts/cp -r UniVLA/prismatic/ ./prismatic/cp -r UniVLA/experiments/ ./experiments/mkdir -p checkpoints/finetunedcd checkpoints/finetunedgit lfs clone https://huggingface.co/qwbu/univla-iros-manipulation-challenge-baselinemv univla-iros-manipulation-challenge-baseline/* ./

To stay up to date

Bashgit clone -b manipulation-challenge https://github.com/OpenDriveLab/AgiBot-World.git AgiBot-World-manipulation-challengecp -r AgiBot-World-manipulation-challenge/UniVLA/* AgiBot-World/
Plainmain├── AgiBot-World│   ├── InternVL│   ├── experiments/robot│   ├── latent_action_model│   ├── prismatic│   ├── robot│   ├── scripts│   │   └── infer.py│   │   └── ...│   │   └── ...│   ├── checkpoints│   │   └── finetuned│   │       └── readme.txt│   ├── genie_sim_ros.py│   ├── hubconf.py│   └── requirements.txt

There is one part that needs to be modified: line 5 of infer.py:

If I have time later, I will submit a PR. Those who are available are also welcome to do so (this issue has been fixed now, so there’s no need to worry about it).

  1. Run the Docker container
Plain# 在主目录中启动一个新容器# 需要将 ~/assets 更改为本地 assets 文件夹SIM_ASSETS=~/17robo/GenieSimAssets ./scripts/start_gui.sh
  1. Run the baseline model inference

Execute the following command in the genie_sim root directory outside the Docker container:

Plain./scripts/autorun.sh iros_open_drawer_and_store_items infer./scripts/autorun.sh iros_clear_the_countertop_waste infer

Support the following task names

Task Name
iros_clear_the_countertop_waste
iros_open_drawer_and_store_items
iros_heat_the_food_in_the_microwave
iros_pack_moving_objects_from_conveyor
iros_pickup_items_from_the_freezer
iros_restock_supermarket_items
iros_pack_in_the_supermarket
iros_make_a_sandwich
iros_clear_table_in_the_restaurant
iros_stamp_the_seal

Success! The 24G graphics card is sufficient.

Open the drawer and pick up the object, but there were still many problems during the process haha. In the end, the Rubik’s cube fell to the ground.

2.5.2 Integrate one’s own policy

  1. Build your own code according to the following instructions.

  2. a. Start model integration using the template on the following path. Do not modify the structure of the infer function.

Plainmain├── model│   ├──demo_infer.py

b. When customizing, ensure that the ROS node strictly follows the specified topic.

*The communication between model inference and simulation environments is standardized and implemented based on ROS2. These are dedicated topics specified for tasks.

Topic Name Publisher Subscriber Message Type Content
/joint_command Model Simulation Environment JointState Joint commands from model inference
/joint_states Simulation Environment Model JointState Current robot joint state from simulation
/sim/head_img Simulation Environment Model CompressedImage Current head RGB image from simulation
/sim/left_wrist_img Simulation Environment Model CompressedImage Current left wrist RGB image from simulation
/sim/right_wrist_img Simulation Environment Model CompressedImage Current right wrist RGB image from simulation
/sim/head_depth_img Simulation Environment Model CompressedImage Depth image of the current head from simulation
/sim/left_wrist_depth_img Simulation Environment Model CompressedImage Depth image of the current left wrist from simulation
/sim/right_wrist_depth_img Simulation Environment Model CompressedImage Depth image of the current right wrist from simulation

c. After customization, ensure that the file structure matches the specified layout, and make sure it contains infer.py and genie_sim_ros.py.

Plainmain├── AgiBot-World│   ├── scripts│   │   └── infer.py│   │   └── ...│   │   └── ...│   ├──genie_sim_ros.py│   ├──...│   └──...
  1. Run the docker container

Bash

Plain# 需要将 ~/assets 更改为 GenieSimAssets 文件夹SIM_ASSETS=~/assets ./scripts/start_gui.sh
  1. Run model inference

  2. Execute the following command in the root directory of genie_sim outside the docker container:

Plain./scripts/autorun.sh {TASK_NAME} infer
  1. Model inference dependencies

Common Python libraries are listed in the requirements.txt file of the Genie Sim Benchmark repository and are pre-installed in the docker image of our manipulation test server. If additional Python libraries are needed to run the policy, a requirements.txt file containing these libraries can be uploaded to the test server along with the model files.


2.5.3 Agibot World Challenge Evaluation Framework

Please refer to 2.4.2 Benchmark Evaluation Framework


2.6 Remote Manipulation

2.6.1 PICO

Supports controlling the movement of the robot’s waist, head, left/right end effectors, and base using a handle.

User Guide

No. Function (Left / Right)
① Joystick: Move the robot base
Press: Reset base posture
② Reset left arm
③ Enable posture tracking
④ Reset right arm
⑤ Reset body and head
⑥ Control left gripper

Pico Settings

  1. Connect to the same local network as the computer

  2. Launch AIDEA Vision App in the resource library

  3. Select Wireless Connection and enter the IP address of the computer.

Launch Settings

  1. Start the server

Bash

Plain# 在容器内运行此命令omni_python server/source/genie.sim.lab/raise_standalone_sim.py
  1. Start PICO control in the container

Bash

Plain# 在容器内运行此命令omni_python teleop/teleop.py --task_name genie_task_home_microwave_food --mode pico --host_ip x.x.x.x

2.6.2 Keyboard

Supports keyboard control of the robot’s waist, head, left/right end effectors, and base movement.

User Guide

Key Function Key Function
w End effector forward i Roll +
s End effector backward k Roll -
a End effector left j Pitch +
d End effector right l Pitch -
q End effector up u Yaw +
e End effector down o Yaw -
↑ Base forward shift+↑ Head pitch +
↓ Base backward shift+↓ Head pitch -
← Base left turn shift+← Head yaw +
→ Base right turn shift+→ Head yaw -
ctrl+↑ Waist up ctrl+tab Switch arms
ctrl+↓ Waist down r Reset
ctrl+← Waist pitch - c Close gripper
ctrl+→ Waist pitch + ctrl+c Open gripper

Launch Settings

  1. Start the server

Bash

PlainSIM_ASSETS=~/17robo/GenieSimAssets/ ./scripts/start_gui.sh./scripts/into.sh# 在容器内运行此命令omni_python server/source/genie.sim.lab/raise_standalone_sim.py
  1. Start keyboard control in a container

Bash

Plain# 在容器内运行此命令omni_python teleop/teleop.py --task_name genie_task_home_microwave_food --mode "keyboard"

Use it with caution on the waist area—it doesn’t look well done. Overall, the end effector control is really great.


2.7 Recording & Playback

Here is a note on the task:

genie_task_cafe_espresso

genie_task_cafe_toast

genie_task_home_clean_desktop

genie_task_home_collect_toy

genie_task_home_microwave_food

genie_task_home_open_drawer

genie_task_home_pass_water

genie_task_home_pour_water

genie_task_home_wipe_dirt

genie_task_supermarket_cashier_packing

genie_task_supermarket_stock_shelf

genie_task_supermarket_pack_fruit

To improve efficiency, first record the trajectory, and then perform playback to record videos.

Record all scene information (including robot joint positions, object poses, camera poses, etc.) in the state.json file.

  • Start the server

Bash

Plain# 在容器内运行此命令omni_python server/source/genie.sim.lab/raise_standalone_sim.py
  • Start the client

Bash

Plain# 在容器内运行此命令omni_python teleop/teleop.py --task_name genie_task_home_pour_water --mode keyboard  --record

Scene information is recorded in ./output/recording_data/{TASK_NAME}/state.json

The generated file /root/workspace/main/output/recording_data/genie_task_home_pour_water/state.json is here.

2.7.1 Replay

Playback the trajectory and record video.

  • Start the server

Bash

Plain# 在容器内运行此命令omni_python server/source/genie.sim.lab/raise_standalone_sim.py --disable_physics --record_img --record_video
  • Start the client

Bash

Plain# 例如:TASK_NAME=genie_task_home_pour_water# 在容器内运行此命令omni_python teleop/replay_state.py --task_file teleop/tasks/${TASK_NAME}.json --state_file output/recording_data/${TASK_NAME}/state.json --record

Images and videos are recorded in ./output/recording_data/{TASK_NAME}/{IDX}/


3. Use Case

3.1 How to run the simulation with a single line of code

  1. Run the Docker container

Bash

PlainSIM_ASSETS=~/17robo/GenieSimAssets ./scripts/start_gui.sh
  1. Execute the shell script in the genie_sim root directory outside the docker container

  2. a. Task execution layout

Bash

Plain./scripts/autorun.sh {TASK_NAME}

b. Run PICO remote manipulation

Bash

Plain./scripts/autorun.sh {TASK_NAME} pico {HOST_IP}

c. Run keyboard remote manipulation

Bash

Plain./scripts/autorun.sh {TASK_NAME} keyboard

d. Run scenario playback

Bash

Plain./scripts/autorun.sh {TASK_NAME} replay {STATE_FILE_PATH}

e. Run model inference

Bash

Plain./scripts/autorun.sh {TASK_NAME} infer

f. Run cleanup

Bash

Plain./scripts/autorun.sh clean
  1. In the terminal, press q or Q to stop the task normally. The autorun script enables ros topic logging by default. If not needed, remove the relevant code in the autorun script and ensure the output folder is cleaned regularly. (What information is stored? Where is it saved?)

3.2 How to set up the baseline task file

Each reference task file contains the following 6 key elements:

  1. task contains a unique task name

  2. objects includes various task objects:

    1. extra_objects: Non-interactive object

    2. fix_objects: Interactive objects with a fixed initial pose

    3. task_related_objects: Interactive objects with random initial poses

  3. recording_setting specifies the camera perspective to be recorded.

  4. robot includes the robot ID, robot configuration file, and initial pose of the robot base.

  5. scene specifies a set of scene information:

    1. scene_id: The unique name of the scenario

    2. function_space_objects: Randomly generate the cube region of task_related_objects

    3. scene_info_dir: Path of the scene asset

    4. scene_usd: Path of the scenario usd file

  6. stages includes several sub-stages designed for planning tasks

    1. action: Define the action name

    2. active: Define active objects, such as grippers

    3. passive: Defines passive objects, such as bottles


3.3 How to Create a Complete Benchmark Task with a Embodied AI Model

  1. First, assemble the task template, such as “genie_task_supermarket.json”. This configuration file contains details like robots, scenes, objects, and stages.
Plainbenchmark/bddl/eval_tasks/your_task.json

Please fill in the asset file path correctly. The program will search for assets in the user-configured environment variable SIM_ASSETS.

  1. Scenario generalization: Map tasks to scenarios
Plain文件路径: benchmark/bddl/task_to_preselected_scenes.json

JSON

Plain{  "genie_task_supermarket": [    "scenes/genie/supermarket_02/Collected_emptyScene_01/emptyScene_01.usd"  ]}
  1. Write the evaluation standard code, for example
Plain文件路径: benchmark/bddl/task_definitions/genie_task_supermarket/problem0.bddl

Lisp

Plain(define (problem restock_shelves)    (:domain isaac)    (:objects        benchmark_beverage_bottle_013 - bottle.n.01    )    (:init        (onfloor benchmark_beverage_bottle_013 floor.n.01_2)    )    (:goal        (onshelf ?benchmark_beverage_bottle_013)    ))

Now, the baseline configuration steps are completed.

  1. Access the embodied AI model in “yourpolicy.py”. (Please refer to demopolicy.py)

Python

Plainclass YourPolicy(BasePolicy):def __init__(self) -> None:super().__init__()        """初始化配置并加载模型。"""passdef reset(self):"""重置。"""passdef act(self, observations, **kwargs) -> np.ndarray:"""根据观察结果采取行动。        参数: observations 包含机器人图像 (Head_Camera_01/Right_Camera_01/Left_Camera_01) 和当前关节信息        返回: 机器人目标关节        """pass
  1. Finally, run the client and evaluate your AI model.

Bash

Plainpython3 benchmark/task_benchmark.py --task_name {task name} --policy_class {policy name} --env_class OmniEnv

3.4 Best Practices for Manipulation Task Asset Parameters

3.4.1 How to debug colliders in IsaacSim

Enable the collision object debugging mode according to the instructions


3.4.2 Bad Example

  • Complex grids can lead to collision calculation errors; the simpler, the better.

  • Having too many triangular meshes in a small area usually leads to mesh collisions.

convexHull and convexDecompisition


3.4.3 Good Example

Good means easy to grasp and minimal grid collisions

  • A good collision mesh usually looks simple and clean.

  • Ensure that the grasping of key areas is precise (such as cans, bottles, and caps)

ConvexDecompisition grid

convexDecompisition collision body

convexHull


4. API Reference

| | | | | | Function | Description | Input | Output | | Initialization | | | | | client.InitRobot() | Initialize robot and scene | robot_cfg: Path to configuration file (located in ‘robot_cfg’ folder)
scene_usd: USD path
init_position([x,y,z])
init_rotation([x,y,z]) | | | Controller | | | | | client.moveto() | The end effector of the robot moves to the target pose | target_position([x,y,z])
target_quaternion([w,x,y,z])
is_backend:
1. True: ee linear movement
2. False: ee obstacle avoidance movement
ee_interpolation:
1. True: ruckig interpolation
2. False: target point interpolation
distance_frame: interpolation density | | | client.set_joint_positions() | The robot’s joints move to the target joint state | target_joint_position: [N], rad/s
joint_indices: [N], index
is_trajectory:
1. True: joint action application
2. False: set joint state | | | client.set_gripper_state() | Set gripper state (open or closed) | gripper_command: “open” or “close”
is_right(bool)
opened_width(float) | | | client.SetTrajectoryList() | Set ee pose list trajectory | trajectory_list(list): [[position(xyz), rotation(wxyz)]] | | | Object | | | | | client.add_object() | Add a USD object to the scene | usd_path(str): Relative path of the asset based on SIM_ASSETS
prim_path(str): Prim path of the object in the scene, e.g.: “/World/Object/obj_01”
lable_name(str): Name of the object label applied for semantic segmentation
target_position([x,y,z])
target_quaternion([w,x,y,z])
target_scale([x,y,z])
mass: [kg]
**add_particle(bool): Add additional fluid particles, e.g.: water in a kettle
particle_size: ([x,y,z])
particle_position: ([x,y,z]) | | | client.SetMaterial() | Set the material for XFormPrim | material_info(list):
e.g.:
material_info = [
{“object_prim” : “/obj1”
“material_name”: “wood”
“material_path: “materials/wood”}] | | | client.SetLight() | Set the lighting information of the stage | light_info(list):
e.g.:
light_info = [{
“light_type”: “Distant”,
“light_prim”: “/World/DistantLight”,
“light_temperature”: 2000,
“light_intensity”: 1000,
“rotation”: [1,0.5,0.5,0.5],
“texture”: “”}] | | | client.SetObjectPose() | Set the pose of rigid bodies and joint objects in a single physics step | object_info(list):
e.g.:
object_info = [{
“prim_path”: “/World/obj1”,
“position”: [x,y,z],
“rotation”: [w,x,y,z]}]
object_joint_info(list): Joint information of joint objects | | | Sensor | | | | | client.AddCamera() | Add a camera to the stage | camera_prim(str): Prim path of the camera
camera_position(xyz): Position of the camera
camera_rotation(wxyz): Rotation of the camera
Width, Height, focus_length, horizontal_aperture
vertical_aperture Internal parameters of the camera:
fx = Width * focus_length / horizontal_aperture
fy = Height * focus_length / vertical_aperture
is_local(bool): Local or world pose | | | client.capture_frame() | Capture rgb/depth frames | camera_prim(str): Prim path of the camera | response.color_image.data
response.depth_image.data | | client.capture_semantic_frame() | Capture semantic frames | camera_prim_path(str): Prim path of the camera | response.semantic_mask.data | | Observation | | | | | client.get_observation() | Obtain camera/joint/tf data in a single frame | data_keys(dict):
For example:
data_keys = { ‘camera’: {
‘camera_prim_list’: [”/camera"],
‘render_depth’: True,
‘render_semantic’: True
},
‘pose’: [“/object1” ],
‘joint_position’: True,
‘gripper’: True} | observation = {
“camera”: camera_datas,
“joint”: joint_datas,
“pose”: object_datas,
“gripper”: gripper_datas } | | client.GetIKStatus() | Inverse kinematics calculation | target_poses(list): [{“position”:xyz, “rotation”:wxyz}]
is_right(bool): Arm type for both arms
ObsAvoid(bool): IK with obstacle avoidance | “status”([bool]): Inverse kinematics successful
“Jacobian”([double]): Jacobian score of ik joint state
“joint_positions”([list]): Ik joint positions
“joint_names”([list]): Ik joint names | | client.GetEEPose() | Obtain world pose of end effector | is_right(bool): Select arm type | state.ee_pose.position
state.ee_pose.rpy | | client.get_object_pose() | Obtain world pose of object | prim_path(str): Object prim path | object_pose.position
object_pose.rpy | | client.get_joint_positions() | Obtain current joint positions of robot | | result.states.name
result.states.position | | Curobo Feature Functions | | | | | client.AttachObj() | Attach object to be attached | prim_paths[list[str]]: Prim path of the attached object | | | client.DetachObj() | Separate all objects | | | | Recording Settings | | | | | client.start_recording() | Start recording segment | data_keys(dict): Recording settings
For example:
data_keys = {
‘camera’: {
‘camera_prim_list’: [
‘/World/base_link/Head_Camera’
],
‘render_depth’: True,
‘render_semantic’: True
},
‘pose’: [
‘/World/obj1’
],
‘joint_position’: True,
‘gripper’: True
}
fps(int): Recording frame rate
task_name(str) | | | client.stop_recording() | Stop recording | | | | client.reset() | Reset scene, robot, and object | | | | client.Exit() | Exit the application | | |