当前位置:   article > 正文

IsaacGym四足机器人sim to real全过程详细解析(walk these ways方法)_legged gym

legged gym

四足机器人强化学习控制第三篇

第一篇 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
  • 1

安装Isaac gym
可以看我第一篇文章Isaac Gym环境安装和四足机器人模型的训练

下载github: walk-these-ways 全部文件。
进入目录后

pip install -e .
  • 1

测试安装是否成功

python scripts/test.py
  • 1

二、训练

1.训练

硬件需求:至少10G显存,最好12G以上显存。本文测试使用3070笔记本 8G显存只能运行 Cfg.env.num_envs=1500 左右,代码提供训练好的模型大概训练3~4万次迭代,本人估计训练时间60到80个小时。

python scripts/train.py
  • 1

本文使用的代码结构是改编自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 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
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)                             
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
# 需要启动ml_dash
python -m ml_logger.server
  • 1
  • 2

3.训练结果

9000次迭代后训练结果

aliengo训练结果

三、sim to real

1.部署模型

本文使用的代码是通过lcm通讯的。
根据github上指示教程,使用的是宇树GO1机器人

  1. 建立通讯:可以ping到机器人中tx2主板
    宇树的开发文档查看ip地址。
#go1
ping 192.163.123.15
  • 1
  • 2
  1. 下载docker镜像并导入机器人主板中
# 代码会下载一个docker镜像并把本地文件都复制到宇树机器人中
cd go1_gym_deploy/scripts && ./send_to_unitree.sh
  • 1
  • 2
  1. 远程控制到机器人中使用
# 密码一般是123
 ssh unitree@192.168.123.15
  • 1
  • 2
  1. 在宇树机器人上载入docker镜像
    使用命令
chmod +x installer/install_deployment_code.sh
cd ~/go1_gym/go1_gym_deploy/scripts
sudo ../installer/install_deployment_code.sh
  • 1
  • 2
  • 3
  1. 启动通讯程序
    确保机器人挂起,机器人在阻尼模式下,启动lcm通讯程序。
cd ~/go1_gym/go1_gym_deploy/autostart
./start_unitree_sdk.sh
  • 1
  • 2
  1. 启动的docker中控制程序
cd ~/go1_gym/go1_gym_deploy/docker
sudo make autostart
  • 1
  • 2

但是本人这样并不能启动控制程序
本人是手动进入docker容器中再启动的

# 启动docker容器
docker start foxy_controller
# 进入docker容器
docker exec foxy_controller bash 
# 启动控制程序
cd go1_gym_deploy/scripts 
python3 deploy_policy.py'
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

注意

其中注意要修改 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 ")")
  • 1

2.更换训练的模型

  1. 找到训练好的模型位置

训练好的模型位置:walk-these-ways/tree/master/runs/
默认的模型位置为gait-conditioned-agility/pretrain-v0/train代码中使用 $PDIR标记

  1. 替换测试代码中模型地址
    替换/walk-these-ways/blob/master/scripts/play.py #L97 中的label = "$PDIR"
  2. 替换机器人中使用的模型
    替换/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官方文档链接

  1. 安装lcm的python版
cd lcm-1.4.0/lcm-python
python setup.py install
# 然后到build再安装
cd build
sudo make install
  • 1
  • 2
  • 3
  • 4
  • 5
  1. 下载需要更换的sdk文件宇树SDK
  2. 将lcm_position.cpp放到宇树unitree_legged_sdk/examples文件夹下
  3. 根据lcm数据定义文件生成c++头文件
    /unitree/go1_gym_deploy/lcm_types文件夹中使用命令lcm-gen -x leg_control_data_lcmt.lcm生成c++的头文件
  4. 将生成的头文件放到unitree_legged_sdk/include/文件夹中。
  5. 修改在sdk下CMakeLists.txt文件
    增加下面代码
add_executable(lcm_position examples/lcm_position.cpp)
target_link_libraries(lcm_position ${EXTRA_LIBS})
  • 1
  • 2
  1. 然后把sdk重新进行编译
mkdir build
cd build
cmake ../
make
  • 1
  • 2
  • 3
  • 4
  1. 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.主要代码分析

  1. go1_gym/envs/base/legged_robot.py为机器人总类,计算总奖励,环境信息汇总,检查终止,创建仿真,使用actuator_net,训练step和状态初始化。
  2. go1_gym/envs/rewards/corl_rewards.py为计算每个类型的reward
  3. 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 .
  • 1
  • 2
  • 3
  • 4

出现的问题

# 出现问题
ImportError: cannot import name 'cli_parse' from 'params_proto' #63
# 解决办法更新ml_logger版本 
## !!! 注意会导致其他包不兼容 影响训练和测试等其他程序 最好是新建环境中升级
pip install -U ml-logger ml-dash params-proto jaynes
  • 1
  • 2
  • 3
  • 4
  • 5

总结

本文通过walk-these-ways方法简单介绍了四足机器人sim to real的方法,并且分享了walk-these-ways安装和使用方法和分析。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/461566
推荐阅读
相关标签
  

闽ICP备14008679号