摘要

在我的想象中机器人首先应该能自由的走来走去,然后应该能流利的与主人对话。朝着这个理想,我准备设计一个能自由行走,并且可以与人语音对话的机器人。实现的关键是让机器人能通过传感器感知周围环境,并通过机器人大脑处理并输出反馈和执行动作。本章节涉及到的传感器有激光雷达、IMU、轮式里程计、麦克风、音响、摄像头,和用于处理信息的嵌入式主板。关于传感器的ROS驱动程序开发和在机器人上的使用在后面的章节会展开,本章节重点对机器人传感器和嵌入式主板进行讲解,主要内容:

1.ydlidar-x4激光雷达

2.带自校准九轴数据融合IMU惯性传感器

3.轮式里程计与运动控制

4.音响麦克风与摄像头

5.机器人大脑嵌入式主板性能对比

6.做一个能走路和对话的机器人



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基础

1.Linux简介

2.安装Linux发行版ubuntu系统

3.Linux命令行基础操作

第2章:ROS入门

1.ROS是什么

2.ROS系统整体架构

3.在ubuntu16.04中安装ROS kinetic

4.如何编写ROS的第一个程序hello_world

5.编写简单的消息发布器和订阅器

6.编写简单的service和client

7.理解tf的原理

8.理解roslaunch在大型项目中的作用

9.熟练使用rviz

10.在实际机器人上运行ROS高级功能预览

第3章:感知与大脑

1.ydlidar-x4激光雷达

2.带自校准九轴数据融合IMU惯性传感器

3.轮式里程计与运动控制

4.音响麦克风与摄像头

5.机器人大脑嵌入式主板性能对比

6.做一个能走路和对话的机器人

第4章:差分底盘设计

1.stm32主控硬件设计

2.stm32主控软件设计

3.底盘通信协议

4.底盘ROS驱动开发

5.底盘PID控制参数整定

6.底盘里程计标

第5章:树莓派3开发环境搭建

1.安装系统ubuntu_mate_16.04

2.安装ros-kinetic

3.装机后一些实用软件安装和系统设置

4.PC端与robot端ROS网络通信

5.Android手机端与robot端ROS网络通信

6.树莓派USB与tty串口号绑定

7.开机自启动ROS节点

第6章:SLAM建图与自主避障导航

1.在机器人上使用传感器

2.google-cartographer机器人SLAM建图

3.ros-navigation机器人自主避障导航

4.多目标点导航及任务调度

5.机器人巡航与现场监控

第7章:语音交互与自然语言处理

1.语音交互相关技术

2.机器人语音交互实现

3.自然语言处理云计算引擎

第8章:高阶拓展

1.miiboo机器人安卓手机APP开发

2.centos7下部署Django(nginx+uwsgi+django+python3)

----------------文章将持续更新,敬请关注-----------------

如果大家对博文的相关类容感兴趣,或有什么技术疑问,欢迎加入下面的《SLAM+语音机器人DIY》QQ技术交流群,一起讨论学习^_^

