【现代机器人学】学习笔记十二:轮式移动机器人

news2024/10/6 8:32:31

这一章讲移动机器人相关的内容。许久没有更新了,有人私聊我是不是烂尾了。写的这几篇屁文我本来是拿来当自己的笔记本的,不以为有人会认真看。没想到居然还有人追,真是受宠若惊。在这里深表感谢!一直没更新其实是因为年后的工作实在是太忙了,连休息的时间都没有,更何谈写这些博客。另外我还看到之前写的一些内容甚至我自己都没有印象了,看来还得抽时间再回顾一遍。

话不多说,开始吧:

开篇放了一个这样的公式:意为讲固定系s下的角速度、沿xy方向的线速度变换到body系下并用旋量表示。在2维平面中,角速度其实无所谓哪个系,因为尽管是body系,瞬间来说也是固定的,其旋转的角速度瞬间而言是相同的。而线速度,可以看出从s系到b系,是乘了一个二维的旋转矩阵Rbs,而从b系是乘了一个Rsb。

这要注意一下:标准的Rsb,第一列是cos,sin。回顾一下以前的知识:对绕轴旋转得到的旋转矩阵而言,对x,z轴旋转,除了把对应位置填成1,行和列其他位置填成0,剩下的第一列就是填cos,sin。写出了第一列,另一列就自然把sin取反即可。y则相反,头一列是cos,-sin。

 轮式机器人类型

主要分为非完整(nonholonomic)类型和全向(omnidirectional)类型。

非完整类型主要受到Pfaffian速度约束,大意就是速度约束无法通过积分来转换成一个等效的位形约束,参见:【现代机器人学】学习笔记一:位形空间_grubler公式_zkk9527的博客-CSDN博客

而全向类型的又分为全向轮和麦克纳姆轮,书上有明确的图,就是一圈轮胎上还挂着横向的轮,全向轮的话横向的轮的旋转轴在车轮平面上,而麦克纳姆轮的旋转轴和轮的平面有一个夹角。

实际上,要实现全向移动,机器人底盘上至少需要有三个轮子,绕起来是一个圆,通过控制三个轮子的转速,才能实现全向功能。(为什么呢?因为我们移动机器人实际上是想生成三维底盘速度,即角速度和xy方向的线速度。我们既然不是非完整约束的轮子,三个自由度的输出,那我们就得需要三个自由度的输入,即三个轮子的转速)而我们图上的轮子:

 它这个横向的轮子只是确保能横着转,这样不会对主动轮造成横向摩擦,并不是说上位机可以控制主动轮上面的一个一个小的滚轮主动运动,这点要注意。

和机械臂不同,轮式机器人的运动学,主要考虑车轮速度如何映射为机器人本体速度,而动力学则考虑车轮的扭矩如何映射为机器人的加速度。这章只考虑运动学的内容。实际上按我的工程经验而言,好像对移动机器人而言一般并不是很在意动力学,更重要的是避开障碍物。也许这些内容做自动驾驶的朋友们更关注,但目前我还没有接触过。

全向轮式机器人

建模

这本书很好,好就好在讲内容以前总是从宏观角度先说明,自己打算讲什么东西。让读者带着问题去继续读,总比稀里糊涂读下去好一些。

这里列出了两个关键问题:

1.车轮怎么转,才能使得底盘达到期望的速度?

2.根据车轮转速的极限,怎么得到底盘速度的极限?

好那让我们带着问题继续读下去。

单个全向轮是怎么运动的

 在说三个全向轮子组成的机器人的运动之前,我们需要先考虑单个轮子转起来会怎么样。如左一图所示,这个麦克纳姆轮上的被动轮,和主动轮的轴之间存在一个夹角γ,被动轮在转起来的时候,可能会发生一个“滑动”,这是被允许的。假设滑动的方向沿着左图的方向,因此我们可以得到如下的公式:

 相信上面的公式大家都可以看明白,就是一个简单的几何关系。但是这个问题中呢,我们是想分清主次。我们事实上是想控制Vx,Vy的,但是我们这里只能控制主动速度Vdrive,因此需要解方程:

