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
2.3.1 Docker container (recommended)
-
Develop using Docker containers
- Install Docker according to the Isaac Sim documentation
-
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
-
We recommend that developers use our unified Docker container environment.
-
If you want to use your own environment, refer to the
dockerfilewe provide and install the dependencies listed by us.
2.3.3 Developer Guide
2.3.4 Enable pre-commit hook (optional)
- Install and set up
pre-committo 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
- 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
- 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
-
Download the Agibot World repository and baseline model from the following address:
-
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.
- 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).
- Run the Docker container
Plain# 在主目录中启动一个新容器# 需要将 ~/assets 更改为本地 assets 文件夹SIM_ASSETS=~/17robo/GenieSimAssets ./scripts/start_gui.sh
- 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
-
Build your own code according to the following instructions.
-
a. Start model integration using the template on the following path. Do not modify the structure of the
inferfunction.
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│ ├──...│ └──...
- Run the docker container
Bash
Plain# 需要将 ~/assets 更改为 GenieSimAssets 文件夹SIM_ASSETS=~/assets ./scripts/start_gui.sh
-
Run model inference
-
Execute the following command in the root directory of genie_sim outside the docker container:
Plain./scripts/autorun.sh {TASK_NAME} infer
- 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
-
Connect to the same local network as the computer
-
Launch AIDEA Vision App in the resource library
-
Select Wireless Connection and enter the IP address of the computer.
Launch Settings
- Start the server
Bash
Plain# 在容器内运行此命令omni_python server/source/genie.sim.lab/raise_standalone_sim.py
- 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
- 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
- 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
- Run the Docker container
Bash
PlainSIM_ASSETS=~/17robo/GenieSimAssets ./scripts/start_gui.sh
-
Execute the shell script in the
genie_simroot directory outside the docker container -
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
- In the terminal, press
qorQto stop the task normally. Theautorunscript enables ros topic logging by default. If not needed, remove the relevant code in theautorunscript 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:
-
task contains a unique task name
-
objects includes various task objects:
-
extra_objects: Non-interactive object -
fix_objects: Interactive objects with a fixed initial pose -
task_related_objects: Interactive objects with random initial poses
-
-
recording_setting specifies the camera perspective to be recorded.
-
robot includes the robot ID, robot configuration file, and initial pose of the robot base.
-
scene specifies a set of scene information:
-
scene_id: The unique name of the scenario -
function_space_objects: Randomly generate the cube region oftask_related_objects -
scene_info_dir: Path of the scene asset -
scene_usd: Path of the scenario usd file
-
-
stages includes several sub-stages designed for planning tasks
-
action: Define the action name -
active: Define active objects, such as grippers -
passive: Defines passive objects, such as bottles
-
3.3 How to Create a Complete Benchmark Task with a Embodied AI Model
- 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.
- 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" ]}
- 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.
- 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
- 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 | | |