分享一个四足蜘蛛机器人
- 开题
-
进入大学以来,学习单片机已经很长时间了。之前都是在开发板上学习各种外设,做各种实验,一直也都没正经的做过什么项目。刚好临近毕业,需要做毕业设计,我感觉这是一个很好的机会,结合之前所学的全部知识,完成一个完整的项目流程。于是我便提前两个月开始准备,在开始项目选题时犹豫了许久,本来是考虑做四轴,但是介于现在这方面网络上的开源项目很多,有许多成熟的方案,还是决定做一点不一样的,所以最终就选定了这个题材。
第一次写博客,有些地方有错误或者描述不清的地方欢迎指出。 -
话不多说,先看图片
- 项目概述
- 整个项目都采用了模块化设计,然后把模块固定到pcb板子上(板子是在学校自己做的,只有单层),全部都是在某宝可以直接买到的模块,目的是方便调试和更换,因此外部走线会有点多。
- 本次设计由机器人主机与遥控器从机两部分组成,机器人采用3D打印骨架,共4条腿,每条腿三个关节,用三个SG92R舵机驱动,一共12个SG92R舵机,12个舵机使用PCA9685 16路PWM控制器集中管理控制,通过IIC总线与单片机通讯;机器人电路设计将分为两层,分为底板和顶板:
- 底板的下方固定住一块1500mAh2S锂电池,连接到LM2596S 降压模块,降压后供电给舵机,电池再连接到一个多路电源模块,分别降压成5V/3.3V后负责给整机电路供电。底板上除了固定住PWM控制器外,还分别搭载了一个MPU6050三维角度传感器与一个HY-SRF05超声波测距模块,三维角度传感器负责采集机器人的姿态信息与温度信息,姿态信息用于实现机器人的稳定功能及遥控器联动功能;超声波测距模块负责采集障碍距离信息,用于实现障碍报警和避障功能。
- 顶板上搭载了单片机STM32f103rct6核心板、HC-05串口蓝牙无线透传模块、双轴舵机云台。STM32f103rct6核心板引出相应引脚对整机进行控制和运算,核心板上拥有两个LED灯与两个按键,两个LED用于显示程序运行状态信息,一个按键用于复位,另一个暂未用到。HC-05蓝牙模块连接上单片机串口二负责传输与遥控器的通讯信息。舵机云台使用两个SG90舵机驱动,连接PCA9685统一控制,云台可搭载小型航拍摄像头或其他设备。
- 底板与顶板之间通过杜邦线连接,整机供电正常模式下估计可以持续运行30-40分钟。
- 遥控器由主控芯片STM32f103c8t6核心板、HC-05串口蓝牙无线透传模块、MPU6050三维角度传感器、0.96寸OLED12864、双轴ADC摇杆与四个按键组成:STM32f103c8t6核心板除了负责控制整个遥控器电路外还将对整个遥控器其他模块供电,考虑到遥控器大小,遥控器不搭载电池,需要外部5v供电;HC-05蓝牙模块负责与主机机器人通讯;OLED用于显示机器人各种状态信息并与按键配合实现一个简单的操作界面,用于选择各种模式;三维角度传感器用于采集遥控器的三维角度信息实现对机器人的体感控制;双轴摇杆使用单片机采集ADC信息用于控制机器人搭载的云台,摇杆还自带一个点触按键实现云台的锁定/控制。
- 主机基于UCOSIII实时操作系统开发,将四条腿分别由四个进程控制,使用时间片轮转运行实现同步,其他每一个模块的采集程序各占用一条进程,通过一条优先级最高的主进程控制各个进程的开关以及信息的采集发送。遥控器采用裸机运行自动采集信息通过判断按键进行各个模式之间的切换。
- 主要内容
-
步态
步态可以说是整个设计中最复杂的部分之一了,刚开始构思项目是打算做成单步行走的(一次只动一条腿),然后把效果做出来之后觉得实在是太捞了,程序顺序执行且舵机一次只能做一组点对点的僵硬动作,而且做不到奔跑的动作(虽然最终也没有实现),所以就放弃了这个方案。最终想到了现在的解决方案:使用操作系统,把每一条腿分离成单独的任务,每个任务只执行自己动作的部分,利用任务并发实现整个移动姿势的动作周期。把四个任务设置成一样的优先级,使用时间片轮转调度,以达到同步的效果。
在做这个项目之前,从来都没有接触过步态这方面的知识,之前也有查阅过各种资料,也有各种公式去计算,但是最大的问题还是如何去实现,我在这个地方卡了很久,最终是通过自己反复看一张小猫走路的gif,把姿态分解成步骤,然后花了很长时间调试出来的。就是下面这个:
从图片来看,貌似可以把每条腿给分成四个阶段,分别是抬起前移->前移放下->放下后移->后移抬起(我将其称为四分割)就像下面这样:
图中对应关系:起->“抬起前移”、落->“前移放下”、前->“放下后移”、后->“后移抬起”
但实际上我这个机器人做不到猫的平衡性和协调性,在实际测试过发现并不能保持平衡,因此必须要同一时刻至少有三条腿接触地面才能不导致重心便宜。解决方法是把腿在地面接触的“放下后移”这个动作姿势给分成两个部分,延长这条腿呆在地面的时间,这样总体的总做时间就变成了5个动作单位(我将其称为五分割,好想也有叫4+1步态的说法,但我不确定是不是一样的),这里可能说的不太清除,具体看下图:
最终实现效果:
为了让舵机在规定时间内均匀的运动(为了同步),我写了一个函数可以实现对一个动作执行的总共时间及分辨率控制:
`//腿部运动控制角度函数
//Leg_num:选择腿号1-4分别对应 右前 左前 左后 右后
//Mov_time:完成一次动作所需要