【Homework】【7】Learning resources for DQ Robotics in MATLAB

news2024/11/20 5:41:19

阻尼伪逆使系统在任务空间奇异性方面具有一定的鲁棒性

阻尼伪逆

阻尼伪逆是SVD(奇异值分解)逆矩阵的一种有趣替代方法,它使系统在任务空间奇异性方面具有一定的鲁棒性。其主要思想是对任意(可能为奇异的)矩阵 B ∈ R m × n B \in \mathbb{R}^{m \times n} BRm×n,使用以下伪逆矩阵,称为阻尼伪逆(damped-pseudo inverse):

B + ≜ ( B T B + λ 2 I ) − 1 B T B^+ \triangleq (B^T B + \lambda^2 I)^{-1} B^T B+(BTB+λ2I)1BT

其中, λ ∈ R − { 0 } \lambda \in \mathbb{R} - \{0\} λR{0}是阻尼因子。这个阻尼因子的含义将在下一节中更清楚地解释,但目前只需知道以下结论:
( B T B + λ 2 I ) − 1 (B^T B + \lambda^2 I)^{-1} (BTB+λ2I)1

始终存在,因此可以使用常规的逆矩阵计算算法来求解阻尼伪逆。

阻尼伪逆与奇异性鲁棒性

从基于雅可比矩阵的机器人控制的角度来看,阻尼因子让我们能够平衡以下两者之间的权衡关系:最优关节速度(在任务误差减少的意义上)和关节速度范数。

如果选择较大的阻尼因子,机器人对任务空间奇异性会更鲁棒,但可能需要更长时间才能达到期望的任务空间值。随着阻尼因子的降低,其行为会更接近于基于SVD的伪逆。如果阻尼因子太小,当机器人接近奇异配置时,关节速度也可能变得危险。

Lesson 7

在这里插入图片描述
在这里插入图片描述

代码

clear all;
close all;
clc;
include_namespace_dq;

% 定义参数
damping_values = [0.001, 0.01, 0.1, 0.2, 0.3, 0.4, 0.5, 1];
tau = 0.01;
final_time = 1;
stored_time = 0:tau:final_time;

% 初始条件
theta_i = 0; % Condition 1
td = 7 * j_;
eta = 10;

% 初始化存储
task_space_error_norms = zeros(length(damping_values), length(stored_time));
control_signal_norms = zeros(length(damping_values), length(stored_time));

% 计算每个阻尼值下的任务空间误差和控制信号
for i = 1:length(damping_values)
    damping = damping_values(i);
    [task_space_error_norms(i, :), control_signal_norms(i, :)] = compute_norms(damping, theta_i, td, tau, final_time, eta);
end

% 创建动态显示的窗口
figure;

% 绘制任务空间误差子图
ax1 = subplot(1, 2, 1);
hold on;
handles_tn = []; % 用于存储任务空间误差句柄
for i = 1:length(damping_values)
    h = plot(stored_time, task_space_error_norms(i, :), 'LineWidth', 2, ...
        'DisplayName', sprintf('\\lambda=%.3f', damping_values(i)));
    handles_tn = [handles_tn; h];
end
title('Task-Space Error Norm');
xlabel('Time (s)');
ylabel('Error Norm');
legend show;
hold off;

% 绘制控制信号范数子图
ax2 = subplot(1, 2, 2);
hold on;
handles_cn = []; % 用于存储控制信号范数句柄
for i = 1:length(damping_values)
    h = plot(stored_time, control_signal_norms(i, :), 'LineWidth', 2, ...
        'DisplayName', sprintf('\\lambda=%.3f', damping_values(i)));
    handles_cn = [handles_cn; h];
end
title('Control Signal Norm');
xlabel('Time (s)');
ylabel('Signal Norm');
legend show;
hold off;

% 添加"取消全部显示"复选框
all_checkbox = uicontrol('Style', 'checkbox', ...
                         'String', 'Show All', ...
                         'Position', [20, 400, 150, 20], ...
                         'Value', 1, ...
                         'Callback', @(src, ~) toggle_all_visibility(src.Value, handles_tn, handles_cn));

