机器人学、机器视觉与控制 上机笔记(2.1章节)

news2024/9/25 13:26:37

机器人学、机器视觉与控制 上机笔记(2.1章节)

  • 1、前言
  • 2、本篇内容
  • 3、代码记录
    • 3.1、新建se2
    • 3.2、生成坐标系
    • 3.3、将T1表示的变换绘制
    • 3.4、完整绘制代码
    • 3.5、获取点`*`在坐标系1下的表示
    • 3.6、相对坐标获取完整代码
  • 4、结语

1、前言

工作需要,想同时显示出六轴协作臂,一组位姿信息逆解出的八组关节角的效果情况。就想使用MATLAB的机器人工具箱RTB去实现这一需求,辅助数据分析。朋友推荐了《机器人学、机器视觉与控制》这本书,书的作者也是工具箱RTB的作者,就开始拜读补充基础知识,并结合书中的RTB示例代码熟悉RTB的使用。个人使用的matlab2022b版本和10.4版本的RTB,实际操作时发现书本中的示例代码(猜测应该是9版本的RTB,语法未做到向下兼容)在个人使用的环境下,频繁出现报错无法运行的问题。就准备写一个改正后的实机运行记录系列。

2、本篇内容

记录书中第2.1章节中的示例代码,修改后能在10.4版本中正确运行。

3、代码记录

3.1、新建se2

原书中的第一步是用函数se2创建一个齐次变换,原书代码如下:

>> T1 = se2(1, 2, 30 * pi / 180)
T1 = 
     0.8660   -0.5000    1.0000
     0.5000    0.8660    2.0000
          0         0    1.0000

高位版本环境下,运行报错,原因是se2的函数形参变动调整了

>> T1 = se2(1, 2, 30 * pi / 180)
错误使用 matlabshared.spatialmath.internal.SE2Base
Invalid number of arguments. To create an se2, specify 2 or fewer arguments.

出错 se2 (69)
            obj@matlabshared.spatialmath.internal.SE2Base(varargin{:});

下面我们来看看help文档中,高版本的se2函数定义:
se2函数定义
原书中是位移在前,旋转在后,高版本恰恰相反了。因此,新建se2需要修改为(可能步骤有些繁琐,欢迎评论区留言优化):

>> tr = [1, 2]

tr =

     1     2
>> rot = rotz(30)

rot =

    0.8660   -0.5000         0
    0.5000    0.8660         0
         0         0    1.0000

>> T1 = se2(rot(1:2, 1:2), tr)

T1 = 

  se2

    0.8660   -0.5000    1.0000
    0.5000    0.8660    2.0000
         0         0    1.0000

3.2、生成坐标系

这个没有问题,同原书一样即可,生成一个XY轴分别为[0,5]刻度的二维平面坐标系。

>> axis([0 5 0 5]);

生成坐标系

3.3、将T1表示的变换绘制

原书代码如下:

>> trplot2(T1, 'frame', '1', 'color', 'b')

高位版本下,同样运行报错,报错提示如下:

>> trplot2(T1, 'frame', '1', 'color', 'b')
Unable to perform assignment because value of type 'se2' is not convertible to 'double'.

出错 transl (88)
            t1(1:3,4,:) = x';

出错 trplot2 (148)
        if all(size(T) == [3 3]) || norm(transl(T)) < eps

原因:
    无法从 se2 转换为 double。

根据报错提示,T1此时是se2数据类型,而高版本trplot2函数的第一个形参,要求数据类型为double,那么,此处需要手动进行数据类型转换。可以参考该链接: (知乎)matlab中SE3是什么类型,怎么转换成double型矩阵?
经过实际尝试,使用tform函数有效,转换如下:

>> T1_double = tform(T1)

T1_double =

    0.8660   -0.5000    1.0000
    0.5000    0.8660    2.0000
         0         0    1.0000

工作区中也可以观察到,数据类型变换成功。
T1转换为T1_double
这边需要再多说几句,知乎回答中提及的T1.T方式尝试过,报错未识别类 'se2' 的方法、属性或字段 'T'。,提及的另一种double(T1)强制转换的方式也同样以失败告终。之后翻阅了tform函数的文档看了一下,该函数应该是2022b版本以后引入的。
tform引入时间
最终运行效果如下,记得补加上hold on,原书中缺失,不然坐标轴刻度变化,不再是[0,5]:

>> T1_double = tform(T1)

T1_double =

    0.8660   -0.5000    1.0000
    0.5000    0.8660    2.0000
         0         0    1.0000
>> hold on         
>> trplot2(T1_double, 'frame', '1', 'color', 'b')

绘制T1变化

3.4、完整绘制代码

>> tr = [1, 2]

tr =

     1     2



>> rot = rotz(30)

rot =

    0.8660   -0.5000         0
    0.5000    0.8660         0
         0         0    1.0000

>> T1 = se2(rot(1:2, 1:2), tr)

T1 = 

  se2

    0.8660   -0.5000    1.0000
    0.5000    0.8660    2.0000
         0         0    1.0000


>> axis([0 5 0 5]);
>> T1_double = tform(T1)

T1_double =

    0.8660   -0.5000    1.0000
    0.5000    0.8660    2.0000
         0         0    1.0000

>> hold on
>> trplot2(T1_double, 'frame', '1', 'color', 'b')
>> rot2 = rotz(0)

rot2 =

     1     0     0
     0     1     0
     0     0     1

>> tr2 = [2, 1]

tr2 =

     2     1

>> T2 = se2(rot2(1:2, 1:2), tr2)

T2 = 

  se2

     1     0     2
     0     1     1
     0     0     1

>> T2_double = tform(T2)

T2_double =

     1     0     2
     0     1     1
     0     0     1

>> hold on
>> trplot2(T2_double, 'frame', '2', 'color', 'r');
>> T3 = T1 * T2

T3 = 

  se2

    0.8660   -0.5000    2.2321
    0.5000    0.8660    3.8660
         0         0    1.0000

>> T3_double = tform(T3)

T3_double =

    0.8660   -0.5000    2.2321
    0.5000    0.8660    3.8660
         0         0    1.0000

>> hold on;
>> trplot2(T3_double, 'frame', '3', 'color', 'g');
>> T4 = T2 * T1

T4 = 

  se2

    0.8660   -0.5000    3.0000
    0.5000    0.8660    3.0000
         0         0    1.0000

>> T4_double = tform(T4)

T4_double =

    0.8660   -0.5000    3.0000
    0.5000    0.8660    3.0000
         0         0    1.0000

>> hold on
>> trplot2(T4_double, 'frame', '4', 'color', 'c')
>> hold on;
>> P = [3; 2];
>> plot_point(P, '*');

最终效果如下:
最终效果

3.5、获取点*在坐标系1下的表示

原书中的inv,在高版本使用时同样需要注意数据类型一致的问题:

% 原书中使用的变量名为P1
% 个人使用P_to_T1替换,感觉变量名意义更清晰明了些
>> P_to_T1 = inv(T1) * [P; 1]
错误使用  .* 
times, .* requires both operands to be transformations or rotations (of the same type).

出错  *  (18)
    out = obj1 .* obj2;

报错原因为左侧inv(T1)的结果仍为se2类型,需要变为double类型。验证如下:

>> Test = inv(T1)

Test = 

  se2

    0.8660    0.5000   -1.8660
   -0.5000    0.8660   -1.2321
         0         0    1.0000

>> Test_double = tform(Test)

Test_double =

    0.8660    0.5000   -1.8660
   -0.5000    0.8660   -1.2321
         0         0    1.0000

>> P_to_T1 = Test_double * [P; 1]

P_to_T1 =

    1.7321
   -1.0000
    1.0000

成功获取,点*相对于坐标系{1}的表示为(1.7321,-1.0000)。

3.6、相对坐标获取完整代码

>> Test = inv(T1)

Test = 

  se2

    0.8660    0.5000   -1.8660
   -0.5000    0.8660   -1.2321
         0         0    1.0000

>> Test_double = tform(Test)

Test_double =

    0.8660    0.5000   -1.8660
   -0.5000    0.8660   -1.2321
         0         0    1.0000

>> P_to_T1 = Test_double * [P; 1]

P_to_T1 =

    1.7321
   -1.0000
    1.0000

>> h2e(Test_double * e2h(P))