滑动速度Vslide是被动轮在转的,我们管不了,我们只能通过控制轮子的驱动角速度,来控制主动速度Vdrive:

 

 因此我们想控制一个轮子的速度vx,vy的话,只要通过上式,控制主动轮的驱动角速度就可以了。

多个全向轮是如何带动底盘运动的

我们假设u_i是第i个轮子的驱动角速度,\dot{q}是期望的底盘速度,那么这里向做的就是计算出各个u_i,从而实现\dot{q}

书里二话不说,摆了一个公式。实际上这里摆快了,容易吓到读者。

现在我们不要急,从右到左一个一个看:

这一项是干嘛呢?别忘记我们开头的内容,是把s系下的线速度,通过Rbs,转换到body系下得到一个旋量速度。

这个公式难在第二个变换:

这是个什么玩意呢?看的让人一头雾水。

我们知道,这个东西得到一个3*1的向量,即代表底盘在body系下的旋量。

 那左边再乘以这样一个2*3的矩阵,会得到一个2*1的向量,目的是得到车轮在body系(也就是底盘坐标系)中xy方向的线速度。

那这里我不得不放一个图,否则说不清楚:

假如蓝色的v是底盘瞬时的角速度引起的垂直于半径方向的线速度,我们要做的就是把它给拆分,得到xy分量上的速度,然后和原本xy方向的速度叠加在一起,得到

 那么这时候 乘以的含义就很清楚了。就是得到了车轮在body系下的线速度,去除了角速度的影响。

然后我们把车轮在body系下的速度,变换到车轮坐标系下,我们根据左图,可以看出有一个β的夹角。我们知道如果从A系到B系,如果根据右手坐标系,从A转到B的夹角为θ,那么旋转矩阵RAB为:

\begin{pmatrix} cos\theta & -sin\theta\\ sin\theta & cos\theta \end{pmatrix}

 在上图中,从body系到车轮系的夹角为β,而我们已经有了body系下的线速度,因此,Rbody_steer  为

 \begin{pmatrix} cos\beta & -sin\beta\\ sin\beta & cos\beta \end{pmatrix}

而Rsteer_body为:

\begin{pmatrix} cos\beta & sin\beta\\ -sin\beta & cos\beta \end{pmatrix}

中的第三个变换。

这时得到了在车轮系下的线速度,我们要变成控制的驱动角速度,这是套用之前在 单个全向轮是怎么运动的 这部分的公式:,我们采用向量的形式来写,就是:

注意,这个里面它是一个1*2的向量,通过乘以右边的2*1的向量,得到一个1*1的角速度。可不能犯傻理解为这里是\frac{1}{r_i} * \frac{tan \gamma}{r_i}啊。

这时候难点攻克下来了,我们这里化简,把H矩阵算出来,这样编码的时候就是一劳永逸,直接就可以从底盘期望速度得到各个车轮的速度了:

 这个过程我就不想推了,毕竟不是在研究数学。

然后u就表示为:

这里的u就是各个车轮的转速了,而不只是之前的ui代表第i个车轮的转速。

如果我们想让H中没有角度变量,那就是把

 

 中的前三项合在一起,后两项合在一起:

 这个的作用是,对车辆的构型可以起到指导作用,即选择车轮在底盘坐标系的位置,滑动方向,就可以合理选择,使得H(0)的秩为3。

那么到现在来说,实际上就完成了开篇的内容中的第一个重要问题:如何通过底盘的期望速度,计算得到各个车轮的转速。

那么根据上面得到的方法,再配合实际的机器人构型:

 我们带入公式就可以得到实际的运动学模型:

 

 那么上面的推导实际上就是授人以渔。

对于图示的四个麦克纳姆轮的全向小车,如果想沿着+x方向运动,所有车轮需要相同速度向前行驶。如果想沿着+y移动,1和3后驱动,2和4前驱动。如果想旋转,就是同侧相同驱动,另一侧反向。这个想想就可以理解。

第二个重要问题:根据车轮转速的极限,怎么得到底盘速度的极限?

我们知道,车轮速度是受到约束的:

那么我们就可以得到两个约束平面,只要在它之间的Vb就可以满足。

多个轮子,就是多个约束平面,构成的多面体,内部空间实际上就意味着在凸多面体内部的运动旋量都是可行的。

运动规划和反馈控制 

