在个人想象中机器人首先应该能自由的走来走去,而后应该能流利的与主人对话。朝着这个理想,我准备设计一个能自由行走,而且能够与人语音对话的机器人。实现的关键是让机器人能经过传感器感知周围环境,并经过机器人大脑处理并输出反馈和执行动做。本章节涉及到的传感器有激光雷达、IMU、轮式里程计、麦克风、音响、摄像头,和用于处理信息的嵌入式主板。关于传感器的ROS驱动程序开发和在机器人上的使用在后面的章节会展开,本章节重点对机器人传感器和嵌入式主板进行讲解,主要内容:html
1.ydlidar-x4激光雷达python
2.带自校准九轴数据融合IMU惯性传感器nginx
4.音响麦克风与摄像头django
5.机器人大脑嵌入式主板性能对比ubuntu
6.作一个能走路和对话的机器人centos
底盘提供轮式里程计与运动控制,是机器人SLAM建图与避障导航的基础。因此对底盘进行了解,和熟悉轮式里程计与运动控制的底层原理是颇有益处的。这里以咱们的miiboo机器人的底盘为例,对底盘上的轮式里程计和运动控制的原理进行分析。网络
(图20)miiboo机器人底盘架构
底盘主要由电机控制板和带编码器的减速电机构成,如图20。电机控制板经过串口与机器人的大脑(如树莓派3)相链接,经过接收大脑下发的控制指令,利用PID算法对电机进行控制;同时,采集电机上的编码器数据发送给大脑,利用航迹推演算法获得底盘的里程计信息。并发
(图21)轮式里程计与运动控制
如图21,为轮式里程计与运动控制的系统框图。首先是机器人大脑发送控制命令,其实就是指望左、右电机达到的目标转速,咱们都知道在一个控制系统中,被控对象很难彻底按照指望目标来运行,这就须要引入反馈对被控对象进行实时的闭环控制,让被控对象尽可能逼近指望目标,电机控制板主要就是用来实现这个过程。同时,电机控制板还负责对电机编码信号进行采样,将单位采样时间(通常为10ms)内的编码脉冲累计值做为里程数据发送给机器人大脑,机器人大脑利用航迹推演算法求解出里程计信息。
通讯协议:
电机控制板与机器人大脑之间采用串口通讯。电机左、右轮指望转速被封装到串口的字符串中,做为控制命令发送给电机控制板;单位时间(通常10ms)内采样到的电机编码脉冲累计值(等效为实际电机速度)做为里程数据,以一样的方式被封装到串口的字符串中发送给机器人大脑。能够看出,控制命令与里程数据遵循同样的封装协议,协议具体形式如图22。
(图22)通讯协议
电机控制:
(图23)PID算法流程
电机控制最经常使用的就是PID控制算法,如图23为PID算法流程。以电机转速控制为例,r(t)就是给定的目标转速,c(t)就是电机实际运行时的转速,经过闭环反馈能够求得r(t)与c(t)的误差值e(t),PID控制算法中的比例(P)、积分(I)、微分(D)调节器利用e(t)生成新的控制量u(t),u(t)经过执行机构(电机驱动器)做用于被控对象(电机),电机的实际运行速度c(t)经过闭环反馈,进入下一次PID调节。就这样,不断的经过闭环反馈调节,使电机实际运行速度c(t)最终逼近给定的目标速度r(t)。
在连续和离散时间域上PID会有不一样的表现形式,在连续时间域上积分、微分调节经过积分计算、微分计算实现,而在离散时间域上积分、微分调节经过累加和、差分计算实现。因为电机控制须要在程序上进行实现,因此须要采用离散域的PID。按照PID算法生成的调节量的形式,又能够分为位置式PID和增量式PID;位置式PID生成的u(t)为直接的控制量,增量式PID生成的Δu(t)是控制量的修正量,须要叠加上一次的u(t-1)才能做为控制量。离散形式的位置式与增量式PID数学表达如图24。
(图24)离散形式的位置式与增量式PID数学表达
能够看出,利用位置PID的数学表达式通过简单的变形就能获得增量PID的数学表达式。增量算法不须要作累加,控制量增量的肯定仅与最近几回偏差采样值有关,计算偏差或计算精度问题,对控制量的计算影响较小。而位置算法要用到过去的偏差的累加值,容易产生大的累加偏差。增量式算法得出的是控制量的增量,例如阀门控制中、只输出阀门开度的变化部分,误动做影响小,必要时经过逻辑判断限制或禁止本次输出,不会严重影响系统的工做。而位置算法的输出是控制量的全量输出,误动做影响大。增量型PID的程序实现,如如图25。关于PID参数的整定,将放在后面的文章进行详细讲解。
(图25)增量型PID的程序实现
差动两轮底盘轮式里程计:
轮式里程计是机器人底盘的重要组成部分,采用航迹推演算法对机器人的位姿进行估计,并对机器人当前的速度、旋转速度、左右轮速度进行转换。不管是机器人的定位导航仍是普通的运动控制,都须要轮式里程计。
(图26)经过航迹推演计算里程计
如图26,为经过航迹推演计算里程计的过程。随时间推移机器人底盘的实时位姿p1、p2、p3、...、pn链接起来就造成了机器人的航迹,考虑很短的时间内两相邻机器人位姿p1和p2,在已知机器人位姿p1和机器人当前左右轮速度vl、vr的条件下,利用微积分的思想能够推算出机器人在下一个时刻的位姿p2,经过这样不断的推演,就能够计算出机器人当前的位姿以及速度、角速度等信息,这就是所谓的航迹推演。关于航迹推演的具体数学推导和程序实现,将在后面的文章中进行展开讲解。
底盘电机控制板软件框架:
(图27)stm32电机控制板软件架构
如图27,为stm32电机控制板软件架构。底盘中的电机控制与里程数据采集的程序在stm32单片机上实现,TIM1定时器产生周期性的循环,循环中进行电机编码器数据采集、PID计算、电机速度pwm控制,剩下的就是usart1串口与usart2串口跟机器人大脑之间的通讯了,底盘debug接口是用于stm32程序开发阶段使用的,因此在机器人正常运行的过程当中只须要使用底盘控制接口。关于stm32部分的代码和对应机器人大脑中ROS驱动代码将在后面介绍。
经过前面的讲解,咱们已经对机器人底盘的用途及工做原理有了必定的了解,而且知道了电机控制和里程计的工做过程。这时候确定很想知道如何在机器人中把底盘使用起来呢?其实很简单,和激光雷达、IMU这些传感器同样,底盘也能够当作一个传感器来使用,只不过不一样之处是这个传感器与机器人大脑是双向交互的,机器人大脑向底盘发送控制命令,底盘反馈里程数据给机器人大脑。可是,不论交互的细节如何,只须要装上底盘的ROS驱动包,上层算法只须要发布和订阅相应的主题就能达到使用底盘的目的。
(图28)在机器人中使用底盘
底盘经过串口与机器人相链接,机器人中经过运行底盘控制ROS驱动,来实现读取串口的速度反馈,利用航迹推演算法计算获得里程计并发布到/odom这个主题;底盘控制ROS驱动订阅/cmd_vel主题的运动控制数据,并转换为速度控制指令经过串口发送给底盘。这样机器人上的其它节点就能够经过发布/cmd_vel主题来对底盘进行控制,经过订阅/odom主题获取底盘的里程计。关于底盘控制ROS驱动、底盘里程计标定、底盘的debug,将在后面的章节中具体讲解。
------SLAM+语音机器人DIY系列【目录】快速导览------
第1章:Linux基础
第2章:ROS入门
第3章:感知与大脑
第4章:差分底盘设计
第5章:树莓派3开发环境搭建
第6章:SLAM建图与自主避障导航
2.google-cartographer机器人SLAM建图
第7章:语音交互与天然语言处理
第8章:高阶拓展
2.centos7下部署Django(nginx+uwsgi+django+python3)
----------------文章将持续更新,敬请关注-----------------
若是你们对博文的相关类容感兴趣,或有什么技术疑问,欢迎加入下面的《SLAM+语音机器人DIY》QQ技术交流群,一块儿讨论学习^_^
关于咱们:
视频教程: