RM麦轮控制以及底盘解算

server/2024/10/11 11:19:53/

一个典型的RM机器人四轮底盘由电机,底板,悬挂等构成,底盘安装在底盘的四角,呈矩形分布,麦克纳姆轮的辊子方向会影响其运动性能,一般采用如下图所示,四个麦轮的辊子延长线都过底盘中心的安装方法。

底盘解算的主要目的是将底盘的运动期望解算至电机,因为电机才是我们最后进行控制的执行机构,为了控制底盘的方向和速度,实际上最后依然是要依靠控制电机的转向和转速来实现。

为此需要对底盘进行运动学分析,将底盘速度期望解算成四个电机的转速期望。如下图中,建立底盘坐标系XY,其中底盘速度期望设为:

给四个电机标为1,2,3,4号(对应于电调ID),设n号电机的速度期望为 Vn​

运动解算的目标是得到以Vx​,Vy​和ωv​,电机的Vn以底盘朝 X 为正方向

在这里插入图片描述

解算的方法很多,这里介绍最简单的一种方式,即将三个正交的底盘运动方向方向Vx​,Vy​和ωv 进行线性叠加的方式,这种方法的好处在于可以直接通过实验的方式就能获得结果 —— 只需要将装好的底盘按照各个方向推一推就可以知道了。

首先假设底盘速度期望只有沿X方向的分量

显然此时需要四个电机沿X方向同样的速度旋转,可以得到四个电机的转换期望

再假设底盘速度期望只有沿Y方向分量,即底盘横向平移

则此时电机转速需要做出正负的区分(麦轮的特性)

最后假设底盘速度期望只有ωv​,即底盘原地旋转

则此时电机转速为

  • 当轮子1和轮子2的速度 V1​ 和 V2​ 是负的,意味着它们在逆时针方向上旋转,这通常发生在底盘顺时针旋转时。
  • 轮子3和轮子4的速度 V3​ 和 V4​ 是正的,意味着它们在顺时针方向上旋转,这通常发生在底盘逆时针旋转时。

对以上公式进行叠加后就可以得到在底盘速度期望为

对应的电机转速为

以上推导过程也可以通过严格的动力学分析完成,最后得到的结果是一致的。最后还是以官方代码为例看一下这个解算过程的代码实现。

在mecanum.c下我们可以找到解算函数mecanum_calculate(struct mecanum *mec)中的解算部分

会发现这段代码和我们公式推导的结果有一点出入,这是由于轮子的标号不一致以及电机正方向规定不一致导致的,我们将推得的公式和代码之间重新对应一下,关系如下:

拿wheel_rpm【0】来说:

mec->speed.vw×rotate_ratio_frmec->speed.vw×rotate_ratio_fr:底盘的角速度 mec->speed.vwmec->speed.vw 乘以前右轮相对于旋转中心的位置比例因子 rotate_ratio_frrotate_ratio_fr。这个乘积表示由于底盘旋转,前右轮需要额外增加或减少的速度。

可见在代码实现时,解算公式要由轮子安装方式,实际的电调设置以及电机正方向决定。

为了方便,一般写完一套代码之后,共用这套代码的所有机器人都要用一样的安装方式和电调设置方式。

闭环控制

光完成底盘运动解算是不够的,如果用只做了解算的底盘拿去开,会发现这个底盘相当的“飘逸”,按一会方向键然后松手,底盘不会立马刹住,而是会“漂移”一段距离才能停下来,这是因为目前电机都是开环控制的,不能及时响应期望的变化,这个时候就需要给电机添加PID控制器了。

底盘的控制流程一般是通过遥控器获取底盘运动期望----->底盘运动期望解算至电机转速期望----->电机转速闭环控制

值得一提的是,在通过遥控器获取底盘运动期望时,由于底盘控制周期(一般1-2ms)往往远小于遥控器数据的刷新周期14ms,所以在底盘控制进程看来,遥控器的输入是阶跃的,这样会使底盘开起来有卡顿感,不够流畅,此外速度突变也容易导致底盘出现超功率。为此需要对输入信号进行平滑处理,处理的方式有很多,比如数字滤波或者斜坡函数。

下图为底盘控制进程获得的遥控器原始数据。

经过低通滤波平滑之后

通过斜坡函数处理

小陀螺

小陀螺是近几年兴起的一股技术风潮,自从中国矿业大学掏出这一黑科技,并取得全国四强的好成绩之后,众多学校纷纷效仿。

使用小陀螺的机器人可以提高对方的瞄准难度,降低被打中装甲板的概率,提高生存率,此外由于云台可以在底盘不动的情况下指向任意位置,也有了更高的灵活性。

小陀螺的实现关键是导电滑环,底盘到云台的过线必须经过导电滑环才能避免在底盘360°旋转时发生线缠住的问题。目前RM选购滑环的主要厂家有森瑞普, 默孚龙等。在备赛时,这两家的产品都使用过,但是最后用在步兵车上的默孚龙的滑环是出了一些问题的,滑环在旋转到不同角度时压降不一致,使传感器的供电不稳定,发生自动复位,导致了比较严重的后果。

 

