查看:
6081
|
回复:
8
|
参赛作品《机器视觉独轮机器人》
|
|||
it民工
4
主题
8
回复 |
发表于2018-05-09 13:19:53
|
显示全部楼层
1#
电梯直达
【报名阶段需要填写的内容】 1. 参赛者姓名(必填项): 李志洋 叶自龙 2. 单位或学校名称(选填项): 郑州大学 3. 当前职务或职称(选填项): 本科在校生 4. 参赛作品的名字(必填项): 机器视觉独轮机器人 5. 简要陈述您的idea和作品(必填项): 设计并制作一款独轮平衡机器人,依靠惯性轮实现左右平衡,依靠驱动轮实现前后平衡。
6. 拟用到的立创商城在售物料(必填项): STM32F103RCT6 MPU-6050 TB6612 XC6206P332MR MP2359DJ-LF-Z 贴片电阻 贴片电容 功率电感 肖特基二极管 等 7. 拟用到的非立创商城物料或其它补充(必填项): OLED屏幕 树莓派 蓝牙模块 等 8. 拟用到的EDA工具软件名称(必填项): altium designer 【作品正式发表(报名成功后进入设计阶段)需要填写的内容】 一、作品简介 1.PCB
在嘉立创打样+SMT后的板子:
补焊完剩余的元件模块: 2.背景 独轮机器人作为一种重要的科学机器人,一直受到全世界的强烈关注,特别是日本的村田少女的问世,使得人们对独轮机器人的兴趣大增。 独轮机器人是一个俯仰,横滚、偏航3自由度耦合的典型欠驱动复杂系统,对于单自由度以及倒立摆,现有的控制方法可以做到很好的效果,但由于独轮机器人的单一行走轮特性,使得其成为一个欠驱动系统,在侧向平衡不像纵向平衡一样通过轮子的前后转动达到,因轮子无法横向运动,另外独轮机器人转向也缺少驱动机构,因而,独轮机器人的侧向平衡及转向问题是独轮机器人研究的关键,为此世界各国的科研工作者进行了各种研究探索。 3.意义 (1)实用性:本技术作为服务机器人、AGV小车等的新型驱动平台。独轮相对于其他轮式行进方式优势有:1、机械结构简单,几乎没有传动机构(使用轮毂电机则完全省去传动机构),降低机械损耗,节省电能。2、占地面积小,在狭小空间的通过性强。3、对于复杂地形的适应能力强。另外,现今市场上独轮平衡车因便携深受消费者欢迎,但其侧向平衡仍需人为控制,使初学者很难上手,将惯量轮平衡系统作为可拆装模块安装在独轮平衡车上,增强其侧向平衡能力,用以辅助初学者使用。 (2)研究性:作为研究一些新型控制算法的实验平台。 (3)观赏性:作为智能玩具具有趣味性与观赏性,具有一定的科幻色彩。图为皮克斯动画电影“机器人总动员”中的角色“MO”,其使用独轮自由移动,颇具新鲜感。 4.创新点 (1)机器人有且仅有一个轮子与地面接触,该轮子既为驱动轮又为承重轮。 (2)机器人运用惯量轮进行侧向平衡。在这里需要注明,飞轮与惯量轮虽然结构相同,但运用原理和控制方式完全不同。前者保持平衡的原理与我们常见的陀螺相同,依靠高速旋转产生的进动力维持平衡。而惯量轮通过电机的精确控制依靠加速减速产生反扭力抵抗外界干扰完成平衡,物理原理为角动量守恒,理想状态下惯量轮的转速接近0,因此在电机控制比较好的情况下,依靠惯量轮保持平衡的方式比飞轮高速旋转维持平衡要节省能量。 (3)机器人依靠模糊自适应PID算法控制驱动轮和惯量轮的电机。在这里同样需要注明模糊自适应PID算法相对于经典PID算法的优势。一般来说,根据仿真结果可以得出,在对三阶线性系统的控制中,利用稳定边界法进行参数整定的经典PID控制的超调量比模糊自适应PID控制的超调量要大,但模糊PID控制存在一定的稳态误差。模糊控制利用模糊集合和模糊概念描述过程系统的动态特性,根据模糊集和模糊逻辑来做出控制决策,它在解决复杂控制问题方面有很大的潜力,可以动态地适应外界环境的变化。
1.作品的整机外观图片或焊接组装好的PCBA图片; 2.作品的研究背景、目的和功能、市场应用前景; 3.作品在创新性、趣味性、实用性甚至公益性方面,有哪些亮点可体现? 二、系统构架图
三、硬件部分的描述 电源部分:整个机器人由12V锂电池供电,12V电压直接驱动惯性轮电机与驱动轮电机,同时使用DC-DC降压至5V后给舵机及其它部分供电,5V经LM1117-3.3降压至3.3V给其它芯片供电。 MCU采用STM32F103RCT6,姿态传感器使用陀螺仪MPU6050,电机驱动使用TB6612,另外还集成了2.4寸OLED屏幕外围电路以及一个蓝牙通信模块。
完整原理图:Robot_Sheet1.rar 1.附上原理图&PCB实物图的图片或者源文件(官方建议大家尽量用源文件上传),如果是图片,请确保图片是清晰可辨的; 2.用文字把该作品的实现原理、系统的工作过程大致讲解一下。 3.注明所用到的EDA工具软件名称并附上设计链接。 四、材料清单(BOM列表) 五、软件部分的描述(选填) 控制程序部分使用定时器中断进行准确定时,采样,计算,控制一系列程序每20ms进行一次。同时采用自适应模糊PID控制算法,PID控制有着原理简单,使用方便,适应性强的特点,同时又有制时精度低、抗干扰能力差等缺点。模糊自适应PID控制是在PID算法的基础上,以误差e和误差变化率ec作为输入,利用模糊规则进行模糊推理,查询模糊矩阵表进行参数调整,来满足不同时刻的e和ec对PID参数自整定的要求。 自适应模糊PID控制的原理如下图所示,从图中可以看出对偏差和偏差变化率进行模糊推理,获得Δkp、Δki、Δkd,模糊控制器的PID参数实际值为:kp=kp0+qp*Δkp、ki=ki0+qi*Δki、kd=kd0+qd*Δkd,其中qp、qi、qd为比例因子,这是比较常见的一种计算方式,但在薛定宇的《控制数学问题的MATLAB求解》一书中讲了另外一种计算方式:kp(k)=kp(k-1)+γ(k)*Δkp、ki(k)=ki(k-1))+γ(k)*Δki、kd(k)=kd(k-1)+γ(k)*Δkd,显然这种计算方式更复杂,我们这里采用前者。
为了进行模糊推理,需要确定模糊规则表和各个模糊变量的隶属度函数, 然后在此基础上进行模糊推理,通常这一步由MATLAB的M代码实现,由此获得Δkp、Δki、Δkd的查询表如下:
其曲面输出图如下,在C语言中,查询表用两维数组来实现,将偏差e和偏差变化率ec分别乘上比例因子ke、kec就可得到数组下标,从而可以进行两维数组的引用,因此在C语言中的编程并不能算作困难。 模糊PID部分C语言代码: float fuzzy_kp(float e, float ec) //函数功能:PID参数Kp的计算 e,ec,表示误差,误差变化率 { float Kp_calcu; uchar num,pe,pec; float code eRule[7]={-3.0,-2.0,-1.0,0.0,1.0,2.0,3.0}; //误差E的模糊论域 float code ecRule[7]={-3.0,-2.0,-1.0,0.0,1.0,2.0,3.0}; //误差变化率EC的模糊论域 float eFuzzy[2]={0.0,0.0}; //隶属于误差E的隶属程度 float ecFuzzy[2]={0.0,0.0}; //隶属于误差变化率EC的隶属程度 float code kpRule[4]={0.0,8.0,16.0,24.0}; //Kp的模糊子集 float KpFuzzy[4]={0.0,0.0,0.0,0.0}; //隶属于Kp的隶属程度 int code KpRule[7][7]= //Kp的模糊控制表 { {3,3,3,3,3,3,3,}, {2,2,2,2,1,2,2,}, {1,1,1,1,1,1,1,}, {1,1,0,1,0,1,1,}, {0,0,1,0,0,1,0,}, {0,1,0,1,0,0,2,}, {3,3,3,3,3,3,3,}, }; /*****误差E隶属函数描述*****/ if(e<eRule[0]) { eFuzzy[0] =1.0; pe = 0; } else if(eRule[0]<=e && e<eRule[1]) { eFuzzy[0] = (eRule[1]-e)/(eRule[1]-eRule[0]); pe = 0; } else if(eRule[1]<=e && e<eRule[2]) { eFuzzy[0] = (eRule[2] -e)/(eRule[2]-eRule[1]); pe = 1; } else if(eRule[2]<=e && e<eRule[3]) { eFuzzy[0] = (eRule[3] -e)/(eRule[3]-eRule[2]); pe = 2; } else if(eRule[3]<=e && e<eRule[4]) { eFuzzy[0] = (eRule[4]-e)/(eRule[4]-eRule[3]); pe = 3; } else if(eRule[4]<=e && e<eRule[5]) { eFuzzy[0] = (eRule[5]-e)/(eRule[5]-eRule[4]); pe = 4; } else if(eRule[5]<=e && e<eRule[6]) { eFuzzy[0] = (eRule[6]-e)/(eRule[6]-eRule[5]); pe = 5; } else { eFuzzy[0] =0.0; pe =5; } eFuzzy[1] =1.0 - eFuzzy[0]; /*****误差变化率EC隶属函数描述*****/
if(ec<ecRule[0]) { ecFuzzy[0] =1.0; pec = 0; } else if(ecRule[0]<=ec && ec<ecRule[1]) { ecFuzzy[0] = (ecRule[1] - ec)/(ecRule[1]-ecRule[0]); pec = 0; } else if(ecRule[1]<=ec && ec<ecRule[2]) { ecFuzzy[0] = (ecRule[2] - ec)/(ecRule[2]-ecRule[1]); pec = 1;} else if(ecRule[2]<=ec && ec<ecRule[3]) { ecFuzzy[0] = (ecRule[3] - ec)/(ecRule[3]-ecRule[2]);pec = 2;} else if(ecRule[3]<=ec && ec<ecRule[4]) { ecFuzzy[0]=(ecRule[4]-ec)/(ecRule[4]-ecRule[3]); pec=3; } else if(ecRule[4]<=ec && ec<ecRule[5]) { ecFuzzy[0]=(ecRule[5]-ec)/(ecRule[5]-ecRule[4]); pec=4; } else if(ecRule[5]<=ec && ec<ecRule[6]) { ecFuzzy[0]=(ecRule[6]-ec)/(ecRule[6]-ecRule[5]); pec=5; } else { ecFuzzy[0] =0.0; pec = 5; } ecFuzzy[1] = 1.0 - ecFuzzy[0]; /*********查询模糊规则表*********/
num =KpRule[pe][pec]; KpFuzzy[num] += eFuzzy[0]*ecFuzzy[0]; num =KpRule[pe][pec+1]; KpFuzzy[num] += eFuzzy[0]*ecFuzzy[1]; num =KpRule[pe+1][pec]; KpFuzzy[num] += eFuzzy[1]*ecFuzzy[0]; num =KpRule[pe+1][pec+1]; KpFuzzy[num]+=eFuzzy[1]*ecFuzzy[1]; Kp_calcu=KpFuzzy[0]*kpRule[0]+KpFuzzy[1]*kpRule[1]+KpFuzzy[2]*kpRule[2]+KpFuzzy[3]*kpRule[3]; //加权平均法解模糊
return(Kp_calcu); } 视觉部分原计划采用树莓派zero用OpenCV开源计算机视觉库进行图像处理,但由于时间关系暂未完成。 六、作品演示 请上传您的作品的功能演示到腾讯视频,并编辑到本楼(或附上视频链接)。按要求上传视频可获得10分,具体详见活动规则。 演示视频:https://v.qq.com/x/page/a076232fpqo.html 七、总结 例如您在完成该作品过程中的一些体会、碰到的技术问题或调试经验、作品的未来规划,及对我们主办方的建议和意见等。 |
|||
it民工
4
主题
8
回复 |
发表于2018-05-09 14:07:34
|
显示全部楼层
3#
|
|||
it民工
4
主题
8
回复 |
发表于2018-05-11 10:58:04
|
显示全部楼层
5#
这样吗
|
|||
it民工
4
主题
8
回复 |
发表于2018-08-20 19:58:07
|
显示全部楼层
8#
作品资料、演示视频更新完成
|
|