基于arduino的自主移动机器小车开发(论文资料).doc

上传人:小小飞 文档编号:3919897 上传时间:2019-10-10 格式:DOC 页数:16 大小:632.50KB
返回 下载 相关 举报
基于arduino的自主移动机器小车开发(论文资料).doc_第1页
第1页 / 共16页
基于arduino的自主移动机器小车开发(论文资料).doc_第2页
第2页 / 共16页
基于arduino的自主移动机器小车开发(论文资料).doc_第3页
第3页 / 共16页
基于arduino的自主移动机器小车开发(论文资料).doc_第4页
第4页 / 共16页
基于arduino的自主移动机器小车开发(论文资料).doc_第5页
第5页 / 共16页
点击查看更多>>
资源描述

《基于arduino的自主移动机器小车开发(论文资料).doc》由会员分享,可在线阅读,更多相关《基于arduino的自主移动机器小车开发(论文资料).doc(16页珍藏版)》请在三一文库上搜索。

1、基于arduino的自主移动机器小车开发smartcar负责人:马培培 张宪许导师:许军2013年6月16日目 录1 项目概述11.1 研究内容11.2 开发背景11.3 项目意义22 详细设计32.1 避障小车设计32.2 自平衡小车104 参考资料141 项目概述1.1 研究内容本项目主要是完成可以自由行走、自动避障以及简单通讯功能的智能小车的研究与实现,具体工作包括基础部分和发挥部分:基础部分:(1) 小车系统能完成测速、避开障碍物等功能。发挥部分:(1) 小车能避开障碍物、并以最佳路线绕过障碍物、防滑落、适应复杂工作环境(主要通过学习)等能力;(2) 小车与小车之间构建一个Zigbee

2、网络,这个网络用于收集周围的环境信息,并组成车载自组网络,给ARM留更多的资源来进行视频传输及对传感器信息的融合处理;1.2 开发背景“robot”一词源自捷克语“robota”,意谓“强迫劳动”。1920年捷克斯洛伐克作家萨佩克写了一个名为洛桑万能机器人公司的剧本,他把在洛桑万能机器人公司生产劳动的那些家伙取名“Robot”,汉语音译为“罗伯特”,捷克语意为“奴隶”萨佩克把机器人的地位确定为只管埋头干活、任由人类压榨的奴隶,他们存在的价值只是服务于人类。他们没有思维能力,不能思考,只是类似人的机器,以便使人摆脱劳动。到目前为止,机器人技术的发展过程大致可以分为以下3个阶段:第一代为可编程示教

3、再现型机器人,其特征是机器人能够按照事先教给它们的程序进行重复工作。1959年美国人英格伯格和德沃尔制造的世界上第一台工业机器人就属于示教再现型,即人手把着机械手,把应当完成的任务做一遍,或者人用示教控制盒发出指令,让机器人的机械手臂运动,一步步完成它应当完成的各个动作;第二代机器人(20世纪70年代)是具有一定的感觉功能和自适应能力的离线编程机器人,其特征是可以根据作业对象的状况改变作业内容,即所谓的“知觉判断机器人”;第三代机器人(20世纪80年代中期以后)是智能机器人,这种机器人带有多种传感器,能够将多种传感器得到的信息进行融合,能够有效的适应变化的环境,具有很强的自适应能力、学习能力和