ans =

    1.7321
   -1.0000

>> homtrans(Test_double, P)

ans =

    1.7321
   -1.0000

>> P_to_T2 = homtrans(tform(inv(T2)), P)

P_to_T2 =

     1
     1

4、结语

平时工作为机械臂软件开发,书本中的matlab示例代码跑通的感觉还是挺舒服的。2.1节总体评价不错,通过二维演示了三维常见的齐次变换大致的使用思想。减去Z的维度,确实更方便初学者的理解。工作一年多,回过头来再看这些内容,也受益匪浅。

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

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

相关文章

HTTP协议笔记

HTTP协议笔记 参考&#xff1a; &#xff08;建议精读&#xff09;HTTP灵魂之问&#xff0c;巩固你的 HTTP 知识体系 《透视 HTTP 协议》——chrono 目录&#xff1a; 1、说说你对HTTP的了解吧。  1. HTTP状态码。  2. HTTP请求头和响应头&#xff0c;其中包括cookie、跨域响…

AcWing 1238 日志统计(双指针算法)

题目概述 小明维护着一个程序员论坛。现在他收集了一份”点赞”日志&#xff0c;日志共有 N 行。 其中每一行的格式是&#xff1a; ts id表示在 ts 时刻编号 id 的帖子收到一个”赞”。 现在小明想统计有哪些帖子曾经是”热帖”。 如果一个帖子曾在任意一个长度为 D 的时间段…

《MySQL 简易速速上手小册》第1章:MySQL 基础和安装(2024 最新版)

文章目录 1.1 MySQL 概览&#xff1a;版本、特性和生态系统1.1.1 基础知识1.1.2 重点案例1.1.3 拓展案例 1.2 安装和配置 MySQL1.2.1 基础知识1.2.2 安装步骤1.2.3 重点案例1.2.4 拓展案例 1.3 基础命令和操作1.3.1 基础知识1.3.2 重点案例1.3.3 拓展案例 1.1 MySQL 概览&#…

JUC ThreadLocal

文章目录 ThreadLocal ^1.2^ 的作用使用场景示例1ThreadLocal 变量初始化ThreadLocal 源码分析源码分析总结 内存泄漏问题示例说明new Thread 方式 执行结果pool 方式执行结果原因解析总结 ThreadLocal 1.2 的作用 ThreadLocal 为每个线程提供单独的变量副本。每个变量副本都是…

史上最全嵌入式(学习路线、应用开发、驱动开发、推荐书籍、软硬件基础)

废话不多说直接上思维导图&#xff01; 如果有觉得图片看不清楚的&#xff0c;有疑问的&#xff0c;可在评论区进行留言&#xff01; 群号&#xff1a; 228447240 嵌入式总括 嵌入式书籍推荐 嵌入式软件知识 嵌入式硬件知识 嵌入式应用开发 嵌入式驱动开发 嵌入式视频推荐: 韦…

WebSocket相关问题

1.WebSocket是什么&#xff1f;和HTTP的区别&#xff1f; WebSocket是一种基于TCP连接的全双工通信协议&#xff0c;客户端和服务器仅需要一次握手&#xff0c;两者之间就可以创建持久性的连接&#xff0c;并且支持双向数据的传输。WebSocket和HTTP都是基于TCP的应用层协议&am…

【PyTorch][chapter 15][李宏毅深度学习][Neighbor Embedding-LLE]

前言&#xff1a; 前面讲的都是线性降维&#xff0c;本篇主要讨论一下非线性降维. 流形学习&#xff08;mainfold learning&#xff09;是一类借鉴了拓扑流行概念的降维方法. 如上图,欧式距离上面 A 点跟C点更近&#xff0c;距离B 点较远 但是从图形拓扑结构来看&#xff0c; …

书生·浦语大模型全链路开源体系

1&#xff0c;简述大模型的定义与特点&#xff1a; 大模型是指参数数量大于10亿的模型&#xff0c;它的特点包括&#xff1a;模型规模大&#xff0c;数据规模大&#xff0c;计算规模大和任务数量 2. 分析大模型成为通用人工智能的重要途径的原因&#xff1a; 大模型能够从大…

2023年的技术变革,我不是破坏大环境的人