SLAM+语音机器人DIY系列:(三)感知与大脑——3.轮式里程计与运动控制的更多相关文章

  1. SLAM+语音机器人DIY系列:(三)感知与大脑——2.带自校准九轴数据融合IMU惯性传感器

    摘要 在我的想象中机器人首先应该能自由的走来走去,然后应该能流利的与主人对话.朝着这个理想,我准备设计一个能自由行走,并且可以与人语音对话的机器人.实现的关键是让机器人能通过传感器感知周围环境,并通过 ...

  2. SLAM+语音机器人DIY系列:(三)感知与大脑——1.ydlidar-x4激光雷达

    摘要 在我的想象中机器人首先应该能自由的走来走去,然后应该能流利的与主人对话.朝着这个理想,我准备设计一个能自由行走,并且可以与人语音对话的机器人.实现的关键是让机器人能通过传感器感知周围环境,并通过 ...

  3. SLAM+语音机器人DIY系列:(三)感知与大脑——4.音响麦克风与摄像头

    摘要 在我的想象中机器人首先应该能自由的走来走去,然后应该能流利的与主人对话.朝着这个理想,我准备设计一个能自由行走,并且可以与人语音对话的机器人.实现的关键是让机器人能通过传感器感知周围环境,并通过 ...

  4. SLAM+语音机器人DIY系列:(三)感知与大脑——5.机器人大脑嵌入式主板性能对比

    摘要 在我的想象中机器人首先应该能自由的走来走去,然后应该能流利的与主人对话.朝着这个理想,我准备设计一个能自由行走,并且可以与人语音对话的机器人.实现的关键是让机器人能通过传感器感知周围环境,并通过 ...

  5. SLAM+语音机器人DIY系列:(三)感知与大脑——6.做一个能走路和对话的机器人

    摘要 在我的想象中机器人首先应该能自由的走来走去,然后应该能流利的与主人对话.朝着这个理想,我准备设计一个能自由行走,并且可以与人语音对话的机器人.实现的关键是让机器人能通过传感器感知周围环境,并通过 ...

  6. SLAM+语音机器人DIY系列:(六)SLAM建图与自主避障导航——2.google-cartographer机器人SLAM建图

    摘要 通过前面的基础学习,本章进入最为激动的机器人自主导航的学习.在前面的学习铺垫后,终于迎来了最大乐趣的时刻,就是赋予我们的miiboo机器人能自由行走的生命.本章将围绕机器人SLAM建图.导航避障 ...

  7. SLAM+语音机器人DIY系列:(二)ROS入门——6.编写简单的service和client

    摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS ...

  8. SLAM+语音机器人DIY系列:(四)差分底盘设计——4.底盘ROS驱动开发

    摘要 运动底盘是移动机器人的重要组成部分,不像激光雷达.IMU.麦克风.音响.摄像头这些通用部件可以直接买到,很难买到通用的底盘.一方面是因为底盘的尺寸结构和参数是要与具体机器人匹配的:另一方面是因为 ...

  9. SLAM+语音机器人DIY系列:(四)差分底盘设计——5.底盘PID控制参数整定

    摘要 运动底盘是移动机器人的重要组成部分,不像激光雷达.IMU.麦克风.音响.摄像头这些通用部件可以直接买到,很难买到通用的底盘.一方面是因为底盘的尺寸结构和参数是要与具体机器人匹配的:另一方面是因为 ...

随机推荐

  1. BZOJ_1269&&1507_[AHOI2006]文本编辑器editor&&[NOI2003]Editor

    BZOJ_1269&&1507_[AHOI2006]文本编辑器editor&&[NOI2003]Editor 题意: 分析: splay模拟即可 注意1507的读入格式 ...

  2. BZOJ_1369_[Baltic2003]Gem_树形DP

    BZOJ_1369_[Baltic2003]Gem_树形DP Description 给出一棵树,要求你为树上的结点标上权值,权值可以是任意的正整数 唯一的限制条件是相临的两个结点不能标上相同的权值, ...

  3. hystrix 结果缓存机制(5)

    hystrix支持将一个请求结果缓存起来,下一个具有相同key的请求将直接从缓存中取出结果,减少请求开销.要使用hystrix cache功能 第一个要求是重写getCacheKey(),用来构造ca ...

  4. .NET 反编译调试神器:dnSpy了解一下

    如果客户环境出了问题,而又无法快速定位问题,可以借助dnSpy进行反编译调试跟踪. 可前往dnSpy官网下载或直接从我的分享链接下载(内置包含.NET Framework 4.7.1,若运行提示需要安 ...

  5. BF-9000 BMC任务关键型应急通信系统

    一.系统简介 BF-9000 BMC任务关键型应急通信系统,凝聚北峰通信近30年专网通信与应急通信研发的经验,并结合用户实际需求和应用场景所打造. 整体设计思路是采用骨干网.前指网.分队战斗网三层组网 ...

  6. Android开发:文本控件详解——EditText(一)基本属性

    一.简单实例: EditText输入的文字样式部分的属性,基本都是和TextView中的属性一样. 除此之外,EditText还有自己独有的属性. 二.基本属性: hint  输入框显示的提示文本  ...

  7. python接口自动化(十六)--参数关联接口后传(详解)

    简介 大家对前边的自动化新建任务之后,接着对这个新建任务操作了解之后,希望带小伙伴进一步巩固胜利的果实,夯实基础.因此再在沙场实例演练一下博客园的相关接口.我们用自动化发随笔之后,要想接着对这篇随笔操 ...

  8. 用node探究http缓存

    用node搞web服务和直接用tomcat.Apache做服务器不太一样, 很多工作都需要自己做.缓存策略也要自己选择,虽然有像koa-static,express.static这些东西可以用来管理静 ...

  9. 强化学习(十五) A3C

    在强化学习(十四) Actor-Critic中,我们讨论了Actor-Critic的算法流程,但是由于普通的Actor-Critic算法难以收敛,需要一些其他的优化.而Asynchronous Adv ...

  10. Django Admin管理入门

    Django最强大的部分之一是自动管理界面.它从模型中读取元数据,以提供快速,以模型为中心的界面,受信任的用户可以在其中管理您网站上的内容.管理员的推荐用途仅限于组织的内部管理工具.它不是用于构建整个 ...