电路

如何构建自导航机器人:7个步骤

Я обалдел!!! Письмо от Китайского Деда Мороза ))))

Я обалдел!!! Письмо от Китайского Деда Мороза ))))

目录:

Anonim

这是一个详细的教程,介绍如何从头开始实现机器人,并使其能够在未知环境中自主导航。
所有涉及机器人技术的典型论据都将包括在内: 机械学 , 电子产品程序设计 .
整个机器人被设计成由家中的任何人制造而无需专业(即昂贵的)工具和设备。
脑板(dsNav )基于具有编码器和电机控制器功能的Microchip dsPIC33 DSC。位置由odometry(编码器)计算,没有任何外部参考(航位推算)。
在最终版本中,一些其他控制器用于控制传感器(Arduino)和管理模拟传感器(PSoC)。

供应:

第1步:基本平台

这是一个如何构建一个非常简单的机器人平台的例子,其中的组件和部件易于在任何地方找到,无需专业工具或设备,也没有机械工作的特殊技能。
底座的大小允许它在许多不同类别的机器人竞赛中使用:Explorer,Line Follower,Can Collector等。

第2步:我们想要获得什么?如何?

这个机器人,作为由业余爱好者建造的大多数机器人,基于差分转向系统,使我们能够在任何给定时刻知道机器人的位置坐标,只需足够精确地周期性地知道每个车轮所覆盖的空间。
这种航位推算导航系统受到累积误差的影响;测量精度必须高,以确保长路径后的小误差圆。因此,在使用自制编码器获得一些好结果之后,我决定使用更好的东西:一对12V-200 rpm的减速电机,连接到几台300转每分钟(cpr)编码器,这两种编码器都可以在许多互联网机器人商店购买。
基本原则
为了在4x解码方法(120 kHz)中捕获300 rpm电机上的300 cpr编码器产生的所有脉冲,我们需要为每个编码器提供专用硬件(QEI =正交编码器接口)。在使用双PIC18F2431进行一些实验后,我确定正确升级到dsPIC。在开始时,它们是两个dsPIC30F4012电机控制器,用于控制车轮位置和速度,执行测距并向dsPIC30F3013提供两个电机的数据。这种通用DSC足以获取数据,进行一些三角测量以计算位置坐标,并存储与所覆盖的路径相关的数据,以便以非常高的速率获得场的地图。
当电路板和程序基本完成时,Microchip在dsPIC33F系列中为电机控制器(MC)和通用(GP)版本推出了一种新的,功能强大的28引脚SPDIP。它们比dsPIC30F快得多,它们具有更多可用的程序存储器和RAM(对于场映射非常有用),它们需要更少的功率(适用于电池供电的机器人),并且它们的DMA功能简化了许多I / O操作。
最重要的是,这些是第一款在同一芯片上具有两个QEI的Microchip电机控制器。让我们再次开始新的端口!该 逻辑框图类似于前一个电路板的逻辑框图 ,但硬件和软件更简单 我只能使用一个只有三个的DSC 。监控器和电机控制器之间不需要高速通信来交换导航参数。每个进程都很容易同步,因为它位于同一芯片上。 dsPIC33F系列的外设引脚选择功能进一步简化了PCB,实现了外设的内部连接和更大的灵活性。
这将我们带到了“基于dsPIC的导航控制板”或 dsNavCon 简而言之。该板设计为更复杂系统的一部分。在一个完整的探险家机器人中,其他电路板将控制声音,光线,气体传感器,以及保险杠和超声波测距仪,以找到目标并避开障碍物。
作为独立板, dsNavCon 也可以用于一个简单的“线跟随者”机器人,一个更复杂的东西,如用于测距和航位推算比赛的机器人,或者所谓的“罐头机器人”(用于收集比赛)。仍然有足够的免费程序内存来​​为这些任务添加代码。只需对软件进行微小改动或无改变,它也可以单独用于遥控车辆,使用双向RF调制解调器和某种智能遥控器。这个遥控器可以发送复杂的命令,如“移动FWD 1m”,“向左转15°”,“以50 cm / s运行FWD”,“转到X,Y坐标”或类似的东西。
电路板和机器人也是由任何人在家制作的,没有专业的工具和设备。

第3步:开源硬件

