OCS2 入门教程(五)- 从 URDF 到 OCP、配置求解器、MPC - Net

系列文章目录


前言

阻碍 MPC 在机器人任务中广泛应用的主要挑战之一是设置最优控制问题的负担。OCS2 提供了多个辅助类,用于定义一些常用模型、成本和约束条件,以减轻这一问题。为此,OCS2 提供了多个第三方软件包接口,如 RobCoGen、CppADCodeGen、Pinocchio 和 HPP-FCL。我们在此重点介绍 Pinocchio 接口。本页讨论的所有软件包都可以在元软件包 ocs2_pinocchio 中找到。


一、从 URDF 到 OCP

1.1 中心模型

多关节浮动基座系统(如足式机器人)可建模为一个未驱动的刚体,该刚体上连接着一组完全驱动的肢体。在对机器人关节有足够控制权的温和假设下,在 MPC 公式中独立考虑中心点动力学作为简化模板模型是合理的。该模型的状态空间包括归一化中心动量、基本坐标和关节位置。输入空间是所有接触扭矩和关节速度的组合。为了捕捉广义坐标变化率对向心动量的影响,该模型使用了向心动量矩阵,并在基础扭转和关节速度之间引入了正确的映射。有关实现的更多详情,请参阅软件包 ocs2_centroidal_model。

1.2 运动学

OCS2 为 URDF 模型中基于 Pinocchio 库的任何已命名坐标系提供了一个运动学接口。该接口为已命名的坐标系列表提供位置、方向误差和速度的一阶模型。OCS2 提供两个接口: 基于分析偏差的 PinocchioEndEffectorKinematics 接口和基于自动微分的 PinocchioEndEffectorKinematicsCppAd 接口。当需要使用 OCS2 的缓存功能时,通常使用前者;否则,应使用 CppAd 变体。

1.3 避免自碰撞

OCS2 库提供了用于定义避免自碰撞约束的辅助类。通过 URDF 模型和用户定义的碰撞体列表可以方便地定义这些约束条件。该列表应是 URDF 模型碰撞体的子集。该列表用于避免在所有碰撞体之间进行碰撞检查,并减少计算开销。碰撞约束计算需要 HPP-FCL 和 Pinocchio 库。有关实现的更多详情,请参阅软件包 ocs2_self_collision。

二、MPC-Net

MPC-Net 是一种模仿学习方法,它使用 MPC 的解决方案来指导策略搜索。其主要思想是通过最小化控制哈密顿来模仿 MPC,同时用参数化策略来表示相应的控制输入。MPC-Net 可用于将模型预测控制器克隆为神经网络策略,其评估速度比 MPC 快得多。因此,MPC-Net 是 MPC 的有用替代品,适用于不需要最精确解决方案的计算要求较高的应用。

多线程数据生成和策略评估与策略训练异步运行。数据生成和策略评估用 C++ 实现,在 CPU 上运行,而策略训练用 Python 实现,在 GPU 上运行。控制哈密顿由线性二次近似表示。因此,训练可以在 GPU 上运行,无需回调在 CPU 上运行的 OCS2 C++ 代码来评估哈密顿方程,而且可以利用 GPU 上的批处理功能。

2.1 机器人

MPC-Net 已在以下机器人示例中实现:

Robot Recom. CPU Cores Recom. GPU Memory RaiSim Training Time
ballbot 4 2 GB No 0m 20s
legged_robot 12 8 GB Yes / No 7m 40s

2.2 设置

确保按照安装页面进行操作。按照所有相关说明进行安装。关于可选依赖项,请务必按照 ONNX Runtime 和虚拟环境的说明进行操作,并可选择设置 RaiSim。

要编译所有 MPC-Net 软件包,请编译元软件包:

cpp 复制代码
cd <path_to_catkin_ws>
catkin_build ocs2_mpcnet

# Example:
cd ~/catkin_ws
catkin_build ocs2_mpcnet

要构建机器人专用软件包,请将 <robot> 替换为机器人名称:

bash 复制代码
cd <path_to_catkin_ws>
catkin_build ocs2_<robot>_mpcnet

# Example:
cd ~/catkin_ws
catkin_build ocs2_ballbot_mpcnet

2.3 训练

要训练 MPC-Net 策略,请运行

bash 复制代码
cd <path_to_ocs2_repo>/ocs2_mpcnet/ocs2_<robot>_mpcnet/python/ocs2_<robot>_mpcnet
source <path_to_catkin_ws>/devel/setup.bash
source <path_to_venvs>/mpcnet/bin/activate
python3 train.py

# Example:
cd ~/git/ocs2/ocs2_mpcnet/ocs2_ballbot_mpcnet/python/ocs2_ballbot_mpcnet
source ~/catkin_ws/devel/setup.bash
source ~/venvs/mpcnet/bin/activate
python3 train.py

要使用 Tensorboard 监控训练进度,请运行