% 添加每条曲线的复选框控件
for i = 1:length(damping_values)
    uicontrol('Style', 'checkbox', ...
        'String', sprintf('Show \\lambda=%.3f', damping_values(i)), ...
        'Position', [20, 400 - 30 * i, 150, 20], ...
        'Value', 1, ...
        'Callback', @(src, ~) toggle_visibility(src.Value, handles_tn(i), handles_cn(i)));
end


% 辅助函数:单独切换曲线可见性
function toggle_visibility(value, h1, h2)
    if value
        set(h1, 'Visible', 'on');
        set(h2, 'Visible', 'on');
    else
        set(h1, 'Visible', 'off');
        set(h2, 'Visible', 'off');
    end
end

% 辅助函数:切换全部曲线可见性
function toggle_all_visibility(value, handles_tn, handles_cn)
    for i = 1:length(handles_tn)
        if value
            set(handles_tn(i), 'Visible', 'on');
            set(handles_cn(i), 'Visible', 'on');
        else
            set(handles_tn(i), 'Visible', 'off');
            set(handles_cn(i), 'Visible', 'off');
        end
    end
end

function [task_space_error_norm, control_signal_norm] = compute_norms(damping, theta_i, td, tau, final_time, eta)
    include_namespace_dq;
    seven_dof_planar_robot = SevenDofPlanarRobotDH.kinematics();
    translation_controller = DQ_PseudoinverseController(seven_dof_planar_robot);
    translation_controller.set_control_objective(ControlObjective.Translation);
    translation_controller.set_gain(eta);
    translation_controller.set_damping(damping);
    q = ones(7, 1) * theta_i;
    n_steps = length(0:tau:final_time);
    task_space_error_norm = zeros(1, n_steps);
    control_signal_norm = zeros(1, n_steps);
    for step = 1:n_steps
        u = translation_controller.compute_setpoint_control_signal(q, vec4(td));
        task_space_error_norm(step) = norm(translation(seven_dof_planar_robot.fkm(q)) - td).q(1);
        control_signal_norm(step) = norm(u);
        q = q + u * tau;
    end
end


Bonus Homework

在这里插入图片描述

1. 证明 A A † = U Σ V T V Σ † U T = I m × m A A^\dagger = U \Sigma V^T V \Sigma^\dagger U^T = I_{m \times m} AA=UΣVTVΣUT=Im×m

第一步:奇异值分解(SVD)

对于矩阵 A ∈ R m × n A \in \mathbb{R}^{m \times n} ARm×n,其中 m ≤ n m \leq n mn rank ( A ) = m \text{rank}(A) = m rank(A)=m,我们可以对 A A A 进行奇异值分解:

A = U Σ V T , A = U \Sigma V^T, A=UΣVT,

其中:

  • U ∈ R m × m U \in \mathbb{R}^{m \times m} URm×m:正交矩阵(满足 U T U = I m × m U^T U = I_{m \times m} UTU=Im×m),
  • Σ ∈ R m × n \Sigma \in \mathbb{R}^{m \times n} ΣRm×n:对角矩阵,对角线上是 A A A 的奇异值,
  • V ∈ R n × n V \in \mathbb{R}^{n \times n} VRn×n:正交矩阵(满足 V T V = I n × n V^T V = I_{n \times n} VTV=In×n)。
第二步:伪逆矩阵的定义

A A A 的伪逆矩阵 A † A^\dagger A 定义为:

A † = V Σ † U T , A^\dagger = V \Sigma^\dagger U^T, A=VΣUT,

其中 Σ † \Sigma^\dagger Σ Σ \Sigma Σ 的伪逆,形式如下:

Σ † = [ Σ m − 1 0 0 0 ] , \Sigma^\dagger = \begin{bmatrix} \Sigma_m^{-1} & 0 \\ 0 & 0 \end{bmatrix}, Σ=[Σm1000],

其中 Σ m − 1 \Sigma_m^{-1} Σm1 Σ \Sigma Σ m × m m \times m m×m 非零子矩阵的逆。

第三步:计算 A A † A A^\dagger AA

A A A A † A^\dagger A 的定义代入:

A A † = ( U Σ V T ) ( V Σ † U T ) . A A^\dagger = (U \Sigma V^T)(V \Sigma^\dagger U^T). AA=(UΣVT)(VΣUT).

由于 V T V = I V^T V = I VTV=I,可以简化为:

A A † = U Σ Σ † U T . A A^\dagger = U \Sigma \Sigma^\dagger U^T. AA=UΣΣUT.

第四步:简化 Σ Σ † \Sigma \Sigma^\dagger ΣΣ

计算 Σ Σ † \Sigma \Sigma^\dagger ΣΣ

Σ Σ † = [ Σ m 0 0 0 ] [ Σ m − 1 0 0 0 ] = [ I m 0 0 0 ] . \Sigma \Sigma^\dagger = \begin{bmatrix} \Sigma_m & 0 \\ 0 & 0 \end{bmatrix} \begin{bmatrix} \Sigma_m^{-1} & 0 \\ 0 & 0 \end{bmatrix} = \begin{bmatrix} I_m & 0 \\ 0 & 0 \end{bmatrix}. ΣΣ=[Σm000][Σm1000]=[Im000].

第五步:代回 A A † A A^\dagger AA

将结果代回:

A A † = U [ I m 0 0 0 ] U T . A A^\dagger = U \begin{bmatrix} I_m & 0 \\ 0 & 0 \end{bmatrix} U^T. AA=U[Im000]UT.

因为 U U U 是正交矩阵,最终结果为:

A A † = I m × m . A A^\dagger = I_{m \times m}. AA=Im×m.


2. 证明 B T B + λ I B^T B + \lambda I BTB+λI 总是可逆:

第一步:问题背景

给定矩阵 B ∈ R m × n B \in \mathbb{R}^{m \times n} BRm×n,其中 m ≤ n m \leq n mn rank ( B ) < m \text{rank}(B) < m rank(B)<m。需要证明 B T B + λ I B^T B + \lambda I BTB+λI λ > 0 \lambda > 0 λ>0 时总是可逆。

第二步:矩阵 B T B B^T B BTB 的特性

矩阵 B T B B^T B BTB 是对称的,且是半正定的,即:

x T ( B T B ) x ≥ 0 , ∀ x ∈ R n . x^T (B^T B) x \geq 0, \quad \forall x \in \mathbb{R}^n. xT(BTB)x0,xRn.

因此,矩阵 B T B B^T B BTB 的所有特征值 λ i \lambda_i λi 满足 λ i ≥ 0 \lambda_i \geq 0 λi0

第三步:考虑 B T B + λ I B^T B + \lambda I BTB+λI

我们需要证明 B T B + λ I B^T B + \lambda I BTB+λI 是可逆的,即证明其特征值全为非零。

令矩阵 B T B B^T B BTB 的特征分解为:

B T B = Q Λ Q T , B^T B = Q \Lambda Q^T, BTB=QΛQT,

其中:

  • Q Q Q 是正交矩阵,
  • Λ \Lambda Λ B T B B^T B BTB 的特征值矩阵,对角线上为 λ i ≥ 0 \lambda_i \geq 0 λi0

B T B + λ I B^T B + \lambda I BTB+λI 表示为:

B T B + λ I = Q ( Λ + λ I ) Q T . B^T B + \lambda I = Q (\Lambda + \lambda I) Q^T. BTB+λI=Q(Λ+λI)QT.

第四步:分析新的特征值

矩阵 Λ + λ I \Lambda + \lambda I Λ+λI 的特征值是 λ i + λ \lambda_i + \lambda λi+λ,其中 λ > 0 \lambda > 0 λ>0。因此:

λ i + λ > 0 ∀ i . \lambda_i + \lambda > 0 \quad \forall i. λi+λ>0i.

第五步:矩阵的可逆性

如果矩阵的所有特征值都为正,则该矩阵一定是可逆的。因此, B T B + λ I B^T B + \lambda I BTB+λI 是可逆的。


结论

  1. A A † = I m × m A A^\dagger = I_{m \times m} AA=Im×m,适用于任何 A ∈ R m × n A \in \mathbb{R}^{m \times n} ARm×n rank ( A ) = m \text{rank}(A) = m rank(A)=m 的情况。
  2. B T B + λ I B^T B + \lambda I BTB+λI λ > 0 \lambda > 0 λ>0 时是可逆的。

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

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

相关文章

新一代API开发工具,让API调试更快 更简单