对全向轮小车而言,好处就在于任何方向都可以直接移动。因此运动规划无需多讲,和前面的内容完全一致,参见:【现代机器人学】学习笔记九:运动规划_虚拟势场法_zkk9527的博客-CSDN博客

而反馈控制,也可以回顾一下:

通过这种方式来跟踪轨迹,其中q为传感器对实际位形的估计。我们在底层使用上面推导得到的公式,就可以把期望速度转化为车轮驱动速度进行控制了。

非完整约束轮式移动机器人 

这个今天没有时间写了,明天继续,占坑。。

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

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

相关文章

优惠卷秒杀功能、全局唯一ID、乐观锁解决超卖问题、悲观锁实现一人一单、集群下锁失效问题

文章目录 1 全局唯一ID的需求分析2 Redis实现全局唯一Id3 添加优惠卷4 实现秒杀下单5 库存超卖问题分析6 乐观锁解决超卖问题6 悲观锁实现一人一单7 集群环境下的并发问题 1 全局唯一ID的需求分析 每个店铺都可以发布优惠券: 当用户抢购时,就会生成订单…

ASP.NET Core MVC 从入门到精通之序列化

随着技术的发展,ASP.NET Core MVC也推出了好长时间,经过不断的版本更新迭代,已经越来越完善,本系列文章主要讲解ASP.NET Core MVC开发B/S系统过程中所涉及到的相关内容,适用于初学者,在校毕业生&#xff0c…

Springboot +Flowable,任务认领和回退(三)

一.简介 有的时候,一个任务节点会存在多个候选人,例如:张三提交一个任务,这个任务即可以由李四处理,又可以由王五处理,那么针对这种多个任务候选人的情况,该如何处理? 二.绘制流程…

并发编程05:Java内存模型之JMM

文章目录 5.1 先从大场面试开始5.2 计算机硬件存储体系5.3 Java内存模型Java Memory Model5.4 JMM规范下三大特性5.5 JMM规范下多线程对变量的读写过程5.6 JMM规范下多线程先行发生原则之happens-before5.6.1 x,y案例说明5.6.2 先行并发原则说明5.6.3 happens-before总原则5.6.…

【面试题】面试官:说说你对MySQL的了解

文章目录 基础篇非关系型数据库和关系型数据库的区别?MySQL 数据库两种存储引擎的区别? 索引篇为什么索引能提高查询速度?聚集索引和非聚集索引的区别?非聚集索引一定回表查询吗?索引这么多优点,为什么不对表中的每一个列创建一个索引呢&a…

八岁都能懂:BFS判断一个图是二分图

目录 1 什么是二分图2 进入情境3 代码实现4 BFS是什么? 1 什么是二分图 一个图用两种颜色涂(橙黄和橘绿),相邻节点不能同色,如下图,4与5相邻且同色,所以不是二分图。 2 进入情境 第一版&#xf…

微服务高频面试题

1、Spring Cloud 5大组件有哪些? 早期我们一般认为的Spring Cloud五大组件是 Eureka : 注册中心Ribbon : 负载均衡Feign : 远程调用Hystrix : 服务熔断Zuul/Gateway : 网关 随着SpringCloudAlibba在国内兴起 , 我们项目中使用了一些阿里巴巴的组件 注册中心/配置…

【论文】SimCLS:摘要总结的对比学习(2)

SimCLS:摘要总结的对比学习(1) 写在最前面2 抽象总结的对比学习框架 写在最前面 SimCLS: A Simple Framework for Contrastive Learning of Abstractive Summarization(2021ACL会议) https://arxiv.org/abs/2106.01890 论文:htt…

HTTP第四讲——域名和DNS

IP 协议的职责是“网际互连”,它在 MAC 层之上,使用 IP 地址把 MAC 编号转换成了四位数字,这就对物理网卡的 MAC 地址做了一层抽象,发展出了许多的“新玩法”。 例如,分为 A、B、C、D、E 五种类型,公有地址…

[GFCTF 2021] day2

Baby_Web 查看源码发现 <!--源码藏在上层目录xxx.php.txt里面&#xff0c;但你怎么才能看到它呢?--> 然后抓包看中间件&#xff0c;Apache/2.4.49 (Unix) 存在目录穿越漏洞 curl http://node4.anna.nssctf.cn:28805/cgi-bin/.%2e/.%2e/.%2e/.%2e/var/www/index …

