【机器人】系统辨识之激励轨迹设计(傅里叶级数)

在机器人参数辨识中使用傅里叶级数,主要是为了生成一种激励轨迹,具有良好的数学特性,同时符合物理要求。傅里叶级数的特性使其在机器人动力学辨识的激励轨迹设计中非常常用。


1. 为什么需要激励轨迹?

激励轨迹的作用是通过驱动机器人运动,产生尽可能丰富的数据,帮助准确辨识动力学模型参数。理想的激励轨迹需要满足:

  • 覆盖丰富的动态特性: 激励轨迹需要让系统尽可能激活更多的自由度(关节),产生多样的运动状态(位置、速度、加速度)。
  • 避免高频噪声: 激励轨迹需要避免激发机器人结构的高频柔性振动,导致噪声放大。
  • 控制复杂度: 激励轨迹应易于生成和分析,同时适合实际硬件执行。

2. 为什么用傅里叶级数?

傅里叶级数在激励轨迹设计中的优势包括以下几点:

(1) 数学简洁性

傅里叶级数能够将任何周期性函数表示为正弦和余弦函数的组合:

q(t)=a0+∑n=1N(ancos⁡(nωt)+bnsin⁡(nωt))q(t) = a_0 + \sum_{n=1}^N \left( a_n \cos(n \omega t) + b_n \sin(n \omega t) \right)

这种形式非常适合生成平滑、周期性的激励轨迹。

(2) 可控的频率特性
  • 低频分量为主: 通过选择较低阶的傅里叶项,可以限制轨迹的频率范围,避免激发高频振动。
  • 可调的频率和幅值: 傅里叶级数的参数(系数)可以直接调整轨迹的幅值和频率特性,满足特定动态要求。
(3) 灵活性
  • 可以轻松调整轨迹的复杂性(通过控制傅里叶级数的阶数 NN)。
  • 可以通过优化傅里叶系数(如本代码中使用的 fmincon),设计特定性质的轨迹,如最小化条件数或减少能量消耗。
(4) 周期性要求

傅里叶级数天然适用于周期性轨迹。对于许多机器人系统(如关节型机械臂),周期性运动是自然的选择,因为它可以让系统循环激励而无需频繁切换模式。


3. 具体应用中的目的

在您的代码中,傅里叶级数用于生成激励轨迹,并通过优化傅里叶系数来满足以下目标:

  1. 提高辨识矩阵的条件数
    • 条件数是系统数值稳定性的指标。优化傅里叶系数可以确保辨识矩阵具有较好的数值稳定性,从而提高参数辨识的精度。
  2. 确保轨迹平滑
    • 傅里叶级数生成的轨迹天然是连续且光滑的,避免了不连续或非光滑轨迹对机器人运动的负面影响。
  3. 覆盖丰富动态范围
    • 不同阶的傅里叶分量提供了轨迹的不同频率特性,使得运动数据能够覆盖更广的动态范围。

4. 其他常见激励轨迹设计方法的对比

方法优点缺点
傅里叶级数平滑、易调控、数学简单,适合周期性激励。不适合非周期性轨迹。
多项式轨迹非周期性轨迹设计方便,适合局部运动。高阶多项式可能导致高频振动。
阶跃信号或方波信号易实现、激励强度大。对硬件要求高,可能引入高频噪声。
随机信号(如伪随机序列)激励范围最广,适用于随机系统。难以控制硬件执行,信号可能过于复杂。
预设轨迹(如标准三角波)简单易用,适合某些特定场景。灵活性不足,可能无法覆盖全部动态特性。

5. 总结

傅里叶级数是激励轨迹设计中的一种理想选择,特别适合周期性运动的机器人参数辨识。使用傅里叶级数有助于生成平滑、低噪声、动态特性丰富的轨迹,同时允许通过优化调整参数以满足特定需求。

如果您对傅里叶系数优化或者其他激励轨迹设计方法有进一步问题,可以随时讨论!

6. 总结个人小结以及代码实现

傅里叶级数,直接映射了频域的响应。直接对应了不同omega的响应。 实际操作是常用 3阶 5阶,就可以了。根据物理情况,选择roi omega .e.g. 10 hz