框图
导航控制子系统由 dsNav 作为系统的“智能”板和基于L298的双H桥板来控制齿轮传动的12V电机(Hsiang Neng HN-GH12-1634TR)。运动反馈来自几个300 cpr编码器(美国数字e4p-300-079-ht)。
通过两个UART串行接口进行与外部世界的通信;一个用于遥测,另一个用于从传感器板获取数据。 XBee模块可以通过JP1和JP2跳线连接到UART1或UART2。 J1和J16插座可用于其他类型的连接。由于dsPIC33F系列的外设引脚选择功能,COMM1端口(J16)也可用于I2C通信。
可以在此处找到Eagle格式的原始示意图:
http://www.guiott.com/Rino/dsNavCon33/dsNavCon33_Eagle_project/DsPid33sch.zip
如您所见,原理图非常简单,可以像我一样在perfboard上实现。如果您不想使用此系统并且不想实现自己的PCB,可以在以下网址获得基于我原创作品并与我的开源软件完全兼容的商用板:http://www.robot-italy的.com / product_info.php?products_id = 1564

第4步:开源软件

该软件使用MPLAB®免费IDE开发,并使用MPLAB®C30编译器(即使是免费版或学生版)编写,当然也包括Microchip:
http://www.microchip.com/stellent/idcplg?IdcService=SS_GET_PAGE&nodeId=81
整个项目在Google Code上作为开源提供
http://code.google.com/p/dspid33/
请在那里参考最新版本,评论,描述等。
程序在代码中逐步描述。为了获得高级别的注释和更易读的代码,在每个重要点都有一个括号中的数字(例如:7)作为MPLAB项目中外部文件(即:descrEng.txt)的引用。
该图显示了dsNav板控制程序的总体架构以及在项目基础上应用的导航策略。
电机控制器可以看作是控制车轮速度的黑匣子。程序的主管部分向它们发送参考速度(VeldDesX:所需速度)。微控制器的输入捕捉模块从连接到电机轴的编码器获取脉冲,并得出电机的转速(VelMesX:测量的速度)。将这些值在PID控制“速度PID”中每1ms组合一次,我们得到正确的PWM值,以保持每个单轮的所需速度。
QEI(正交编码器接口)模块从编码器获得A和B脉冲,并将4x模式下的行进方向和脉冲数返回到监控功能(计算信号A和信号B的上升沿和下降沿: 2 x 2 = 4)。
将脉冲数乘以表示每个单个编码器脉冲行进空间的K,我们获得每10ms左右车轮行进的距离。监督者结合这种行进信息并应用航位推算程序以获得机器人的测量位置坐标:Xmes,Ymes,θMes(方位角)。
主管通过串行接口(遥测)从外部接收导航命令。
可以应用不同的策略:
一个 - 以给定方向以给定速度行进(VelDes,θDes)。
- 使用坐标XDes,YDes朝向给定点行进。
C - 沿给定方向行进给定距离(DistDes,θDes)。
模式A. :通过位置1中的“逻辑控制开关”,监控功能仅使用PID控制“角度PID”。该方法将期望角度θDes与通过测距程序计算的测量角度θMes组合,以获得车辆围绕其垂直轴的旋转角速度ω的值,以校正定向误差。
DeltaV的值与ω成比例。将其添加到VelDes以获得左轮的速度并减去VelDes以获得右轮的速度,以保持航向对应于θDes值,同时机器人的中心仍以VelDes速度行进。
模式B. :使用位置2中的“逻辑控制开关”,通过PID控制“Dist PID”计算所需速度VelDes,并将其用作模式A.此PID(DistMes)的测量输入计算为当前坐标和目标坐标。期望的方位角θDes也来自相同的程序,并且它用作“角度PID”的参考输入。 “Dist PID”的参考输入为0,表示已到达目的地。在ω和VelDes可用的情况下,车轮的速度控制与模式A一样运行。
模式C. :通过位置2中的“逻辑控制开关”,目标坐标Xdes,Ydes在开始时作为输入参数DistDes,θDes的函数计算一次。之后,一切都像模式B一样

第5步:软件详细信息:速度控制和其他基本功能

