Crocoddyl 使用教程(二)

2024-05-04 21:12
文章标签 使用 教程 crocoddyl

本文主要是介绍Crocoddyl 使用教程(二),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

系列文章目录

 


前言

f7ecb5fb5d094244aa05ed9a570f3325.png

        小车摆杆是另一个经典的控制实例。在这个系统中,一根欠驱动的杆子被固定在一辆一维驱动的小车顶部。游戏的目的是将杆子升到站立位置。

        模型如下: https://en.wikipedia.org/wiki/Inverted_pendulum

        我们用 eq?m_1 表示小车质量、eq?m_2 表示摆杆质量 (eq?m%3Dm_1+m_2)、eq?l 表示摆杆长度、eq?%5Ctheta 表示摆杆相对于垂直轴的角度、eq?p 表示小车位置、eq?g%3D9.81 表示重力。

        系统加速度可重写为

eq?%5Cddot%7B%5Ctheta%7D%3D%5Cdfrac1%7B%5Cmu%28%5Ctheta%29%7D%5Cbig%28%5Cdfrac%7B%5Ccos%5Ctheta%7Dlf+%5Cdfrac%7Bmg%7Dl%5Csin%28%5Ctheta%29-m_2%5Ccos%28%5Ctheta%29%5Csin%28%5Ctheta%29%5Cdot%7B%5Ctheta%7D%5E2%5Cbig%29%2C%5C%5C%5Cddot%7Bp%7D%3D%5Cdfrac1%7B%5Cmu%28%5Ctheta%29%7D%5Cbig%28f+m_2%5Ccos%28%5Ctheta%29%5Csin%28%5Ctheta%29g-m_2l%5Csin%28%5Ctheta%29%5Cdot%7B%5Ctheta%7D%5Cbig%29%2C

        其中,

eq?%5Cmu%28%5Ctheta%29%3Dm_1+m_2%5Csin%28%5Ctheta%29%5E2%2C

        其中,eq?f 代表输入指令(即 eq?f%3Du),eq?m%3Dm_1+m_2 代表总质量。


 

一、 微分动作模型

        微分动作模型(DAM)描述的是连续时间内的动作(控制/动力学)。在本练习中,我们要求您编写小车摆杆的运动方程。

        更多详情,请参阅 DifferentialActionModelCartpole 类中的说明。

import crocoddyl
import pinocchio
import numpy as np
from IPython.display import HTML
from cartpole_utils import animateCartpoleclass DifferentialActionModelCartpole(crocoddyl.DifferentialActionModelAbstract):def __init__(self):crocoddyl.DifferentialActionModelAbstract.__init__(self, crocoddyl.StateVector(4), 1, 6)  # nu = 1; nr = 6self.unone = np.zeros(self.nu)self.m1 = 1.0self.m2 = 0.1self.l = 0.5self.g = 9.81self.costWeights = [1.0,1.0,0.1,0.001,0.001,1.0,]  # sin, 1-cos, x, xdot, thdot, fdef calc(self, data, x, u=None):if u is None:u = model.unone# Getting the state and control variablesy, th, ydot, thdot = x[0].item(), x[1].item(), x[2].item(), x[3].item()f = u[0].item()# Shortname for system parametersm1, m2, l, g = self.m1, self.m2, self.l, self.gs, c = np.sin(th), np.cos(th)####################################################################################### TODO: Write the dynamics equation of your system ######################################################################################### Hint:# You don't need to implement integration rules for your dynamic system.# Remember that DAM implemented action models in continuous-time.m = m1 + m2mu = m1 + m2 * s**2xddot, thddot = cartpole_dynamics(self, data, x, u)  # Write the cartpole dynamics heredata.xout = np.matrix([xddot, thddot]).T# Computing the cost residual and valuedata.r = np.matrix(self.costWeights * np.array([s, 1 - c, y, ydot, thdot, f])).Tdata.cost = 0.5 * sum(np.asarray(data.r) ** 2).item()def calcDiff(model, data, x, u=None):# Advance user might implement the derivatives in cartpole_analytical_derivativescartpole_analytical_derivatives(model, data, x, u)

        取消下面一行的注释,就能得到小车摆杆动力学的解:

# %load solutions/cartpole_dyn.py

        您可能需要检查一下您的计算结果。以下是创建模型和运行计算方法的方法。

cartpoleDAM = DifferentialActionModelCartpole()
cartpoleData = cartpoleDAM.createData()
x = cartpoleDAM.state.rand()
u = np.zeros(1)
cartpoleDAM.calc(cartpoleData, x, u)

二、使用 DAMNumDiff 写导数

        在前面的练习中,我们没有定义 cartpole 系统的导数。在 crocoddyl 中,我们可以利用 DifferentialActionModelNumDiff 类来计算导数,而无需任何额外代码。该类通过数值微分计算导数。

        在下面的单元格中,您需要创建一个使用 NumDiff 计算导数的 cartpole DAM。

# Creating the carpole DAM using NumDiff for computing the derivatives.
# We specify the withGaussApprox=True to have approximation of the
# Hessian based on the Jacobian of the cost residuals.
cartpoleND = crocoddyl.DifferentialActionModelNumDiff(cartpoleDAM, True)

        使用 NumDiff 创建 cartpole DAM 后。我们希望您能回答以下问题:

  • Fx 的 2 列为空。是 Wich 列吗?为什么?
  • 能否仔细检查一下 Fu 的值?
# %load solutions/cartpole_fxfu.py

三、积分模型

        为 cartpole 系统创建 DAM 后。我们需要创建一个积分动模型(IAM)。请注意,IAM 将连续时间动作模型转换为离散时间动作模型。在本练习中,我们将使用简单欧拉积分器。

# %load solutions/cartpole_integration.py
###########################################################################
################## TODO: Create an IAM with from the DAM ##################
###########################################################################
# Hint:
# Use IntegratedActionModelEuler

四、编写问题,创建求解器

        首先,您需要描述射击问题。为此,您必须说明步的数量及其时间步长。在本练习中,我们希望使用 50 步和 5e-2。

        下面是我们创建问题的方法。

# Fill the number of knots (T) and the time step (dt)
x0 = np.array([0.0, 3.14, 0.0, 0.0])
T = 50
problem = crocoddyl.ShootingProblem(x0, [cartpoleIAM] * T, cartpoleIAM)

        问题不能解决,只能积分:

us = [np.zeros(cartpoleIAM.differential.nu)] * T
xs = problem.rollout(us)

        在 cartpole_utils 中,我们提供了 plotCartpole 和 animateCartpole 方法。让我们展示一下这个滚动条!

        请注意,to_jshtml 会生成视频控制命令。

HTML(animateCartpole(xs).to_jshtml())
# %load solutions/cartpole_ddp.py
# #########################################################################
# ################# TODO: Create the DDP solver and run it ###############
# ##########################################################################
HTML(animateCartpole(ddp.xs.tolist()).to_jshtml())

五、调整问题,解决问题

        指出解决问题的方法。

  • 没有终端模型,我们可以看到一些波动,但无法稳定下来。怎么办?
  • 最重要的是达到站立位置。我们还能使速度失效吗?
  • 增加所有权重是行不通的。如何慢慢增加惩罚?
# %load solutions/cartpole_tuning.py
# ##########################################################################
# ################# TODO: Tune the weights for each cost ###################
# ##########################################################################
terminalCartpole = DifferentialActionModelCartpole()
terminalCartpoleDAM = crocoddyl.DifferentialActionModelNumDiff(terminalCartpole, True)
terminalCartpoleIAM = crocoddyl.IntegratedActionModelEuler(terminalCartpoleDAM)terminalCartpole.costWeights[0] = 0  # fix me :)
terminalCartpole.costWeights[1] = 0  # fix me :)
terminalCartpole.costWeights[2] = 0  # fix me :)
terminalCartpole.costWeights[3] = 0  # fix me :)
terminalCartpole.costWeights[4] = 0  # fix me :)
terminalCartpole.costWeights[5] = 0  # fix me :)
problem = crocoddyl.ShootingProblem(x0, [cartpoleIAM] * T, terminalCartpoleIAM)
# Creating the DDP solver
ddp = crocoddyl.SolverDDP(problem)
ddp.setCallbacks([crocoddyl.CallbackVerbose()])# Solving this problem
done = ddp.solve([], [], 300)
print(done)
HTML(animateCartpole(ddp.xs.tolist()).to_jshtml())

