迭代学习笔记

news2024/9/20 22:46:23

一、迭代学习定义和分类

1、直观理解

  • 迭代学习一般应用于重复性的场景。比如控制一个单自由度的小车以特定的速度曲线移动到指定位置,整个时间是10s,控制频率是0.01,那么整个控制序列就会有1000个点。这1000个点在10s内依次发出,完成依次控制,目的就是让小车的速度或者位置跟踪上特定的曲线。我们有一个优势在于跟踪曲线不变,那么我们可以不断进行尝试,只要获得一组良好的控制序列,那么就可以完成控制。

2、更新率

  • 如果我们可以设置一个更新率,根据每一个点面临的误差对控制量进行修改,那么就可以在若干次更新后获得完美的控制序列。
    新控制量 = 旧控制量 + 更新率 新控制量 = 旧控制量 + 更新率 新控制量=旧控制量+更新率

  • 根据更新率与什么参数有关,可以分为开环、闭环、开闭环。如果跟上一次的误差有关就是开环,如果跟此刻的误差有关就是闭环,如果都有关就是开闭环。根据更新率的结构还可以分为D型、PD型等。

  • 需要注意一下有D型和PD型,没有P型,我在仿真中试了半天P型都不收敛。

二、实现例子

  • 网上关于迭代学习的代码实现比较少,很多还是用simulink搭的,不方便复现。这里给一个D型闭环迭代学习例子,被控对象是一个钟摆小车,全部代码用python实现,直接运行即可。
    在这里插入图片描述

1、动力学模型

# 动力学模型函数
def dynamics(state, u):
    x, theta, dx, dtheta = state
    dd_x = (u + m2*l*dtheta*dtheta + m2*g*np.sin(theta)*np.cos(theta)) / (m1 + m2*np.sin(theta)*np.sin(theta))
    dd_theta = (-dd_x*np.cos(theta) + dx*np.sin(theta)*dtheta - np.sin(theta)*(dx*dtheta + g)) / l
    return np.array([dx, dtheta, dd_x, dtheta])

2、四阶龙格库塔积分器和控制器更新率

# 四阶龙格库塔法函数
def RK4(t_start, t_end, fun, Npoints, init_state, u_list, pos_des, spd_des):
    t = np.linspace(t_start, t_end, Npoints)
    dt = t[1] - t[0]
    state = np.zeros((Npoints, len(init_state)))
    state[0, :] = init_state
    e = np.zeros((Npoints, 2))
        
    for i in range(Npoints-1):
        u_list[i] = u_list[i] + 1 * (spd_des[i] - state[i, 2])  # 闭环D型更新率
        u = u_list[i]

        e[i, 0] = pos_des[i] - state[i, 0]
        e[i, 1] = spd_des[i] - state[i, 2]

        k1 = fun(state[i, :], u)
        k2 = fun(state[i, :] + 0.5 * dt * k1, u)
        k3 = fun(state[i, :] + 0.5 * dt * k2, u)
        k4 = fun(state[i, :] + dt * k3, u)
        state[i + 1, :] = state[i, :] + (1/6) * dt * (k1 + 2 * k2 + 2 * k3 + k4)

    return state, u_list, e

3、进行迭代

for i in range(10):
    # 运行RK4
    state, u_list, e_buff = RK4(t_start, t_end, dynamics, Npoints, [0, 0, 0, 0], u_list, pos_des, spd_des)

4、完整代码和效果展示

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

# 动力学模型函数
def dynamics(state, u):
    x, theta, dx, dtheta = state
    dd_x = (u + m2*l*dtheta*dtheta + m2*g*np.sin(theta)*np.cos(theta)) / (m1 + m2*np.sin(theta)*np.sin(theta))
    dd_theta = (-dd_x*np.cos(theta) + dx*np.sin(theta)*dtheta - np.sin(theta)*(dx*dtheta + g)) / l
    return np.array([dx, dtheta, dd_x, dtheta])

# 四阶龙格库塔法函数
def RK4(t_start, t_end, fun, Npoints, init_state, u_list, pos_des, spd_des):
    t = np.linspace(t_start, t_end, Npoints)
    dt = t[1] - t[0]
    state = np.zeros((Npoints, len(init_state)))
    state[0, :] = init_state
    e = np.zeros((Npoints, 2))
        
    for i in range(Npoints-1):
        u_list[i] = u_list[i] + 1 * (spd_des[i] - state[i, 2])  # 闭环D型更新率
        u = u_list[i]

        e[i, 0] = pos_des[i] - state[i, 0]
        e[i, 1] = spd_des[i] - state[i, 2]

        k1 = fun(state[i, :], u)
        k2 = fun(state[i, :] + 0.5 * dt * k1, u)
        k3 = fun(state[i, :] + 0.5 * dt * k2, u)
        k4 = fun(state[i, :] + dt * k3, u)
        state[i + 1, :] = state[i, :] + (1/6) * dt * (k1 + 2 * k2 + 2 * k3 + k4)

    return state, u_list, e