%% Excited Trajectory Generation
clear
clc

% 设置傅里叶级数的阶数
N = 3; % 使用三阶傅里叶级数

% 设置优化参数和限制条件
OPTIONS = optimoptions('fmincon', 'Algorithm', 'active-set'); % 使用激活集算法进行约束优化
A = []; b = []; % 无线性不等式约束
Aeq = []; beq = []; % 无线性等式约束

% 设置傅里叶系数的上下界(例如,振幅限制在 [-3, 3])
lb = [-3 * ones(1, 2), -3, -3 * ones(1, 2 * (N - 1))]; % 下界
ub = [3 * ones(1, 2), 3, 3 * ones(1, 2 * (N - 1))];   % 上界

% 优化傅里叶系数,目标函数和约束分别定义在 myfun2 和 mycon
x = fmincon(@(x) myfun2(x), ...             % 目标函数:由 myfun2 定义
            1 * ones(1, 2 * N + 1), ...    % 初始值:所有系数为 1
            [], [], [], [], ...            % 无额外的线性约束
            lb, ub, ...                    % 系数的上下界
            @(x) mycon(x), ...             % 非线性约束:由 mycon 定义
            OPTIONS);                      % 优化选项

% 轨迹生成的时间参数
Tf = 10;          % 总时间周期 (秒)
omega = 2 * pi / Tf; % 基频 (rad/s)
dt = 0.007;       % 时间步长 (秒)
t = 0:dt:Tf;      % 时间向量

%% 生成傅里叶级数轨迹
% 初始化第一个傅里叶级数的各阶分量
l = 1; % 傅里叶级数的阶次
q{1} = x(1) / (omega * l) * sin(omega * l * t) ...
     - x(2) / (omega * l) * cos(omega * l * t) + x(3); % 位移
dq{1} = x(1) * cos(omega * l * t) + x(2) * sin(omega * l * t); % 速度
ddq{1} = -x(1) * omega * l * sin(omega * l * t) ...
       + x(2) * omega * l * cos(omega * l * t); % 加速度

% 生成其他傅里叶级数的分量
for i = 2:N
    l = i; % 当前傅里叶级数的阶次
    q{i} = x(2 + (i - 2) * 2 + 2) / (omega * l) * sin(omega * l * t) ...
         - x(2 + (i - 2) * 2 + 3) / (omega * l) * cos(omega * l * t); % 位移
    dq{i} = x(2 + (i - 2) * 2 + 2) * cos(omega * l * t) ...
          + x(2 + (i - 2) * 2 + 3) * sin(omega * l * t); % 速度
    ddq{i} = -x(2 + (i - 2) * 2 + 2) * omega * l * sin(omega * l * t) ...
           + x(2 + (i - 2) * 2 + 3) * omega * l * cos(omega * l * t); % 加速度
end

%% 合并所有傅里叶分量
% 初始化合成轨迹
qF = q{1}; % 合成位置
dqF = dq{1}; % 合成速度
ddqF = ddq{1}; % 合成加速度

% 将每阶傅里叶分量累加
for i = 2:N
    qF = qF + q{i};
    dqF = dqF + dq{i};
    ddqF = ddqF + ddq{i};
end

%% 生成动力学特征矩阵
% 初始化第一时间点的动力学特征矩阵
F = [ddqF(1), dqF(1), sign(dqF(1)), cos(qF(1)), sin(qF(1))];
for i = 2:length(t)
    F = [F; ddqF(i), dqF(i), sign(dqF(i)), cos(qF(i)), sin(qF(i))];
end

% 计算特征矩阵的条件数(数值稳定性评价)
f = cond(F);

%% 保存轨迹数据
save('tra', 'qF', 'dqF', 'ddqF');

此代码用于生成激励轨迹,并计算相应的动力学特征矩阵的条件数。


代码的目的

  • 通过傅里叶级数生成一个周期性激励轨迹 q(t)q(t),其包含位置、速度和加速度。
  • 优化傅里叶系数,以确保动力学辨识矩阵具有良好的条件数(数值稳定性)。
  • 保存生成的轨迹和对应的动力学数据。

/