该计划已满 中断驱动 。在启动时,在初始化之后,程序进入一个非常简单的主循环,充当状态机。在主循环中,程序检查由外部事件启用的标志,并根据它们的值进入相对状态。
因为它是一种非常简单的合作“实时操作系统 ,“每个例程必须在最短的时间内执行,释放系统以处理非常频繁的中断。
代码中没有“等待”并且没有延迟。只要有可能就使用中断,特别是对于传输或接收字符串等慢速操作。 UART通信具有dsPIC33F DMA功能的优势,可节省CPU时间,完成硬件中的所有“脏”工作。
dsPIC33FJ128MC802使用的外设:
- QEI计算行进路径。
- 输入捕获(IC)以计算速度。
- A / D转换器读取电机电流。
- 增强型PWM驱动电机。
- UART与外部世界通信
QEI模块 用于了解车轮行驶的程度和方向。该值每1ms在变量中进行代数累加,并在其请求时发送给监督函数。发送值后,将重置变量。
如下所述,在每个编码器的脉冲处测量速度。每1ms通过平均采样计算平均速度,执行PID算法,并根据其结果校正电机速度,从而改变PWM占空比。有关C30 PID库应用的详细说明,请参见Microchip代码示例:CE019 - 在闭环控制系统中使用比例积分微分(PID)控制器。 http://ww1.microchip.com/downloads/en/DeviceDoc/CE019_PID.zip
电动机的速度变化平稳地执行,加速或减速,具有上升或下降的倾斜斜坡,以避免可能导致测距误差的严重机械应变和车轮打滑。减速比加速更快,以避免在制动过程中遇到障碍物。
我知道了 ,输入捕捉模块用于测量编码器产生的两个脉冲之间经过的时间,s意味着当车轮行驶一段众所周知的固定空间时(常数) SPACE_ENC )。通过与QEA并联连接(由于dsPIC33F的外设引脚选择功能,可在DSC内部连接),它们捕获编码器信号上升沿的经过时间。 TIMER2用于自由运行模式。在每个IC中断时,存储TMR2的当前值并从中减去其先前的值;这是脉冲期。然后当前值变为先前的值,等待下一个中断。必须检查TMR2的标志,以了解16位寄存器中是否发生溢出。如果是,则必须将0xFFFF与前一个样本之间的差值添加到当前值。样品以代数方式添加 IcPeriod 变量根据 _UPDN 位,也确定速度方向。这是建议的方法之一 Microchip应用笔记AN545 .
变量 IcIndx 包含添加的样本数 IcPeriod .
每1ms平均速度计算为 V =空间/时间
哪里 空间= SPACE_ENC•IcIndx
(=一个编码器脉冲覆盖的空间•脉冲数)
和 时间= TCY•IcPeriod
(=单个TMR期间•发生期间的总和)。
Single_TMR_period = TCY = 1 / FCY (时钟频率)。
所以 V = Kvel•(IcIndx / IcPeriod)
哪里 Kvel = SPACE_ENC•FCY 以m / s为单位的速度。
向左移15位 Kvel const( KvelLong = Kvel << 15 )速度是以分数格式计算的(如果只使用整数变量),准备在PID程序中使用。有关更详细的说明,请参见MPLAB项目中的“descrEng.txt”文件。
A / D转换器 连续测量电机电流,将值存储在16位ADCBUF缓冲器中。当缓冲区已满时,会发生中断,并且大约每1ms计算一次平均值。
个UART 用于从外部接收命令并发回测量结果。程序的通信部分作为状态机运行。状态变量用于按顺序执行操作。非常简单快速的中断服务程序(ISR)从缓冲区获取或放入每个字节,并设置正确的标志以执行正确的功能。
如果在接收期间发生任何类型的错误(UART,校验和,解析错误),则状态变量设置为负数,并且红色LED被启动以在外部通信此故障状况。有关可能的错误的完整列表,请参见MPLAB项目中的“descrEng.txt”文件。
用于握手的协议是 物理层独立 ,也可以与I2C或RS485总线一起使用以进行通信。
第一层 由dsPIC外设接口控制。硬件检测到帧或溢出错误(UART)或冲突(I2C),并设置相应的标志。
第二层 由ISR例程处理。它们使用从接口接收的字节填充RX缓冲区。它们还检测缓冲区溢出和命令溢出。
UartRx或UartRx2功能管理 第三层 。如前所述(另请参见流程图),这些例程充当状态机,从缓冲区获取字节并解码命令字符串。
字节在第二层和第三层(ISR和UartRx函数)之间通过循环缓冲区交换。 ISR接收一个字节,将其存储在一个数组中并递增指向该数组的指针,如果指针到达数组的末尾,它将重新启动到开头。 UartRx函数有自己的指针来读取相同的数组,一旦字节在当前RX状态下被解码,就会递增(以循环方式)。只要“in”指针与“out”指针不同,主循环就会调用UartRx函数。
每个命令包由以下组成:
0 - Header @
1 - ID 0-9 ASCII
2 - Cmd A-Z ASCII
3 - CmdLen N = 1-MAX_RX_BUFF以下字节数(包括校验和)
4 - 数据……

