欢迎光临散文网 会员登陆 & 注册

蜘蛛机器人项目的具体细节

2022-08-25 18:34 作者:扎之克  | 我要投稿

蜘蛛机器人的机械结构:

它是由一个底盘、六个足、18个舵机构成的18自由度的机器人,每一个足分成三节。

蜘蛛机器人的主控芯片:

主控芯片,stm32f103rct6,这个芯片的主频最高为72MHZ。

它的RAM大小为48 KB,如此大小的RAM和主频足以支持它实时演算腿部角度。

其内置有八个定时器,其中有六个定时器带有pwm模块,所以这个芯片可以同时输出24路pwm信号。

外置的传感器:

MPU6050传感器,此模块用于测量蜘蛛的姿态,我需要姿态信息来使蜘蛛保持平衡

ESP8266 WIFI模块,此模块主要用于与手机通信,实现手机无线操控蜘蛛

蜘蛛的控制方式:

电脑上位机串口控制运动模式(有线串口1)

按键控制蜘蛛运动模式

    运动模式1、手机重力或姿态控制蜘蛛以三角步态移动以及移动的距离和方向((WIFI无线控制,无线串口3)

    运动模式2、手机重力或姿态控制蜘蛛姿态(WIFI无线控制,无线串口3)

    运动模式3、底盘各种平移测试

    运动模式4、旋转三角步态测试

关于重力控制或姿态控制两种算法的优缺点:重力控制的传感器数据来源于手机的加速度传感器,姿态控制的传感器数据来源于手机的加速度和角速度传感器数据的融合(互补滤波),所以重力控制的动态特性不如姿态控制,其静态特性又与姿态控制的相差无几,但是这里重力控制的计算量要比姿态控制少很多(不需要对传感器数据进行复杂的处理)

硬件参数与机电结构设计:

总共有18个舵机、一个舵机有3根线,如果只算上舵机线的话,那也有54根线,如果没有规划好线路,那会导致一些不可名状的问题。

这里是这样处理接线问题的,我在洞洞板上使用了母座排针(插开发板上)和公排针(舵机引线插上边),我将它称为插卡式接线结构(与Arduino与其模块的连接方式雷同)

根据下图的引脚设定以及开发板引脚图,


硬件:引脚设定
开发板引脚图

我很快就焊接了一个插卡式连接板,然后再将舵机过长的引线剪短(这里用到了热缩管),最终效果如下图

硬件参数:接下来考虑系统的硬件参数,WIFI模块的串口与STM32的串口3相连,波特率115200........如下图

为了不占用MPU的资源,这里采用DMA传输的方式来接收WIFI模块的数据。

来自ESP8266的数据的接收逻辑:首先我使能了串口3的空闲中断,ESP8266接收到手机发送过来的控制命令后通过串口传输到STM32上,当数据传输完成后,芯片进入串口空闲中断程序

空闲中断程序

空闲中断程序会处理接收的数据并重新启动DMA传输,并将数据通过串口1打印到上位机上。

电脑的串口与STM32的串口1相连,波特率之类的参数与串口3的一样,这里依然使用DMA传输来接收上位机的数据

(串口1的DMA传输优先级和中断优先级要低于串口3的)

MPU6050的I2C接口与STM32的模拟I2C接口相连。在阅读MPU6050的手册,我们可以给出其寄存器的名字(能反映寄存器功能)与地址的映射关系(宏定义),这样可以提高代码的可读性(修改Keli5的编码模式后,我们可以使用中文宏定义与中文名变量)

MPU6050参数设置:

设定8个采样点的平均滤波

加速度传感器量程±2G

角速度传感器量程±2000dps

采样频率50HZ


在这里,我启动了某个50HZ(与MPU6050的采样频率一样)的定时器中断,中断程序:读取MPU6050的数据并使用四元数积分、互补滤波的算法来解算姿态。

在所有中断程序中,它的优先级是最高的。

定时器2中断程序

当然,在使用MPU6050之前,先校正了陀螺仪的零点漂移和加速度计的零飘和比例尺(椭球拟合)

关于最小二乘法椭球拟合:当加速度传感器在静止状态下(仅受到重力作用),加速度的模等于重力的模,根据这个关系,我们可以列出下面的方程,而这正是一个椭球方程,但我们不能通过这个方程来解各轴零飘和比例尺,这是因为数据存有噪声即便是平均滤波过的数据(滤波不能消除噪声,只能抑制噪声)。

在三维空间中将大量的加速度传感器静止时的数据绘制出来,我们预测这些点的分布应该会近似一个椭球,事实上也正是如此,我们去找到一个最接近的椭球方程,用这个方程的系数(零飘和比例尺)来作为传感器的零飘和比例尺,我们用加速度矢量范数的方差来衡量数据组与椭球的距离,这样的话,我们只要求得误差(距离)方程最小时各轴的零飘和比例尺即可,这样的方法就是最小二乘法椭球拟合

椭球拟合指的是:当我们有大量传感器静止无噪声时的数

这是之前写的最小二乘法椭球拟合函数,太长了,主要方法就是求得距离函数的导数,然后令导数为0得到一个线性方程组,然后用高斯消元法求解

程序的逻辑与结构

接下来来讨论一下程序的逻辑与结构,实际上上面的文字已经把所有的中断程序都解释过了,所以,这里只需要讨论主程序和其他函数的逻辑与结构

main逻辑:

我定义了一个状态标志位变量Mode,这个标志位用于表示机器人的运动模式,当硬件初始化万后,程序就进入了while循环里,while循环里主要是Switch语句,根据Mode的值执行相应的运动程序

main函数之外定义的函数:

舵机测试:在main函数之外还定义了不少测试用的函数,这些函数主要是用来测试舵机的好坏与舵机接线是否正确用的

a是一个随时间变化的变量,Servo_angtotime函数将电机角度转化为PWM高电平时长

蜘蛛机器人的运动原理与算法https://www.bilibili.com/video/BV1WB4y147D9?spm_id_from=333.999.0.0&;vd_source=6cfcfed4d7c52b2a577834ce56144709已经讲述过了,这里贴出代码演示一下算法的具体过程

蜘蛛机器人单腿逆运动学方程,因为用了二维指针,代码太长了!方程实际上就是用视频中的那个方程
单腿运动正解
使用四元数计算矢量旋转后的值,这没什么好说的
矢量加减法,没什么好说的
关节系转底盘系
底盘系转关节系


我们发出一个运动指令,让机器人底盘位移(10cm,10cm),对矢量指令(10cm,10cm)100均分(这是我随便给出的一个数,实际上我们可以通过舵机的精度来计算多少均分)线性插值,通过控制某个与时间成正比的变量来控制机器人的运动,改变系数即可改变机器人执行指令的速度。

程序结构:

程序结构
main.c下的全局变量
main.c下的全局变量



蜘蛛机器人项目的具体细节的评论 (共 条)

分享到微博请遵守国家法律