滑环是运动和静止的电器连接装置,即需要旋转的机械设备。传输电流设备,它确保固定导线的电流与需要转动或旋转的导线保持接触

 

选购导电滑环前需要提前设计好整车的硬件拓扑结构,根据该结构计算需要通过滑环的型号,线数,电源线所需要的电流上限等,再结合机械方面的需求,比如如果要做下供弹可能需要过孔滑环,以及需不需要带法兰等。确认好这些需求之后去联系厂家,厂家会有客服以及选型手册帮助完成选型。

选滑环的坑是比较多的,所以当设计方案要使用滑环时,最好做好迭代一两次的心理准备。

 

另外由于麦克纳姆轮的特性,我们是可以实现在底盘360°旋转的同时,依然正常的前后左右平动的。

由于底盘在360°转动,我们以图传朝向为正方向,建立云台坐标系。假设底盘坐标系S1,云台坐标系S2,为了实现该功能,我们需要将S2下的速度期望转换到S1坐标系下,

假设S2(云台坐标系)下速度期望为

S1(底盘坐标系)下速度期望为

S2和S1之间的夹角为θ,可以得到如下公式

我们在底盘小陀螺模式下通过这样一个公式将云台坐标系期望解算到底盘坐标系期望之后,就和普通的底盘控制过程一模一样了。具体的代码实现就不贴了,总共也就几行就可以写出来,sin⁡和cos可以#include "math.h"后直接调用。

结语

本次教程主要介绍了麦克纳姆轮底盘的运动解算原理以及代码实现,基本上结合之前的几讲,一个能动的底盘就能够写出来了,但是底盘的主要难度是在和云台结合起来之后,会有更多的运动模式,比如底盘跟随云台,底盘和云台独立,扭屁股,小陀螺等,另外软件功率控制以及操作手感的提升,也是一些值得研究的问题。


http://www.ppmy.cn/server/99048.html

相关文章

SpringBoot Actuator

对应用进行观测,监控,预警 健康状况[组件状态,存活状态] health 健康端点:返回存活,死亡. Health对象 运行指标[CPU,内存,垃圾回收,吞吐量,响应成功率] Metrics 指标监控端点:访问次数/率等等 链路追踪等等 引入web和actuator依赖 在…

3种Python爬虫 中文乱码 的处理方法

Python爬虫在抓取网页数据时,经常会遇到中文乱码问题。这通常是因为网页的编码格式与Python处理时使用的编码格式不一致导致的。以下是三种常见的处理中文乱码的方法,并附上相应的代码示例。 方法一:指定正确的编码格式 大多数现代网页采用…

Power BI产品详细介绍

目录 前言 1、什么是Power BI? 1.1 功能强大 1.2 适用范围 2、Power BI的基本组成部分 2.1 Power BI Desktop 2.2 Power BI Service 2.3 Power BI Mobile 3、如何使用Power BI? 3.1 数据导入 3.2 数据建模 3.3 数据可视化 4、常见问题与解决…

Python 学习路径:从零基础到高级应用

当然可以!学习 Python 是一个循序渐进的过程。下面是一个分阶段的学习流程,适合初学者参考: 第一阶段:基础入门 目标: 理解 Python 基础语法,能够编写简单的程序。 安装 Python: 下载并安装最…

spring boot-18

用途 **application.properties**: - 是 Spring Boot 应用程序的核心配置文件。 - 用于定义应用程序的各种配置属性,如数据库连接、端口号、日志级别等。 - 应用程序的大多数配置都放在这个文件中。 **bootstrap.properties**: - 主要用于 Spring Cloud 的应用程序…

第十二章 Spring MVC 框架扩展和SSM框架整合(2023版本IDEA)

学习目标 12.1 Spring MVC 框架处理JSON数据12.1.1 JSON数据的传递处理12.1.2 JSON数据传递过程中的中文乱码和日期问题12.1.3 多视图解析器 12.2 Spring MVC 框架中的数据格式转换12.2.1 Spring MVC 框架数据转换流程12.2.2 编写自定义转换器12.2.3 使用InitBinder装配自定义编…

C++之类与对象(完结撒花篇)

目录 前言 1.再探构造函数 2.类型转换 3.static成员 4. 友元 5.内部类 6.匿名对象 7.对象拷贝时的编译器优化 结束语 前言 在前面的博客中,我们对类的默认成员函数都有了一定了解,同时实现了一个日期类对所学的没内容进行扩展延伸,本…

Robot Operating System——std_msgs消息类型说明和使用

大纲 特点类型std_msgs::msg::Bool结构定义字段说明示例用法 std_msgs::msg::Byte结构定义字段说明示例用法 std_msgs::msg::ByteMultiArray结构定义字段说明示例用法 std_msgs::msg::Char结构定义字段说明示例用法 std_msgs::msg::ColorRGBA结构定义字段说明示例用法 std_msgs…