机器人学、机器视觉与控制 上机笔记(第一版译文版 2.1章节)

机器人学、机器视觉与控制 上机笔记(第一版译文版 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的维度,确实更方便初学者的理解。工作一年多,回过头来再看这些内容,也受益匪浅。

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

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

相关文章

【前端web入门第四天】03 显示模式+综合案例热词与banner效果

文章目录: 1. 显示模式 1.1 块级元素,行内元素,行内块元素 1.2 转换显示模式 综合案例 综合案例一 热词综合案例二 banner效果 1. 显示模式 什么是显示模式 标签(元素)的显示方式 标签的作用是什么? 布局网页的时候&#xff0c;根据标签的显示模式选择合适的标签摆放内容。…

编码安全风险是什么,如何进行有效的防护

2011年6月28日晚20时左右&#xff0c;新浪微博突然爆发XSS&#xff0c;大批用户中招&#xff0c;被XSS攻击的用户点击恶意链接后并自动关注一位名为HELLOSAMY的用户&#xff0c;之后开始自动转发微博和私信好友来继续传播恶意地址。不少认证用户中招&#xff0c;也导致该XSS被更…

21、数据结构/单向循环链表练习20240203

一、请编程实现单向循环链表的头插&#xff0c;头删、尾插、尾删。 二、请编程实现单向循环链表约瑟夫环 约瑟夫环&#xff1a;用循环链表编程实现约瑟夫问题 n个人围成一圈&#xff0c;从某人开始报数1, 2, …, m&#xff0c;数到m的人出圈&#xff0c;然后从出圈的下一个人…

pytorch入门第一天

今天作为入门pytorch的第一天。打算记录每天学习pytorch的一些理解和笔记&#xff0c;以用来后面回顾。当然如果能帮到和我一样的初学者&#xff0c;那也是不胜荣幸。作为一名初学者&#xff0c;难免有些地方会现错误&#xff0c;欢迎各位大佬指出 预备知识 这里主要介绍pyto…

gtkmm4 应用程序使用 CSS 样式

文章目录 前言css选择器css文件示例源代码效果 前言 程序样式和代码逻辑分离开 使代码逻辑更可观 css选择器 Cambalache提供了两种css-classes 相当于css里的类名:class“类名”css-name 相当于css里的标签名:spin div p 啥的 如上我设置了这个按钮控件的类名为testButton 标…

基于Chrome插件的Chatgpt对话无损导出markdown格式(Typora完美显示)

刚刚提交插件到Chrome插件商店正在审核&#xff0c;想尝试的可以先使用&#xff1a; https://github.com/thisisbaiy/ChatGPT-To-Markdown-google-plugin/tree/main 我将源代码上传至了GitHub&#xff0c;欢迎star, IssueGoogle插件名称为&#xff1a;ChatGPT to MarkDown plus…

元宇宙虚拟数字人实训室:推动高校培养创新技术人才

随着元宇宙时代的到来&#xff0c;虚拟数字人技术逐渐成为当下火热的产业赛道之一。虚拟数字人涉及了计算机、数字媒体、市场营销等学科技术领域&#xff0c;高校可以通过搭建元宇宙虚拟数字人实训室&#xff0c;有效培养对元宇宙行业的专业化理解和研究能力的专业型创新人才。…

Python中的数据类型

如果说python中的数据类型,那我们要从标准数据类型说起,在python中标准数据类型如下: 数字类型: 数字数据类型用于存储数值。 他们是不可改变的数据类型&#xff0c;这意味着改变数字数据类型会分配一个新的对象。 在python2.X中数据类型分的比较多,有int(有符号整型),long(…

原生JS使用PrintJs进行表格打印 -- 遇到的问题总结

需求1&#xff1a;表格自动分页之后&#xff0c;表头在每一页都需要显示 html中表头增加 thead 标签 css样式新增&#xff1a; thead {display: table-header-group; /* 这个属性使thead总是在新的page-break之后重新开始 */ }需求2&#xff1a;表格自动分页之后&#xff0c;…

MySQL优化器

优化器 MySQL存储引擎中存在了一个可插拔的优化器OPTIMIZER_TRACE&#xff0c;可以看到内部查询计划的TRACE信息&#xff0c;从而可以知道MySQL内部执行过程 查询优化器状态 show variables like optimizer_trace;Variable_name Valueoptimizer_trace enabledoff,one_lineoff…

【数据结构】二叉树的顺序结构及链式结构

目录 1.树的概念及结构 1.1树的概念 1.2树的相关概念 ​编辑 1.3树的表示 1.4树在实际中的运用&#xff08;表示文件系统的目录树结构&#xff09; 2.二叉树概念及结构 2.1二叉树的概念 2.2现实中的二叉树 ​编辑 2.3特殊的二叉树 2.4二叉树的性质 2.5二叉树的存储结…

2023爱分析·通用大模型市场厂商评估报告:出门问问

01 研究范围定义 研究范围&#xff1a; 大模型是指通过在海量数据上依托强大算力资源进行训练后能完成大量不同下游任务的模型。2023年以来&#xff0c;ChatGPT引爆全球大模型市场。国内众多大模型先后公测&#xff0c;众多互联网领军者投身大模型事业&#xff0c;使得大模型…

微信小程序(三十八)滚动容器

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.滚动触底事件 2.下拉刷新事件 源码&#xff1a; index.wxml <view class"Area"> <!-- scroll-y 垂直滚动refresher-enabled 允许刷新bindrefresherrefresh 绑定刷新作用函数bindscrollto…

SolidWorks的抽壳

抽壳在建模的时候是比较常见的要求&#xff0c;这里废话不多说&#xff0c;直接开始实例操作。 文章目录 一、规则实体抽壳2、多面抽壳3、空心化抽壳 二、椎体抽壳三、不规则实体抽壳1、不规则实体2、部分实体抽壳 文章随时可能更新&#xff0c;请关注文章原出处&#xff1a; …

【GAMES101】Lecture 19 透镜

目录 理想的薄透镜 模糊 利用透镜模型做光线追踪 景深&#xff08;Depth of Field&#xff09; 理想的薄透镜 在实际的相机中都是用的一组透镜来作为这个镜头 这个因为真实的棱镜无法将光线真正聚焦到一个点上&#xff0c;它只能聚在一堆上 所以方便研究提出了一种理想化的…

vue3的常用功能

文章目录 一、前言二、自动注册全局组件2.1、自动注册components目录下所有vue组件并以组件的文件名为组件的名称2.2、使用这个插件2.3、为全局组件添加类型提示 三、函数式图片预览四、手动封装 svgIcon 组件五、封装拖拽钩子函数六、vscode 中 vue3 代码片段七、最后 一、前言…

C#静态数组删除数组元素不改变数组长度 vs 动态数组删除数组元素改变数组长度

目录 一、使用的方法 1.对静态数组删除指定长度并不改变数长度的方法 &#xff08;1&#xff09;静态数组 &#xff08;2&#xff09;对静态数组删除元素不得改变其长度 2.对动态数组删除指定长度并改变数长度的方法 &#xff08;1&#xff09;动态数组 &#xff08;2&a…

Log4j2漏洞(二)3种方式复现反弹shell

★★免责声明★★ 文章中涉及的程序(方法)可能带有攻击性&#xff0c;仅供安全研究与学习之用&#xff0c;读者将信息做其他用途&#xff0c;由Ta承担全部法律及连带责任&#xff0c;文章作者不承担任何法律及连带责任。 1、前言 明天就是除夕了&#xff0c;提前祝大家&#x…

2023年06月CCF-GESP编程能力等级认证C++编程二级真题解析

一、单选题(每题2分,共30分) 第1题 高级语言编写的程序需要经过以下()操作,可以生成在计算机上运行的可执行代码。 A. 编辑 B. 保存 C. 调试 D. 编译 答案:D 第2题 能够实现下面流程图功能的伪代码是( )。 A. if 条件判断 then 语句块 B. if 条件判断 then 什么…

使用x86架构+Nvidia消费显卡12G显存,搭建智能终端,将大模型本地化部署,说不定是未来方向,开源交互机器人设计

1&#xff0c;大模型本地部署 视频说明地址&#xff1a; https://www.bilibili.com/video/BV1BF4m1u769/ 【创新思考】&#xff08;1&#xff09;&#xff1a;使用x86架构Nvidia消费显卡12G显存&#xff0c;搭建智能终端&#xff0c;将大模型本地化部署&#xff0c;语音交互机…