当前位置: 首页 > article >正文

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

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

阻尼伪逆

阻尼伪逆是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.kler.cn/a/402160.html

相关文章:

  • Linux进阶:压缩、解压
  • 首次实现!在Docker容器中运行macOS项目,自动化下载与Web体验
  • 《生成式 AI》课程 第3講 CODE TASK执行文章摘要的机器人
  • Gin路由深入
  • 量化交易系统开发-实时行情自动化交易-4.1.3.A股平均趋向指数(ADX)实现
  • ArkTS组件结构和状态管理
  • 大模型本地部署实践:Ollama+Open-WebUI(MacOS)
  • 鸿蒙中服务卡片数据的获取和渲染
  • 72项!湖北省2024年度第二批省级科技计划项目拟立项项目公示!
  • 基于豆包MarsCode 和 Threejs 实现3D地图可视化
  • 关于Web Component
  • 前端面试笔试(四)
  • 使用Go语言编写一个Web服务器,处理客户端的HTTP请求,并返回相应的HTML页面。
  • 百度AI人脸检测与对比
  • 优选算法--快乐数(快慢指针)循环链表
  • 《物理学进展》
  • koa-body 的详细使用文档
  • Node.js 版本管理的最终答案 Volta
  • windows系统中实现对于appium的依赖搭建
  • Android CALL按键同步切换通话界面上免提和听筒的图标显示
  • Linux进阶:用户、用户组、权限
  • Vue实现响应式导航菜单:桌面端导航栏 + 移动端抽屉式菜单
  • HarmonyOS NEXT应用元服务开发Intents Kit(意图框架服务)习惯推荐方案概述
  • 批量将当前目录里的所有pdf 转化为png 格式
  • 鸿蒙实战:使用显式Want启动Ability
  • 【C++课程学习】:继承:默认成员函数