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

news2024/12/24 0:20:01

Lesson 5

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

代码-TwoDofPlanarRobot.m

表示一个 2 自由度平面机器人。该类包含构造函数、计算正向运动学模型的函数、计算平移雅可比矩阵的函数,以及在二维空间中绘制机器人的函数。

classdef TwoDofPlanarRobot
    %TwoDofPlanarRobot - 表示一个 2 自由度平面机器人类
    
    properties (Access=private)
        % The lengths of the two links, in meters
        l1
        l2
    end
    
    methods
        function obj = TwoDofPlanarRobot(l1, l2)
            % TwoDofPlanarRobot creates a 2-DoF planar robot with link lengths l1 and l2
            obj.l1 = l1;
            obj.l2 = l2;
        end
        
        function t_w_r = fkm(obj, theta1, theta2)
            % fkm calculates the FKM for the 2-DoF planar robot.
            % Input: theta1, theta2 - Joint angles in radians
            
            % Include the namespace inside the function
            include_namespace_dq
            
            % Rotation and translation for the first link
            x_w_1 = cos(theta1/2.0) + k_*sin(theta1/2.0);
            x_1_r1 = 1 + 0.5*E_*i_*obj.l1;
            x_w_r1 = x_w_1 * x_1_r1;
            
            % Rotation and translation for the second link
            x_r1_r2 = cos(theta2/2.0) + k_*sin(theta2/2.0);
            x_r2_r = 1 + 0.5*E_*i_*obj.l2;
            x_w_r = x_w_r1 * x_r1_r2 * x_r2_r;
            
            % Get the translation (end-effector position)
            t_w_r = translation(x_w_r);
        end
        
        function Jt = translation_jacobian(obj, theta1, theta2)
            % Calculates the translation Jacobian of the 2-DoF planar robot.
            
            % Include the namespace inside the function
            include_namespace_dq
            
            % Partial derivatives of the end effector position
            j1 = obj.l1*(-i_*sin(theta1) + j_*cos(theta1)) + obj.l2*(-i_*sin(theta1+theta2) + j_*cos(theta1+theta2));
            j2 = obj.l2*(-i_*sin(theta1+theta2) + j_*cos(theta1+theta2));
            
            % Construct the Jacobian matrix
            Jt = [vec3(j1), vec3(j2)];
        end
        
        function plot(obj, theta1, theta2)
            % Plot the 2-DoF planar robot in the xy-plane
            
            % Calculate the positions of each joint and the end effector
            x1 = obj.l1 * cos(theta1);
            y1 = obj.l1 * sin(theta1);
            x2 = x1 + obj.l2 * cos(theta1 + theta2);
            y2 = y1 + obj.l2 * sin(theta1 + theta2);
            
            % Plot the links
            plot([0 x1 x2], [0 y1 y2], 'r-o', 'LineWidth', 2, 'MarkerSize', 6)
            hold on
            % Mark the base with an 'o'
            plot(0, 0, 'ko', 'MarkerSize', 8, 'MarkerFaceColor', 'k')
            % Mark the end effector with an 'x'
            plot(x2, y2, 'bx', 'MarkerSize', 8, 'LineWidth', 2)
            hold off
            title('The Two DoF planar robot in the xy-plane')
            xlim([-obj.l1 - obj.l2, obj.l1 + obj.l2])
            xlabel('x [m]')
            ylim([-obj.l1 - obj.l2, obj.l1 + obj.l2])
            ylabel('y [m]')
            grid on
        end
    end
end

可视化

% Length
l1 = 1;
l2 = 1;

% Create robot
two_dof_planar_robot = TwoDofPlanarRobot(l1,l2);

% Choose theta freely
theta1 =3.55;%添加滑动条进行修改
theta2 =-4.19;%添加滑动条进行修改

% Get the fkm, based on theta
t_w_r = two_dof_planar_robot.fkm(theta1,theta2)

% Plot the robot in the xy-plane
two_dof_planar_robot.plot(theta1,theta2);

代码-two_dof_planar_robot_position_control.m

实现了一个 2 自由度平面机器人的任务空间位置控制,旨在让机器人的末端执行器移动到指定的目标位置 (tx, ty),直到误差达到设定的阈值为止。

clear all;
close all;

% Length
l1 = 1;
l2 = 1;

% Sampling time [s]
tau = 0.001; 

% Control threshold [m/s]
control_threshold = 0.01;

% Control gain
eta = 200;

% Create robot
two_dof_planar_robot = TwoDofPlanarRobot(l1,l2);

% Initial joint value [rad]
theta1 = 0;
theta2 = pi/2;
theta=[theta1;theta2];

% Desired task-space position
% tx [m]
tx =0;
% ty [m]
ty =2;

% Compose the end effector position into a pure quaternion
td = DQ([tx ty 0]);