# 参数设置
m1 = 5
m2 = 1
l = 1
g = 9.8

t_start = 0
t_end = 10
Npoints = 10000
t = np.linspace(t_start, t_end, Npoints)

# 期望位置和速度
pos_des = np.sin(t) + t
spd_des = np.cos(t) + 1

pos_des = t * t + 2 * t
spd_des = 2 * t + 2

# 初始状态和控制输入
u_list = [0] * 10000

# 创建图形对象
plt.figure(figsize=(12, 12))

for i in range(20):
    # 运行RK4
    state, u_list, e_buff = RK4(t_start, t_end, dynamics, Npoints, [0, 0, 0, 0], u_list, pos_des, spd_des)
    
    # 清除当前图像
    plt.clf()
    
    # 绘制实际位置和期望位置的对比图
    plt.subplot(3, 1, 1)
    plt.plot(t, state[:, 0], label='Actual x (position)')
    plt.plot(t, pos_des, label='Desired x (position)', linestyle='--')
    plt.xlabel('Time (s)')
    plt.ylabel('Position')
    plt.legend()
    plt.title(f'Iteration {i+1}')
    
    # 绘制实际速度和期望速度的对比图
    plt.subplot(3, 1, 2)
    plt.plot(t, state[:, 2], label='Actual dx (velocity)')
    plt.plot(t, spd_des, label='Desired dx (velocity)', linestyle='--')
    plt.xlabel('Time (s)')
    plt.ylabel('Velocity')
    plt.legend()
    
    # 绘制控制输入(力)曲线
    plt.subplot(3, 1, 3)
    plt.plot(t, u_list, label='Control input (force)')
    plt.xlabel('Time (s)')
    plt.ylabel('Force')
    plt.legend()
    
    # 显示图像
    plt.pause(0.01)

# 最后显示图像
plt.show()

# 将误差和力存储到CSV文件
data = np.hstack((e_buff, np.array(u_list).reshape(-1, 1)))
df = pd.DataFrame(data, columns=['Position Error', 'Velocity Error', 'Control Input'])
df.to_csv('error_and_force_data.csv', index=False)

在这里插入图片描述

5、实物效果

  • 这个曲线不是上面仿真小车钟摆的实物测试,而是一个有一定质量的物体yaw轴回转的控制效果,展示的是位置曲线。这个物体受到不小的摩擦力,所以在开始迭代时开始和后来都会有停止不动的情况出现。同时,摩擦力也导致这个物体受到很大的干扰,就像小车钟摆的重物一样。

  • 值得一提的是整个实物的算法测试过程非常顺利,在代码完成后,一次测试就成功了。使用的还是闭环D型迭代学习,经过三四次迭代就收敛到期望曲线附近了。这说明迭代学习还是一种很实用的算法。
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1935949.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

网络编程-TCP 协议的三次握手和四次挥手做了什么