代码主要部分总结

  1. 优化傅里叶系数

    • 使用 fmincon 优化傅里叶级数系数,以确保生成的轨迹符合约束条件。
    • myfun2mycon 分别定义了优化的目标函数和非线性约束。
  2. 生成轨迹

    • 基于傅里叶级数生成机器人激励轨迹,包括位置 qFqF、速度 dqFdqF 和加速度 ddqFddqF。
  3. 动力学特征矩阵

    • 通过轨迹生成对应的动力学特征矩阵 FF,每一行包括加速度、速度、速度符号、位置的余弦和正弦。
    • 计算矩阵的条件数 cond(F)\text{cond}(F),评估辨识的数值稳定性。
  4. 保存数据

    • 将合成轨迹 qFqF、速度 dqFdqF 和加速度 ddqFddqF 保存到文件 tra.mat,供后续分析使用。

附加建议

  1. 优化目标:进一步明确 myfun2 的具体目标(可能是条件数或轨迹平滑性)。
  2. 约束定义:确保 mycon 合理定义非线性约束,避免优化结果不符合实际物理要求。
  3. 性能提升:如果轨迹生成计算量较大,可以尝试优化循环结构,减少重复计算。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Unity简单操作及使用教程

Unity 是一款强大的跨平台游戏引擎,它不仅支持 2D 和 3D 游戏的开发,还可以用于虚拟现实 (VR)、增强现实 (AR)、动画、建筑可视化等多个领域。Unity 提供了完整的开发环境,具有丰富的功能、工具和资源,可以帮助开发者快速实现创意…

前端node环境安装:nvm安装详细教程(安装nvm、node、npm、cnpm、yarn及环境变量配置)

需求:在做前端开发的时候,有的时候 这个项目需要 node 14 那个项目需要 node 16,我们也不能卸载 安装 。这岂不是很麻烦。这个时候 就需要 一个工具 来管理我们的 node 版本和 npm 版本。 下面就分享一个 nvm 工具 用来管理 node 版本。 这个…

为什么数据平台需要敏捷版|直播回顾

11月28日,我们邀请到StartDT合伙人、CTO地雷和StartDT资深战略咨询专家何夕,围绕“为什么数据平台需要敏捷版”这个话题,向大家汇报了DataSimba敏捷版这半年来的最新进展,并带来了详细的产品解读。 敏捷版支持StarRocks、ClickHo…

HarmonyOS-中级(四)

文章目录 Native适配开发三方库的基本使用 🏡作者主页:点击! 🤖HarmonyOS专栏:点击! ⏰️创作时间:2024年12月09日11点12分 Native适配开发 Node-API HarmonyOS Node-API 是 HarmonyOS 提供的…

从零开始的使用SpringBoot和WebSocket打造实时共享文档应用

在现代应用中,实时协作已经成为了非常重要的功能,尤其是在文档编辑、聊天系统和在线编程等场景中。通过实时共享文档,多个用户可以同时对同一份文档进行编辑,并能看到其他人的编辑内容。这种功能广泛应用于 Google Docs、Notion 等…

统信桌面专业版部署postgresql-14.2+postgis-3.2方法介绍

文章来源:统信桌面专业版部署postgresql-14.2postgis-3.2方法介绍 | 统信软件-知识分享平台 应用场景 CPU架构:X86(海光C86-3G 3350) OS版本信息:1070桌面专业版 软件信息:postgresql-14.2postgis-3.2 …

jmeter 提取数据写入文件

BeanShell PostProcessor FileWriter file new FileWriter("E:\\IOT\\cui家庭中心\\v3.8.0\\123.txt",true); BufferedWriter out new BufferedWriter(file); out.write(vars.get("localKey")"\n"); log.info("到这里了吗"); out.c…

在ensp中ACL路由控制实验

一、实验目的 掌握ACL路由控制管理 二、实验要求 要求: 配置路由策略,左右两边不公开区域对方不可达,其他区域可以互相ping通 设备: 1、三台路由器 2、四台交换机 3、四台电脑 4、四台服务器 使用ensp搭建实验环境,如图所…

MySQL 实现分库分表详解

MySQL 实现分库分表详解 为什么要分库分表什么是分库分表分库分表的几种方式垂直拆分数据库垂直拆分表垂直拆分垂直拆分特点垂直拆分优缺点优点缺点 水平拆分数据库水平拆分表水平拆分水平拆分的其他方式水平拆分特点水平拆分优缺点优点缺点 分库分表带来的问题分库分表技术如何…

如何让Google快速收录你的页面?

要让Google更快地收录你的网站内容,首先需要理解“爬虫”这个概念。Google的爬虫是帮助它发现和评估网站内容质量的工具,如果你的页面质量高且更新频率稳定,那么Google爬虫更可能频繁光顾。通常情况下,通过Google Search Console&…

游戏引擎学习第36天

仓库 :https://gitee.com/mrxiao_com/2d_game 回顾之前的内容 在这个程序中,目标是通过手动编写代码来从头开始制作一个完整的游戏。整个过程不使用任何库或现成的游戏引擎,这样做的目的是为了能够全面了解游戏执行的每一个细节。开发过程中&#xff0…

【Linux】系统信息和状态命令

步骤 1:显示系统信息 命令: uname -a 1.打开终端。 2.输入命令并按回车键。 3.观察:输出将显示包括内核版本、主机名、硬件架构等在内的系统信息。 步骤 2:显示或设置系统的主机名 命令: hostname 1.打开终端。…

IDEA创建Spring Boot项目配置阿里云Spring Initializr Server URL【详细教程-轻松学会】

1.首先打开idea选择新建项目 2.选择Spring Boot框架(就是选择Spring Initializr这个) 3.点击中间界面Server URL后面的三个点更换为阿里云的Server URL Idea中默认的Server URL地址:https://start.spring.io/ 修改为阿里云Server URL地址:https://star…

获得日志记录之外的新视角:应用程序性能监控简介(APM)

作者:来自 Elastic David Hope 日志记录领域即将发生改变。在这篇文章中,我们将概述从单纯的日志记录到包含日志、跟踪和 APM 的完全集成解决方案的推荐流程。 通过 APM 和跟踪优先考虑客户体验 企业软件开发和运营已成为一个有趣的领域。我们拥有一些非…

Qt之第三方库‌QXlsx使用(三)

Qt开发 系列文章 - QXlsx(三) 目录 前言 一、Qt开源库 二、QXlsx 1.QXlsx介绍 2.QXlsx下载 3.QXlsx移植 4.修改项目文件.pro 三、使用技巧 1.添加头文件 2.写入数据 3.读出数据 总结 前言 Qt第三方控件库是指非Qt官方提供的、用于扩展Qt应用…

Codeforces Round 992 (Div. 2)

传送门:Dashboard - Codeforces Round 992 (Div. 2) - Codeforces A. Game of Division 思路:模拟 AC代码:Submission #295676347 - Codeforces B. Paint a Strip 思路:数学 贪心 放置的位置一定是 1 4 10 22 48 ....…

MySQL并发控制(二):锁

只改一行语句,为什么锁那么多 注1:MySQL后面的版本可能会改变加锁策略, 所以这个规则只限于截止到现在的最新版本, 即5.x系列 注2:因为间隙锁在可重复读隔离级别下才有效, 所以本篇文章接下来的描述&#…

ThinkPHP+Layui开发的ERP管理系统

ERP采购生产销售系统,一款基于ThinkPHPLayui开发的ERP管理系统,帮助中小企业实现ERP管理规范化,此系统能为你解决五大方面的经营问题:1.采购管理 2.销售管理 3.仓库管理 4.资金管理 5.生产管理,适用于:服装…

vue的初步使用

一. vue的初步使用 1.引入相关依赖 //<!-- 引入一个vue文件 --><script src"https://cdn.jsdelivr.net/npm/vue2.7.16/dist/vue.js"></script>2. 给出相应的数据 <!DOCTYPE html> <html lang"en"> <head><meta ch…

计算机网络-Wireshark探索ARP

使用工具 Wiresharkarp: To inspect and clear the cache used by the ARP protocol on your computer.curl(MacOS)ifconfig(MacOS or Linux): to inspect the state of your computer’s network interface.route/netstat: To inspect the routes used by your computer.Brows…