4、自治功能。而对于机器人领域的一个分支移动机器人,它的研究始于60年代末期,斯坦福研究院(SRI)的Nits Nilssen和Charles Rosen等人, 在1966年至1972年间研制出了名为Shake的自主移动机器人。进入20世纪80年代以后,人们的研究方向逐渐转移到了面向实际应用的室内移动机器人的研究,并逐步形成了自主式移动机器人AMR(Indoor Autonomous Mobile Robot)概念。美国国防高级研究计划局(DARPA)专门立项,制定了地面天人作战平台的战略计划。从此在全世界掀开了全面研究室外移动机器人的序幕,如DARPA的“战略计算机”计划中的自主地面车辆(ALV

5、)计划(19831990),能源部制订的为期10年的机器人和智能系统计划(RIPS)(19861995),以及后来的空间机器人计划:日本通产省组织的极限环境下作业的机器人计划:欧洲尤里卡中的机器人计划等。初期的研究,主要从学术角度研究室外机器人的体系结构和信息处理,并建立实验系统进行验证。虽然由于80年代对机器人的智能行为期望过高,导致室外机器人的研究未达到预期的效果,但却带动了相关技术的发展,为探讨人类研制智能机器人的途径积累了经验。同时,也推动了其它国家对移动机器人的研究与开发。在国内,从“七五”开始,国的移动机器人研究开始起步,经过多年来的发展,己经取得了一定的成绩。清华大学智能移动机器

6、人于1994年通过鉴定。涉及到五个方面的关键技术:基于地图的全局路径规划技术研究(准结构道路网环境下的全局路径规划、具有障碍物越野环境下的全局路径规划、自然地形环境下的全局路径规划);基于传感器信息的局部路径规划技术研究(基于多种传感器信息的“感知一动作”行为、基于环境势场法的“感知一动作”行为、基于模糊控制的局部路径规划与导航控制);路径规划的仿真技术研究(基于地图的全局路径规划系统的仿真模拟、室外移动机器人规划系统的仿真模拟、室内移动机器人局部路径规划系统的仿真模拟);传感技术、信息融合技术研究(差分全球卫星定位系统、 磁罗盘和光码盘定位系统、超声测距系统、视觉处理技术 信息融合技术);智

7、能移动机器人的设计和实现(智能移动机器人THMR111的体系结构、高效快速的数据传输技术、自动驾驶系统)。香港城市大学智能设计、自动化及制造研究中心的自动导航车和服务机器人。中国科学院沈阳自动化研究所的AGV和防爆机器人。中国科学院自动化所自行设计、制造的全方位移动式机器人视觉导航系统。哈尔滨工业大学于1996年研制成功的导游机器人等。1.3 项目意义1994年,美国的一个机器人丹蒂(Dante)探索了南极洲的埃力柏斯火山口,这无疑是智能机器人最新技术的示范。该探险行动实际上是由相互协作的两个机器人来执行的。其中一个是善于爬坡的运输机器人,把丹蒂从营地送到火山口边缘,然后丹蒂用攀登绳索下去取样

8、。虽然该项行动遇到故障,但是人们普遍承认该机器人系统是成功的。事实上,这是代表当前智能机器人最高水平的自主式移动机器人(AMR)系列中的一个。自主式移动机器人,它要求在野外非结构化环境中自主地执行一系列任务,例如侦察、探险、搬运等等。环境变化的不确定性意味着机器人必须有良好的环境感知、行动规划与决策、灵巧的机动控制等功能。涉及的技术领域包括机器视觉、多传感融合、全局与局部控制、学习与决策,以及机械构造、运动学与动力学控制等。综上所述,开发一款具有无线功能的智能小车是有很大实用意义的。图1为此系统在探险中应用的模型表示:图1.1 智能车在探险中的应用的模型化表示2 详细设计本部分主要简要地介绍智

9、能车系统设计思路及设计过程。2.1 避障小车设计小车采用超声波测量前方距离,Arduino 根据超声波模块接受的距离控制小车前进、后退或者左转右转。也就是说它有自己的“思维”方式,只要打开电源在没有人干预的情况下可以独自在房间里闲逛而不会碰到任何东西。材料准备:1、Arduino UNO板子一个。2、 超声波测距模块一个3、 直流电机 + 轮胎4、 L298N电机驱动模块 一个 电机驱动最好带光耦的,否则可能会对超声波信号产生干扰5、万向轮 + 小车底盘 + 杜邦线 + 螺丝、螺母 + 烙铁 + 螺丝刀 + 剪刀等小车底盘是用来固定电机和电路板的,可以选用PVC板自己动手制作也可以买现成的材料

