零、实现功能
- 实现了爬行机器人的移动控制功能。采用三角步态控制机器人移动,通过运动学逆运算得出控制角度。
- 实现了上位机控制功能。采用蓝牙模块,实现蓝牙无线通信,下发控制指令控制机器人。
- 实现了实时监控功能。通过WIFI模块将是系统采集到的视频画面上传到上位机界面中。
- 实现了显示动画效果、灯光效果。促进人机交互体验。
一个呆萌的小机器人
一、关于本想法
我从小就是一个闲不住的孩子,小时候也动手拆过家里的遥控器、电子玩具等一些物品,对电子的世界也是充满了好奇,随着逐渐成长,在大学期间,我开始更深入的了解电子世界,当我接触单片机之后,小时候的一些梦想,就好像能得到了诠释,做一辆遥控小车、做一个音乐播放器、做一个掌上游戏机,这些都能够在电子的世界里找到答案。
于是那是的我也就有了一个梦想,那就是在大学期间做一个机器人,经过不断地学习与挑战,这个梦想也就在今天得到了展现。下图就是我设计的爬行机器人。
二、理论分析
由于爬行机器人是通过舵机来控制各个足之间的传动,从而实现爬行机器人移动过程的稳定。运动学的逆运算就是这样一种适合爬行机器人移动控制的算法。作为一种逆解算法,运动学的逆运算实际上就是输入坐标轴参数,得出舵机执行的角度。该算法的实现,需要以机器人的中心建立空间直角坐标系,然后将原点偏移到六个足跟部,足尖在空间直角坐标系内的轨迹坐标,就是逆解算法输入的参数,根据算法的解析,就得出了各个舵机的控制量。
通过查阅文献和相关资料,发现运动学逆运算大多是采用矩阵运算实现,计算出舵机控制角度和整个足部之间移动位置的关系。因为看的不是很懂,所以本设计进行取巧,用三角函数关系硬算出来,但最后也没用上,因为发现舵机死区和主控性能不够,理论的计算实际上达不到一个预期的效果。所以最后直接输入不同参数验证,取了一个效果看起来比较好的值。以下为相关程序。
void core_run(double x, double y, double z, int *angle)
{
int flag[2] = {0}; //负坐标判断标志,[0]为x轴,[1]为z轴
double l; //模长投影
double l1; //模长
double angle0; //小腿角1
double angle1; //腿连接角2
double angle2; //大腿角3
double angle11; //辅助角1
double angle12; //辅助角2
double angle13; //辅助角3
if(z < 0){
flag[1] = 1;
}
if(x < 0){
flag[0] = 1;
}
l = sqrt(pow(x,2) + pow(y,2)); //进行三角变换处理
l1 = sqrt(pow(l,2) + pow(z,2));
angle11 = acos( (pow(l1,2) + pow(A1,2) - pow(A2,2)) / (2*l1*A1) );
angle12 = acos( l / l1 );
angle13 = acos( (pow(l1,2) + pow(A2,2) - pow(A1,2)) / (2*l1*A2) );
if(flag[1] == 1){
angle12 = -angle12;
}
angle0 = atan(x/y); //解算出舵机执行的弧度
angle1 = PI/2 - angle11 - angle12;
angle2 = angle11 + angle13;
if(flag[0] == 1){
angle0 = -angle0;
}
angle[0] = angle0 * (180.0/PI); //解算出执行角度,传入数组中
angle[1] = angle1 * (180.0/PI);
angle[2] = angle2 * (180.0/PI);
}
三角步态是一种仿生学步态,主要是参照了多足昆虫的爬行特点。在本设计爬行机器人中,共有6足,按照逆时针方向分别以A-F命名。将这6足分为2组,分别是A、C、E和B、D、F。其中,A、C、E作为第一组足,B、D、F作为第二组足。每组足的三个端点连接在一起,就组成了两个三角形。在机器人移动时,两组足之间交替运动,第一组足抬升时,第二组足就固定在地面,起到支撑作用。此时第一组足则往前伸,体现移动过程。然后再将第一组足放下,第二组足抬升,同时整个机器人的身体前移。如此循环交替两组足之间的动作,就完成了爬行机器人的移动控制。通过三角步态实现的移动具有稳定性,这是由于三角形的结构稳定特性,而且由于两组足之间是稳定分布的,当爬行机器人移动时,不仅能够确保在任何状态下都能有三足进行支撑。足之间所承受压力也是较为平均分摊的。将爬行机器人的六个足顺序进行调换,就能够实现向六个方向的移动控制,体现了爬行机器人移动控制的灵活特性。三角步态示意如下图所示。
三、3D结构设计
关于3D结构设计,采用Fusion360,用Fusion360的原因就是它足够灵活,操作也比较简单,在本课题中,共设计了14个3D结构件,包括重复在内,一共打印了86个结构件。Fusion360设计界面如下图。
由于在大二期间有幸接触了3D打印机,产生了浓厚的兴趣,于是同年就基于开源项目自己DIY了一台3D打印机,主要就是在淘宝上买来零件,根据教程组装,给控制板烧录固件,就搭建起了人生的第一台3D打印机。关于本结构设计,也并非空穴来风,而是参考了国外的一个开源项目的3D结构设计。那么为什么要自己重新去做呢,主要原因有两个,第一就是我自己想独立完成本课题的全部设计(没有完全实现,因为时间不够,云台部分还是采用了OPENMV官方开源的结构),第二就是开源项目中的结构设计我感觉有些地方不合理(有些地方容易断裂,当然也可能和打印机精度和耗材材质有关),而且与我需要用的舵机不适配,于是我就自行设计了爬行机器人的3D结构。下图为开源项目的结构示意图。
而我自己设计的3D结构图,从形状上大部分参考了该项目,但在细节方面和尺寸方面做出了改动,使其能够适配国产舵机,也能满足本人的审美需求。下图为本设计的结构图。
四、硬件设计
关于硬件,做了两个PCB的设计。分为主控板和驱动板两块板子,两块板子之间通过2.54mm的排针进行连接。
其中驱动板主要采用贴片式的封装,通过PCA9685芯片提供16个PWM输出接口,再由主控单元引出2个PWM输出接口,完成18足的舵机驱动。驱动板也设计了2个5V电源管理模块,分别用于舵机的供电以及控制系统的供电。
主控板则主要采用直插式的封装,引出了主控STM32单片机最小系统、OLED显示屏、蓝牙模块等的接口,通过排插与驱动板的连接,体现控制特点。
硬件设计示意图如下。
整个设计看起来也比较简单,板子的体积也比较大,不够紧凑。布线也比较随意,主要原因还是为了求稳,毕竟是毕业设计,没有那么多时间去试错。今后也希望自己在有时间时进行改良,去实现更好地想法。
主控板
主控板采用直插封装,主控用的是STM32F103C8T6最小系统单片机,也就是市面上常见的小模块,引出了蓝牙接口,实现手机蓝牙控制;OLED接口,进行眼神动画展示;FLASH存储模块接口,存放眼神表情;MPU6050接口,保持姿态稳定;云台接口,控制两个舵机驱动摄像头云台转动;RGB灯接口,实现灯光特效。
驱动板
驱动板用到了贴片焊接,用的舵机驱动芯片应该是市面上中低配置的一款,主要引出了18个舵机驱动接口,2个电源管理模块,1个电源输入接口和1个主控通信接口。
五、软件设计
软件设计主要分三块,控制程序、机器视觉和APP设计。
控制程序
采用了KEIL5-IDE来设计STM32单片机的控制程序。本设计核心程序是一种自定义的算法,实际上也就是根据三角步态来一帧一帧的去写控制,没有太大的参考价值,但我在设计过程中也有了一些其他想法,如果能实现的话确实是一个不错的创新点,在后续过程中会加以完善。
关于思路
- 对PCA9685进行驱动控制,完成16路的舵机驱动控制,通过IIC通信建立该芯片与主控芯片之间的联系;
- 对STM32单片机的PWM输出进行配置,配置好4个输出通道,其中2个用于2足的驱动,另外2个用于驱动云台;
- 封装角度控制函数,输入参数为舵机编号(1-20)与舵机执行角度,输出效果是控制该编号舵机执行至该角度;
- 通过逆解算法与实际测试得出稳定移动的控制角度;
- 封装三角步态函数,分为6个不同方向的移动函数;
- 配置蓝牙串口函数,根据不同指令,体现不同的控制效果;
- 引入MPU6050,通过简单判断维持姿态稳定(后期改进换用精度更高的舵机,拟引入PID算法);
- 配置显示功能,分两个过程,先配置图显函数,再配置FLASH读取函数,实现眼神播放效果;
- 根据相关数据手册与资料,实现RGB灯光效果。
机器视觉
机器视觉功能实现了一个视频流传输到上位机显示的功能(就是直接调用一下图传库,进行点对点式的图传)。
APP设计
APP采用App Inventor组件搭载手机APP控制端。App Inventor是麻省理工学院某教授研发的一种开源安卓APP开发环境,采用的编程方式是一种图形化编程,能够快速实现安卓APP的开发,在本设计上位机中,通过调用其内部的蓝牙控件库来实现蓝牙无线通信,以安卓APP作为客户端,爬行机器人作为服务器,实现蓝牙通信过程,客户端将控制的指令上传到爬行机器人主机中,然后执行相应的移动控制功能和其它功能。其次上位机还搭载了Web浏览框,通过图传模块,可以将 OPENMV摄像头采集到的画面,实时上传到上位机中进行远程监控显示。APP界面如下图所示。
整个界面的图案是在网上找图抠下来的,也符合自己的审美预期。通过开关控制视频流传输开启;通过按键和选择框进行蓝牙连接;通过显示框和发送、清除按键,进行指令下发和指令查看;下方的12个按键是固定指令按键,按下就直接发相应的字符;滑动条可以控速;摇杆控制机器人移动和方向(摇杆是采用了内里的一个球控件,后期会出一期教程展开说明)。
六、结束语
本设计算是实现了自己的一个小想法,也有些遗憾,很多想到的功能都没有实现,祝愿自己后续能够更进一步。最后引用稚晖君的一句话结尾,“保持热爱,奔赴星海”。虽青春不再年少,但属于我们的天空却依旧广阔,愿我们带着雏鹰的斗志,勇敢高飞。
(本项目在后续整理好资料后开源,有兴趣的小伙伴可以多多讨论,分享心得)。