SLAM+语音机器人DIY系列:(三)感知与大脑——3.轮式里程计与运动控制
摘要
在我的想象中机器人首先应该能自由的走来走去,然后应该能流利的与主人对话。朝着这个理想,我准备设计一个能自由行走,并且可以与人语音对话的机器人。实现的关键是让机器人能通过传感器感知周围环境,并通过机器人大脑处理并输出反馈和执行动作。本章节涉及到的传感器有激光雷达、IMU、轮式里程计、麦克风、音响、摄像头,和用于处理信息的嵌入式主板。关于传感器的ROS驱动程序开发和在机器人上的使用在后面的章节会展开,本章节重点对机器人传感器和嵌入式主板进行讲解,主要内容:
3.轮式里程计与运动控制
底盘提供轮式里程计与运动控制,是机器人SLAM建图与避障导航的基础。所以对底盘进行了解,和熟悉轮式里程计与运动控制的底层原理是很有益处的。这里以我们的miiboo机器人的底盘为例,对底盘上的轮式里程计和运动控制的原理进行分析。
3.1.硬件概述

(图20)miiboo机器人底盘
底盘主要由电机控制板和带编码器的减速电机构成,如图20。电机控制板通过串口与机器人的大脑(如树莓派3)相连接,通过接收大脑下发的控制指令,利用PID算法对电机进行控制;同时,采集电机上的编码器数据发送给大脑,利用航迹推演算法得到底盘的里程计信息。
3.2.轮式里程计与运动控制

