机器人学、机器视觉与控制 上机笔记(第一版译文版 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.00000.5000    0.8660    2.00000         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         00.5000    0.8660         00         0    1.0000>> T1 = se2(rot(1:2, 1:2), tr)T1 = se20.8660   -0.5000    1.00000.5000    0.8660    2.00000         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.00000.5000    0.8660    2.00000         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.00000.5000    0.8660    2.00000         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         00.5000    0.8660         00         0    1.0000>> T1 = se2(rot(1:2, 1:2), tr)T1 = se20.8660   -0.5000    1.00000.5000    0.8660    2.00000         0    1.0000>> axis([0 5 0 5]);
>> T1_double = tform(T1)T1_double =0.8660   -0.5000    1.00000.5000    0.8660    2.00000         0    1.0000>> hold on
>> trplot2(T1_double, 'frame', '1', 'color', 'b')
>> rot2 = rotz(0)rot2 =1     0     00     1     00     0     1>> tr2 = [2, 1]tr2 =2     1>> T2 = se2(rot2(1:2, 1:2), tr2)T2 = se21     0     20     1     10     0     1>> T2_double = tform(T2)T2_double =1     0     20     1     10     0     1>> hold on
>> trplot2(T2_double, 'frame', '2', 'color', 'r');
>> T3 = T1 * T2T3 = se20.8660   -0.5000    2.23210.5000    0.8660    3.86600         0    1.0000>> T3_double = tform(T3)T3_double =0.8660   -0.5000    2.23210.5000    0.8660    3.86600         0    1.0000>> hold on;
>> trplot2(T3_double, 'frame', '3', 'color', 'g');
>> T4 = T2 * T1T4 = se20.8660   -0.5000    3.00000.5000    0.8660    3.00000         0    1.0000>> T4_double = tform(T4)T4_double =0.8660   -0.5000    3.00000.5000    0.8660    3.00000         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 = se20.8660    0.5000   -1.8660-0.5000    0.8660   -1.23210         0    1.0000>> Test_double = tform(Test)Test_double =0.8660    0.5000   -1.8660-0.5000    0.8660   -1.23210         0    1.0000>> P_to_T1 = Test_double * [P; 1]P_to_T1 =1.7321-1.00001.0000

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

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

>> Test = inv(T1)Test = se20.8660    0.5000   -1.8660-0.5000    0.8660   -1.23210         0    1.0000>> Test_double = tform(Test)Test_double =0.8660    0.5000   -1.8660-0.5000    0.8660   -1.23210         0    1.0000>> P_to_T1 = Test_double * [P; 1]P_to_T1 =1.7321-1.00001.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 =11

4、结语

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

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

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

相关文章

简单说网络:TCP+UDP

TCP和UPD: (1)都工作在传输层 (2)目的都是在程序之中传输数据 (3)数据可以是文本、视频或者图片(对TCP和UDP来说都是一堆二进制数没有太大区别) 一、区别:一个基于连接一个基于非连接 将人与人之间的通信比喻为进程和进程之前的通信:基本上有两种方式(1)写信;(2)打电话;这…

Docker容器化K8s集群部署教程(一键部署sheel脚本)

本文通过脚本&#xff0c;可以快速地部署和配置Kubernetes环境&#xff0c;省去了各插件手动部署、配置的繁琐过程。 先看最终结果&#xff1a; [rootlocalhost home]# kubectl get node NAME STATUS ROLES AGE VERSION k8smaster Ready control-p…

LlamaIndex 入门实战

文章目录 LlamaIndex 入门实战1. 基本概念2. 优劣势分析3. 简单代码示例4. Index持久化5. 使用场景6. 总结 LlamaIndex 入门实战 LlamaIndex是一个连接大型语言模型&#xff08;LLMs&#xff09;与外部数据的工具&#xff0c;它通过构建索引和提供查询接口&#xff0c;使得大模…

Java学习17-- super类

重点&#xff1a;super类 & 方法重写 super类 super指的是本级的上一级&#xff0c;即father class父类 很好理解&#xff0c;比如Person class>Student class 当前在Student class执行&#xff0c;那么就写this.xxx 需要在Student程序里面调用Person&#xff0c;那就…

HarmonyOS应用/服务发布:打造多设备生态的关键一步

目前 前言HarmonyOS 应用/服务发布的重要性使用HarmonyOS 构建跨设备的应用生态前期准备工作简述发布流程生成签名文件配置签名信息编译构建.app文件上架.app文件到AGC结束语 前言 随着智能设备的快速普及和多样化&#xff0c;以及编程语言的迅猛发展&#xff0c;构建一个无缝…

大数据 - Spark系列《四》- Spark分布式运行原理

Spark系列文章&#xff1a; 大数据 - Spark系列《一》- 从Hadoop到Spark&#xff1a;大数据计算引擎的演进-CSDN博客 大数据 - Spark系列《二》- 关于Spark在Idea中的一些常用配置-CSDN博客 大数据 - Spark系列《三》- 加载各种数据源创建RDD-CSDN博客 目录 &#x1f360;…

sqli-labs-master靶场训练笔记(38-53|boss战)

2024.2.4 level-38 &#xff08;堆叠注入&#xff09; 这题乍一看感觉又是来卖萌的&#xff0c;这不是和level-1一模一样吗 然后仔细看了一下源代码&#xff0c;根据 mysqli_multi_query 猜测这题的本意应该是堆叠注入 mysqli_multi_query() 是 PHP 中用于执行多个 SQL 查…

品牌如何营造生活感氛围?媒介盒子分享

「生活感」简而言之是指人们对生活的感受和意义&#xff0c;它往往没有充斥在各种重要的场合和事件中&#xff0c;而是更隐藏在细碎平凡的生活场景中。在营销越来越同质化的当下&#xff0c;品牌应该如何打破常规模式&#xff0c;洞察消费情绪&#xff0c;找到更能打动消费者心…

2023:AI疯狂进化年

嘿&#xff0c;大家好&#xff01;让我们一起来回顾一下这疯狂的 2023 年吧&#xff01;记得那个二月初吗&#xff1f;ChatGPT 上线了&#xff0c;然后呢&#xff1f;短短两个月&#xff0c;用户数量就像火箭一样突破了 1 亿&#xff01;这速度&#xff0c;简直比超级赛亚人还快…

前端JavaScript篇之对执行上下文的理解

目录 对执行上下文的理解创建执行上下文 对执行上下文的理解 当我们在执行JavaScript代码时&#xff0c;JavaScript引擎会创建并维护一个执行上下文栈来管理执行上下文。执行上下文有三种类型&#xff1a;全局执行上下文、函数执行上下文和eval函数执行上下文。 在写代码的时…

(6)【Python/机器学习/深度学习】Machine-Learning模型与算法应用—使用Adaboost建模及工作环境下的数据分析整理

目录 一、为什么要使用Adaboost建模? 二、泰坦尼克号分析(工作环境) (插曲)Python可以引入任何图形及图形可视化工具 三、数据分析 四、模型建立 1、RandomForestRegressor预测年龄 2、LogisticRegression建模 引入GridSearchCV 引入RandomizedSearchCV 3、Deci…

第三百一十回

我们在上一章回中介绍了"再谈ListView中的分隔线"&#xff0c;本章回中将介绍showMenu的用法.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在第一百六十三回中介绍了showMenu相关的内容&#xff0c;它主要用来显示移动PopupMenu在页面中的位置…

C语言第二十一弹---指针(五)

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】 转移表 1、转移表 总结 1、转移表 函数指针数组的用途&#xff1a;转移表 举例&#xff1a;计算器的⼀般实现&#xff1a; 假设我们需要做一个能够进行加减…

CoreSight学习笔记

文章目录 1 Components1.1 ROM Table 2 使用场景2.1 Debug Monitor中断2.1.1 参考资料 2.2 Programming the cross halt2.2.1 编程实现2.2.2 参考资料 2.3 CTI中断2.3.1 编程实现2.3.1.1 准备工作2.3.1.2 触发中断2.3.1.3 中断响应 2.3.2 参考资料 1 Components 1.1 ROM Table…

rust语言tokio库底层原理解析

目录 1 rust版本及tokio版本说明1 tokio简介2 tokio::main2.1 tokio::main使用多线程模式2.2 tokio::main使用单线程模式 3 builder.build()函数3.1 build_threaded_runtime()函数新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图…

国产三维剖面仪—MPAS-100相控参量阵浅地层剖面仪

最近声学所东海站邹博士发来了他们最新的浅地层剖面仪—MPAS-100相控参量阵浅地层剖面仪的资料&#xff0c;市场型号GeoInsight&#xff0c;委托Ocean Physics Technology公司销售&#xff0c;地大李师兄的公司负责技术支持。 MPAS-100相控参量阵浅地层剖面仪就是俗称的三维浅…

git安装配置

1、下载安装 下载地址 2、配置git用户 git config --global user.name "yw" git config --global user.email "88888qq.com" 3、git init 初始化 4、生成ssh密钥 mkdir .ssh //创建文件夹cd .ssh //进入新建文件夹 ssh-keygen -t rsa // 输入密钥文…

Uniapp真机调试:手机端访问电脑端的后端接口解决

Uniapp真机调试&#xff1a;手机端访问电脑端的后端接口解决 1、前置操作 HBuilderX -> 运行 -> 运行到手机或模拟器 -> 运行到Android App基座 少了什么根据提示点击下载即可 使用数据线连接手机和电脑 手机端&#xff1a;打开开发者模式 -> USB调试打开手机端&…

使用 WMI 查询安全软件信息

在这篇文章中&#xff0c;我们将详细介绍如何使用 Windows Management Instrumentation (WMI) API 来查询当前计算机上安装的安全软件的基本信息。我们将分析代码的各个部分&#xff0c;并解释每个步骤所涉及的技术和原理。 一、什么是 WMI&#xff1f; WMI 是 Windows Manag…

Vue安装与配置

写入借鉴网址&#xff1a;好细的Vue安装与配置_vue配置-CSDN博客 下载Vue安装地址&#xff1a; Node.js — Download 查看是否安装成功&#xff1a; node -v npm -v 配置全局模式及缓存 结果通过&#xff1a; C:\Windows\system32>npm install vue -g added 20 packages …