四足机器人强化学习控制第三篇
第一篇 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
二、训练
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为计算每个类型的reward
- scripts/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安装和使用方法和分析。