六、使用分析导数

        取消下面一行的注释,就能得到分析导数的解:

# %load solutions/cartpole_analytical_derivatives.py
def cartpole_analytical_derivatives(model, data, x, u=None):pass

        在定义了分析导数后,我们就不需要使用 DAMNumDiff 对导数进行数值逼近了。

timeStep = 5e-2
cartpoleIAM = crocoddyl.IntegratedActionModelEuler(cartpoleDAM, timeStep)

        现在您可以再次运行 "IV. 编写问题,创建求解器 "中的所有模块,因为 cartpoleIAM 已被重新定义为直接使用解析导数。

 

这篇关于Crocoddyl 使用教程(二)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/960094

相关文章

Windows环境下解决Matplotlib中文字体显示问题的详细教程

《Windows环境下解决Matplotlib中文字体显示问题的详细教程》本文详细介绍了在Windows下解决Matplotlib中文显示问题的方法,包括安装字体、更新缓存、配置文件设置及编码調整,并... 目录引言问题分析解决方案详解1. 检查系统已安装字体2. 手动添加中文字体(以SimHei为例)步骤

C++中assign函数的使用

《C++中assign函数的使用》在C++标准模板库中,std::list等容器都提供了assign成员函数,它比操作符更灵活,支持多种初始化方式,下面就来介绍一下assign的用法,具有一定的参考价... 目录​1.assign的基本功能​​语法​2. 具体用法示例​​​(1) 填充n个相同值​​(2)

Spring StateMachine实现状态机使用示例详解

《SpringStateMachine实现状态机使用示例详解》本文介绍SpringStateMachine实现状态机的步骤,包括依赖导入、枚举定义、状态转移规则配置、上下文管理及服务调用示例,重点解... 目录什么是状态机使用示例什么是状态机状态机是计算机科学中的​​核心建模工具​​,用于描述对象在其生命

Java JDK1.8 安装和环境配置教程详解

《JavaJDK1.8安装和环境配置教程详解》文章简要介绍了JDK1.8的安装流程,包括官网下载对应系统版本、安装时选择非系统盘路径、配置JAVA_HOME、CLASSPATH和Path环境变量,... 目录1.下载JDK2.安装JDK3.配置环境变量4.检验JDK官网下载地址:Java Downloads

使用Python删除Excel中的行列和单元格示例详解

《使用Python删除Excel中的行列和单元格示例详解》在处理Excel数据时,删除不需要的行、列或单元格是一项常见且必要的操作,本文将使用Python脚本实现对Excel表格的高效自动化处理,感兴... 目录开发环境准备使用 python 删除 Excphpel 表格中的行删除特定行删除空白行删除含指定

深入理解Go语言中二维切片的使用

《深入理解Go语言中二维切片的使用》本文深入讲解了Go语言中二维切片的概念与应用,用于表示矩阵、表格等二维数据结构,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习吧... 目录引言二维切片的基本概念定义创建二维切片二维切片的操作访问元素修改元素遍历二维切片二维切片的动态调整追加行动态

prometheus如何使用pushgateway监控网路丢包

《prometheus如何使用pushgateway监控网路丢包》:本文主要介绍prometheus如何使用pushgateway监控网路丢包问题,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录监控网路丢包脚本数据图表总结监控网路丢包脚本[root@gtcq-gt-monitor-prome

Python通用唯一标识符模块uuid使用案例详解

《Python通用唯一标识符模块uuid使用案例详解》Pythonuuid模块用于生成128位全局唯一标识符,支持UUID1-5版本,适用于分布式系统、数据库主键等场景,需注意隐私、碰撞概率及存储优... 目录简介核心功能1. UUID版本2. UUID属性3. 命名空间使用场景1. 生成唯一标识符2. 数

SpringBoot中如何使用Assert进行断言校验

《SpringBoot中如何使用Assert进行断言校验》Java提供了内置的assert机制,而Spring框架也提供了更强大的Assert工具类来帮助开发者进行参数校验和状态检查,下... 目录前言一、Java 原生assert简介1.1 使用方式1.2 示例代码1.3 优缺点分析二、Spring Fr

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期