文章目录 前言2023年的技术变革人工智能的崛起元宇宙的跌落物联网的渗入 技术变革的背后技术变革的影响积极的影响负面的影响 技术变革带来的思考 前言 2023无疑是一个充满变革和创新的一年&#xff0c;这背后离不开技术的发展和进步。不论是人工智能的崛起&#xff0c;还是元…

[word] word表格内容自动编号 #经验分享#微信#其他

word表格内容自动编号 在表格中的内容怎么样自动编号&#xff1f;我们都知道Word表格和Excel表格有所不同&#xff0c;Excel表格可以轻松自动编号&#xff0c;那么在Word表格中如何自动编号呢&#xff1f; 1、选中内容后&#xff0c;点击段落-自动编号&#xff0c;选择其中一…

数据结构——C/栈和队列

&#x1f308;个人主页&#xff1a;慢了半拍 &#x1f525; 创作专栏&#xff1a;《史上最强算法分析》 | 《无味生》 |《史上最强C语言讲解》 | 《史上最强C练习解析》 &#x1f3c6;我的格言&#xff1a;一切只是时间问题。 ​ 1.栈 1.1栈的概念及结构 栈&#xff1a;一种特…

计算机缺失concrt140.dll怎么修复?分享5种有效的修复方法

在计算机系统运行过程中&#xff0c;如果发现无法找到“concrt140.dll”这个特定的动态链接库文件&#xff0c;可能会引发一系列问题和故障。首先&#xff0c;我们需要了解“concrt140.dll”是Microsoft Visual Studio中用于实现并行计算框架的重要组件&#xff0c;它的缺失会导…

HarmonyOS 鸿蒙应用开发(十、第三方开源js库移植适配指南)

在前端和nodejs的世界里&#xff0c;有很多开源的js库&#xff0c;通过npm(NodeJS包管理和分发工具)可以安装使用众多的开源软件包。但是由于OpenHarmony开发框架中的API不完全兼容V8运行时的Build-In API&#xff0c;因此三方js库大都需要适配下才能用。 移植前准备 建议在适…

RabbitMQ的延迟队列实现[死信队列](笔记二)

上一篇已经讲述了实现死信队列的rabbitMQ服务配置&#xff0c;可以点击: RabbitMQ的延迟队列实现(笔记一) 目录 搭建一个新的springboot项目模仿订单延迟支付过期操作启动项目进行测试 搭建一个新的springboot项目 1.相关核心依赖如下 <dependency><groupId>org.…

Linux | 进度条 | Linux简单小程序 | 超级简单 | 这一篇就够了

进度条—实例示范 在学习了基本的Linux指令&#xff0c;Linux上vim编译器等等之后&#xff0c;我们就来学习写代码喽~ 今天就给大家详细讲解一下进度条的编写&#xff0c;需要的效果如下图&#xff1a; 进度条—必备知识 回车和换行 在我们学习编程语言中&#xff0c;经常…

【力扣 - 回文链表】

题目描述 给你一个单链表的头节点 head &#xff0c;请你判断该链表是否为回文链表。如果是&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 提示&#xff1a; 链表中节点数目在范围[1, 100000] 内 0 < Node.val < 9 方法一&#xff1a;将值复制到数…

jsp教材管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 JSP 教材管理系统是一套完善的java web信息管理系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为Mysql5.0&…

网工内推 | 高级网工,IE认证优先,最高15K,五险一金

01 丰沃创新(北京)科技有限公司 招聘岗位&#xff1a;高级网络工程师 职责描述&#xff1a; 1. 主要负责移动营运商数据中心机房网络的维护工作&#xff1b; 2. 负责防火墙策略调整&#xff0c;负责交换机路由器等网络设备的配置&#xff1b; 3. 负责云专线的入网配置&#…

07:Kubectl 命令详解|K8S资源对象管理|K8S集群管理(重难点)

Kubectl 命令详解&#xff5c;K8S资源对象管理&#xff5c;K8S集群管理 kubectl管理命令kubectl get 查询资源常用的排错命令kubectl run 创建容器 POD原理pod的生命周期 k8s资源对象管理资源文件使用资源文件管理对象Pod资源文件deploy资源文件 集群调度的规则扩容与缩减集群更…