% Position controller. The simulation ends when the 
% derivative of the error is below a threshold
time = 0;
t_error_dot = DQ(1); % Give it an initial high value
t_error = DQ(1); % Give it an initial high value
while norm(vec4(t_error_dot)) > control_threshold
    % Get the current translation
    t = two_dof_planar_robot.fkm(theta(1),theta(2));
    
    % Calculate the error and old error
    t_error_old = t_error;
    t_error = (t-td);
    t_error_dot = (t_error-t_error_old)/tau;
    
    % Get the translation jacobian, based on theta
    Jt = two_dof_planar_robot.translation_jacobian(theta(1),theta(2));
    
    % Calculate the IDKM
    theta_dot = -eta*pinv(Jt)*vec3(t_error);
    
    % Move the robot
    theta = theta + theta_dot*tau;
    
    % Plot the robot
    two_dof_planar_robot.plot(theta(1),theta(2))
    
    % Plot the desired position
    hold on
    plot(tx,ty,'bx')
    hold off
    
    % [For animations only]
    drawnow; % [For animations only] Ask MATLAB to draw the plot now
    pause(0.001) % [For animations only] Pause so that MATLAB has enough time to draw the plot
    
end

在这里插入图片描述
DQ(1) 表示创建了一个特殊的双四元数对象,用来初始化误差和误差导数。这一初始化操作仅仅是为了确保控制循环在开始时能正确进入,不会因为初始误差太小而导致循环直接退出。

  • DQ(1)DQ Robotics 中表示一个双四元数,初始值为 1。它是单位双四元数,通常表示没有旋转或平移,即一个默认、标准的双四元数。这一数值用于初始化误差和误差导数,并不意味着其实际值很大,而是让程序有一个初始化的起点。

  • DQ Robotics 中,通过给 t_errort_error_dot 初始化为 DQ(1),可以确保循环一开始不会因为误差值太小而退出。只要在后续的计算中计算出真实的误差,循环即可继续执行。

作用总结

  • DQ(1) 的作用是初始化,不会因为值太小而导致不进入循环;
  • 代码后续将实际误差值更新为 t_errort_error_dot,从而让控制逻辑正常工作。

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

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

相关文章

Uniapp 引入 Android aar 包 和 Android 离线打包

需求: 原生安卓 apk 要求嵌入到 uniapp 中,并通过 uniapp 前端调起 app 的相关组件。 下面手把手教你,从 apk 到 aar,以及打包冲突到如何运行,期间我所遇到的问题都会 一 一 进行说明,相关版本以我文章内为…

你可以通过以下步骤找到并打开 **Visual Studio 开发者命令提示符**:

