1. 滚球控制系统系统简介
1.1 题目要求
作为一名合格的研发人员,面对系统,首先要看的当然是需求,来看看需求长什么样。
图1-1 题目要求
看到 65cm*65cm 我觉得当年的参赛师兄师姐都已经哭了,这个系统对比往年的倒立摆、风力摆大得多,大就会有一个问题,细节将会被放大,特别是硬件结构的细节,我后面会详细说(只针对我选得材料,其他材料还未验证)。
1.2 硬件选取
首先当然是 65cm*65cm的板子选取 ,选的是雪弗板,当时是参考别人的方案的,有优点也有缺点吧。优点就是轻,加工比较容易,裁剪和后期想挖坑的话还是比较好操作的。同时不够硬又有一个缺点,易变形,怎么一个易变形,板子到处是坑,那种肉眼看不见,但是滚球能感受的到的坑,还有就是四周容易下垂,导致变成一个山形,雪弗板这个变形特性也是给我们带来很大的麻烦了。
其次是传动结构的选取,万向节和轴承肯定是缺不了的了,具体的会在下面说到。
最后是主控和识别传感器,先说识别的传感器,有人推荐用电容板,博主知识盲区,放弃了,选择了大多数人选择的摄像头,摄像头选择的是原子的OV2640,200W像素,SVGA 可达 30 帧,当初选择OV2640的原因很简单,只会32,只有原子接口的板子,还有就是没钱去买openmv啊,其实做滚球的话,也足够了,帧数也还可以,当然使用这个摄像头的话基本就告别了图像滤波,不然帧数就更低了,有经费的同学也可以上手openmv,对于识别小球这个简单物体是非常简单的,不用自己搞驱动,开窗控制也十分简单,寻找色块也就一条语句搞定,最重要的是,帧数更高,这个直接决定了你的PID参数好不好调。
2. 机械结构设计
滚球控制系统对于机械结构搭建要求还是比较高的,博主采用的是正交的结构,所谓的正交,也就是将板球切分为XY,舵机分别控制XY,中间加个万向节保证系统可任意沿XY翻转,舵机连接板的结构可以通过舵臂加轴承实现,上图吧。
图2-1 结构图一
图2-1 结构图二
此处有几个设计错误,首先是舵机垫高以及固定的地方,可以说是严重错误,但是当时身边没什么材料,就割了几块雪弗板作为坐垫,加上角码固定,导致系统运行时震动过大,调PID调到发吐。接着就是舵臂到平板的连接结构,使用亚克力板其实效果不好,亚克力板切成条之后刚性不足也会导致系统运行时系统震动。
对于挖不挖坑,官方是允许挖坑的,当时我还是建议先不挖坑,这个系统不震动的话,帧数够高的话,不挖坑也可以把小球稳定在目标范围,但是挖坑有个好处就是,入坑之后放弃控制就可以把小球留在坑中,不过,有坑的话控制也不是那么好,小球下坑会失控。
3. 软件算法设计
3.1 采用两套PID
软件算法设计,我觉得PID应该采用两套,在远离目标点和靠经目标点可以采用不同的PID参数,特别是针对挖坑的同学。
3.2 设置缓冲区
因为我们采用的是单级的PID控制,仅仅针对目标位置进行控制,对于轨迹基本上是无法控制的,但是我们可以设置缓冲区的方式拟合方式控制轨迹。针对画圆,我当时还未想出如何设计,也是通过缓冲区拟合的,后来做了风力摆就知道怎么一回事了,大家可以看看我的风力摆分享博客,找找思路。
图3-1 缓冲区设置
3.3 设置不同的初始位置
所谓的初始位置,其实就是,小球在每一个目标点静止不动是舵机的转动角度,使用这种方式可以更好的实现小球静止以解决平板变形的问题。
4. 踩坑经历
使用OV2640很麻烦的一点是,STM32内部SRAM大小只有192KB, 储存像素点的数据大小有限制,开窗不能太大,所以架子需要架得老高,虽然说可以设置输出图像大小,但是好像找不到对应的初始化序列,原子提供的接口也不管用。
使用STM32F4摄像头接口采集一帧数据会有帧中断,我们PID计算应该紧跟帧中断中,不能边获取图像边计算PID,会导致顺序混乱。
我们可以设计一些GUI方便调试参数,每次参数变动都得下载效率太低,这里推荐移植emWin设计GUI。