Compare commits
10 Commits
c02a6aabff
...
efa4090e10
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
efa4090e10 | ||
|
|
30e74dc507 | ||
|
|
dbbdc60664 | ||
|
|
b05cf62284 | ||
|
|
5dd2759713 | ||
|
|
6c6d28a9a4 | ||
|
|
93c5c22b57 | ||
|
|
8e2ae7e5a2 | ||
|
|
7558467aca | ||
|
|
1029c41a0b |
32
README.md
32
README.md
@@ -1,12 +1,12 @@
|
||||
<div align="center">
|
||||
<h1 align="center">Go2 RL GYM</h1>
|
||||
<p align="center">
|
||||
<span>🌎 English</span> | <a href="README_zh.md">🇨🇳 中文</a> | <a href="https://arxiv.org/abs/2602.00678">📄 Paper</a>
|
||||
<span>🌎 English</span> | <a href="README_zh.md">🇨🇳 中文</a> | <a href="https://arxiv.org/abs/2602.00678">📄 Paper [RSS 2026]</a>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<p align="center">
|
||||
<strong>This repository builds on <a href="https://github.com/unitreerobotics/unitree_rl_gym">unitree_rl_gym</a> to train the Unitree Go2 quadruped with reinforcement learning.</strong>
|
||||
<strong>This repository builds on <a href="https://github.com/unitreerobotics/unitree_rl_gym">unitree_rl_gym</a> to train the Unitree Go2 quadruped with reinforcement learning.</br>For the IsaacLab-based version, see <a href="https://github.com/wertyuilife2/go2_rl_robotlab">go2_rl_robotlab</a>.</strong>
|
||||
</p>
|
||||
|
||||
<div align="center">
|
||||
@@ -56,18 +56,19 @@ python legged_gym/scripts/train.py --task=xxx --headless
|
||||
#### Model Evaluation
|
||||
|
||||
The trained model above was evaluated using the [RoboGauge](https://github.com/wty-yy/RoboGauge) framework via Sim2Sim. The models in the table below are the best models after 150k training steps.
|
||||
All released checkpoints are hosted on Hugging Face: [wty-yy/go2_rl_gym_data](https://huggingface.co/wty-yy/go2_rl_gym_data).
|
||||
|
||||
| Model | Score | Tracking | Safety | Quality | Level | Download |
|
||||
| --- | --- | --- | --- | --- | --- | --- |
|
||||
| go2_moe_cts (Ours) | **0.6713** | **0.6669** | **0.7857** | **0.7392** | **7.85** | [ckpt](https://drive.google.com/drive/folders/1aoXUxw-pGK1MbyzQ4IJzlA_tW8zrWP3Y?usp=drive_link) |
|
||||
| go2_ac_moe_cts | 0.6509 | 0.6442 | 0.7644 | 0.7149 | 7.52 | [ckpt](https://drive.google.com/file/d/1CDLsaR4XR3oG09ZHQ5u3lrJLfwyH2jz2/view?usp=drive_link) |
|
||||
| go2_mcp_cts | 0.6399 | 0.6355 | 0.7542 | 0.7058 | 7.41 | [ckpt](https://drive.google.com/drive/folders/1fd9cDVhV1dY6hcxuSZq2mcvFUp6V5Zfl?usp=drive_link) |
|
||||
| go2_moe_ng_cts | 0.6519 | 0.6447 | 0.7639 | 0.7186 | 7.56 | [ckpt](https://drive.google.com/drive/folders/1Rr89ZS0QJT-o-5LXsNqCWJdLGweqmN4Q?usp=drive_link) |
|
||||
| [CTS](https://arxiv.org/pdf/2405.10830) vanilla | 0.5786 | 0.5755 | 0.7066 | 0.6624 | 6.83 | [ckpt]() |
|
||||
| [HIM](https://github.com/InternRobotics/HIMLoco) | 0.5379 | 0.5453 | 0.6476 | 0.6050 | 6.19 | [ckpt](https://drive.google.com/file/d/1remJbGoTorqnArsz8Z1ewY4TVobss4Fb/view?usp=drive_link) |
|
||||
| [DreamWaQ](https://arxiv.org/abs/2301.10602) | 0.5054 | 0.5105 | 0.6149 | 0.5730 | 5.74 | [ckpt](https://drive.google.com/file/d/19BEBeiQqjHcPgGrN3AX6D7Yefs_8eswL/view?usp=drive_link) |
|
||||
| go2_moe_cts (Ours) | **0.6713** | **0.6669** | **0.7857** | **0.7392** | **7.85** | [ckpt](https://huggingface.co/wty-yy/go2_rl_gym_data/tree/main/go2_moe_cts_137000_0.6713) |
|
||||
| go2_ac_moe_cts | 0.6509 | 0.6442 | 0.7644 | 0.7149 | 7.52 | [ckpt](https://huggingface.co/wty-yy/go2_rl_gym_data/blob/main/go2_ac_moe_cts_115k_0.6509.pt) |
|
||||
| go2_mcp_cts | 0.6399 | 0.6355 | 0.7542 | 0.7058 | 7.41 | [ckpt](https://huggingface.co/wty-yy/go2_rl_gym_data/tree/main/go2_mcp_cts_91k_0.6399) |
|
||||
| go2_moe_ng_cts | 0.6519 | 0.6447 | 0.7639 | 0.7186 | 7.56 | [ckpt](https://huggingface.co/wty-yy/go2_rl_gym_data/tree/main/go2_moe_ng_cts_79k_0.6519) |
|
||||
| [CTS](https://arxiv.org/pdf/2405.10830) vanilla | 0.5786 | 0.5755 | 0.7066 | 0.6624 | 6.83 | [ckpt](https://huggingface.co/wty-yy/go2_rl_gym_data/tree/main/go2_cts_vanilla2_103.5k_0.5786) |
|
||||
| [HIM](https://github.com/InternRobotics/HIMLoco) | 0.5379 | 0.5453 | 0.6476 | 0.6050 | 6.19 | [ckpt](https://huggingface.co/wty-yy/go2_rl_gym_data/blob/main/go2_him_21k_0.5379.pt) |
|
||||
| [DreamWaQ](https://arxiv.org/abs/2301.10602) | 0.5054 | 0.5105 | 0.6149 | 0.5730 | 5.74 | [ckpt](https://huggingface.co/wty-yy/go2_rl_gym_data/blob/main/go2_dwaq_119.5k_0.5054.pt) |
|
||||
|
||||
> In the downloaded ckpt files, `*.pt` is used for [Python deployment](#41-python-deployment), and `*.onnx` is used for [C++ deployment](#42-c-deployment). The models above were all trained with self-collision disabled. In later tests, we found that enabling self-collision can also achieve strong results; see [go2_moe_cts_self_0.6669 - ckpt](https://drive.google.com/drive/folders/1znytqHNtDiZM5J4vaBd-EuM81l91D6s5?usp=drive_link).
|
||||
> In the downloaded ckpt files, `*.pt` is used for [Python deployment](#41-python-deployment), and `*.onnx` is used for [C++ deployment](#42-c-deployment). The models above were all trained with self-collision disabled. In later tests, we found that enabling self-collision can also achieve strong results; see [go2_moe_cts_164k_0.6715 - exported](https://huggingface.co/wty-yy/go2_rl_gym_data/tree/main/go2_moe_cts_high_slope_thre_164k_0.6715_20260419) with [complete model weights - model_164000.pt](https://huggingface.co/wty-yy/go2_rl_gym_data/blob/main/go2_moe_cts_high_slope_thre_164k_0.6715_20260419/model_164000.pt).
|
||||
|
||||
### 2. Play
|
||||
|
||||
@@ -158,6 +159,10 @@ Follow the usage described in [unitree_cpp_deploy](https://github.com/wty-yy/uni
|
||||
| --- | --- |
|
||||
|  |  |
|
||||
|
||||
C++ Deployment: Policy 1/2/4 trained by go2_rl_gym, Policy 3 trained by [go2_rl_robotlab](https://github.com/wertyuilife2/go2_rl_robotlab).
|
||||
|
||||
https://github.com/user-attachments/assets/b72e10f2-ffdb-407d-bb1f-9d545e7f9f63
|
||||
|
||||
---
|
||||
|
||||
## 🎉 Acknowledgements
|
||||
@@ -183,12 +188,11 @@ Contributors:
|
||||
## 📄 Citation
|
||||
If you find our work helpful, please cite:
|
||||
```bibtex
|
||||
@article{wu2026robogauge,
|
||||
@inproceedings{wu2026robogauge,
|
||||
title={Toward Reliable Sim-to-Real Predictability for MoE-based Robust Quadrupedal Locomotion},
|
||||
author={Tianyang Wu and Hanwei Guo and Yuhang Wang and Junshu Yang and Xinyang Sui and Jiayi Xie and Xingyu Chen and Zeyang Liu and Xuguang Lan},
|
||||
year={2026},
|
||||
journal={arXiv preprint arXiv:2602.00678},
|
||||
url={https://arxiv.org/abs/2602.00678},
|
||||
booktitle={Proceedings of Robotics: Science and Systems},
|
||||
year={2026}
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
34
README_zh.md
34
README_zh.md
@@ -1,12 +1,12 @@
|
||||
<div align="center">
|
||||
<h1 align="center">Go2 RL GYM</h1>
|
||||
<p align="center">
|
||||
<a href="README.md">🌎 English</a> | <span>🇨🇳 中文</span> | <a href="https://arxiv.org/abs/2602.00678">📄 Paper</a>
|
||||
<a href="README.md">🌎 English</a> | <span>🇨🇳 中文</span> | <a href="https://arxiv.org/abs/2602.00678">📄 Paper [RSS 2026]</a>
|
||||
</p>
|
||||
</div>
|
||||
|
||||
<p align="center">
|
||||
<strong>本仓库基于<a href="https://github.com/unitreerobotics/unitree_rl_gym">unitree_rl_gym</a>,使用强化学习训练Go2机器狗。</strong>
|
||||
<strong>本仓库基于<a href="https://github.com/unitreerobotics/unitree_rl_gym">unitree_rl_gym</a>,使用强化学习训练Go2机器狗。</br>基于IsaacLab开发的版本请见<a href="https://github.com/wertyuilife2/go2_rl_robotlab">go2_rl_robotlab</a>。</strong>
|
||||
</p>
|
||||
|
||||
<div align="center">
|
||||
@@ -55,19 +55,20 @@ python legged_gym/scripts/train.py --task=xxx --headless
|
||||
|
||||
#### 模型评估
|
||||
|
||||
使用[RoboGauge](https://github.com/wty-yy/RoboGauge)框架通过Sim2Sim评估上述训练模型,下表中模型为150k训练步中的最优模型
|
||||
使用[RoboGauge](https://github.com/wty-yy/RoboGauge)框架通过Sim2Sim评估上述训练模型,下表中模型为150k训练步中的最优模型。
|
||||
发布的权重统一保存在 Hugging Face: [wty-yy/go2_rl_gym_data](https://huggingface.co/wty-yy/go2_rl_gym_data)。
|
||||
|
||||
| Model | Score | Tracking | Safety | Quality | Level | Download |
|
||||
| --- | --- | --- | --- | --- | --- | --- |
|
||||
| go2_moe_cts (Ours) | **0.6713** | **0.6669** | **0.7857** | **0.7392** | **7.85** | [ckpt](https://drive.google.com/drive/folders/1aoXUxw-pGK1MbyzQ4IJzlA_tW8zrWP3Y?usp=drive_link) |
|
||||
| go2_ac_moe_cts | 0.6509 | 0.6442 | 0.7644 | 0.7149 | 7.52 | [ckpt](https://drive.google.com/file/d/1CDLsaR4XR3oG09ZHQ5u3lrJLfwyH2jz2/view?usp=drive_link) |
|
||||
| go2_mcp_cts | 0.6399 | 0.6355 | 0.7542 | 0.7058 | 7.41 | [ckpt](https://drive.google.com/drive/folders/1fd9cDVhV1dY6hcxuSZq2mcvFUp6V5Zfl?usp=drive_link) |
|
||||
| go2_moe_ng_cts | 0.6519 | 0.6447 | 0.7639 | 0.7186 | 7.56 | [ckpt](https://drive.google.com/drive/folders/1Rr89ZS0QJT-o-5LXsNqCWJdLGweqmN4Q?usp=drive_link) |
|
||||
| [CTS](https://arxiv.org/pdf/2405.10830) vanilla | 0.5786 | 0.5755 | 0.7066 | 0.6624 | 6.83 | [ckpt]() |
|
||||
| [HIM](https://github.com/InternRobotics/HIMLoco) | 0.5379 | 0.5453 | 0.6476 | 0.6050 | 6.19 | [ckpt](https://drive.google.com/file/d/1remJbGoTorqnArsz8Z1ewY4TVobss4Fb/view?usp=drive_link) |
|
||||
| [DreamWaQ](https://arxiv.org/abs/2301.10602) | 0.5054 | 0.5105 | 0.6149 | 0.5730 | 5.74 | [ckpt](https://drive.google.com/file/d/19BEBeiQqjHcPgGrN3AX6D7Yefs_8eswL/view?usp=drive_link) |
|
||||
| go2_moe_cts (Ours) | **0.6713** | **0.6669** | **0.7857** | **0.7392** | **7.85** | [ckpt](https://huggingface.co/wty-yy/go2_rl_gym_data/tree/main/go2_moe_cts_137000_0.6713) |
|
||||
| go2_ac_moe_cts | 0.6509 | 0.6442 | 0.7644 | 0.7149 | 7.52 | [ckpt](https://huggingface.co/wty-yy/go2_rl_gym_data/blob/main/go2_ac_moe_cts_115k_0.6509.pt) |
|
||||
| go2_mcp_cts | 0.6399 | 0.6355 | 0.7542 | 0.7058 | 7.41 | [ckpt](https://huggingface.co/wty-yy/go2_rl_gym_data/tree/main/go2_mcp_cts_91k_0.6399) |
|
||||
| go2_moe_ng_cts | 0.6519 | 0.6447 | 0.7639 | 0.7186 | 7.56 | [ckpt](https://huggingface.co/wty-yy/go2_rl_gym_data/tree/main/go2_moe_ng_cts_79k_0.6519) |
|
||||
| [CTS](https://arxiv.org/pdf/2405.10830) vanilla | 0.5786 | 0.5755 | 0.7066 | 0.6624 | 6.83 | [ckpt](https://huggingface.co/wty-yy/go2_rl_gym_data/tree/main/go2_cts_vanilla2_103.5k_0.5786) |
|
||||
| [HIM](https://github.com/InternRobotics/HIMLoco) | 0.5379 | 0.5453 | 0.6476 | 0.6050 | 6.19 | [ckpt](https://huggingface.co/wty-yy/go2_rl_gym_data/blob/main/go2_him_21k_0.5379.pt) |
|
||||
| [DreamWaQ](https://arxiv.org/abs/2301.10602) | 0.5054 | 0.5105 | 0.6149 | 0.5730 | 5.74 | [ckpt](https://huggingface.co/wty-yy/go2_rl_gym_data/blob/main/go2_dwaq_119.5k_0.5054.pt) |
|
||||
|
||||
> 下载的 ckpt 中,`*.pt` 用于[Python 实物部署](#41-python实物部署),`*.onnx` 用于[C++ 实物部署](#42-c实物部署)。上述模型均在关闭自碰撞的设置下训练;后续测试发现,开启自碰撞也能取得不错效果,参考 [go2_moe_cts_self_0.6669 - ckpt](https://drive.google.com/drive/folders/1znytqHNtDiZM5J4vaBd-EuM81l91D6s5?usp=drive_link)。
|
||||
> 下载的 ckpt 中,`*.pt` 用于[Python 实物部署](#41-python实物部署),`*.onnx` 用于[C++ 实物部署](#42-c实物部署)。上述模型均在关闭自碰撞的设置下训练;后续测试发现,开启自碰撞也能取得不错效果,参考 [go2_moe_cts_164k_0.6715 - exported](https://huggingface.co/wty-yy/go2_rl_gym_data/tree/main/go2_moe_cts_high_slope_thre_164k_0.6715_20260419)以及其[完整模型权重 - model_164000.pt](https://huggingface.co/wty-yy/go2_rl_gym_data/blob/main/go2_moe_cts_high_slope_thre_164k_0.6715_20260419/model_164000.pt)。
|
||||
|
||||
---
|
||||
|
||||
@@ -158,6 +159,10 @@ python deploy_real_go2.py eth0
|
||||
| --- | --- |
|
||||
|  |  |
|
||||
|
||||
C++ 部署效果:策略1/2/4由go2_rl_gym训练,策略3由[go2_rl_robotlab](https://github.com/wertyuilife2/go2_rl_robotlab)训练。
|
||||
|
||||
https://github.com/user-attachments/assets/b72e10f2-ffdb-407d-bb1f-9d545e7f9f63
|
||||
|
||||
---
|
||||
|
||||
## 🎉 致谢
|
||||
@@ -183,12 +188,11 @@ python deploy_real_go2.py eth0
|
||||
## 📄 引用
|
||||
如果觉得我们的工作有帮助,请引用:
|
||||
```bibtex
|
||||
@article{wu2026robogauge,
|
||||
@inproceedings{wu2026robogauge,
|
||||
title={Toward Reliable Sim-to-Real Predictability for MoE-based Robust Quadrupedal Locomotion},
|
||||
author={Tianyang Wu and Hanwei Guo and Yuhang Wang and Junshu Yang and Xinyang Sui and Jiayi Xie and Xingyu Chen and Zeyang Liu and Xuguang Lan},
|
||||
year={2026},
|
||||
journal={arXiv preprint arXiv:2602.00678},
|
||||
url={https://arxiv.org/abs/2602.00678},
|
||||
booktitle={Proceedings of Robotics: Science and Systems},
|
||||
year={2026}
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
@@ -1,6 +1,14 @@
|
||||
# 20260419
|
||||
## v1.0.4
|
||||
1. 地形中`slope_threshold: 0.75 -> 1.5`,wave和rough_slope表现更好
|
||||
# 20260403
|
||||
## v1.0.3
|
||||
1. 修复last_last_action重置问题,修复resample_command在计算奖励前的问题
|
||||
2. 将所有配置中加入自碰撞
|
||||
# 20260325
|
||||
## v1.0.2-rc2
|
||||
1. 修复robogauge评估中返回None导致的训练中断问题
|
||||
2. 将自碰撞打开,真机表现更好
|
||||
# 20260126
|
||||
## v1.0.2-rc1
|
||||
1. 修改高速移动的训练文件到最终版,删除配置中无用注释
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
policy_path: "{LEGGED_GYM_ROOT_DIR}/deploy/pre_train/go2/go2_moe_cts_137k_0.6739.pt"
|
||||
# policy_path: "{LEGGED_GYM_ROOT_DIR}/deploy/pre_train/go2/go2_moe_cts_137k_0.6739.pt" # paper defult model
|
||||
policy_path: "{LEGGED_GYM_ROOT_DIR}/deploy/pre_train/go2/go2_moe_cts_high_slope_thre_164k_0.6715.pt"
|
||||
# policy_path: "{LEGGED_GYM_ROOT_DIR}/deploy/pre_train/go2/go2_cts_150k.pt"
|
||||
|
||||
# xml_path: "{LEGGED_GYM_ROOT_DIR}/resources/robots/go2/flat.xml"
|
||||
|
||||
BIN
deploy/pre_train/go2/go2_moe_cts_high_slope_thre_164k_0.6715.pt
Normal file
BIN
deploy/pre_train/go2/go2_moe_cts_high_slope_thre_164k_0.6715.pt
Normal file
Binary file not shown.
@@ -2,6 +2,8 @@ from legged_gym import LEGGED_GYM_ROOT_DIR, LEGGED_GYM_ENVS_DIR
|
||||
|
||||
from legged_gym.envs.go2.go2_env import Go2Robot
|
||||
from legged_gym.envs.go2.go2_config import GO2Cfg, GO2CfgPPO, GO2CfgCTS, GO2CfgMoECTS, GO2CfgMoENGCTS, GO2CfgMCPCTS, GO2CfgACMoECTS, GO2CfgDualMoECTS
|
||||
from legged_gym.envs.go1.go1_env import Go1Robot
|
||||
from legged_gym.envs.go1.go1_config import GO1Cfg, GO1CfgMoECTS, GO1StairsCfg, GO1StairsCfgMoECTS
|
||||
from .base.legged_robot import LeggedRobot
|
||||
|
||||
from legged_gym.utils.task_registry import task_registry
|
||||
@@ -13,3 +15,5 @@ task_registry.register("go2_moe_ng_cts", Go2Robot, GO2Cfg(), GO2CfgMoENGCTS())
|
||||
task_registry.register("go2_mcp_cts", Go2Robot, GO2Cfg(), GO2CfgMCPCTS())
|
||||
task_registry.register("go2_ac_moe_cts", Go2Robot, GO2Cfg(), GO2CfgACMoECTS())
|
||||
task_registry.register("go2_dual_moe_cts", Go2Robot, GO2Cfg(), GO2CfgDualMoECTS())
|
||||
task_registry.register("go1_moe_cts", Go1Robot, GO1Cfg(), GO1CfgMoECTS())
|
||||
task_registry.register("go1_moe_cts_stairs", Go1Robot, GO1StairsCfg(), GO1StairsCfgMoECTS())
|
||||
|
||||
@@ -129,6 +129,9 @@ class LeggedRobot(BaseTask):
|
||||
# compute observations, rewards, resets, ...
|
||||
self.check_termination()
|
||||
self.compute_reward()
|
||||
# resample commands must after reward computing
|
||||
resampling_env_ids = ((self.commands_resampling_step <= 0.0) * (self.episode_length_buf < self.max_episode_length - 1)).nonzero(as_tuple=False).flatten()
|
||||
self._resample_commands(resampling_env_ids)
|
||||
env_ids = self.reset_buf.nonzero(as_tuple=False).flatten()
|
||||
self.reset_idx(env_ids)
|
||||
|
||||
@@ -137,6 +140,7 @@ class LeggedRobot(BaseTask):
|
||||
|
||||
self.compute_observations() # in some cases a simulation step might be required to refresh some obs (for example body positions)
|
||||
|
||||
self.last_last_actions[:] = self.last_actions[:]
|
||||
self.last_actions[:] = self.actions[:]
|
||||
self.last_dof_vel[:] = self.dof_vel[:]
|
||||
self.last_root_vel[:] = self.root_states[:, 7:13]
|
||||
@@ -180,7 +184,7 @@ class LeggedRobot(BaseTask):
|
||||
def reset_idx(self, env_ids):
|
||||
""" Reset some environments.
|
||||
Calls self._reset_dofs(env_ids), self._reset_root_states(env_ids), and self._resample_commands(env_ids)
|
||||
[Optional] calls self._update_terrain_curriculum(env_ids), self.update_command_curriculum(env_ids) and
|
||||
[Optional] calls self._update_terrain_curriculum(env_ids),
|
||||
Logs episode info
|
||||
Resets some buffers
|
||||
|
||||
@@ -216,14 +220,13 @@ class LeggedRobot(BaseTask):
|
||||
# reset buffers
|
||||
self.actions[env_ids] = 0.
|
||||
self.last_actions[env_ids] = 0.
|
||||
self.last_last_actions[env_ids] = 0.
|
||||
self.last_dof_vel[env_ids] = 0.
|
||||
self.feet_air_time[env_ids] = 0.
|
||||
self.episode_length_buf[env_ids] = 0
|
||||
self.reset_buf[env_ids] = 1
|
||||
self.commands_resampling_step[env_ids] = self.cfg.commands.resampling_time / self.dt
|
||||
self.commands_xy_accumulation[env_ids] = 0.0
|
||||
if self.cfg.commands.curriculum:
|
||||
self.update_command_curriculum(env_ids)
|
||||
self._resample_commands(env_ids)
|
||||
# fill extras
|
||||
self.extras["episode"] = {}
|
||||
@@ -238,7 +241,6 @@ class LeggedRobot(BaseTask):
|
||||
for key in self.episode_sums.keys():
|
||||
self.extras["episode"]['rew_' + key] = torch.mean(self.episode_sums[key][env_ids]) / self.max_episode_length_s
|
||||
self.episode_sums[key][env_ids] = 0.
|
||||
if self.cfg.commands.curriculum:
|
||||
self.extras["episode"]["max_command_x"] = self.command_ranges["lin_vel_x"][1]
|
||||
# send timeout info to the algorithm
|
||||
if self.cfg.env.send_timeouts:
|
||||
@@ -403,20 +405,8 @@ class LeggedRobot(BaseTask):
|
||||
|
||||
def _post_physics_step_callback(self):
|
||||
""" Callback called before computing terminations, rewards, and observations
|
||||
Default behaviour: Compute ang vel command based on target and heading, compute measured terrain heights and randomly push robots
|
||||
Default behaviour: Compute measured terrain heights and randomly push robots
|
||||
"""
|
||||
# env_ids = (self.episode_length_buf % int(self.cfg.commands.resampling_time / self.dt)==0).nonzero(as_tuple=False).flatten()
|
||||
resampling_env_ids = ((self.commands_resampling_step <= 0.0) * (self.episode_length_buf < self.max_episode_length - 1)).nonzero(as_tuple=False).flatten()
|
||||
self._resample_commands(resampling_env_ids)
|
||||
if self.cfg.commands.heading_command:
|
||||
mask = (self.stop_heading == 0.0)
|
||||
forward = quat_apply(self.base_quat[mask], self.forward_vec[mask])
|
||||
heading = torch.atan2(forward[:, 1], forward[:, 0])
|
||||
self.commands[mask, 2] = torch.clip(
|
||||
0.5*wrap_to_pi(self.commands[mask, 3] - heading),
|
||||
self.env_command_ranges["ang_vel_yaw"][:, 0],
|
||||
self.env_command_ranges["ang_vel_yaw"][:, 1]
|
||||
)
|
||||
if self.cfg.terrain.measure_heights:
|
||||
self.measured_heights = self._get_heights()
|
||||
|
||||
@@ -591,6 +581,17 @@ class LeggedRobot(BaseTask):
|
||||
|
||||
self.commands_xy_accumulation[env_ids] += self.commands[env_ids, :2]
|
||||
|
||||
if self.cfg.commands.heading_command:
|
||||
heading_env_ids = env_ids[self.stop_heading[env_ids] == 0.0]
|
||||
if len(heading_env_ids) > 0:
|
||||
forward = quat_apply(self.base_quat[heading_env_ids], self.forward_vec[heading_env_ids])
|
||||
heading = torch.atan2(forward[:, 1], forward[:, 0])
|
||||
self.commands[heading_env_ids, 2] = torch.clip(
|
||||
0.5 * wrap_to_pi(self.commands[heading_env_ids, 3] - heading),
|
||||
self.env_command_ranges["ang_vel_yaw"][heading_env_ids, 0],
|
||||
self.env_command_ranges["ang_vel_yaw"][heading_env_ids, 1]
|
||||
)
|
||||
|
||||
def _compute_torques(self, actions):
|
||||
""" Compute torques from actions.
|
||||
Actions can be interpreted as position or velocity targets given to a PD controller, or directly as scaled torques.
|
||||
@@ -723,20 +724,6 @@ class LeggedRobot(BaseTask):
|
||||
gymtorch.unwrap_tensor(self.root_states),
|
||||
gymtorch.unwrap_tensor(env_ids_int32), len(env_ids_int32))
|
||||
|
||||
|
||||
|
||||
def update_command_curriculum(self, env_ids):
|
||||
""" Implements a curriculum of increasing commands
|
||||
|
||||
Args:
|
||||
env_ids (List[int]): ids of environments being reset
|
||||
"""
|
||||
# If the tracking reward is above 80% of the maximum, increase the range of commands
|
||||
if torch.mean(self.episode_sums["tracking_lin_vel"][env_ids]) / self.max_episode_length > 0.8 * self.reward_scales["tracking_lin_vel"]:
|
||||
self.command_ranges["lin_vel_x"][0] = np.clip(self.command_ranges["lin_vel_x"][0] - 0.5, -self.cfg.commands.max_curriculum, 0.)
|
||||
self.command_ranges["lin_vel_x"][1] = np.clip(self.command_ranges["lin_vel_x"][1] + 0.5, 0., self.cfg.commands.max_curriculum)
|
||||
|
||||
|
||||
def _get_noise_scale_vec(self, cfg):
|
||||
""" Sets a vector used to scale the noise added to the observations.
|
||||
[NOTE]: Must be adapted when changing the observations structure
|
||||
@@ -807,6 +794,7 @@ class LeggedRobot(BaseTask):
|
||||
self.d_gains = torch.zeros(self.num_actions, dtype=torch.float, device=self.device, requires_grad=False)
|
||||
self.actions = torch.zeros(self.num_envs, self.num_actions, dtype=torch.float, device=self.device, requires_grad=False)
|
||||
self.last_actions = torch.zeros(self.num_envs, self.num_actions, dtype=torch.float, device=self.device, requires_grad=False)
|
||||
self.last_last_actions = torch.zeros(self.num_envs, self.num_actions, dtype=torch.float, device=self.device, requires_grad=False)
|
||||
self.last_dof_vel = torch.zeros_like(self.dof_vel)
|
||||
self.last_root_vel = torch.zeros_like(self.root_states[:, 7:13])
|
||||
self.commands = torch.zeros(self.num_envs, self.cfg.commands.num_commands, dtype=torch.float, device=self.device, requires_grad=False) # x vel, y vel, yaw vel, heading
|
||||
@@ -1372,10 +1360,7 @@ class LeggedRobot(BaseTask):
|
||||
|
||||
def _reward_action_smoothness(self):
|
||||
# a_t - 2a_{t-1} + a_{t-2}
|
||||
if not hasattr(self, 'last_last_actions'):
|
||||
self.last_last_actions = torch.zeros_like(self.last_actions)
|
||||
rew = torch.sum((self.actions - 2 * self.last_actions + self.last_last_actions).pow(2), dim=1)
|
||||
self.last_last_actions[:] = self.last_actions[:]
|
||||
return rew
|
||||
|
||||
def _reward_dof_power(self):
|
||||
|
||||
@@ -37,12 +37,10 @@ class LeggedRobotCfg(BaseConfig):
|
||||
# [wave, slope, rough slope, stairs up, stairs down, obstacles, stepping stones, gap, flat]
|
||||
terrain_proportions = [0.1, 0.1, 0.1, 0.2, 0.2, 0.1, 0.1, 0.1, 0.0]
|
||||
# trimesh only:
|
||||
slope_treshold = 0.75 # slopes above this threshold will be corrected to vertical surfaces
|
||||
slope_threshold = 0.75 # slopes above this threshold will be corrected to vertical surfaces
|
||||
move_down_by_accumulated_xy_command = False # move down the terrain curriculum based on accumulated xy command distance instead of absolute distance
|
||||
|
||||
class commands:
|
||||
curriculum = False
|
||||
max_curriculum = 1.
|
||||
num_commands = 4 # default: lin_vel_x, lin_vel_y, ang_vel_yaw, heading (in heading mode ang_vel_yaw is recomputed from heading error)
|
||||
resampling_time = 10. # time before command are changed[s]
|
||||
heading_command = False # if true: compute ang vel command from heading error
|
||||
|
||||
58
legged_gym/envs/go1/go1_config.py
Normal file
58
legged_gym/envs/go1/go1_config.py
Normal file
@@ -0,0 +1,58 @@
|
||||
from legged_gym.envs.go2.go2_config import GO2Cfg, GO2CfgMoECTS
|
||||
|
||||
|
||||
class GO1Cfg(GO2Cfg):
|
||||
class init_state(GO2Cfg.init_state):
|
||||
pos = [0.0, 0.0, 0.34]
|
||||
|
||||
class control(GO2Cfg.control):
|
||||
stiffness = {'joint': 28.0}
|
||||
damping = {'joint': 0.7}
|
||||
action_scale = 0.25
|
||||
decimation = 4
|
||||
|
||||
class asset(GO2Cfg.asset):
|
||||
file = '{LEGGED_GYM_ROOT_DIR}/resources/robots/go1/urdf/go1.urdf'
|
||||
name = 'go1'
|
||||
self_collisions = 1
|
||||
|
||||
class rewards(GO2Cfg.rewards):
|
||||
base_height_target = 0.30
|
||||
|
||||
|
||||
class GO1CfgMoECTS(GO2CfgMoECTS):
|
||||
class runner(GO2CfgMoECTS.runner):
|
||||
experiment_name = 'go1_moe_cts'
|
||||
run_name = 'from_scratch_5000'
|
||||
max_iterations = 5000
|
||||
save_interval = 500
|
||||
resume = False
|
||||
load_run = -1
|
||||
checkpoint = -1
|
||||
resume_path = None
|
||||
|
||||
|
||||
class GO1StairsCfg(GO1Cfg):
|
||||
class terrain(GO1Cfg.terrain):
|
||||
# wave, slope, rough slope, stairs up, stairs down, obstacles,
|
||||
# stepping stones, gap, flat
|
||||
terrain_proportions = [0.03, 0.06, 0.03, 0.50, 0.20, 0.08, 0.0, 0.0, 0.10]
|
||||
|
||||
class commands(GO1Cfg.commands):
|
||||
# The 10k checkpoint has only seen +/-0.5 m/s because the original
|
||||
# curriculum does not widen until iteration 20000. Cover the 0.8 m/s
|
||||
# RoboGauge stair command immediately during this fine-tune.
|
||||
command_range_curriculum = []
|
||||
|
||||
class ranges(GO1Cfg.commands.ranges):
|
||||
lin_vel_x = [-1.0, 1.0]
|
||||
lin_vel_y = [-0.5, 0.5]
|
||||
ang_vel_yaw = [-1.0, 1.0]
|
||||
|
||||
|
||||
class GO1StairsCfgMoECTS(GO1CfgMoECTS):
|
||||
class runner(GO1CfgMoECTS.runner):
|
||||
experiment_name = 'go1_moe_cts'
|
||||
run_name = 'stairs_finetune_10000_to_15000'
|
||||
max_iterations = 5000
|
||||
save_interval = 500
|
||||
34
legged_gym/envs/go1/go1_env.py
Normal file
34
legged_gym/envs/go1/go1_env.py
Normal file
@@ -0,0 +1,34 @@
|
||||
from legged_gym.envs.go2.go2_env import Go2Robot
|
||||
import torch
|
||||
|
||||
|
||||
class Go1Robot(Go2Robot):
|
||||
"""Go1 asset with an explicit policy-to-asset joint permutation.
|
||||
|
||||
Isaac Gym loads this asset as [FL, FR, RL, RR]. The permutation below
|
||||
presents observations to the policy as [FR, FL, RR, RL] and maps policy
|
||||
actions back to the Isaac Gym asset order. Existing Go1 checkpoints depend
|
||||
on this policy order.
|
||||
"""
|
||||
|
||||
# Policy order [FR, FL, RR, RL] -> asset order [FL, FR, RL, RR].
|
||||
_POLICY_TO_ASSET = [3, 4, 5, 0, 1, 2, 9, 10, 11, 6, 7, 8]
|
||||
|
||||
def step(self, actions):
|
||||
asset_actions = torch.zeros_like(actions)
|
||||
asset_actions[:, self._POLICY_TO_ASSET] = actions
|
||||
return super().step(asset_actions)
|
||||
|
||||
def compute_observations(self):
|
||||
super().compute_observations()
|
||||
|
||||
# Go2 policy observation: angular velocity, gravity, commands,
|
||||
# joint-position error, joint velocity, previous action.
|
||||
for start in (9, 21, 33):
|
||||
self.obs_buf[:, start:start + 12] = self.obs_buf[:, start:start + 12][:, self._POLICY_TO_ASSET]
|
||||
|
||||
# Keep the privileged teacher input consistent as well. Its first
|
||||
# three fields are base linear velocity, so joint fields start at 12.
|
||||
if self.privileged_obs_buf is not None:
|
||||
for start in (12, 24, 36, 52, 64):
|
||||
self.privileged_obs_buf[:, start:start + 12] = self.privileged_obs_buf[:, start:start + 12][:, self._POLICY_TO_ASSET]
|
||||
@@ -93,11 +93,10 @@ class GO2Cfg(LeggedRobotCfg):
|
||||
# terrain_proportions = [0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0]
|
||||
# terrain_proportions = [0.3, 0.3, 0.3, 0.0, 0.0, 0.0, 0.0, 0.0, 0.1]
|
||||
# terrain_proportions = [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0]
|
||||
slope_threshold = 1.5 # higher value means more steep slopes, for better wave and rough slope generation
|
||||
move_down_by_accumulated_xy_command = True # move down the terrain curriculum based on accumulated xy command distance instead of absolute distance
|
||||
|
||||
class commands(LeggedRobotCfg.commands):
|
||||
curriculum = False
|
||||
max_curriculum = 1.
|
||||
num_commands = 4 # default: lin_vel_x, lin_vel_y, ang_vel_yaw (in heading mode ang_vel_yaw is recomputed from heading error)
|
||||
resampling_time = 5. # time before command are changed[s]
|
||||
heading_command = False # if true: compute ang vel command from heading error
|
||||
@@ -151,7 +150,7 @@ class GO2Cfg(LeggedRobotCfg):
|
||||
foot_name = "foot"
|
||||
penalize_contacts_on = ["thigh", "calf"]
|
||||
terminate_after_contacts_on = ["base"]
|
||||
self_collisions = 1 # 1 to disable, 0 to enable...bitwise filter
|
||||
self_collisions = 0 # 1 to disable, 0 to enable...bitwise filter
|
||||
|
||||
class rewards(LeggedRobotCfg.rewards):
|
||||
soft_dof_pos_limit = 0.9
|
||||
|
||||
@@ -146,7 +146,7 @@ class GO2Cfg(LeggedRobotCfg):
|
||||
'heading': [-1.57, 1.57], # min max [rad]
|
||||
}, { # list for command range curriculums at specific training iterations
|
||||
'iter': 40000, # training iteration at which the command ranges are updated
|
||||
'lin_vel_x': [-2.0, 4.2], # min max [m/s]
|
||||
'lin_vel_x': [-2.0, 4.5], # min max [m/s]
|
||||
'lin_vel_y': [-0.5, 0.5], # min max [m/s]
|
||||
'ang_vel_yaw': [-1.0, 1.0], # min max [rad/s]
|
||||
'heading': [-1.57, 1.57], # min max [rad]
|
||||
@@ -181,7 +181,7 @@ class GO2Cfg(LeggedRobotCfg):
|
||||
foot_name = "foot"
|
||||
penalize_contacts_on = ["thigh", "calf"]
|
||||
terminate_after_contacts_on = ["base"]
|
||||
self_collisions = 1 # 1 to disable, 0 to enable...bitwise filter
|
||||
self_collisions = 0 # 1 to disable, 0 to enable...bitwise filter
|
||||
|
||||
class rewards(LeggedRobotCfg.rewards):
|
||||
soft_dof_pos_limit = 0.9
|
||||
|
||||
@@ -165,7 +165,7 @@ class GO2Cfg(LeggedRobotCfg):
|
||||
foot_name = "foot"
|
||||
penalize_contacts_on = ["thigh", "calf"]
|
||||
terminate_after_contacts_on = ["base"]
|
||||
self_collisions = 1 # 1 to disable, 0 to enable...bitwise filter
|
||||
self_collisions = 0 # 1 to disable, 0 to enable...bitwise filter
|
||||
|
||||
class rewards(LeggedRobotCfg.rewards):
|
||||
soft_dof_pos_limit = 0.9
|
||||
|
||||
@@ -165,7 +165,7 @@ class GO2Cfg(LeggedRobotCfg):
|
||||
foot_name = "foot"
|
||||
penalize_contacts_on = ["thigh", "calf"]
|
||||
terminate_after_contacts_on = ["base"]
|
||||
self_collisions = 1 # 1 to disable, 0 to enable...bitwise filter
|
||||
self_collisions = 0 # 1 to disable, 0 to enable...bitwise filter
|
||||
|
||||
class rewards(LeggedRobotCfg.rewards):
|
||||
soft_dof_pos_limit = 0.9
|
||||
|
||||
@@ -46,7 +46,7 @@ class Terrain:
|
||||
self.vertices, self.triangles = terrain_utils.convert_heightfield_to_trimesh( self.height_field_raw,
|
||||
self.cfg.horizontal_scale,
|
||||
self.cfg.vertical_scale,
|
||||
self.cfg.slope_treshold)
|
||||
self.cfg.slope_threshold)
|
||||
|
||||
def randomized_terrain(self):
|
||||
for k in range(self.cfg.num_sub_terrains):
|
||||
|
||||
339
resources/robots/go1/meshes/calf.dae
Normal file
339
resources/robots/go1/meshes/calf.dae
Normal file
File diff suppressed because one or more lines are too long
BIN
resources/robots/go1/meshes/calf.stl
Normal file
BIN
resources/robots/go1/meshes/calf.stl
Normal file
Binary file not shown.
303
resources/robots/go1/meshes/depthCamera.dae
Normal file
303
resources/robots/go1/meshes/depthCamera.dae
Normal file
File diff suppressed because one or more lines are too long
408
resources/robots/go1/meshes/hip.dae
Normal file
408
resources/robots/go1/meshes/hip.dae
Normal file
File diff suppressed because one or more lines are too long
BIN
resources/robots/go1/meshes/hip.stl
Normal file
BIN
resources/robots/go1/meshes/hip.stl
Normal file
Binary file not shown.
783
resources/robots/go1/meshes/thigh.dae
Normal file
783
resources/robots/go1/meshes/thigh.dae
Normal file
File diff suppressed because one or more lines are too long
BIN
resources/robots/go1/meshes/thigh.stl
Normal file
BIN
resources/robots/go1/meshes/thigh.stl
Normal file
Binary file not shown.
1266
resources/robots/go1/meshes/thigh_mirror.dae
Normal file
1266
resources/robots/go1/meshes/thigh_mirror.dae
Normal file
File diff suppressed because one or more lines are too long
BIN
resources/robots/go1/meshes/thigh_mirror.stl
Normal file
BIN
resources/robots/go1/meshes/thigh_mirror.stl
Normal file
Binary file not shown.
132
resources/robots/go1/meshes/trunk.dae
Normal file
132
resources/robots/go1/meshes/trunk.dae
Normal file
File diff suppressed because one or more lines are too long
BIN
resources/robots/go1/meshes/trunk.stl
Normal file
BIN
resources/robots/go1/meshes/trunk.stl
Normal file
Binary file not shown.
369
resources/robots/go1/meshes/ultraSound.dae
Normal file
369
resources/robots/go1/meshes/ultraSound.dae
Normal file
File diff suppressed because one or more lines are too long
581
resources/robots/go1/urdf/go1.urdf
Normal file
581
resources/robots/go1/urdf/go1.urdf
Normal file
@@ -0,0 +1,581 @@
|
||||
<?xml version="1.0" ?>
|
||||
<robot name="go1_description" xmlns:xacro="http://www.ros.org/wiki/xacro">
|
||||
<material name="black">
|
||||
<color rgba="0.0 0.0 0.0 1.0"/>
|
||||
</material>
|
||||
<material name="blue">
|
||||
<color rgba="0.0 0.0 0.8 1.0"/>
|
||||
</material>
|
||||
<material name="green">
|
||||
<color rgba="0.0 0.8 0.0 1.0"/>
|
||||
</material>
|
||||
<material name="grey">
|
||||
<color rgba="0.2 0.2 0.2 1.0"/>
|
||||
</material>
|
||||
<material name="silver">
|
||||
<color rgba="0.913725490196 0.913725490196 0.847058823529 1.0"/>
|
||||
</material>
|
||||
<material name="orange">
|
||||
<color rgba="1.0 0.423529411765 0.0392156862745 1.0"/>
|
||||
</material>
|
||||
<material name="brown">
|
||||
<color rgba="0.870588235294 0.811764705882 0.764705882353 1.0"/>
|
||||
</material>
|
||||
<material name="red">
|
||||
<color rgba="0.8 0.0 0.0 1.0"/>
|
||||
</material>
|
||||
<material name="white">
|
||||
<color rgba="1.0 1.0 1.0 1.0"/>
|
||||
</material>
|
||||
|
||||
|
||||
<link name="base">
|
||||
<visual>
|
||||
<origin rpy="0 0 0" xyz="0 0 0"/>
|
||||
<geometry>
|
||||
<box size="0.001 0.001 0.001"/>
|
||||
</geometry>
|
||||
</visual>
|
||||
</link>
|
||||
<joint name="floating_base" type="fixed">
|
||||
<origin rpy="0 0 0" xyz="0 0 0"/>
|
||||
<parent link="base"/>
|
||||
<child link="trunk"/>
|
||||
</joint>
|
||||
<link name="trunk">
|
||||
<visual>
|
||||
<origin rpy="0 0 0" xyz="0 0 0"/>
|
||||
<geometry>
|
||||
<mesh filename="../meshes/trunk.dae" scale="1 1 1"/>
|
||||
</geometry>
|
||||
<material name="silver"/>
|
||||
</visual>
|
||||
<collision>
|
||||
<origin rpy="0 0 0" xyz="0 0 0"/>
|
||||
<geometry>
|
||||
<box size="0.3762 0.0935 0.114"/>
|
||||
</geometry>
|
||||
</collision>
|
||||
<inertial>
|
||||
<origin rpy="0 0 0" xyz="0.011611 0.004437 0.000108"/>
|
||||
<mass value="4.8"/>
|
||||
<inertia ixx="0.016130741919" ixy="0.000593180607" ixz="7.324662e-06" iyy="0.036507810812" iyz="2.0969537e-05" izz="0.044693872053"/>
|
||||
</inertial>
|
||||
</link>
|
||||
<joint name="imu_joint" type="fixed">
|
||||
<parent link="trunk"/>
|
||||
<child link="imu_link"/>
|
||||
<origin rpy="0 0 0" xyz="-0.01592 -0.06659 -0.00617"/>
|
||||
</joint>
|
||||
<link name="imu_link">
|
||||
<inertial>
|
||||
<mass value="0.001"/>
|
||||
<origin rpy="0 0 0" xyz="0 0 0"/>
|
||||
<inertia ixx="0.0001" ixy="0" ixz="0" iyy="0.0001" iyz="0" izz="0.0001"/>
|
||||
</inertial>
|
||||
<visual>
|
||||
<origin rpy="0 0 0" xyz="0 0 0"/>
|
||||
<geometry>
|
||||
<box size="0.001 0.001 0.001"/>
|
||||
</geometry>
|
||||
<material name="red"/>
|
||||
</visual>
|
||||
<!-- <collision>
|
||||
<origin rpy="0 0 0" xyz="0 0 0"/>
|
||||
<geometry>
|
||||
<box size=".001 .001 .001"/>
|
||||
</geometry>
|
||||
</collision> -->
|
||||
</link>
|
||||
<joint name="FR_hip_joint" type="revolute">
|
||||
<origin rpy="0 0 0" xyz="0.1881 -0.04675 0"/>
|
||||
<parent link="trunk"/>
|
||||
<child link="FR_hip"/>
|
||||
<axis xyz="1 0 0"/>
|
||||
<dynamics damping="0" friction="0"/>
|
||||
<limit effort="33.5" lower="-0.802851455917" upper="0.802851455917" velocity="50"/>
|
||||
</joint>
|
||||
<link name="FR_hip">
|
||||
<visual>
|
||||
<origin rpy="3.14159265359 0 0" xyz="0 0 0"/>
|
||||
<geometry>
|
||||
<mesh filename="../meshes/hip.dae" scale="1 1 1"/>
|
||||
</geometry>
|
||||
<material name="silver"/>
|
||||
</visual>
|
||||
<collision>
|
||||
<origin rpy="1.57079632679 0 0" xyz="0 -0.045 0"/>
|
||||
<geometry>
|
||||
<cylinder length="0.04" radius="0.046"/>
|
||||
</geometry>
|
||||
</collision>
|
||||
<inertial>
|
||||
<origin rpy="0 0 0" xyz="-0.00541 0.00074 6e-06"/>
|
||||
<mass value="0.510299"/>
|
||||
<inertia ixx="0.00030528937" ixy="7.788013e-06" ixz="2.2016e-07" iyy="0.000590894859" iyz="1.7175e-08" izz="0.000396594572"/>
|
||||
</inertial>
|
||||
</link>
|
||||
<joint name="FR_hip_fixed" type="fixed">
|
||||
<origin rpy="0 0 0" xyz="0 -0.08 0"/>
|
||||
<parent link="FR_hip"/>
|
||||
<child link="FR_thigh_shoulder"/>
|
||||
</joint>
|
||||
<!-- this link is only for collision -->
|
||||
<link name="FR_thigh_shoulder">
|
||||
<!-- <collision>
|
||||
<origin rpy="1.57079632679 0 0" xyz="0 0 0"/>
|
||||
<geometry>
|
||||
<cylinder length="0.032" radius="0.041"/>
|
||||
</geometry>
|
||||
</collision> -->
|
||||
</link>
|
||||
<joint name="FR_thigh_joint" type="revolute">
|
||||
<origin rpy="0 0 0" xyz="0 -0.08 0"/>
|
||||
<parent link="FR_hip"/>
|
||||
<child link="FR_thigh"/>
|
||||
<axis xyz="0 1 0"/>
|
||||
<dynamics damping="0" friction="0"/>
|
||||
<limit effort="33.5" lower="-1.0471975512" upper="4.18879020479" velocity="28"/>
|
||||
</joint>
|
||||
<link name="FR_thigh">
|
||||
<visual>
|
||||
<origin rpy="0 0 0" xyz="0 0 0"/>
|
||||
<geometry>
|
||||
<mesh filename="../meshes/thigh_mirror.dae" scale="1 1 1"/>
|
||||
</geometry>
|
||||
<material name="silver"/>
|
||||
</visual>
|
||||
<collision>
|
||||
<origin rpy="0 1.57079632679 0" xyz="0 0 -0.1065"/>
|
||||
<geometry>
|
||||
<box size="0.213 0.0245 0.034"/>
|
||||
</geometry>
|
||||
</collision>
|
||||
<inertial>
|
||||
<origin rpy="0 0 0" xyz="-0.003468 0.018947 -0.032736"/>
|
||||
<mass value="0.898919"/>
|
||||
<inertia ixx="0.005395867678" ixy="-1.02809e-07" ixz="0.000337529085" iyy="0.005142451046" iyz="5.816563e-06" izz="0.00102478732"/>
|
||||
</inertial>
|
||||
</link>
|
||||
<joint name="FR_calf_joint" type="revolute">
|
||||
<origin rpy="0 0 0" xyz="0 0 -0.213"/>
|
||||
<parent link="FR_thigh"/>
|
||||
<child link="FR_calf"/>
|
||||
<axis xyz="0 1 0"/>
|
||||
<dynamics damping="0" friction="0"/>
|
||||
<limit effort="33.5" lower="-2.69653369433" upper="-0.916297857297" velocity="28"/>
|
||||
</joint>
|
||||
<link name="FR_calf">
|
||||
<visual>
|
||||
<origin rpy="0 0 0" xyz="0 0 0"/>
|
||||
<geometry>
|
||||
<mesh filename="../meshes/calf.dae" scale="1 1 1"/>
|
||||
</geometry>
|
||||
<material name="black"/>
|
||||
</visual>
|
||||
<collision>
|
||||
<origin rpy="0 1.57079632679 0" xyz="0 0 -0.1065"/>
|
||||
<geometry>
|
||||
<box size="0.213 0.016 0.016"/>
|
||||
</geometry>
|
||||
</collision>
|
||||
<inertial>
|
||||
<origin rpy="0 0 0" xyz="0.006286 0.001307 -0.122269"/>
|
||||
<mass value="0.158015"/>
|
||||
<inertia ixx="0.003607648222" ixy="1.494971e-06" ixz="-0.000132778525" iyy="0.003626771492" iyz="-2.8638535e-05" izz="3.5148003e-05"/>
|
||||
</inertial>
|
||||
</link>
|
||||
<joint name="FR_foot_fixed" type="fixed" dont_collapse="true">
|
||||
<origin rpy="0 0 0" xyz="0 0 -0.213"/>
|
||||
<parent link="FR_calf"/>
|
||||
<child link="FR_foot"/>
|
||||
</joint>
|
||||
<link name="FR_foot">
|
||||
<visual>
|
||||
<origin rpy="0 0 0" xyz="0 0 0"/>
|
||||
<geometry>
|
||||
<sphere radius="0.01"/>
|
||||
</geometry>
|
||||
<material name="black"/>
|
||||
</visual>
|
||||
<collision>
|
||||
<origin rpy="0 0 0" xyz="0 0 0"/>
|
||||
<geometry>
|
||||
<sphere radius="0.02"/>
|
||||
</geometry>
|
||||
</collision>
|
||||
<inertial>
|
||||
<mass value="0.06"/>
|
||||
<inertia ixx="9.6e-06" ixy="0.0" ixz="0.0" iyy="9.6e-06" iyz="0.0" izz="9.6e-06"/>
|
||||
</inertial>
|
||||
</link>
|
||||
|
||||
<joint name="FL_hip_joint" type="revolute">
|
||||
<origin rpy="0 0 0" xyz="0.1881 0.04675 0"/>
|
||||
<parent link="trunk"/>
|
||||
<child link="FL_hip"/>
|
||||
<axis xyz="1 0 0"/>
|
||||
<dynamics damping="0" friction="0"/>
|
||||
<limit effort="33.5" lower="-0.802851455917" upper="0.802851455917" velocity="50"/>
|
||||
</joint>
|
||||
<link name="FL_hip">
|
||||
<visual>
|
||||
<origin rpy="0 0 0" xyz="0 0 0"/>
|
||||
<geometry>
|
||||
<mesh filename="../meshes/hip.dae" scale="1 1 1"/>
|
||||
</geometry>
|
||||
<material name="silver"/>
|
||||
</visual>
|
||||
<collision>
|
||||
<origin rpy="1.57079632679 0 0" xyz="0 0.045 0"/>
|
||||
<geometry>
|
||||
<cylinder length="0.04" radius="0.046"/>
|
||||
</geometry>
|
||||
</collision>
|
||||
<inertial>
|
||||
<origin rpy="0 0 0" xyz="-0.00541 -0.00074 6e-06"/>
|
||||
<mass value="0.510299"/>
|
||||
<inertia ixx="0.00030528937" ixy="-7.788013e-06" ixz="2.2016e-07" iyy="0.000590894859" iyz="-1.7175e-08" izz="0.000396594572"/>
|
||||
</inertial>
|
||||
</link>
|
||||
<joint name="FL_hip_fixed" type="fixed">
|
||||
<origin rpy="0 0 0" xyz="0 0.08 0"/>
|
||||
<parent link="FL_hip"/>
|
||||
<child link="FL_thigh_shoulder"/>
|
||||
</joint>
|
||||
<!-- this link is only for collision -->
|
||||
<link name="FL_thigh_shoulder">
|
||||
<!-- <collision>
|
||||
<origin rpy="1.57079632679 0 0" xyz="0 0 0"/>
|
||||
<geometry>
|
||||
<cylinder length="0.032" radius="0.041"/>
|
||||
</geometry>
|
||||
</collision> -->
|
||||
</link>
|
||||
<joint name="FL_thigh_joint" type="revolute">
|
||||
<origin rpy="0 0 0" xyz="0 0.08 0"/>
|
||||
<parent link="FL_hip"/>
|
||||
<child link="FL_thigh"/>
|
||||
<axis xyz="0 1 0"/>
|
||||
<dynamics damping="0" friction="0"/>
|
||||
<limit effort="33.5" lower="-1.0471975512" upper="4.18879020479" velocity="28"/>
|
||||
</joint>
|
||||
<link name="FL_thigh">
|
||||
<visual>
|
||||
<origin rpy="0 0 0" xyz="0 0 0"/>
|
||||
<geometry>
|
||||
<mesh filename="../meshes/thigh.dae" scale="1 1 1"/>
|
||||
</geometry>
|
||||
<material name="silver"/>
|
||||
</visual>
|
||||
<collision>
|
||||
<origin rpy="0 1.57079632679 0" xyz="0 0 -0.1065"/>
|
||||
<geometry>
|
||||
<box size="0.213 0.0245 0.034"/>
|
||||
</geometry>
|
||||
</collision>
|
||||
<inertial>
|
||||
<origin rpy="0 0 0" xyz="-0.003468 -0.018947 -0.032736"/>
|
||||
<mass value="0.898919"/>
|
||||
<inertia ixx="0.005395867678" ixy="1.02809e-07" ixz="0.000337529085" iyy="0.005142451046" iyz="-5.816563e-06" izz="0.00102478732"/>
|
||||
</inertial>
|
||||
</link>
|
||||
<joint name="FL_calf_joint" type="revolute">
|
||||
<origin rpy="0 0 0" xyz="0 0 -0.213"/>
|
||||
<parent link="FL_thigh"/>
|
||||
<child link="FL_calf"/>
|
||||
<axis xyz="0 1 0"/>
|
||||
<dynamics damping="0" friction="0"/>
|
||||
<limit effort="33.5" lower="-2.69653369433" upper="-0.916297857297" velocity="28"/>
|
||||
</joint>
|
||||
<link name="FL_calf">
|
||||
<visual>
|
||||
<origin rpy="0 0 0" xyz="0 0 0"/>
|
||||
<geometry>
|
||||
<mesh filename="../meshes/calf.dae" scale="1 1 1"/>
|
||||
</geometry>
|
||||
<material name="silver"/>
|
||||
</visual>
|
||||
<collision>
|
||||
<origin rpy="0 1.57079632679 0" xyz="0 0 -0.1065"/>
|
||||
<geometry>
|
||||
<box size="0.213 0.016 0.016"/>
|
||||
</geometry>
|
||||
</collision>
|
||||
<inertial>
|
||||
<origin rpy="0 0 0" xyz="0.006286 0.001307 -0.122269"/>
|
||||
<mass value="0.158015"/>
|
||||
<inertia ixx="0.003607648222" ixy="1.494971e-06" ixz="-0.000132778525" iyy="0.003626771492" iyz="-2.8638535e-05" izz="3.5148003e-05"/>
|
||||
</inertial>
|
||||
</link>
|
||||
<joint name="FL_foot_fixed" type="fixed" dont_collapse="true">
|
||||
<origin rpy="0 0 0" xyz="0 0 -0.213"/>
|
||||
<parent link="FL_calf"/>
|
||||
<child link="FL_foot"/>
|
||||
</joint>
|
||||
<link name="FL_foot">
|
||||
<visual>
|
||||
<origin rpy="0 0 0" xyz="0 0 0"/>
|
||||
<geometry>
|
||||
<sphere radius="0.01"/>
|
||||
</geometry>
|
||||
<material name="black"/>
|
||||
</visual>
|
||||
<collision>
|
||||
<origin rpy="0 0 0" xyz="0 0 0"/>
|
||||
<geometry>
|
||||
<sphere radius="0.02"/>
|
||||
</geometry>
|
||||
</collision>
|
||||
<inertial>
|
||||
<mass value="0.06"/>
|
||||
<inertia ixx="9.6e-06" ixy="0.0" ixz="0.0" iyy="9.6e-06" iyz="0.0" izz="9.6e-06"/>
|
||||
</inertial>
|
||||
</link>
|
||||
|
||||
<joint name="RR_hip_joint" type="revolute">
|
||||
<origin rpy="0 0 0" xyz="-0.1881 -0.04675 0"/>
|
||||
<parent link="trunk"/>
|
||||
<child link="RR_hip"/>
|
||||
<axis xyz="1 0 0"/>
|
||||
<dynamics damping="0" friction="0"/>
|
||||
<limit effort="33.5" lower="-0.802851455917" upper="0.802851455917" velocity="50"/>
|
||||
</joint>
|
||||
<link name="RR_hip">
|
||||
<visual>
|
||||
<origin rpy="3.14159265359 3.14159265359 0" xyz="0 0 0"/>
|
||||
<geometry>
|
||||
<mesh filename="../meshes/hip.dae" scale="1 1 1"/>
|
||||
</geometry>
|
||||
<material name="silver"/>
|
||||
</visual>
|
||||
<collision>
|
||||
<origin rpy="1.57079632679 0 0" xyz="0 -0.045 0"/>
|
||||
<geometry>
|
||||
<cylinder length="0.04" radius="0.046"/>
|
||||
</geometry>
|
||||
</collision>
|
||||
<inertial>
|
||||
<origin rpy="0 0 0" xyz="0.00541 0.00074 6e-06"/>
|
||||
<mass value="0.510299"/>
|
||||
<inertia ixx="0.00030528937" ixy="-7.788013e-06" ixz="-2.2016e-07" iyy="0.000590894859" iyz="1.7175e-08" izz="0.000396594572"/>
|
||||
</inertial>
|
||||
</link>
|
||||
<joint name="RR_hip_fixed" type="fixed">
|
||||
<origin rpy="0 0 0" xyz="0 -0.08 0"/>
|
||||
<parent link="RR_hip"/>
|
||||
<child link="RR_thigh_shoulder"/>
|
||||
</joint>
|
||||
<!-- this link is only for collision -->
|
||||
<link name="RR_thigh_shoulder">
|
||||
<!-- <collision>
|
||||
<origin rpy="1.57079632679 0 0" xyz="0 0 0"/>
|
||||
<geometry>
|
||||
<cylinder length="0.032" radius="0.041"/>
|
||||
</geometry>
|
||||
</collision> -->
|
||||
</link>
|
||||
<joint name="RR_thigh_joint" type="revolute">
|
||||
<origin rpy="0 0 0" xyz="0 -0.08 0"/>
|
||||
<parent link="RR_hip"/>
|
||||
<child link="RR_thigh"/>
|
||||
<axis xyz="0 1 0"/>
|
||||
<dynamics damping="0" friction="0"/>
|
||||
<limit effort="33.5" lower="-1.0471975512" upper="4.18879020479" velocity="28"/>
|
||||
</joint>
|
||||
<link name="RR_thigh">
|
||||
<visual>
|
||||
<origin rpy="0 0 0" xyz="0 0 0"/>
|
||||
<geometry>
|
||||
<mesh filename="../meshes/thigh_mirror.dae" scale="1 1 1"/>
|
||||
</geometry>
|
||||
<material name="silver"/>
|
||||
</visual>
|
||||
<collision>
|
||||
<origin rpy="0 1.57079632679 0" xyz="0 0 -0.1065"/>
|
||||
<geometry>
|
||||
<box size="0.213 0.0245 0.034"/>
|
||||
</geometry>
|
||||
</collision>
|
||||
<inertial>
|
||||
<origin rpy="0 0 0" xyz="-0.003468 0.018947 -0.032736"/>
|
||||
<mass value="0.898919"/>
|
||||
<inertia ixx="0.005395867678" ixy="-1.02809e-07" ixz="0.000337529085" iyy="0.005142451046" iyz="5.816563e-06" izz="0.00102478732"/>
|
||||
</inertial>
|
||||
</link>
|
||||
<joint name="RR_calf_joint" type="revolute">
|
||||
<origin rpy="0 0 0" xyz="0 0 -0.213"/>
|
||||
<parent link="RR_thigh"/>
|
||||
<child link="RR_calf"/>
|
||||
<axis xyz="0 1 0"/>
|
||||
<dynamics damping="0" friction="0"/>
|
||||
<limit effort="33.5" lower="-2.69653369433" upper="-0.916297857297" velocity="28"/>
|
||||
</joint>
|
||||
<link name="RR_calf">
|
||||
<visual>
|
||||
<origin rpy="0 0 0" xyz="0 0 0"/>
|
||||
<geometry>
|
||||
<mesh filename="../meshes/calf.dae" scale="1 1 1"/>
|
||||
</geometry>
|
||||
<material name="black"/>
|
||||
</visual>
|
||||
<collision>
|
||||
<origin rpy="0 1.57079632679 0" xyz="0 0 -0.1065"/>
|
||||
<geometry>
|
||||
<box size="0.213 0.016 0.016"/>
|
||||
</geometry>
|
||||
</collision>
|
||||
<inertial>
|
||||
<origin rpy="0 0 0" xyz="0.006286 0.001307 -0.122269"/>
|
||||
<mass value="0.158015"/>
|
||||
<inertia ixx="0.003607648222" ixy="1.494971e-06" ixz="-0.000132778525" iyy="0.003626771492" iyz="-2.8638535e-05" izz="3.5148003e-05"/>
|
||||
</inertial>
|
||||
</link>
|
||||
<joint name="RR_foot_fixed" type="fixed" dont_collapse="true">
|
||||
<origin rpy="0 0 0" xyz="0 0 -0.213"/>
|
||||
<parent link="RR_calf"/>
|
||||
<child link="RR_foot"/>
|
||||
</joint>
|
||||
<link name="RR_foot">
|
||||
<visual>
|
||||
<origin rpy="0 0 0" xyz="0 0 0"/>
|
||||
<geometry>
|
||||
<sphere radius="0.01"/>
|
||||
</geometry>
|
||||
<material name="black"/>
|
||||
</visual>
|
||||
<collision>
|
||||
<origin rpy="0 0 0" xyz="0 0 0"/>
|
||||
<geometry>
|
||||
<sphere radius="0.02"/>
|
||||
</geometry>
|
||||
</collision>
|
||||
<inertial>
|
||||
<mass value="0.06"/>
|
||||
<inertia ixx="9.6e-06" ixy="0.0" ixz="0.0" iyy="9.6e-06" iyz="0.0" izz="9.6e-06"/>
|
||||
</inertial>
|
||||
</link>
|
||||
|
||||
<joint name="RL_hip_joint" type="revolute">
|
||||
<origin rpy="0 0 0" xyz="-0.1881 0.04675 0"/>
|
||||
<parent link="trunk"/>
|
||||
<child link="RL_hip"/>
|
||||
<axis xyz="1 0 0"/>
|
||||
<dynamics damping="0" friction="0"/>
|
||||
<limit effort="33.5" lower="-0.802851455917" upper="0.802851455917" velocity="50"/>
|
||||
</joint>
|
||||
<link name="RL_hip">
|
||||
<visual>
|
||||
<origin rpy="0 3.14159265359 0" xyz="0 0 0"/>
|
||||
<geometry>
|
||||
<mesh filename="../meshes/hip.dae" scale="1 1 1"/>
|
||||
</geometry>
|
||||
<material name="silver"/>
|
||||
</visual>
|
||||
<collision>
|
||||
<origin rpy="1.57079632679 0 0" xyz="0 0.045 0"/>
|
||||
<geometry>
|
||||
<cylinder length="0.04" radius="0.046"/>
|
||||
</geometry>
|
||||
</collision>
|
||||
<inertial>
|
||||
<origin rpy="0 0 0" xyz="0.00541 -0.00074 6e-06"/>
|
||||
<mass value="0.510299"/>
|
||||
<inertia ixx="0.00030528937" ixy="7.788013e-06" ixz="-2.2016e-07" iyy="0.000590894859" iyz="-1.7175e-08" izz="0.000396594572"/>
|
||||
</inertial>
|
||||
</link>
|
||||
<joint name="RL_hip_fixed" type="fixed">
|
||||
<origin rpy="0 0 0" xyz="0 0.08 0"/>
|
||||
<parent link="RL_hip"/>
|
||||
<child link="RL_thigh_shoulder"/>
|
||||
</joint>
|
||||
<!-- this link is only for collision -->
|
||||
<link name="RL_thigh_shoulder">
|
||||
<!-- <collision>
|
||||
<origin rpy="1.57079632679 0 0" xyz="0 0 0"/>
|
||||
<geometry>
|
||||
<cylinder length="0.032" radius="0.041"/>
|
||||
</geometry>
|
||||
</collision> -->
|
||||
</link>
|
||||
<joint name="RL_thigh_joint" type="revolute">
|
||||
<origin rpy="0 0 0" xyz="0 0.08 0"/>
|
||||
<parent link="RL_hip"/>
|
||||
<child link="RL_thigh"/>
|
||||
<axis xyz="0 1 0"/>
|
||||
<dynamics damping="0" friction="0"/>
|
||||
<limit effort="33.5" lower="-1.0471975512" upper="4.18879020479" velocity="28"/>
|
||||
</joint>
|
||||
<link name="RL_thigh">
|
||||
<visual>
|
||||
<origin rpy="0 0 0" xyz="0 0 0"/>
|
||||
<geometry>
|
||||
<mesh filename="../meshes/thigh.dae" scale="1 1 1"/>
|
||||
</geometry>
|
||||
<material name="silver"/>
|
||||
</visual>
|
||||
<collision>
|
||||
<origin rpy="0 1.57079632679 0" xyz="0 0 -0.1065"/>
|
||||
<geometry>
|
||||
<box size="0.213 0.0245 0.034"/>
|
||||
</geometry>
|
||||
</collision>
|
||||
<inertial>
|
||||
<origin rpy="0 0 0" xyz="-0.003468 -0.018947 -0.032736"/>
|
||||
<mass value="0.898919"/>
|
||||
<inertia ixx="0.005395867678" ixy="1.02809e-07" ixz="0.000337529085" iyy="0.005142451046" iyz="-5.816563e-06" izz="0.00102478732"/>
|
||||
</inertial>
|
||||
</link>
|
||||
<joint name="RL_calf_joint" type="revolute">
|
||||
<origin rpy="0 0 0" xyz="0 0 -0.213"/>
|
||||
<parent link="RL_thigh"/>
|
||||
<child link="RL_calf"/>
|
||||
<axis xyz="0 1 0"/>
|
||||
<dynamics damping="0" friction="0"/>
|
||||
<limit effort="33.5" lower="-2.69653369433" upper="-0.916297857297" velocity="28"/>
|
||||
</joint>
|
||||
<link name="RL_calf">
|
||||
<visual>
|
||||
<origin rpy="0 0 0" xyz="0 0 0"/>
|
||||
<geometry>
|
||||
<mesh filename="../meshes/calf.dae" scale="1 1 1"/>
|
||||
</geometry>
|
||||
<material name="black"/>
|
||||
</visual>
|
||||
<collision>
|
||||
<origin rpy="0 1.57079632679 0" xyz="0 0 -0.1065"/>
|
||||
<geometry>
|
||||
<box size="0.213 0.016 0.016"/>
|
||||
</geometry>
|
||||
</collision>
|
||||
<inertial>
|
||||
<origin rpy="0 0 0" xyz="0.006286 0.001307 -0.122269"/>
|
||||
<mass value="0.158015"/>
|
||||
<inertia ixx="0.003607648222" ixy="1.494971e-06" ixz="-0.000132778525" iyy="0.003626771492" iyz="-2.8638535e-05" izz="3.5148003e-05"/>
|
||||
</inertial>
|
||||
</link>
|
||||
<joint name="RL_foot_fixed" type="fixed" dont_collapse="true">
|
||||
<origin rpy="0 0 0" xyz="0 0 -0.213"/>
|
||||
<parent link="RL_calf"/>
|
||||
<child link="RL_foot"/>
|
||||
</joint>
|
||||
<link name="RL_foot">
|
||||
<visual>
|
||||
<origin rpy="0 0 0" xyz="0 0 0"/>
|
||||
<geometry>
|
||||
<sphere radius="0.01"/>
|
||||
</geometry>
|
||||
<material name="black"/>
|
||||
</visual>
|
||||
<collision>
|
||||
<origin rpy="0 0 0" xyz="0 0 0"/>
|
||||
<geometry>
|
||||
<sphere radius="0.02"/>
|
||||
</geometry>
|
||||
</collision>
|
||||
<inertial>
|
||||
<mass value="0.06"/>
|
||||
<inertia ixx="9.6e-06" ixy="0.0" ixz="0.0" iyy="9.6e-06" iyz="0.0" izz="9.6e-06"/>
|
||||
</inertial>
|
||||
</link>
|
||||
</robot>
|
||||
194
resources/robots/go1/xml/go1.xml
Normal file
194
resources/robots/go1/xml/go1.xml
Normal file
@@ -0,0 +1,194 @@
|
||||
<mujoco model="go1_description">
|
||||
<compiler angle="radian" meshdir="../meshes/" />
|
||||
<size njmax="500" nconmax="100" />
|
||||
<option gravity='0 0 -9.806' iterations='50' solver='Newton' timestep='0.002'/>
|
||||
|
||||
<default>
|
||||
<geom contype="1" conaffinity="1" friction="0.6 0.3 0.3" rgba="0.5 0.6 0.7 1" margin="0.001" group="0"/>
|
||||
|
||||
<light castshadow="false" diffuse="1 1 1"/>
|
||||
<motor ctrlrange="-33.5 33.5" ctrllimited="true"/>
|
||||
<camera fovy="60"/>
|
||||
<joint damping="0.01" armature="0.01" frictionloss="0.2" />
|
||||
|
||||
</default>
|
||||
<asset>
|
||||
<mesh name="trunk" file="trunk.stl" />
|
||||
<mesh name="hip" file="hip.stl" />
|
||||
<mesh name="thigh_mirror" file="thigh_mirror.stl" />
|
||||
<mesh name="calf" file="calf.stl" />
|
||||
<mesh name="thigh" file="thigh.stl" />
|
||||
</asset>
|
||||
|
||||
<asset>
|
||||
<texture type="skybox" builtin="gradient" rgb1="1.0 1.0 1.0" rgb2="1.0 1.0 1.0" width="512" height="512"/>
|
||||
<texture name="plane" type="2d" builtin="flat" rgb1="1 1 1" rgb2="1 1 1" width="512" height="512" mark="cross" markrgb="0 0 0"/>
|
||||
<material name="plane" reflectance="0.0" texture="plane" texrepeat="3 3" texuniform="true"/>
|
||||
</asset>
|
||||
|
||||
<visual>
|
||||
<rgba com="0.502 1.0 0 0.5" contactforce="0.98 0.4 0.4 0.7" contactpoint="1.0 1.0 0.6 0.4"/>
|
||||
<scale com="0.2" forcewidth="0.035" contactwidth="0.10" contactheight="0.04"/>
|
||||
</visual>
|
||||
|
||||
<worldbody>
|
||||
<light directional="true" diffuse=".8 .8 .8" pos="0 0 10" dir="0 0 -10"/>
|
||||
<camera name="track" mode="trackcom" pos="0 -1.3 1.6" xyaxes="1 0 0 0 0.707 0.707"/>
|
||||
<geom name='floor' type='plane' conaffinity='1' condim='3' contype='1' rgba="0.5 0.9 0.9 0.1" material='plane' pos='0 0 0' size='0 0 1'/>
|
||||
|
||||
<body name="trunk" pos="0 0 0.35">
|
||||
<inertial pos="0.0116053 0.00442221 0.000106692" quat="0.0111438 0.707126 -0.00935374 0.706938" mass="4.801" diaginertia="0.0447997 0.0366257 0.0162187" />
|
||||
<joint type="free" />
|
||||
<geom type="mesh" contype="0" conaffinity="0" group="1" rgba="0.913725 0.913725 0.847059 1" mesh="trunk" />
|
||||
<geom size="0.13 0.04675 0.057" type="box" rgba="0.913725 0.913725 0.847059 1" />
|
||||
<geom size="0.0005 0.0005 0.0005" pos="-0.01592 -0.06659 -0.00617" type="box" contype="0" conaffinity="0" group="1" rgba="0.8 0 0 0" />
|
||||
<geom size="0.0005 0.0005 0.0005" pos="-0.01592 -0.06659 -0.00617" type="box" rgba="0.8 0 0 0" />
|
||||
<site name="imu" pos="0 0 0"/>
|
||||
|
||||
<body name="FR_hip" pos="0.1881 -0.04675 0">
|
||||
<inertial pos="-0.00406411 -0.0193463 4.50733e-06" quat="0.467526 0.531662 -0.466259 0.530431" mass="0.679292" diaginertia="0.00131334 0.00122648 0.000728484" />
|
||||
<joint name="FR_hip_joint" pos="0 0 0" axis="1 0 0" limited="true" range="-0.802851 0.802851" />
|
||||
<geom quat="0 1 0 0" type="mesh" contype="0" conaffinity="0" group="1" rgba="0.913725 0.913725 0.847059 1" mesh="hip" />
|
||||
<geom size="0.046 0.02" pos="0 -0.045 0" quat="0.707107 0.707107 0 0" type="cylinder" rgba="0.913725 0.913725 0.847059 0" />
|
||||
<geom size="0.031 0.02" pos="0 -0.07 0" quat="0.707107 0.707107 0 0" type="cylinder" rgba="0.913725 0.913725 0.847059 0" />
|
||||
|
||||
<body name="FR_thigh" pos="0 -0.08 0">
|
||||
<inertial pos="-0.003468 0.018947 -0.032736" quat="0.999266 0.00067676 -0.0382978 0.000639813" mass="0.898919" diaginertia="0.00542178 0.00514246 0.000998869" />
|
||||
<joint name="FR_thigh_joint" pos="0 0 0" axis="0 1 0" limited="true" range="-1.0472 4.18879" />
|
||||
<geom type="mesh" contype="0" conaffinity="0" group="1" rgba="0.913725 0.913725 0.847059 1" mesh="thigh_mirror" />
|
||||
<geom size="0.1065 0.01225 0.017" pos="0 0 -0.1065" quat="0.707107 0 0.707107 0" type="box" rgba="0.913725 0.913725 0.847059 0" />
|
||||
<body name="FR_calf" pos="0 0 -0.213">
|
||||
<inertial pos="0.00455603 0.0009473 -0.147239" quat="0.762045 0.00970173 0.0180098 0.647201" mass="0.218015" diaginertia="0.00399678 0.00398122 3.99428e-05" />
|
||||
<joint name="FR_calf_joint" pos="0 0 0" axis="0 1 0" limited="true" range="-2.69653 -0.916298" />
|
||||
<geom type="mesh" contype="0" conaffinity="0" group="1" rgba="0 0 0 1" mesh="calf" />
|
||||
<geom size="0.1065 0.008 0.008" pos="0 0 -0.1065" quat="0.707107 0 0.707107 0" type="box" rgba="0 0 0 0" />
|
||||
<geom size="0.01" pos="0 0 -0.213" contype="0" conaffinity="0" group="1" rgba="0 0 0 1" />
|
||||
<geom size="0.02" pos="0 0 -0.213" rgba="0 0 0 1" />
|
||||
</body>
|
||||
</body>
|
||||
</body>
|
||||
<body name="FL_hip" pos="0.1881 0.04675 0">
|
||||
<inertial pos="-0.00406411 0.0193463 4.50733e-06" quat="0.531662 0.467526 -0.530431 0.466259" mass="0.679292" diaginertia="0.00131334 0.00122648 0.000728484" />
|
||||
<joint name="FL_hip_joint" pos="0 0 0" axis="1 0 0" limited="true" range="-0.802851 0.802851" />
|
||||
<geom type="mesh" contype="0" conaffinity="0" group="1" rgba="0.913725 0.913725 0.847059 1" mesh="hip" />
|
||||
<geom size="0.046 0.02" pos="0 0.045 0" quat="0.707107 0.707107 0 0" type="cylinder" rgba="0.913725 0.913725 0.847059 0" />
|
||||
<geom size="0.031 0.02" pos="0 0.07 0" quat="0.707107 0.707107 0 0" type="cylinder" rgba="0.913725 0.913725 0.847059 0" />
|
||||
|
||||
<body name="FL_thigh" pos="0 0.08 0">
|
||||
<inertial pos="-0.003468 -0.018947 -0.032736" quat="0.999266 -0.00067676 -0.0382978 -0.000639813" mass="0.898919" diaginertia="0.00542178 0.00514246 0.000998869" />
|
||||
<joint name="FL_thigh_joint" pos="0 0 0" axis="0 1 0" limited="true" range="-1.0472 4.18879" />
|
||||
<geom type="mesh" contype="0" conaffinity="0" group="1" rgba="0.913725 0.913725 0.847059 1" mesh="thigh" />
|
||||
<geom size="0.1065 0.01225 0.017" pos="0 0 -0.1065" quat="0.707107 0 0.707107 0" type="box" rgba="0.913725 0.913725 0.847059 0" />
|
||||
<body name="FL_calf" pos="0 0 -0.213">
|
||||
<inertial pos="0.00455603 0.0009473 -0.147239" quat="0.762045 0.00970173 0.0180098 0.647201" mass="0.218015" diaginertia="0.00399678 0.00398122 3.99428e-05" />
|
||||
<joint name="FL_calf_joint" pos="0 0 0" axis="0 1 0" limited="true" range="-2.69653 -0.916298" />
|
||||
<geom type="mesh" contype="0" conaffinity="0" group="1" rgba="0 0 0 1" mesh="calf" />
|
||||
<geom size="0.1065 0.008 0.008" pos="0 0 -0.1065" quat="0.707107 0 0.707107 0" type="box" rgba="0.913725 0.913725 0.847059 0" />
|
||||
<geom size="0.01" pos="0 0 -0.213" contype="0" conaffinity="0" group="1" rgba="0 0 0 1" />
|
||||
<geom size="0.02" pos="0 0 -0.213" rgba="0 0 0 1" />
|
||||
</body>
|
||||
</body>
|
||||
</body>
|
||||
<body name="RR_hip" pos="-0.1881 -0.04675 0">
|
||||
<inertial pos="0.00406411 -0.0193463 4.50733e-06" quat="0.530431 0.466259 -0.531662 0.467526" mass="0.679292" diaginertia="0.00131334 0.00122648 0.000728484" />
|
||||
<joint name="RR_hip_joint" pos="0 0 0" axis="1 0 0" limited="true" range="-0.802851 0.802851" />
|
||||
<geom quat="0 0 0 -1" type="mesh" contype="0" conaffinity="0" group="1" rgba="0.913725 0.913725 0.847059 1" mesh="hip" />
|
||||
<geom size="0.046 0.02" quat="0.707107 0.707107 0 0" type="cylinder" rgba="0.913725 0.913725 0.847059 1" />
|
||||
<geom size="0.046 0.02" pos="0 -0.045 0" quat="0.707107 0.707107 0 0" type="cylinder" rgba="0.913725 0.913725 0.847059 0" />
|
||||
<geom size="0.031 0.02" pos="0 -0.07 0" quat="0.707107 0.707107 0 0" type="cylinder" rgba="0.913725 0.913725 0.847059 0" />
|
||||
|
||||
<body name="RR_thigh" pos="0 -0.08 0">
|
||||
<inertial pos="-0.003468 0.018947 -0.032736" quat="0.999266 0.00067676 -0.0382978 0.000639813" mass="0.898919" diaginertia="0.00542178 0.00514246 0.000998869" />
|
||||
<joint name="RR_thigh_joint" pos="0 0 0" axis="0 1 0" limited="true" range="-1.0472 4.18879" />
|
||||
<geom type="mesh" contype="0" conaffinity="0" group="1" rgba="0.913725 0.913725 0.847059 1" mesh="thigh_mirror" />
|
||||
<geom size="0.1065 0.01225 0.017" pos="0 0 -0.1065" quat="0.707107 0 0.707107 0" type="box" rgba="0.913725 0.913725 0.847059 0" />
|
||||
<body name="RR_calf" pos="0 0 -0.213">
|
||||
<inertial pos="0.00455603 0.0009473 -0.147239" quat="0.762045 0.00970173 0.0180098 0.647201" mass="0.218015" diaginertia="0.00399678 0.00398122 3.99428e-05" />
|
||||
<joint name="RR_calf_joint" pos="0 0 0" axis="0 1 0" limited="true" range="-2.69653 -0.916298" />
|
||||
<geom type="mesh" contype="0" conaffinity="0" group="1" rgba="0 0 0 1" mesh="calf" />
|
||||
<geom size="0.1065 0.008 0.008" pos="0 0 -0.1065" quat="0.707107 0 0.707107 0" type="box" rgba="0 0 0 0" />
|
||||
<geom size="0.01" pos="0 0 -0.213" contype="0" conaffinity="0" group="1" rgba="0 0 0 1" />
|
||||
<geom size="0.02" pos="0 0 -0.213" rgba="0 0 0 1" />
|
||||
</body>
|
||||
</body>
|
||||
</body>
|
||||
<body name="RL_hip" pos="-0.1881 0.04675 0">
|
||||
<inertial pos="0.00406411 0.0193463 4.50733e-06" quat="0.466259 0.530431 -0.467526 0.531662" mass="0.679292" diaginertia="0.00131334 0.00122648 0.000728484" />
|
||||
<joint name="RL_hip_joint" pos="0 0 0" axis="1 0 0" limited="true" range="-0.802851 0.802851" />
|
||||
<geom quat="0 0 1 0" type="mesh" contype="0" conaffinity="0" group="1" rgba="0.913725 0.913725 0.847059 1" mesh="hip" />
|
||||
<geom size="0.046 0.02" quat="0.707107 0.707107 0 0" type="cylinder" rgba="0.913725 0.913725 0.847059 1" />
|
||||
<geom size="0.046 0.02" pos="0 0.045 0" quat="0.707107 0.707107 0 0" type="cylinder" rgba="0.913725 0.913725 0.847059 0" />
|
||||
<geom size="0.031 0.02" pos="0 0.07 0" quat="0.707107 0.707107 0 0" type="cylinder" rgba="0.913725 0.913725 0.847059 0" />
|
||||
|
||||
<body name="RL_thigh" pos="0 0.08 0">
|
||||
<inertial pos="-0.003468 -0.018947 -0.032736" quat="0.999266 -0.00067676 -0.0382978 -0.000639813" mass="0.898919" diaginertia="0.00542178 0.00514246 0.000998869" />
|
||||
<joint name="RL_thigh_joint" pos="0 0 0" axis="0 1 0" limited="true" range="-1.0472 4.18879" />
|
||||
<geom type="mesh" contype="0" conaffinity="0" group="1" rgba="0.913725 0.913725 0.847059 1" mesh="thigh" />
|
||||
<geom size="0.1065 0.01225 0.017" pos="0 0 -0.1065" quat="0.707107 0 0.707107 0" type="box" rgba="0.913725 0.913725 0.847059 0" />
|
||||
<body name="RL_calf" pos="0 0 -0.213">
|
||||
<inertial pos="0.00455603 0.0009473 -0.147239" quat="0.762045 0.00970173 0.0180098 0.647201" mass="0.218015" diaginertia="0.00399678 0.00398122 3.99428e-05" />
|
||||
<joint name="RL_calf_joint" pos="0 0 0" axis="0 1 0" limited="true" range="-2.69653 -0.916298" />
|
||||
<geom type="mesh" contype="0" conaffinity="0" group="1" rgba="0 0 0 1" mesh="calf" />
|
||||
<geom size="0.1065 0.008 0.008" pos="0 0 -0.1065" quat="0.707107 0 0.707107 0" type="box" rgba="0 0 0 0" />
|
||||
<geom size="0.01" pos="0 0 -0.213" contype="0" conaffinity="0" group="1" rgba="0 0 0 1" />
|
||||
<geom size="0.02" pos="0 0 -0.213" rgba="0 0 0 1" />
|
||||
</body>
|
||||
</body>
|
||||
</body>
|
||||
</body>
|
||||
</worldbody>
|
||||
<actuator>
|
||||
|
||||
<motor name="FR_hip" gear="1" joint="FR_hip_joint"/>
|
||||
<motor name="FR_thigh" gear="1" joint="FR_thigh_joint"/>
|
||||
<motor name="FR_calf" gear="1" joint="FR_calf_joint"/>
|
||||
<motor name="FL_hip" gear="1" joint="FL_hip_joint"/>
|
||||
<motor name="FL_thigh" gear="1" joint="FL_thigh_joint"/>
|
||||
<motor name="FL_calf" gear="1" joint="FL_calf_joint"/>
|
||||
<motor name="RR_hip" gear="1" joint="RR_hip_joint"/>
|
||||
<motor name="RR_thigh" gear="1" joint="RR_thigh_joint"/>
|
||||
<motor name="RR_calf" gear="1" joint="RR_calf_joint" />
|
||||
<motor name="RL_hip" gear="1" joint="RL_hip_joint"/>
|
||||
<motor name="RL_thigh" gear="1" joint="RL_thigh_joint"/>
|
||||
<motor name="RL_calf" gear="1" joint="RL_calf_joint"/>
|
||||
</actuator>
|
||||
|
||||
<sensor>
|
||||
|
||||
<jointpos name="FR_hip_pos" joint="FR_hip_joint"/>
|
||||
<jointpos name="FR_thigh_pos" joint="FR_thigh_joint"/>
|
||||
<jointpos name="FR_calf_pos" joint="FR_calf_joint"/>
|
||||
<jointpos name="FL_hip_pos" joint="FL_hip_joint"/>
|
||||
<jointpos name="FL_thigh_pos" joint="FL_thigh_joint"/>
|
||||
<jointpos name="FL_calf_pos" joint="FL_calf_joint"/>
|
||||
<jointpos name="RR_hip_pos" joint="RR_hip_joint"/>
|
||||
<jointpos name="RR_thigh_pos" joint="RR_thigh_joint"/>
|
||||
<jointpos name="RR_calf_pos" joint="RR_calf_joint" />
|
||||
<jointpos name="RL_hip_pos" joint="RL_hip_joint"/>
|
||||
<jointpos name="RL_thigh_pos" joint="RL_thigh_joint"/>
|
||||
<jointpos name="RL_calf_pos" joint="RL_calf_joint"/>
|
||||
|
||||
<jointvel name="FR_hip_vel" joint="FR_hip_joint"/>
|
||||
<jointvel name="FR_thigh_vel" joint="FR_thigh_joint"/>
|
||||
<jointvel name="FR_calf_vel" joint="FR_calf_joint"/>
|
||||
<jointvel name="FL_hip_vel" joint="FL_hip_joint"/>
|
||||
<jointvel name="FL_thigh_vel" joint="FL_thigh_joint"/>
|
||||
<jointvel name="FL_calf_vel" joint="FL_calf_joint"/>
|
||||
<jointvel name="RR_hip_vel" joint="RR_hip_joint"/>
|
||||
<jointvel name="RR_thigh_vel" joint="RR_thigh_joint"/>
|
||||
<jointvel name="RR_calf_vel" joint="RR_calf_joint" />
|
||||
<jointvel name="RL_hip_vel" joint="RL_hip_joint"/>
|
||||
<jointvel name="RL_thigh_vel" joint="RL_thigh_joint"/>
|
||||
<jointvel name="RL_calf_vel" joint="RL_calf_joint"/>
|
||||
|
||||
<accelerometer name="Body_Acc" site="imu"/>
|
||||
|
||||
<gyro name="Body_Gyro" site="imu"/>
|
||||
|
||||
<framepos name="Body_Pos" objtype="site" objname="imu"/>
|
||||
|
||||
<framequat name="Body_Quat" objtype="site" objname="imu"/>
|
||||
|
||||
|
||||
</sensor>
|
||||
</mujoco>
|
||||
@@ -119,6 +119,7 @@ class OnPolicyRunnerCTS:
|
||||
except Exception as e:
|
||||
print(f"[INFO] RoboGauge client could not be initialized: {e}, disabling RoboGauge interface.")
|
||||
self.robogauge_client = None
|
||||
self._logged_robogauge_steps: set[int] = set()
|
||||
|
||||
def learn(self, num_learning_iterations, init_at_random_ep_len=False):
|
||||
# initialize writer
|
||||
@@ -343,11 +344,14 @@ class OnPolicyRunnerCTS:
|
||||
continue
|
||||
if step == it:
|
||||
result_received = True
|
||||
if step in self._logged_robogauge_steps:
|
||||
continue
|
||||
for key, val in scores.items():
|
||||
self.writer.add_scalar(f'RoboGauge/{key}', val, step)
|
||||
results_path = os.path.join(results_dir, f'results_{step}.yaml')
|
||||
with open(results_path, 'w', encoding='utf-8') as f:
|
||||
yaml.dump(results, f, allow_unicode=True, sort_keys=False)
|
||||
self._logged_robogauge_steps.add(step)
|
||||
|
||||
if last_model and result_received:
|
||||
print(f"RoboGauge result for step {it} received. Exiting wait loop.")
|
||||
|
||||
Reference in New Issue
Block a user