N-1 - 数据
N - 校验和0-255通过简单地加入8位变量获得,所有字节组成消息(校验和本身被排除)。
该层控制超时和校验和错误,以及数据包一致性(正确的标头,正确的长度)。如果一切正常,则启用Parser例程(第四层 )解码消息并执行所需的操作。如果收到的消息代码未知,则此例程设置相应的错误标志。
TMR1 生成一个1000 Hz的定时时钟 - 程序的心跳。在每个TMR1的中断上,内部定时器被更新,看门狗被清除,并且设置一个标志以启用要求行进空间值的功能。每10ms“All_Parameters_Ask”功能(速度,位置,电流)启用。

第6步:软件细节:测距和野外测绘=我在哪里?

优化用于基于DSC或MCU的系统的通用算法
一旦我们获得了关于每个车轮在离散时间更新(测距法)中行进的距离的信息,我们就可以在没有任何外部参考(航位推算)的情况下估计具有相同周期的机器人的位置坐标。
有关航位测量航位推算的一些理论背景可以在Johann Borenstein的书中找到:
“我在哪里? - 用于移动机器人定位的传感器和方法”
并在以下网页上:
http://www.seattlerobotics.org/encoder/200010/dead_reckoning_article.html
数学背景和对所用一般方法的深入解释可以在G.W. Lucas的论文“机器人车轮执行器差速转向系统的教程和基本轨迹模型”,可在因特网上获得:
http://rossum.sourceforge.net/papers/DiffSteer/DiffSteer.html
一些简化的算法也可以在相同的文档中找到,因此可以使用dsPIC33F系列的数学(三角)功能在精度和精细化速度之间获得正确的折衷。
可以在附加到此步骤的图片中找到用于计算位置的数学的描述。第一个显示符号的含义,第二个显示与这些符号一起使用的公式。单击每个计算步骤旁边的框,将显示简要说明。
最后,我们知道机器人在该时间间隔内移动了多少作为方向的增量,X轴上的增量和在胎儿参考域中的Y轴上的增量。
在自己的变量中累计每个delta值,我们知道平台的当前坐标(位置和方向)。
为了避免计算错误(除以零)和浪费控制器时间,必须事先对Sr和Sl变量进行检查。如果机器人以直线行进(右轮所覆盖的空间与左轮所经过的空间几乎相同),则定义一个准零值来处理最小的机械和计算近似值,我们可以简化公式。或者它是否绕其垂直轴旋转(右轮所覆盖的空间与左轮所经过的空间几乎相同,但方向相反),如上图所示的流程图所示。

该视频显示了我们可以获得的精度的示例:
http://www.youtube.com/watch?v=d7KZDPJW5n8


场映射
利用先前函数计算的数据,执行字段映射。
每个Xms,在当前位置细化之后,执行场映射,将未知场分成10×10cm单元网格。定义最大场尺寸为5 x 5m,我们获得50 x 50 = 2500个单元矩阵。每个单元用半字节定义,总存储器占用1250字节。可以为每个单元分配16个不同的值:
n = 00未知细胞
n = 01 - 10个小区访问了n次
n =发现11个障碍物
发现n = 12气体目标
发现n = 13个轻目标
找到n = 14个声音目标
机器人可以从现场的任何位置开始;这些将是其参考系统中的参考坐标(0,0)。
场映射有助于在未知领域中找到最佳探索策略。机器人可以将自己引导到较少探索的区域(较低的“n”值),可以通过不在已发现的目标中停止两次来节省时间,可以找到到达给定坐标的最佳路径等等。

第7步:远程控制台

这是一个应用程序,通过串行通信,通过几个XBee设备从Mac / PC远程控制dsNavCon板,如框图所述。
为了便于开发和在任何操作系统中运行,它都是用 处理 语言:
http://www.processing.org/
该程序的源代码也可作为Google Code的开源源代码获得:
http://code.google.com/p/dsnavconconsole/
随着 主要小组 (第一张图片)我们可以通过在网格上查看机器人所遵循的路径(由odometry估计)在可配置的大小字段中执行遥测,并在其上读取一些其他重要值。 dsNav .
仪表显示测量值:
- MesSpeed在+/- 500 mm / s范围内,两个车轮速度的平均值(平台中心的速度)。
- 以mA为单位的测量电流(两个电机的电流之和)。
- 测量角度,由里程计测量。
其他面板用于配置机器人的参数,并在机器人中存储要遵循的定义路径(如果需要)。至少在机器人开发过程中,一个重要的面板是 细节面板 (第二张图片)实时显示每个车轮的速度,对于校准所有参数非常有用。
可以使用网络摄像头的视图切换中央网格视图,以便甚至通过视图控制机器人遵循的路径。
此视频中显示了此控制台的实际使用示例:
http://www.youtube.com/watch?v=OPiaMkCJ-r0