TCP 协议概述 1. TCP 协议简介 TCP(Transmission Control Protocol,传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。 TCP 协议提供可靠的通信服务,通过校验和、序列号、确认应答、重传等机制保证数据传输…

Pytorch学习笔记day4——训练mnist数据集和初步研读

该来的还是来了hhhhhhhhhh,基本上机器学习的初学者都躲不开这个例子。开源,数据质量高,数据尺寸整齐,问题简单,实在太适合初学者食用了。 今天把代码跑通,趁着周末好好的琢磨一下里面的各种细节。 代码实…

C++内存管理(区别C语言)深度对比

欢迎来到我的Blog,点击关注哦💕 前言 前面已经介绍了类和对象,对C面向对象编程已经有了全面认识,接下来要学习对语言学习比较重要的是对内存的管理。 一、内存的分区 代码区:存放程序的机器指令,通常是可…

js实现数组的下标为n的对象后面新增一条对象

前言: js实现数组的下标为n的对象后面新增一条对象 实现方法: arr.splice(1, 0, obj); splice 参数1: 数组里面的第几个元素,你希望在第几个对象后面新增参数2: 0 表示不删除任何元素参数3: 插入的新对象 let arr [{},{},{},{}] let obj…

vue使用echarts开发大屏可视化(附echarts案例资源)

近年来,可视化在前端领域是越来越多。最近投入的一个项目就是关于大屏可视化,基本就是用到了echarts,所以项目结束后,我也来总结一下如何在Vue中去引入echarts并使用。 文章目录 一、echarts案例网站可视化社区(https://www.makea…

Zoho Mail企业邮箱好用吗?

企业在选择企业邮箱时需要考虑三大因素,一是安全隐私,二是功能易用,三是产品价格。作为国际排行前五的企业邮箱,Zoho邮箱好用吗?本文将为您详细介绍Zoho邮箱的功能、安全性和产品价格。 一、安全隐私 1、数据加密与安…

MySQL----初始数据类型

前言 一、tinyint 范围:-128-----127 在MySQL中,整型可以指定是有符号的和无符号的,默认是有符号的。可以通过UNSIGNED来说明某个字段是无符号的。如果我们向mysqlt特定的类型中插入不合法的数据,Mysq一般会直接拦截&#xff0c…

【HarmonyOS学习】定位相关知识(Locationkit)

简介 LocationKit提供了定位服务、地理围栏、地理编码、逆地理编码和国家码等功能。 可以实现点击获取用户位置信息、持续获取位置信息和区域进出监控等多项功能。 需要注意,需要确定用户已经开启定位信息,一下的代码没有做这一步的操作,默…

p17面试题

品茗面试题 1.交换两个int变量的值&#xff0c;不能使用第三个变量&#xff0c;即a3,b5,交换后&#xff0c;a5,b3&#xff1b; #include<stdio.h> //int main(){ // //打印函数&#xff0c;引用头文件.stdio.h // printf("hello world\n");//打印函数 …

C++STL详解(二)——string类的模拟实现

首先&#xff0c;我们为了防止命名冲突&#xff0c;我们需要在自己的命名空间内实现string类。 一.string类基本结构 string类的基本结构和顺序表是相似的&#xff0c;结构如下&#xff1a; //.h namespace kuzi {class string{private:char* _str;//字符串size_t _size;//长…

算法基础之回溯法

本文将详细介绍回溯法的基本原理和适用条件&#xff0c;并通过经典例题辅助读者理解回溯法的思想、掌握回溯法的使用。本文给出的例题包括&#xff1a;N皇后问题、子集和问题。 算法原理 在问题的解空间树中&#xff0c;回溯法按照深度优先的搜索策略&#xff0c;从根结点出发…

LDR6020:重塑iPad一体式有线键盘体验的创新力量

在移动办公与娱乐日益融合的时代&#xff0c;iPad凭借其强大的性能和便携性&#xff0c;成为了众多用户不可或缺的生产力工具。然而&#xff0c;为了进一步提升iPad的使用体验&#xff0c;一款高效、便捷的键盘成为了不可或缺的配件。今天&#xff0c;我们要介绍的&#xff0c;…

TYPE-C接口PD取电快充协议芯片ECP5701:支持PD 2.0和PD 3.0(5V,9V,12V,15V,20V)

随着智能设备的普及&#xff0c;快充技术成为了越来越多用户的刚需。而TYPE-C接口作为新一代的USB接口&#xff0c;具有正反插、传输速度快、充电体验好等优点&#xff0c;已经成为了快充技术的主要接口形式。而TYPE-C接口的PD&#xff08;Power Delivery&#xff09;取电快充协…

【数据结构】线性结构——数组、链表、栈和队列

目录 前言 一、数组&#xff08;Array&#xff09; 1.1优点 1.2缺点 1.3适用场景 二、链表&#xff08;Linked List&#xff09; 2.1优点 2.2缺点 2.3适用场景 三、栈&#xff08;Stack&#xff09; 3.1优点 3.2缺点 3.3适用场景 四、队列&#xff08;Queue&#xff09; 4.1优点…

【python】Python高阶函数--reduce函数的高阶用法解析与应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

Redis常用的5大数据类型

Reids字符串&#xff08;String&#xff09; 设置相同的key&#xff0c;之前内容会覆盖掉 Redis列表&#xff08;List&#xff09; 常用命令 从左往右放值 数据结构 Redis集合&#xff08;set&#xff09; sadd<key><value1><value2>...... 数据结构 Set数据…

前端组件化开发:以Vue自定义底部操作栏组件为例

摘要 随着前端技术的不断演进&#xff0c;组件化开发逐渐成为提升前端开发效率和代码可维护性的关键手段。本文将通过介绍一款Vue自定义的底部操作栏组件&#xff0c;探讨前端组件化开发的重要性、实践过程及其带来的优势。 一、引言 随着Web应用的日益复杂&#xff0c;传统的…

「豆包Marscode体验官」 | 云端 IDE 启动 Rust 体验

theme: cyanosis 我正在参加「豆包MarsCode初体验」征文活动 MarsCode 可以看作一个运行在服务端的远程 VSCode开发环境。 对于我这种想要学习体验某些语言&#xff0c;但不想在电脑里装环境的人来说非常友好。本文就来介绍一下在 MarsCode里&#xff0c;我的体验 rust 开发体验…

Games101学习笔记 Lecture22 Animation(cont.)

Lecture22 Animation(cont. 一、单个粒子模拟Ordinary Differential Equation ODE 常微分方程ODE求解方法——欧拉方法解决不稳定中点法改进欧拉方法自适应步长隐式欧拉方法 二、流体模拟基于位置的方法物质点方法 一、单个粒子模拟 想模拟粒子在场中的运动 Ordinary Differe…

Token Labeling(NeurIPS 2021, ByteDance)论文解读

paper&#xff1a;All Tokens Matter: Token Labeling for Training Better Vision Transformers official implementation&#xff1a;https://github.com/zihangJiang/TokenLabeling 出发点 ViTs的局限性&#xff1a;尽管ViTs在捕捉长距离依赖方面表现出色&#xff0c; 但…