新一代API开发工具 代理调试 请求测试一站式解决方案 Reqable Fiddler Charles Postman, 让API调试更快 &#x1f680; 更简单 &#x1f44c; 直接上下载地址 根据系统,下载对应的版本即可 https://reqable.com/zh-CN/download/

详细解析STM32 GPIO引脚的8种模式

目录 一、输入浮空&#xff08;Floating Input&#xff09;&#xff1a;GPIO引脚不连接任何上拉或下拉电阻&#xff0c;处于高阻态 1.浮空输入的定义 2.浮空输入的特点 3.浮空输入的应用场景 4.浮空输入的缺点 5.典型配置方式 6.注意事项 二、输入上拉&#xff08;Inpu…

对于 unix 系统管理员来说,了解 VIM 有多重要?

对于 Unix 系统管理员来说&#xff0c;掌握 VIM 的重要性不言而喻。VIM 作为 Unix 系统中默认的文本编辑器&#xff0c;几乎在所有 Unix 系统中都预装&#xff0c;这使得系统管理员必须熟练使用它来编辑配置文件、编写脚本等。 VIM 强大的功能和灵活性&#xff0c;使得它能够满…

containerd使用

一、ctr命令 1.查看命名空间 ctr namespace ls 2.查看特定命名空间镜像 ctr -n k8s.io images ls 3.查看特定命名空间容器 ctr -n k8s.io container ls 注意&#xff1a;该项与docker不同&#xff0c;container查看容器是所有的容器无论有没有启动&#xff0c;只要创建了的…

Python 数据结构对比:列表与数组的选择指南

文章目录 &#x1f4af;前言&#x1f4af;Python中的列表&#xff08;list&#xff09;和数组&#xff08;array&#xff09;的详细对比1. 数据类型的灵活性2. 性能与效率3. 功能与操作4. 使用场景5. 数据结构选择的考量6. 实际应用案例7. 结论 &#x1f4af;小结 &#x1f4af…

在Q-Studio中进行OTX脚本的开发、仿真与调试

一 背景 现如今&#xff0c;随着车辆中电子器件和软件数量的快速增加&#xff0c;在车辆研发、生产、测试及售后阶段需要进行的车载测试工作越来越多、越来越复杂&#xff0c;呈现指数级增长的趋势。以往常用的手动测试方式已完全无法满足现如今的测试需求了&#xff0c;由此推…

Cursor安装Windows / Ubuntu

一、安装 1、下载软件 2、安装依赖 #安装fuse sudo apt-get install fuse3、将cursor添加到应用程序列表 sudo mv cursor-0.42.5x86_64.AppImage /opt/cursor.appimage #使用自己版本号替换 sudo chmod x /opt/cursor.appimage #给予可执行权限 sudo nano /usr/share/applic…

NLP论文速读(多伦多大学)|利用人类偏好校准来调整机器翻译的元指标

论文速读|MetaMetrics-MT: Tuning Meta-Metrics for Machine Translation via Human Preference Calibration 论文信息&#xff1a; 简介&#xff1a; 本文的背景是机器翻译&#xff08;MT&#xff09;任务的评估。在机器翻译领域&#xff0c;由于不同场景和语言对的需求差异&a…

Docker部署Kafka集群,增加 SASL_SSL认证,并集成到Spring Boot,无Zookeeper版

1&#xff0c;准备好Kafka 镜像包&#xff1a; bitnami/kafka:3.9.0 镜像资源包 2&#xff0c;准备好kafka.keystore.jks 和 kafka.truststore.jks证书 具体操作可参考&#xff1a; Docker部署Kafka SASL_SSL认证&#xff0c;并集成到Spring Boot-CSDN博客 3&#xff0c;配置…

Git 分⽀规范 Git Flow 模型

前言 GitFlow 是一种流行的 Git 分支管理策略&#xff0c;由 Vincent Driessen 在 2010 年提出。它提供了一种结构化的方法来管理项目的开发、发布和维护&#xff0c;特别适合大型和复杂的项目。GitFlow 定义了一套明确的分支模型和工作流程&#xff0c;使得团队成员可以更有效…

shell脚本命令1,保姆级别---清风

