四足机器人强化学习控制第三篇
第一篇 Isaac Gym环境安装和四足机器人模型的训练
第二篇 docker中安装ROS 在宇树四足机器人运行 强化学习GenLoco算法
目录
- 四足机器人强化学习控制第三篇
- 前言
- 一、安装和配置
- 二、训练
- 1.训练
- 2.恢复训练
- 3.训练结果
- 三、sim to real
- 1.部署模型
- 注意
- 2.更换训练的模型
- 3.通讯协议介绍
- 3.更换宇树其他机器人使用教程
- 重新编译lcm_position.cpp程序
- 修改机器人配置文件
- 三、代码解析
- 1.代码结构
- 2.主要代码分析
- 3.ml_logger使用
- 总结
前言
本文使用强化学习的方法运行到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
二、训练
1.训练
硬件需求:至少10G显存,最好12G以上显存。本文测试使用3070笔记本 8G显存只能运行 Cfg.env.num_envs=1500
左右,代码提供训练好的模型大概训练3~4万次迭代,本人估计训练时间60到80个小时。
python scripts/train.py
本文使用的代码结构是改编自legged_gym
所以也可以借鉴我前面的文章Isaac Gym环境安装和四足机器人模型的训练
2.恢复训练
如果想要在训练结束后继续上次的训练需要修改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
3.训练结果
9000次迭代后训练结果
aliengo训练结果
三、sim to real
1.部署模型
本文使用的代码是通过lcm通讯的。
根据github上指示教程,使用的是宇树GO1机器人
- 建立通讯:可以ping到机器人中tx2主板
宇树的开发文档查看ip地址。
#go1
ping 192.163.123.15
- 下载docker镜像并导入机器人主板中
# 代码会下载一个docker镜像并把本地文件都复制到宇树机器人中
cd go1_gym_deploy/scripts && ./send_to_unitree.sh
- 远程控制到机器人中使用
# 密码一般是123
ssh unitree@192.168.123.15
- 在宇树机器人上载入docker镜像
使用命令
chmod +x installer/install_deployment_code.sh
cd ~/go1_gym/go1_gym_deploy/scripts
sudo ../installer/install_deployment_code.sh
- 启动通讯程序
确保机器人挂起,机器人在阻尼模式下,启动lcm通讯程序。
cd ~/go1_gym/go1_gym_deploy/autostart
./start_unitree_sdk.sh
- 启动的docker中控制程序
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 ")")
2.更换训练的模型
- 找到训练好的模型位置
训练好的模型位置: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"
然后在复制到机器人中替换
3.通讯协议介绍
该方法使用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
发送机器人控制命令
3.更换宇树其他机器人使用教程
重新编译lcm_position.cpp程序
如果有需要更改lcm_position.cpp程序,则需要重新编译。
本人因为要把代码使用在aliengo上,所以需要改变sdk信息进行重新编译。
LCM官方文档链接
- 安装lcm的python版
cd lcm-1.4.0/lcm-python
python setup.py install
# 然后到build再安装
cd build
sudo make install
- 下载需要更换的sdk文件宇树SDK
- 将lcm_position.cpp放到宇树
unitree_legged_sdk/examples
文件夹下 - 根据lcm数据定义文件生成c++头文件
在/unitree/go1_gym_deploy/lcm_types
文件夹中使用命令lcm-gen -x leg_control_data_lcmt.lcm
生成c++的头文件 - 将生成的头文件放到
unitree_legged_sdk/include/
文件夹中。 - 修改在sdk下
CMakeLists.txt
文件
增加下面代码
add_executable(lcm_position examples/lcm_position.cpp)
target_link_libraries(lcm_position ${EXTRA_LIBS})
- 然后把sdk重新进行编译
mkdir build
cd build
cmake ../
make
- build文件夹下生成的
lcm_position
就是新编译的可执行文件。
修改机器人配置文件
添加新机器人模型在resources/robots
文件夹下
根据go1_gym/envs/go1/go1_config.py
文件重新制作新机器人参数文件
最后修改scripts/train.py
中调用参数的代码。
更换模型出现的问题整理:
参考Isaac Gym环境安装和四足机器人模型的训练中
三、4.关于宇树URDF文件训练中出现的问题 整理的问题
三、代码解析
1.代码结构
unitree
├── go1_gym(训练测试使用机器人参数和奖励计算代码)
├── go1_gym_deploy(sim to real 部署用代码)
├──go1_gym_learn(网络模型代码)
├──logs(真实机器人收集到的数据)
├──resources(机器人模型文件)
├──runs(训练结果的记录和模型参数文件)
└── scripts(训练测试启动代码)
2.主要代码分析
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"
则是使用计算得出力矩。
3.ml_logger使用
训练时可视化训练结果使用的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安装和使用方法和分析。