10、都有了就可以将它们链接起来。接线方式可以从程序的注释中看出来,android程序如下:#defineDEBUG 0 / set to 1 to print to serial monitor, 0 to disable#include Servo headservo; / 头部舵机对象/ Constantsconst int EchoPin = 2; /超声波信号输入const int TrigPin = 3; /超声波控制信号输出constintleftmotorpin1 = 4; / 直流电机信号输出const int leftmotorpin2 = 5;constintrightmoto

11、rpin1 = 6;constintrightmotorpin2 = 7;constintHeadServopin = 9; / 舵机信号输出 只有9或10接口可利用const int Sharppin = 11; / 红外输入 constintmaxStart = 800; /run dec time/ Variablesint isStart = maxStart; /启动int currDist = 0; / 距离boolean running = false;voidsetup() Serial.begin(9600); / 开始串行监测 /信号输入接口 pinMode(EchoPin

12、, INPUT);pinMode(Sharppin, INPUT);/信号输出接口for(int pinindex = 3; pinindex 11; pinindex+) pinMode(pinindex, OUTPUT); / set pins 3 to 10 as outputs /舵机接口headservo.attach(HeadServopin);/启动缓冲活动头部headservo.write(70);delay(2000);headservo.write(20);delay(2000);voidloop() if(DEBUG)Serial.print(running:);if(r

13、unning)Serial.println(true);elseSerial.println(false);if(isStart 0) isStart = maxStart;delay(4000);return;isStart-;delay(100);if(DEBUG)Serial.print(isStart: );Serial.println(isStart);currDist = MeasuringDistance(); /读取前端距离if(DEBUG)Serial.print(Current Distance: );Serial.println(currDist);if(currDist

14、 30) nodanger();elseif(currDist 15)backup();randTrun();else/whichway();randTrun();/测量距离 单位厘米longMeasuringDistance() longduration;/pinMode(TrigPin, OUTPUT);digitalWrite(TrigPin, LOW);delayMicroseconds(2);digitalWrite(TrigPin, HIGH);delayMicroseconds(5);digitalWrite(TrigPin, LOW);/pinMode(EchoPin, INP

15、UT);duration = pulseIn(EchoPin, HIGH);returnduration / 29 / 2;/ 前进voidnodanger() running = true;digitalWrite(leftmotorpin1, LOW);digitalWrite(leftmotorpin2, HIGH);digitalWrite(rightmotorpin1, LOW);digitalWrite(rightmotorpin2, HIGH);return;/后退voidbackup() running = true;digitalWrite(leftmotorpin1, HI

16、GH);digitalWrite(leftmotorpin2, LOW);digitalWrite(rightmotorpin1, HIGH);digitalWrite(rightmotorpin2, LOW);delay(1000);/选择路线voidwhichway() running = true;totalhalt(); / first stop!headservo.write(20);delay(1000);intlDist = MeasuringDistance(); / check left distance totalhalt(); / 恢复探测头headservo.write

17、(120); / turn the servo right delay(1000);intrDist = MeasuringDistance(); / check right distance totalhalt(); / 恢复探测头if(lDist 5) body_rturn();elsebody_lturn(); 2.2 自平衡小车Arduino自平衡小车,查了些SEGWAY技术资料发现自平衡小车的原理也比较简单:利用陀螺仪和加速度模块获得小车角度,Arduino对获取的数据进行处理,然后控制电机运转纠正倾斜,从而达到平衡的效果。需要准备的硬件有:1、陀螺仪 选用的是L3G4200D三轴陀

18、螺仪,其实自平衡小车只用到其中的一轴 2、加速度计 用的是ADXL345三轴加速度计,自平衡小车也只用到其中两轴3、Arduino板子 4、L298N电机驱动模块 一个 需要带光耦5、直流减速电机两个 小车轮胎两个 塑料盒子一个还需要一些杜邦线、 电池、螺丝等辅助的东西组装过程比较简单,在塑料盒合适的位置打孔,然后用螺丝固定住电路板和电机即可:制作之前需要对陀螺仪 + 加速度计 进行测试,看获取的角度数据是否满足要求。网上常用的方法是使用卡尔曼滤波将陀螺仪和加速度计的数据进行融合而得到一个相对稳定正确的角度值。获取到角度以后需要找到小车的平衡点,也就是无外力作用的时候小车能够立在地面上的角度:

19、 角度差 = 小车角度 - 平衡点角度。用小车角度数据结合当前的倾斜目标值,通过PID运算,得出电机PWM脉宽数据,指挥电机运行即可。PID算法相对比较简单,而且arduino有现成的PID libraries : http:/arduino.cc/playground/Code/PIDLibraryPID:PID(double* Input, double* Output, double* Setpoint,doubleKp, double Ki, double Kd, int ControllerDirection)PID:SetOutputLimits(0, 255); /default

20、 output limit corresponds to /the arduino pwm limitsSampleTime = 100; /default Controller Sample Time is 0.1 secondsPID:SetControllerDirection(ControllerDirection);PID:SetTunings(Kp, Ki, Kd);lastTime = millis()-SampleTime;inAuto = false;myOutput = Output;myInput = Input;mySetpoint = Setpoint;PID LIB

21、的参数分别是这样的:Input 输入值(这里输入卡尔曼融合获取的角度值)Output PID计算的结果,供电机驱动的PWM使用Setpoint 期望值(这里输入小车平衡点的角度值)Kp、Ki、Kd 这是KPI的三个重要参数这三个参数的详细说明:比例(P)控制比例控制是一种最简单的控制方式。其控制器的输出与输入误差信号成比例关系。当仅有比例控制时系统输出存在稳态误差(Steady-state error)。积分(I)控制在积分控制中,控制器的输出与输入误差信号的积分成正比关系。对一个自动控制系统,如果在进入稳态后存在稳态误差,则称这个控制系统是有稳态误差的或简称有差系统(System with

22、Steady-state Error)。为了消除稳态误差,在控制器中必须引入“积分项”。积分项对误差取决于时间的积分,随着时间的增加,积分项会增大。这样,即便误差很小,积分项也会随着时间的增加而加大,它推动控制器的输出增大使稳态误差进一步减小,直到等于零。因此,比例+积分(PI)控制器,可以使系统在进入稳态后无稳态误差。微分(D)控制在微分控制中,控制器的输出与输入误差信号的微分(即误差的变化率)成正比关系。自动控制系统在克服误差的调节过程中可能会出现振荡甚至失稳。其原因是由于存在有较大惯性组件(环节)或有滞后(delay)组件,具有抑制误差的作用,其变化总是落后于误差的变化。解决的办法是使抑

23、制误差的作用的变化“超前”,即在误差接近零时,抑制误差的作用就应该是零。这就是说,在控制器中仅引入 “比例”项往往是不够的,比例项的作用仅是放大误差的幅值,而目前需要增加的是“微分项”,它能预测误差变化的趋势,这样,具有比例+微分的控制器,就能够提前使抑制误差的控制作用等于零,甚至为负值,从而避免了被控量的严重超调。所以对有较大惯性或滞后的被控对象,比例+微分(PD)控制器能改善系统在调节过程中的动态特性。PID计算相关代码如下:PID myPID(&Input, &Output, &Setpoint,2,5,1, DIRECT); /PID对象声明setupPID(); /PID初始化.Ka

24、lman_Filter(Adxl_angle, Gyro_sensor); /卡尔曼融合获取angleInput = angle;myPID.Compute(); /PID计算获取 OutputDrive(Output); /根据Output驱动电机voidsetupPID()Input = 0;Setpoint = 17; /的小车自平衡角度为17 myPID.SetSampleTime(100); /控制器的采样时间100ms /myPID.SetOutputLimits(0, 2000); myPID.SetMode(AUTOMATIC);由于直流电机减速太多了(减速比1:220的单轴电机),小车抖动得比较厉害,而且PID的kp,ki,kd三个参数没调整好。等有时间换个电机再仔细调整一下参数,能做成可以控制前景、后退、转弯的小车。4 参考资料1 www.arduino.cc13

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1