赞
踩
第一篇 Isaac Gym环境安装和四足机器人模型的训练
第二篇 docker中安装ROS 在宇树四足机器人运行 强化学习GenLoco算法
本文使用强化学习的方法运行到Aliengo机器人上完成从训练到部署的全过程。
使用的是方法方法是:
Walk these Ways: Tuning Robot Control for Generalization with Multiplicity of Behavior
Conference on Robot Learning, 2022
paper / project page / github
该方法使用的是GO1机器人提供了完整的sim to real代码和遥控器控制代码,所以我们只需要重新训练和部署健康就可以使用在Aliengo上。
本人测试了以下三种环境
可以使用:
torch 1.10.0+cu11.4
torch 1.12.0+cu11.6
不能使用:torch 1.13.1+cu11.8
安装pytorch1.12配合CUDA11.6
pip install torch==1.12.0+cu116 torchvision==0.13.0+cu116 torchaudio==0.12.0 --extra-index-url https://download.pytorch.org/whl/cu116
安装Isaac gym
可以看我第一篇文章Isaac Gym环境安装和四足机器人模型的训练
下载github: walk-these-ways 全部文件。
进入目录后
pip install -e .
测试安装是否成功
python scripts/test.py
硬件需求:至少10G显存,最好12G以上显存。本文测试使用3070笔记本 8G显存只能运行 Cfg.env.num_envs=1500
左右,代码提供训练好的模型大概训练3~4万次迭代,本人估计训练时间60到80个小时。
python scripts/train.py
本文使用的代码结构是改编自legged_gym
所以也可以借鉴我前面的文章Isaac Gym环境安装和四足机器人模型的训练
如果想要在训练结束后继续上次的训练需要修改go1_gym_learn/ppo_cse/__init__.py
位置的代码
依照Resume training #25进行修改
注意本人在自己训练的模型上进行恢复训练的修改,虽然可以恢复训练但是效果不好,谨慎使用。
分析原因是可能使用.pt模型文件而不是.jit的模型文件。
class RunnerArgs(PrefixProto, cli=False):
...
# load and resume
resume = True
load_run = -1 # -1 = last run
checkpoint = -1 # -1 = last saved model
label = "gait-conditioned-agility/2023-05-18/train" # 需要恢复的模型位置
dirs = glob.glob(f"../runs/{label}/*")
logdir = sorted(dirs)[0]
resume_path = logdir[:] # 根据自己情况修改只要能找到文件即可
resume_curriculum = True
if RunnerArgs.resume: # load pretrained weights from resume_path from ml_logger import ML_Logger # loader = ML_Logger(root="http://escher.csail.mit.edu:8080", # prefix=RunnerArgs.resume_path) loader = ML_Logger(root="http://127.0.0.1:8081", # ML_Logger 需要若不该会报错 prefix=RunnerArgs.resume_path) # 原来的loader.load_torch会报错这样该可以使用 weights = torch.load(RunnerArgs.resume_path + "/checkpoints/ac_weights_last.pt") # weights = loader.load_torch(RunnerArgs.resume_path + "/checkpoints/ac_weights_last.pt") actor_critic.load_state_dict(state_dict=weights) if hasattr(self.env, "curricula") and RunnerArgs.resume_curriculum: # load curriculum state # distributions = loader.load_pkl(RunnerArgs.resume_path + "/curriculum/distribution.pkl") # 原来的loader.load_pkl会报错,使用pickle读取.pkl文件 f = open(RunnerArgs.resume_path + '/curriculum/distribution.pkl','rb') distributions = pickle.load(f) # 也进行了修改,为了找到weights_ distribution_last = distributions["distribution"] gait_names = [key[8:] if key.startswith("weights_") else None for key in distribution_last.keys()] for gait_id, gait_name in enumerate(self.env.category_names): self.env.curricula[gait_id].weights = distribution_last[f"weights_{gait_name}"] print(gait_name)
# 需要启动ml_dash
python -m ml_logger.server
9000次迭代后训练结果
aliengo训练结果
本文使用的代码是通过lcm通讯的。
根据github上指示教程,使用的是宇树GO1机器人
#go1
ping 192.163.123.15
# 代码会下载一个docker镜像并把本地文件都复制到宇树机器人中
cd go1_gym_deploy/scripts && ./send_to_unitree.sh
# 密码一般是123
ssh unitree@192.168.123.15
chmod +x installer/install_deployment_code.sh
cd ~/go1_gym/go1_gym_deploy/scripts
sudo ../installer/install_deployment_code.sh
cd ~/go1_gym/go1_gym_deploy/autostart
./start_unitree_sdk.sh
cd ~/go1_gym/go1_gym_deploy/docker
sudo make autostart
但是本人这样并不能启动控制程序
本人是手动进入docker容器中再启动的
# 启动docker容器
docker start foxy_controller
# 进入docker容器
docker exec foxy_controller bash
# 启动控制程序
cd go1_gym_deploy/scripts
python3 deploy_policy.py'
其中注意要修改 go1_gym_deploy/docker/makefile
文件中
--volume="/home/unitree/go1_gym:/home/isaac/go1_gym" \
参数到你的工作目录。
./send_to_unitree.sh
下载的docker镜像是针对jetson arm架构的,并不能在x86机器上运行。
./start_unitree_sdk.sh
命令只能运行在arm架构的机器上。不然会报下面错。
./lcm_position: 1: Syntax error: word unexpected (expecting ")")
训练好的模型位置:walk-these-ways/tree/master/runs/
默认的模型位置为gait-conditioned-agility/pretrain-v0/train
代码中使用 $PDIR
标记
/walk-these-ways/blob/master/scripts/play.py #L97
中的label = "$PDIR"
/walk-these-ways/blob/master/go1_gym_deploy/scripts/deploy_policy.py#L73
label = "$PDIR"
然后在复制到机器人中替换该方法使用lcm进行通讯
首先go1_gym_deploy/unitree_legged_sdk_bin/lcm_position.cpp
程序通过UDP和机器人控制板进行通讯获取机器人状态并下达指令。然后又通过lcm进行机器人状态信息的发布和模型命令的获取。
模型端:
使用go1_gym_deploy/utils/cheetah_state_estimator.py
程序获取机器人状态信息。
使用go1_gym_deploy/envs/lcm_agent.py
发送机器人控制命令
如果有需要更改lcm_position.cpp程序,则需要重新编译。
本人因为要把代码使用在aliengo上,所以需要改变sdk信息进行重新编译。
LCM官方文档链接
cd lcm-1.4.0/lcm-python
python setup.py install
# 然后到build再安装
cd build
sudo make install
unitree_legged_sdk/examples
文件夹下/unitree/go1_gym_deploy/lcm_types
文件夹中使用命令lcm-gen -x leg_control_data_lcmt.lcm
生成c++的头文件unitree_legged_sdk/include/
文件夹中。CMakeLists.txt
文件add_executable(lcm_position examples/lcm_position.cpp)
target_link_libraries(lcm_position ${EXTRA_LIBS})
mkdir build
cd build
cmake ../
make
lcm_position
就是新编译的可执行文件。添加新机器人模型在resources/robots
文件夹下
根据go1_gym/envs/go1/go1_config.py
文件重新制作新机器人参数文件
最后修改scripts/train.py
中调用参数的代码。
更换模型出现的问题整理:
参考Isaac Gym环境安装和四足机器人模型的训练中
三、4.关于宇树URDF文件训练中出现的问题 整理的问题
unitree
├── go1_gym(训练测试使用机器人参数和奖励计算代码)
├── go1_gym_deploy(sim to real 部署用代码)
├──go1_gym_learn(网络模型代码)
├──logs(真实机器人收集到的数据)
├──resources(机器人模型文件)
├──runs(训练结果的记录和模型参数文件)
└── scripts(训练测试启动代码)
go1_gym/envs/base/legged_robot.py
为机器人总类,计算总奖励,环境信息汇总,检查终止,创建仿真,使用actuator_net,训练step和状态初始化。go1_gym/envs/rewards/corl_rewards.py
为计算每个类型的rewardscripts/actuator_net/utils.py
为训练actuator_net网络使用的代码,该方法主要参考论文。目的是通过网络预测力矩的输出。control_type=="actuator_net"
则使用网络预测。control_type == "P"
则是使用计算得出力矩。训练时可视化训练结果使用的ml_logger包。
ml_logger的github链接
ml_logger的说明文档
启动ml_dash frontend app
# 启动ml_dash app
python -m ml_dash.app
# cd到代码主目录后 启动ml_dash 服务
python -m ml_dash.server .
出现的问题
# 出现问题
ImportError: cannot import name 'cli_parse' from 'params_proto' #63
# 解决办法更新ml_logger版本
## !!! 注意会导致其他包不兼容 影响训练和测试等其他程序 最好是新建环境中升级
pip install -U ml-logger ml-dash params-proto jaynes
本文通过walk-these-ways方法简单介绍了四足机器人sim to real的方法,并且分享了walk-these-ways安装和使用方法和分析。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。