(图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驱动代码将在后面介绍。
3.3.在机器人中使用底盘
通过前面的讲解,我们已经对机器人底盘的用途及工作原理有了一定的了解,并且知道了电机控制和里程计的工作过程。这时候肯定很想知道如何在机器人中把底盘使用起来呢?其实很简单,和激光雷达、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技术交流群,一起讨论学习^_^

SLAM+语音机器人DIY系列:(三)感知与大脑——3.轮式里程计与运动控制的更多相关文章
- SLAM+语音机器人DIY系列:(三)感知与大脑——2.带自校准九轴数据融合IMU惯性传感器
摘要 在我的想象中机器人首先应该能自由的走来走去,然后应该能流利的与主人对话.朝着这个理想,我准备设计一个能自由行走,并且可以与人语音对话的机器人.实现的关键是让机器人能通过传感器感知周围环境,并通过 ...
- SLAM+语音机器人DIY系列:(三)感知与大脑——1.ydlidar-x4激光雷达
摘要 在我的想象中机器人首先应该能自由的走来走去,然后应该能流利的与主人对话.朝着这个理想,我准备设计一个能自由行走,并且可以与人语音对话的机器人.实现的关键是让机器人能通过传感器感知周围环境,并通过 ...
- SLAM+语音机器人DIY系列:(三)感知与大脑——4.音响麦克风与摄像头
摘要 在我的想象中机器人首先应该能自由的走来走去,然后应该能流利的与主人对话.朝着这个理想,我准备设计一个能自由行走,并且可以与人语音对话的机器人.实现的关键是让机器人能通过传感器感知周围环境,并通过 ...
- SLAM+语音机器人DIY系列:(三)感知与大脑——5.机器人大脑嵌入式主板性能对比
摘要 在我的想象中机器人首先应该能自由的走来走去,然后应该能流利的与主人对话.朝着这个理想,我准备设计一个能自由行走,并且可以与人语音对话的机器人.实现的关键是让机器人能通过传感器感知周围环境,并通过 ...
- SLAM+语音机器人DIY系列:(三)感知与大脑——6.做一个能走路和对话的机器人
摘要 在我的想象中机器人首先应该能自由的走来走去,然后应该能流利的与主人对话.朝着这个理想,我准备设计一个能自由行走,并且可以与人语音对话的机器人.实现的关键是让机器人能通过传感器感知周围环境,并通过 ...
- SLAM+语音机器人DIY系列:(六)SLAM建图与自主避障导航——2.google-cartographer机器人SLAM建图
摘要 通过前面的基础学习,本章进入最为激动的机器人自主导航的学习.在前面的学习铺垫后,终于迎来了最大乐趣的时刻,就是赋予我们的miiboo机器人能自由行走的生命.本章将围绕机器人SLAM建图.导航避障 ...
- SLAM+语音机器人DIY系列:(二)ROS入门——6.编写简单的service和client
摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS ...
- SLAM+语音机器人DIY系列:(四)差分底盘设计——4.底盘ROS驱动开发
摘要 运动底盘是移动机器人的重要组成部分,不像激光雷达.IMU.麦克风.音响.摄像头这些通用部件可以直接买到,很难买到通用的底盘.一方面是因为底盘的尺寸结构和参数是要与具体机器人匹配的:另一方面是因为 ...
- SLAM+语音机器人DIY系列:(四)差分底盘设计——5.底盘PID控制参数整定
摘要 运动底盘是移动机器人的重要组成部分,不像激光雷达.IMU.麦克风.音响.摄像头这些通用部件可以直接买到,很难买到通用的底盘.一方面是因为底盘的尺寸结构和参数是要与具体机器人匹配的:另一方面是因为 ...
随机推荐
- 【源码解析】Sharding-Jdbc模块分析
最新的2.0版本的Sharding-Jdbc版本,由于需要支持动态配置加载,所以最新的模块信息如下: |-sharding-jdbc |-sharding-jdbc-core |-api |-cons ...
- Spring mvc 上传进度条实现
以下的仅仅是学习而已,记录以下笔记 1 springmvc 进度条,要实现ProgressListener接口,实现方法update(long readLength, long contextLeng ...
- 自行实现 dotnet core rpc
前言 小李:“胖子,上头叫你对接我的数据好了没有?” 胖子:“那是你的事,你都不提供数据源,我咋接?” 小李:“你想要什么样的数据源?” 胖子:“我想要一个调用简单点的!” 小李:“我这个数据源是在l ...
- 记录遭遇挖矿程序kthrotlds的失败处理经历
1 发现问题 在腾讯云上购买了一个centos7的服务器,平时用来练手,偶尔也安装一些程序进行测试,上面安装了mysql和redis,前段时间数据库经常掉线,连不上,到腾讯云后台进行查看,通过服务器实 ...
- Node.js + MySQL 实现数据的增删改查
通过完成一个 todo 应用展示 Node.js + MySQL 增删改查的功能.这里后台使用 Koa 及其相应的一些中间件作为 server 提供服务. 初始化项目 $ mkdir node-cru ...
- 新手篇丨Python任意网段Web端口信息探测工具
你学习Python的目的是什么?是想写爬虫爬取数据(数据.图片等内容),还是想自写自动化的小工具,又或是作为一个新手小白单纯的欣赏这门语言呢? 今天i春秋分享的是一篇关于多线程工具的文章,工具使用效率 ...
- 从壹开始前后端 [vue后台] 之二 || 完美实现 JWT 滑动授权刷新
缘起 哈喽大家周一好!不知道小伙伴们有没有学习呀,近来发现各种俱乐部搞起来了,啥时候群里小伙伴也搞一次分享会吧,好歹也是半千了(时间真快,还记得5个月前只有20多人),之前在上个公司,虽然也参与组织过 ...
- 微服务架构 - SpringBoot整合Jooq和Flyway
在一次学习分布式跟踪系统zipkin中,发现了jooq这个组件,当时不知这个组件是干嘛的,后来抽空学习了一下,感觉这个组件还挺用的.它主要有以下作用: 通过DSL(Domain Specific La ...
- ES 12 - 配置使用Elasticsearch的动态映射 (dynamic mapping)
目录 1 动态映射(dynamic mapping) 1.1 什么是动态映射 1.2 体验动态映射 1.3 搜索结果不一致的原因分析 2 开启dynamic mapping策略 2.1 约束策略 2. ...
- 最详细的Windows平台安装MongoDB教程
一.MongoDB简介 MongoDB是一个基于分布式文件存储的数据库,由C++语言编写,旨在为WEB应用提供可扩展的高性能数据存储解决方案. MongoDB将数据存储为一个文档,数据结构由键值(ke ...