声明&#xff1a; 本文的学习内容来源于B站up主“泷羽sec”视频“蓝队基础之网络七层杀伤链”的公开分享&#xff0c;所有内容仅限于网络安全技术的交流学习&#xff0c;不涉及任何侵犯版权或其他侵权意图。如有任何侵权问题&#xff0c;请联系本人&#xff0c;我将立即删除相…

MySQL扩展varchar字段长度能否Online DDL

目录 问题场景 Online DDL 简介 场景复现 DBdoctor快速识别 Online DDL 总结 问题场景 在MySQL数据库中&#xff0c;DDL变更可以通过两种算法实现&#xff1a;Copy算法和In-Place算法。Copy算法会复制整个表&#xff0c;这可能导致长时间的写入阻塞&#xff0c;从而严重影…

低成本出租屋5G CPE解决方案:ZX7981PG/ZX7981PM WIFI6千兆高速网络

刚搬进新租的房子&#xff0c;没有网络&#xff0c;开个热点&#xff1f;续航不太行。随身WIFI&#xff1f;大多是百兆级网络。找人拉宽带&#xff1f;太麻烦&#xff0c;退租的时候也不能带着走。5G CPE倒是个不错的选择&#xff0c;插入SIM卡就能直接连接5G网络&#xff0c;千…

港大ArcLab最新开源DEIO:第一个学习与传统非线性图优化紧密结合的单目事件惯性里程计

原文链接&#xff1a;港大ArcLab最新开源DEIO&#xff1a;第一个学习与传统非线性图优化紧密结合的单目事件惯性里程计 导读 本文介绍了一种名为 DEIO&#xff08;Deep Event Inertial Odometry&#xff09;的新型单目深度事件惯性里程计框架。该方法创新性地将深度学习与传统…

基于麒麟服务器操作系统V10版本,部署Nginx服务、MySql服务搭建PHP环境,实现静态网站平台的搭建。

一、环境准备 关闭防火墙。 查看当前防火墙的状态 systemctl status firewalld Copy 如果防火墙的状态参数是inactive,则防火墙为关闭状态。 如果防火墙的状态参数是active,则防火墙为开启状态。 关闭防火墙。 如果您想临时关闭防火墙,需要运行以下命令: systemctl…

【priority_queue的使用及模拟实现】—— 我与C++的不解之缘(十六)

前言 ​ priority_queue&#xff0c;翻译过来就是优先级队列&#xff0c;但是它其实是我们的堆结构&#xff08;如果堆一些遗忘的可以看一下前面的文章复习一下【数据结构】二叉树——顺序结构——堆及其实现_二叉树顺序结构-CSDN博客&#xff09;&#xff0c;本篇文章就来使用…

在AndroidStudio中新建项目时遇到的Gradle下载慢问题,配置错的按我的来,镜像地址不知道哪个网页找的,最主要下载要快

android-studio-2024.2.1.11-windows Android 移动应用开发者工具 – Android 开发者 | Android Developers https://r4---sn-j5o76n7z.gvt1-cn.com/edgedl/android/studio/install/2024.2.1.11/android-studio-2024.2.1.11-windows.exe?cms_redirectyes&met1731775…

《Java核心技术 卷I》用户界面中首选项API

首选项API 在桌面程序中&#xff0c;通常都会存储用户首选项&#xff0c;如用户最后处理的文件、窗口的最后位置等。 利用Properties类可以很容易的加载和保存程序的配置信息&#xff0c;但有以下缺点&#xff1a; 有些操作系统没有主目录概念&#xff0c;很难为匹配文件找到…

服务器数据恢复—raid5阵列故障导致上层系统分区无法识别的数据恢复案例

服务器数据恢复环境&#xff1a; 某品牌DL380服务器&#xff0c;服务器中三块SAS硬盘组建了一组raid5阵列。服务器安装Windows Server操作系统&#xff0c;划分了3个分区&#xff0c;D分区存放数据库&#xff0c;E分区存放数据库备份。 服务器故障&#xff1a; RAID5阵列中有一…

Linux_shell脚本if语句详细教程

前言 在 Linux Shell 脚本中&#xff0c;if 语句用于基于条件执行命令或代码块。它的基本语法结构如下&#xff1a; if 条件; then# 如果条件为真时执行的代码 elif 另一个条件; then# 如果另一个条件为真时执行的代码 else# 如果所有条件都不成立时执行的代码 fi一、if 语句…