接触了移动机器人这么久,我觉得应该写点什么东西,分享一下最基础的自己关于移动机器人的理解,也作为笔记总结,留到以后查阅。目前我还是觉得自己刚入门,有时候总想的太多,不如实践来的更直接,下面总结之前的实践经验,来系统的梳理一下什么是移动机器人软硬件系统问题。文中涉及到的开源项目网站地址如下:
开源项目网站Handsfree(https://github.com/HANDS-FREE/OpenRE);
项目网站和教程: http://wiki.hfreetech.org/
开源代码 : https://github.com/hands-free
图 1 移动机器人的物理样机
图1所示的是实验中常用的移动智能小车的架构,其中设备和接口是嵌入式软硬件系统最底层的一部分,CPU 需要对其它设备或者传感器进行通信,控制,操作则是通过这里的接口实现的。
这里借用github 上的开源项目Handsfree(https://github.com/HANDS-FREE/OpenRE),对 移动智能车的底层嵌入式系统做个简单的介绍,完成整个小车的搭建。
本课题专门为机器人系统所设计的嵌入式系统架构,主要包含设备和 IO 接口,操作系统组件和应用软件。
1 最底层之设备与接口
图3 HANDS FREE硬件设备与接口
如图 3,则是 HANDS FREE 为了上层应用跨平台建立的底层软件框架,其隔离了不同CPU环境下的设备和接口代码 。接口方面封装了USRT,IIC,SPI,CAN 等常用通信接口,以及 pwm 电机控制输出,encoder 编接口等。设备方面封装了常用的陀螺仪,加速计,磁力计等传感器,以及直流电机,伺服舵机,遥控器等设备。
1.1 惯性测量传感器与 IIC 接口(具体的模块使用,请看前面的博客)
IIC 即 Inter-Integrated Circuit(集成电路总线),IIC 是一种多向控制总线,半双工通信方式,也就是说多个芯片可以连接到同一总线结构下,同时控制每个芯片的实时数据传输。
IIC 是串行总线的一种,一般是有两根信号线构成,一根是可以双向通信的数据线并连接着每个设备的 SDA,另一根是所有设备的时钟线SCL。每个 IIC 设备有一个属于自己的地址,通信是 IIC 通信协议会先进行地址匹配,从而有条不紊的分别操作 IIC 总线上不同的设备。
图1的系统中,使用 IIC 接口的设备非常多,有保存数据用的可擦写存储器 AT24C0X,512KB 的 EEPROM,也有测量角速度,重力加速计的传感器MPU6050,测量磁场的磁力计 HMC5883L,测量气压的气压计 MS5611。
1.2 射频模块与 SPI 接口(具体的模块使用,请看前面的博客)
SPI 是串行外设接口(Serial Peripheral Interface)的缩写,是一种高速度,全双工,同步通信的总线结构,一般占用 4 根线,分别是主设备的输出、从设备输入的 MOSI,主设备输入、从设备输出的 MISO,和公用时钟线 SCLK,以及每个设备都有一个属于自己的使能信号,又叫片选限号 CS。
SPI 的通信速度是以自己的时钟为依据的,比如使用的 STM32F407 最高可达 42Mbits/s,比起 400K 的 IIC 快了不少,所以现在很多系统都尽量选择 SPI 的设备,包括之前所说的 IIC 的传感器,也有支持 SPI 的同类型替代品。
使用的 SPI 通信的射频模块 NRF24L01,一对该模块即可构成双向无线通信,通信速度理论可达 2Mbits/s,使用它可以方便的构成机器人的无线通信网络,方便开发测试。(具体的模块使用,请看前面的博客)
1.3串口与 PC 端通信(具体的模块使用,请看前面的博客)
这里的串口主要指异步串行通信方式,异步串行是指 UART(Universal Asynchronous Receiver/Transmitter),通用异步接收/发送,UART 包含 TTL 电平的串口和 RS232 电平的串口。
TTL 电平是 3.3V 的,也是单片机端的电平,而RS232 是负逻辑电平,它定义+5~+12V 为低电平,而-12~-5V 为高电平,PC 端则是这种逻辑。
所以单片机的串口和 PC 的串口不能直接通信,需要进行电平转换。由于现在 PC 端 USB 接口非常的方便实用,所以有很多串口转 USB 的转换芯片,比如 FT232RL,CP2102 等。单片机连接模块通过 USB 数据线和 PC 进行通信。
2 中间层之运动控制
整个嵌入式系统通过控制电机驱动和读取电机编码器的数据实现电机的PID速度环控制,通过运动学解算实现机器人运动控制和坐标计算,通过各种 IO 扩展接口实现多超声波、IMU 等传感器数据的采集和处理,通过RoboLink 协议实现和上层软件系统的数据和命令通信。
2.1电机速度环控制(具体代码参考前面的电机控制博客)
电机控制是指对电机的启动、加速、运转、减速及停止进行的控制。又可以划分为开环控制和闭环控制。
闭环控制,是指通过对编码器反馈的数据和希望值进行比较得到误差,并将误差进行分析和运算,不断调节控制力度的的控制方式。开环控制,是指没有反馈调节的控制方式,通过提前预估系统的特性,并在控制时根据该特性和希望值做出相应的控制力度。
图 5 HANDS FREE 电机 PID 控制流程
如图 5,为 HANDS FREE 电机 PID 控制的流程,通过目标速度和编码器测量的速度作比较形成误差,并通过 PID 控制的输出控制电机以消减误差,从而达到目标速度,这是电机控制中最普遍的方式,即速度环控制。
2.2 底盘运动控制(参见之前的编队博客)
底盘控制是首要任务,主要可以分为运动学控制和坐标解算两部分。
坐标解算其实是一个逆运动学解算的过程,关于运动学控制模型和之间的数学关系会略去,后续补,此处只介绍软件的实现过程。
运动学控制负责控制三个电机机体或者使底盘达到期望的速度向量,由于该机器人是在平面上运动,所以这是一个三维向量 x、y、w,分别代表前后、左右、和旋转。在课题试验中,机体速度的更新频率不需要太高,上位机以 10HZ 左右要求底盘更新自己的机器人坐标速度,当软件每次更新速度时则会重新分配三个电机的旋转速度,从而不断使机体的运动保持自己想要的速度向量。同时电机控制则是一个简单的速度环控制,通过 50~200HZ 的 PID 控制使电机的速度一直保持希望值。
坐标解算,则和运动学控制相反,它的主要任务是采集分析编码器的数据,解算出当前机器人的速度、坐标等信息,通过这一步可以让软件确认当前的运动是否正确实施,并且是否到达自己想要的位置。编码器以 50~200HZ 的频率进行采样,同时坐标解算任务以 20~50HZ 的频率计算当前的坐标偏移,并通过不断积分得到总的坐标偏移从而得到基于起始点坐标系的位置,并将这些信息反馈给上位机方便其进行路径规划,避障导航等任务的实施。