bash 复制代码
cd <path_to_ocs2_repo>/ocs2_mpcnet/ocs2_<robot>_mpcnet/python/ocs2_<robot>_mpcnet
source <path_to_venvs>/mpcnet/bin/activate
tensorboard --logdir=runs

# Example:
cd ~/git/ocs2/ocs2_mpcnet/ocs2_ballbot_mpcnet/python/ocs2_ballbot_mpcnet
source ~/venvs/mpcnet/bin/activate
tensorboard --logdir=runs

如果使用 RaiSim,您可以使用 RaiSim Unity 对数据生成和策略评估滚动进行可视化,RaiSim 的 raisimUnity 文件夹中提供了预构建的可执行文件。例如,在 Linux 上运行

bash 复制代码
<path_to_raisimLib_repo>/raisimUnity/linux/raisimUnity.x86_64

# Example:
~/git/raisimLib/raisimUnity/linux/raisimUnity.x86_64

2.4 部署

要部署存储在机器人专用软件包策略文件夹中的默认策略,请运行

bash 复制代码
cd <path_to_catkin_ws>
source devel/setup.bash
roslaunch ocs2_<robot>_mpcnet <robot>_mpcnet.launch

# Example:
cd ~/catkin_ws
source devel/setup.bash
roslaunch ocs2_ballbot_mpcnet ballbot_mpcnet.launch

要部署存储在机器人专用软件包的 python/ocs2_<robot>_mpcnet/runs 文件夹中的新策略,请将 <path> 替换为最终策略的绝对文件路径,然后运行:

bash 复制代码
cd <path_to_catkin_ws>
source devel/setup.bash
roslaunch ocs2_<robot>_mpcnet <robot>_mpcnet.launch policyFile:=<path>

# Example:
cd ~/catkin_ws
source devel/setup.bash
roslaunch ocs2_ballbot_mpcnet ballbot_mpcnet.launch policyFile:='/home/user/git/ocs2/ocs2_mpcnet/ocs2_ballbot_mpcnet/python/ocs2_ballbot_mpcnet/runs/2022-04-01_12-00-00_ballbot_description/final_policy.onnx'

2.5 如何设置新机器人

为新机器人设置 MPC-Net 相对容易,因为 ocs2_mpcnet_core 软件包负责数据生成和策略评估,并实现重要的学习组件,如内存、策略和损失函数。

本节假定您已经拥有机器人专用 MPC 实现的软件包:

  1. ocs2_<robot>: 提供机器人专用 MPC 实现库。
  2. ocs2_<robot>_ros: 用 ROS 封装 MPC 实现,以定义 ROS 节点。
  3. ocs2_<robot>_raisim:(可选)机器人专用 MPC 实现与 RaiSim 之间的接口。

对于实际的 ocs2_<robot>_mpcnet 软件包,请遵循现有机器人专用 MPC-Net 软件包的结构。必须实现的最重要类/文件有

  • <Robot>MpcnetDefinition: 定义如何将 OCS2 状态变量转换为策略观测值,以及如何将策略动作转换为 OCS2 控制输入。
  • <Robot>MpcnetInterface: 提供 C++ 和 Python 之间的接口,允许交换数据和策略。
  • <robot>.yaml: 存储配置参数。
  • mpcnet.py: 为 MPC-Net 训练添加机器人专用方法,例如实现机器人应执行的任务。
  • train.py: 启动主训练脚本。
相关推荐
深度学习实战训练营39 分钟前
基于CNN-RNN的影像报告生成
人工智能·深度学习
昨日之日20063 小时前
Moonshine - 新型开源ASR(语音识别)模型,体积小,速度快,比OpenAI Whisper快五倍 本地一键整合包下载
人工智能·whisper·语音识别
浮生如梦_3 小时前
Halcon基于laws纹理特征的SVM分类
图像处理·人工智能·算法·支持向量机·计算机视觉·分类·视觉检测
深度学习lover3 小时前
<项目代码>YOLOv8 苹果腐烂识别<目标检测>
人工智能·python·yolo·目标检测·计算机视觉·苹果腐烂识别
热爱跑步的恒川4 小时前
【论文复现】基于图卷积网络的轻量化推荐模型
网络·人工智能·开源·aigc·ai编程
阡之尘埃6 小时前
Python数据分析案例61——信贷风控评分卡模型(A卡)(scorecardpy 全面解析)
人工智能·python·机器学习·数据分析·智能风控·信贷风控
孙同学要努力8 小时前
全连接神经网络案例——手写数字识别
人工智能·深度学习·神经网络
Eric.Lee20218 小时前
yolo v5 开源项目
人工智能·yolo·目标检测·计算机视觉
其实吧39 小时前
基于Matlab的图像融合研究设计
人工智能·计算机视觉·matlab
丕羽9 小时前
【Pytorch】基本语法
人工智能·pytorch·python