你可以通过以下步骤找到并打开 Visual Studio 开发者命令提示符: 1. 通过开始菜单查找 打开 开始菜单(点击屏幕左下角的 Windows 图标)。在搜索框中输入 Developer Command Prompt。你应该看到以下几种选项(具体取决于你的 Visu…

北京大学c++程序设计听课笔记101

基本概念 程序运行期间,每个函数都会占用一段连续的内存空间。而函数名就是该函数所占内存区域的起始地址(也称“入口地址”)。我们可以将函数的入口地址赋给一个指针变量,使该指针变量指向该函数。然后通过指针变量就可以调用这个…

(时序论文阅读)TimeMixer: Decomposable Multiscale Mixing for Time Series Forecasting

来源论文iclr2024 论文地址:https://arxiv.org/abs/2405.14616 源码地址: https://github.com/kwuking/TimeMixer 背景 数据是有连续性,周期性,趋势性的。我们这篇文章主要围绕的是用MLP结构来预测数据的周期性具体为&#xff…

Springboot 使用EasyExcel导出含图片并设置样式的Excel文件

Springboot 使用EasyExcel导出含图片并设置样式的Excel文件 Excel导出系列目录:★★★★尤其注意:引入依赖创建导出模板类逻辑处理controllerservice 导出效果总结 Excel导出系列目录: 【Springboot 使用EasyExcel导出Excel文件】 【Springb…

【论文分享】基于街景图像识别和深度学习的针对不同移动能力老年人的街道步行可达性研究——以南京成贤街社区为例

全球老龄化趋势加剧, 许多城市中老年人数量不断增加,而现有街道和社区基础设施往往未能满足其步行安全和便利需求。本次我们给大家带来一篇SCI论文的全文翻译,该论文通过探讨不同步行能力的老年人对城市步行环境的需求,提供了关于如何改善城市…

LM2 : A Simple Society of Language Models Solves Complex Reasoning

文章目录 题目摘要简介相关工作方法论实验结果结论局限性 题目 LM2:简单的语言模型社会解决复杂推理问题 论文地址:https://aclanthology.org/2024.emnlp-main.920/ 项目地址: https://github.com/LCS2-IIITD/Language_Model_Multiplex 摘要…

【因果分析方法】MATLAB计算Liang-Kleeman信息流

【因果分析方法】MATLAB计算Liang-Kleeman信息流 1 Liang-Kleeman信息流2 MATLAB代码2.1 函数代码2.2 案例参考Liang-Kleeman 信息流(Liang-Kleeman Information Flow)是由 Liang 和 Kleeman 提出的基于信息论的因果分析方法。该方法用于量化变量之间的因果关系,通过计算信息…

[含文档+PPT+源码等]精品基于springboot实现的原生Andriod手机使用管理软件

软件开发环境及开发工具: 数据库管理工具:phpstudy/Navicat或者phpstudy/sqlyog 开发工具:Android Studio 后台管理系统涉及技术: 后台使用框架:Springboot 前端使用技术:Vue,HTML5,CSS3、JavaScript等…

(三十三)队列(queue)

文章目录 1. 队列(queue)1.1 定义1.2 函数1.3 习题1.3.1 例题(周末舞会) 2. 双向队列(deque)2.1 定义2.2 函数2.3 题目2.3.1 例题(打BOSS) 1. 队列(queue) 队…

常用数据类型

1.数值类型 分为整型和浮点型 double(3,1);长度是3,小数点后是1,比如99.5,10.0,20.8 这里的float和double与java中的类似,都是IEEE 754标准的浮点数,精度会丢失,存在一定误差&#…

Vue3 -- 集成sass【项目集成5】

集成sass&#xff1a; 看过博主的 配置styleLint工具应该已经安装过 sass sass-loader 了&#xff0c;所以我们只需要加上我们的 lang"scss"即可。 <style scoped lang"scss"></style>给项目添加全局样式文件&#xff1a; 在src文件夹下创建…

【云原生系列--Longhorn的部署】

Longhorn部署手册 1.部署longhorn longhorn架构图&#xff1a; 1.1部署环境要求 kubernetes版本要大于v1.21 每个节点都必须装open-iscsi &#xff0c;Longhorn依赖于 iscsiadm主机为 Kubernetes 提供持久卷。 apt-get install -y open-iscsiRWX 支持要求每个节点都安装 N…

Springboot集成ElasticSearch实现minio文件内容全文检索

一、docker安装Elasticsearch &#xff08;1&#xff09;springboot和Elasticsearch的版本对应关系如下&#xff0c;请看版本对应&#xff1a; 注意安装对应版本&#xff0c;否则可能会出现一些未知的错误。 &#xff08;2&#xff09;拉取镜像 docker pull elasticsearch:7…

Diff 算法的误判

起源&#xff1a; 设想一下&#xff0c;假如你桌面上的文件都没有文件名&#xff0c;取而代之的是&#xff0c;你使用通过文件的位置顺序即index来区分它们———第一个文件&#xff0c;第二个文件&#xff0c;以此类推。也许这种方式可行&#xff0c;可是一旦你删除了其中的一…

D69【 python 接口自动化学习】- python 基础之数据库

day69 Python 执行 SQL 语句 学习日期&#xff1a;20241115 学习目标&#xff1a; MySQL 数据库&#xfe63;- Python连接redis 学习笔记&#xff1a; redis数据库的用途 使用Python访问redis数据库 使用Python对redis数据库进行读写操作 总结 1. redis是一款高性能的键…

飞书文档只读限制复制

飞书文档只读限制复制 场景描述解决方式插件安装测试 场景描述 当使用飞书时&#xff0c;可能会存在无对方文档编辑/管理权限&#xff0c;对方只给自己开放只读权限的时候&#xff0c;此时如果文档较重要&#xff0c;需要本地保存一份&#xff0c;但是又无法复制文档或直接屏蔽…

[每周一更]-(第123期):模拟面试|消息队列面试思路解析

文章目录 22|消息队列:消息队列可以用来解决什么问题?1. 你用过消息队列吗?主要用来解决什么问题?异步、削峰和解耦你能各举一个例子吗?2. 你用的是哪个消息队列?为什么使用它而不用别的消息队列?3. 为什么你一定要用消息队列?不用行不行?不用有什么缺点?4. 在对接多…

npm list @types/node 命令用于列出当前项目中 @types/node 包及其依赖关系

文章目录 作用示例常用选项示例命令注意事项 1、实战举例**解决方法**1. **锁定唯一的 types/node 版本**2. **清理依赖并重新安装**3. **设置 tsconfig.json 的 types**4. **验证 Promise 类型支持** **总结** npm list types/node 命令用于列出当前项目中 types/node 包及其…

使用 DBSCAN(基于密度的聚类算法) 对二维数据进行聚类分析

代码功能 生成数据&#xff1a; 使用 make_moons 方法生成一个非线性分布的二维数据集&#xff0c;模拟月亮形状的两个半环形分布&#xff0c;同时添加一定的噪声。 数据标准化&#xff1a; 使用 StandardScaler 对数据进行标准化处理&#xff0c;使不同特征的值具有相同的…