快速上手分布式异步任务框架Celery

一、Celery架构介绍 Celery&#xff1a;芹菜&#xff1f;&#xff08;跟翻译没有任何关系&#xff09;&#xff0c;分布式异步任务框架&#xff08;跟其他web框架无关&#xff09; Celery is a project with minimal funding, so we don’t support Microsoft Windows. Please…

【嵌入式系统】课程复习资料整理

【嵌入式系统】课程复习资料整理 一、绪论 1.定义 从技术的角度定义&#xff1a;以应用为中心、以计算机技术为基础、软件硬件可裁剪、对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。从系统的角度定义&#xff1a;嵌入式系统是设计完成复杂功能的硬件和软件&a…

Android多模块开发

Android多模块开发 1. 建立项目和多个模块 ​ app为主模块 ​ app-setting为功能模块&#xff0c;可作为独立模块运行&#xff0c;也可作为其他模块的资源模块 ​ app-video为功能模块 2. 建立公共环境文件(env.gradle)并在各模块配置 Step1&#xff1a; 建立在根目录下建…

第31步 机器学习分类实战:多轮建模

开始填坑之旅。 首先&#xff0c;之前提过&#xff0c;random_state这个参数&#xff0c;它的功能是确保每次随机抽样所得到的数据都是一样的&#xff0c;有利于数据的复现。比如&#xff0c;我们这十个ML模型&#xff0c;用的参数都是random_state666&#xff0c;这样作比较才…

【写一个hello的html页面,将页面放到服务器,通过浏览器访问页面,这个过程是怎么实现的?】第一个 servlet 程序

第一个 servlet 程序 第一个 servlet 程序1. 创建项目创建好后的 默认目录 解析 2. 引入依赖为什么要引入依赖&#xff1f; 3. 创建目录结构1、在 main 目录下创建一个 webapp 目录2、在 webapp 下创建一个 WEB-INF 目录3、在 WEB-INF 目录下创建一个 web.xml 文件4、web.xml 需…

章节3:02-Apache Commons Collections反序列化漏洞

章节3&#xff1a;02-Apache Commons Collections反序列化漏洞 02-Apache Commons Collections反序列化漏洞 漏洞爆出 2015.01.28 Gabriel Lawrence和Chris Frohoff https://speakerdeck.com/frohoff/appseccali-2015-marshalling-pickles-how-deserializing-objects-can-r…

《Java虚拟机学习》 asmtools 字节码汇编器使用 与 JVM识别方法重载 的思考

1.asmtools下载 链接&#xff1a;https://pan.baidu.com/s/1R3nAaUbN1Dkf6UKkdEMSEA?pwdk8l8 提取码&#xff1a;k8l8 2.结合方法重载实验的使用 总所周知&#xff0c;方法重载跟方法名无关&#xff0c;但对于JVM而言&#xff0c;区别方法主要通过 类名&#xff0c;方法名&…

java spring MVC REST风格概念叙述

REST属于spring MVC中的一个知识点 REST是三个单词的缩写 即 Representational State Transfer 意思为 表现形式状态转换 老实说 不用尝试字面上理解 因为字面意思 确实是比较抽象 其实 意思就是 访问网络资源的格式 转换 下图 对比了 传统风格和REST风格 请求路径的差别 RES…

【英语】大学英语CET考试,阅读部分2(长篇阅读,选词填空,综合演练)

文章目录 1、长篇阅读&#xff08;连连看&#xff0c;要会做&#xff09;1.1 解题技巧&#xff08;定位词扫读&#xff0c;看到大于看懂&#xff0c;一题带练&#xff09;1.2 做题方法复习总结1.3 题目练习&#xff08;2篇文章&#xff09; 2、选词填空&#xff08;只有5分&…

opencv_c++学习(五)

Mat类数值存储方式 上图为opencv中三通道数据的存储方式&#xff0c;反映到图像上则为空间维度为3*3&#xff0c;通道为3的图像。 Mat类的属性 Mat类的属性如上&#xff0c;在这里我们解释一下step。step是行列数与数据类型的字节数相乘的数据。 Mat类元素读取 在Mat中&…