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

news/2025/2/21 16:32:28

系列文章目录


前言

阻碍 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 软件包,请编译元软件包:

cd <path_to_catkin_ws>
catkin_build ocs2_mpcnet

# Example:
cd ~/catkin_ws
catkin_build ocs2_mpcnet

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

cd <path_to_catkin_ws>
catkin_build ocs2_<robot>_mpcnet

# Example:
cd ~/catkin_ws
catkin_build ocs2_ballbot_mpcnet

2.3 训练

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

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 监控训练进度,请运行 

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 上运行 

<path_to_raisimLib_repo>/raisimUnity/linux/raisimUnity.x86_64

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

2.4 部署

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

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> 替换为最终策略的绝对文件路径,然后运行:

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: 启动主训练脚本。

http://www.niftyadmin.cn/n/5312543.html

相关文章

使用vscode开发小程序项目

使用vscode开发uni-app 这里的创建使用用vue3ts版本&#xff0c;如过是vue2&#xff0c;具体可参考官网命令 uni-app官网 首先创建uni-app npx degit dcloudio/uni-preset-vue#vite-ts my-vue3-project需要再vscode中下载uni-app插件&#xff0c;以方便开发 uni-create-view …

uni-app顶部导航条固定

1.准备 scroll-view 滚动容器&#xff0c;包裹需要滚动的区域 <!-- 自定义导航栏 --><CustomNavbar /><scroll-view class"scroll-view" scroll-y><!-- 自定义轮播图 --><XtxSwiper :bannerList"bannerList" /><!-- 首页…

Kafka与RabbitMQ的区别

消息队列介绍 消息队列&#xff08;Message Queue&#xff09;是一种在分布式系统中进行异步通信的机制。它允许一个或多个生产者在发送消息时暂时将消息存储在队列中&#xff0c;然后由一个或多个消费者按顺序读取并处理这些消息。 消息队列具有以下特点&#xff1a; 异步通…

java 对接口返回的某个字段进行加密

后端加密 可以使用Java提供的加密库&#xff0c;比如Jasypt或Bouncy Castle等。以下是使用Jasypt进行AES加密的示例代码&#xff1a; 首先&#xff0c;你需要在项目中引入Jasypt依赖。在Maven项目中&#xff0c;在pom.xml文件中添加以下内容&#xff1a; <dependency>…

Access、Trunk、Hybrid接口接收发送数据帧标签剥离区分

以太网二层接口类型 Access Trunk Hybrid 总结&#xff1a; VLAN原理最全最详细讲解&#xff01;彻底搞懂VLAN打和摘tag过程

深入理解云原生技术:构建现代化可靠的应用

引言 云原生技术作为软件开发和部署的新范式&#xff0c;以其高度可伸缩性、灵活性和可靠性&#xff0c;吸引了广泛的关注。本文将深入探讨云原生技术的核心概念、优势以及其在现代软件开发中的应用。 1. 什么是云原生技术&#xff1f; 云原生技术是一种以云计算为基础&#…

UV贴图和展开初学者指南

在线工具推荐&#xff1a; 3D数字孪生场景编辑器 - GLTF/GLB材质纹理编辑器 - 3D模型在线转换 - Three.js AI自动纹理开发包 - YOLO 虚幻合成数据生成器 - 三维模型预览图生成器 - 3D模型语义搜索引擎 介绍 这正是本文的主题——UV贴图——登上舞台的时候。大多数 3D 建…

深入PostgreSQL:高级函数用法探索

写在开头 在 PostgreSQL 中,函数是数据库开发和管理中强大而灵活的工具。通过深入了解高级函数用法,我们可以更有效地利用 PostgreSQL 的功能。在本文中,我们将探讨一些看起来比较高级的 PostgreSQL 函数用法,包括窗口函数、自定义聚合函数、JSONB 类型函数、全文搜索、PL…