SLAM+语音机器人DIY系列:(四)差分底盘设计——4.底盘ROS驱动开发
摘要
运动底盘是移动机器人的重要组成部分,不像激光雷达、IMU、麦克风、音响、摄像头这些通用部件可以直接买到,很难买到通用的底盘。一方面是因为底盘的尺寸结构和参数是要与具体机器人匹配的;另一方面是因为底盘包含软硬件整套解决方案,是很多机器人公司的核心技术,一般不会随便公开。出于强烈的求知欲与学习热情,我想自己DIY一整套两轮差分底盘,并且将完整的设计过程公开出去供大家学习。说干就干,本章节主要内容:
4.底盘ROS驱动开发
对于做纯SLAM算法、机器人导航避障、或者别的需要用到移动底盘的应用,根据底盘的通信协议,直接使用底盘ROS驱动实现跟底盘的交互。miiboo机器人底盘的ROS驱动代码组织如图36。

(图36)miiboo机器人底盘的ROS驱动代码组织
整个代码组织是一个完整的ROS功能包,功能包名为miiboo_bringup,功能包中包含两个ROS节点源码(base_controller.cpp和pid_set.cpp),不难看出这两个节点正是对底盘通信协议中的DATA-uart2与DEBUG-uart1的具体实现。base_controller.cpp负责对底盘控制驱动的具体实现,pid_set.cpp负责对底盘调试驱动的具体实现。本节重点对这两个节点进行讲解,至于功能包名下的其他内容将放在后面的miiboo机器人SLAM导航实战中具体展开。
4.1.底盘控制节点
接口:
底盘控制节点对下与底盘DATA-uart2串口通信,对上开放ROS接口为应用层提功能数据发布与订阅,便于SLAM导航等功能的开发。

(图37)底盘控制节点接口
节点实现源码解析:
底盘控制节点由base_controller.cpp实现。程序主要分为两个过程:订阅topic数据并下发给底盘、从底盘接收数据并发布到topic。
首先,程序订阅/cmd_vel作为用户的控制输入,将控制输入的速度信息转换为通信协议中DATA-uart2规定的格式,然后通过串口下发给底盘,实现对底盘的运动控制。订阅/cmd_vel的回调函数和串口下发函数分别如图38和图39所示。

(图38)订阅/cmd_vel的回调函数

(图39)串口下发函数
然后,程序从串口获取底盘的速度反馈,并将速度反馈数据放入航迹推演算法中进行解算,得到里程计,将反馈回来的左轮速度、右轮速度值分别发布到/wheel_left_speed和/wheel_right_speed主题,将解算出来的里程计分别发布到/odom和/tf主题。由于不同的算法对里程计的格式要求不一样,所以将里程计同时发布到/odom和/tf主题,便于不同的算法使用。从串口获取速度反馈并求解里程计和发布反馈速度与里程计到topic
分别如图40和图41所示。

(图40)从串口获取速度反馈并求解里程计

(图41)发布反馈速度与里程计到topic
基于航迹推演算法的里程计解算:
首先,我们需要了解一下ROS下的机器人坐标系为右手坐标系,如图42,机器人底盘的正前方为x轴正方向、机器人底盘的正上方为z轴正方向、机器人底盘的正左方向为y轴正方向、机器人航向角theta坐标轴以x轴为0度角并逆时针方向增大。一般以机器人底盘上电时刻,机器人底盘的位置建立里程计坐标系,也就是说机器人底盘的起始位姿为原点O,机器人底盘在运动过程中,通过前一时刻的位置和左、右轮位移可以推算出机器人底盘的下一时刻位姿,这就是航迹推演算法。

(图42)机器人右手坐标系与航迹推演
我们这里值讨论两轮差分底盘的情况,分析如图41,通过前一时刻的位置和左、右轮位移可以推算出机器人底盘的下一时刻位姿。航迹推演的数学模型如图43。

(图43)航迹推演的数学模型
在很短的时间间隔里,前后两个机器人位姿满足一定的关系,具体看图44的推导。

(图44)短时间内两个机器人位姿的约束关系
这样,经过进一步的化简,可以得到我们解算里程计的核心公式,如图45。

(图45)解算里程计核心公式
不难发现,上面程序中解算里程计部分的代码就是这个核心公式的具体编程实现。关于航迹推演算法更详细的推导,请参考:
http://faculty.salina.k-state.edu/tim/robotics_sg/Control/kinematics/odometry.html
4.2.底盘调试节点
接口:
底盘调试节点对下与底盘DEBUG-uart1串口通信,对上通过命令行终端指令交互方式。

(图46)底盘调试节点接口
节点实现源码解析:
底盘调试节点由pid_set.cpp实现。程序主要分为两个过程:从终端获取调试命令并下发给底盘、从底盘接收应答数据并显示在终端。
首先,程序从终端获取调试命令,用户可输入数字1,2,3,如果用户输入3会再要求输入kp,ki,kd这三个数,将调试命令转换为通信协议中DEBUG-uart1规定的格式,然后通过串口下发给底盘,实现对底盘的调试。调试命令获取与下发如图47。

(图47)调试命令获取与下发
然后,程序从串口获取底盘的应答信息,这里就比较简单了,直接将获取的应答数据原样打印到终端就行了,如图48。

(图48)应答数据原样打印
后记
------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系列:(四)差分底盘设计——4.底盘ROS驱动开发的更多相关文章
- SLAM+语音机器人DIY系列:(四)差分底盘设计——6.底盘里程计标
摘要 运动底盘是移动机器人的重要组成部分,不像激光雷达.IMU.麦克风.音响.摄像头这些通用部件可以直接买到,很难买到通用的底盘.一方面是因为底盘的尺寸结构和参数是要与具体机器人匹配的:另一方面是因为 ...
- SLAM+语音机器人DIY系列:(四)差分底盘设计——1.stm32主控硬件设计
摘要 运动底盘是移动机器人的重要组成部分,不像激光雷达.IMU.麦克风.音响.摄像头这些通用部件可以直接买到,很难买到通用的底盘.一方面是因为底盘的尺寸结构和参数是要与具体机器人匹配的:另一方面是因为 ...
- SLAM+语音机器人DIY系列:(四)差分底盘设计——2.stm32主控软件设计
摘要 运动底盘是移动机器人的重要组成部分,不像激光雷达.IMU.麦克风.音响.摄像头这些通用部件可以直接买到,很难买到通用的底盘.一方面是因为底盘的尺寸结构和参数是要与具体机器人匹配的:另一方面是因为 ...
- SLAM+语音机器人DIY系列:(四)差分底盘设计——3.底盘通信协议
摘要 运动底盘是移动机器人的重要组成部分,不像激光雷达.IMU.麦克风.音响.摄像头这些通用部件可以直接买到,很难买到通用的底盘.一方面是因为底盘的尺寸结构和参数是要与具体机器人匹配的:另一方面是因为 ...
- SLAM+语音机器人DIY系列:(四)差分底盘设计——5.底盘PID控制参数整定
摘要 运动底盘是移动机器人的重要组成部分,不像激光雷达.IMU.麦克风.音响.摄像头这些通用部件可以直接买到,很难买到通用的底盘.一方面是因为底盘的尺寸结构和参数是要与具体机器人匹配的:另一方面是因为 ...
- SLAM+语音机器人DIY系列:(二)ROS入门——1.ROS是什么
摘要 ROS机器人操作系统在机器人应用领域很流行,依托代码开源和模块间协作等特性,给机器人开发者带来了很大的方便.我们的机器人“miiboo”中的大部分程序也采用ROS进行开发,所以本文就重点对ROS ...
- SLAM+语音机器人DIY系列:(三)感知与大脑——4.音响麦克风与摄像头
摘要 在我的想象中机器人首先应该能自由的走来走去,然后应该能流利的与主人对话.朝着这个理想,我准备设计一个能自由行走,并且可以与人语音对话的机器人.实现的关键是让机器人能通过传感器感知周围环境,并通过 ...
- SLAM+语音机器人DIY系列:(三)感知与大脑——5.机器人大脑嵌入式主板性能对比
摘要 在我的想象中机器人首先应该能自由的走来走去,然后应该能流利的与主人对话.朝着这个理想,我准备设计一个能自由行走,并且可以与人语音对话的机器人.实现的关键是让机器人能通过传感器感知周围环境,并通过 ...
- SLAM+语音机器人DIY系列:(三)感知与大脑——6.做一个能走路和对话的机器人
摘要 在我的想象中机器人首先应该能自由的走来走去,然后应该能流利的与主人对话.朝着这个理想,我准备设计一个能自由行走,并且可以与人语音对话的机器人.实现的关键是让机器人能通过传感器感知周围环境,并通过 ...
随机推荐
- java 基础知识小结
1. java 有三个求整的函数 math.floor () (floor 是地板的意思) 向下求整 math.ceil () (ceil 是天花板的意思 ) 向上求整 math.round() ...
- 死链接检查工具:Xenu 使用教程
一.软件作用 Xenu 全称Xenu’s Link Sleuth,是一款英文软件,界面单一,功能简单,使用方法很容易掌握.虽然看起来简单,但Xenu却拥有强大的功能.Xenu可以对网站的内链进行详细的 ...
- 如何将markdown转换为wxml
话说我要为技术博客写一个小程序版,我的博客解决方案是 hexo + github-page,格式当然是技术控们喜欢的 markdown 了 .但小程序使用的却是独有的模版语言 WXML.我总不能把之前 ...
- 重磅!!!微软发布ASP.NET Core 2.2,先睹为快。
我很高兴地宣布ASP.NET Core 2.2现在作为.NET Core 2.2的一部分提供! 如何获取? 您可以从.NET Core 2.2下载页面下载适用于您的开发机器和构建服务器的新.NET C ...
- JS教程:从0开始
一. JS简介 1. JavaScript概述 JavaScript 是世界上最流行的编程语言.这门语言可用于 HTML 和 web,更可广泛用于服务器.PC.笔记本电脑.平板电脑和智能手机等设备. ...
- [区块链\理解BTCD源码]GO语言实现一个区块链原型
摘要 本文构建了一个使用工作量证明机制(POW)的类BTC的区块链.将区块链持久化到一个Bolt数据库中,然后会提供一个简单的命令行接口,用来完成一些与区块链的交互操作.这篇文章目的是希望帮助大家理解 ...
- java并发编程(2) --Synchronized与Volatile区别
Synchronized 在多线程并发中synchronized一直是元老级别的角色.利用synchronized来实现同步具体有一下三种表现形式: 对于普通的同步方法,锁是当前实例对象. 对于静态同 ...
- CSharpGL(50)使用Assimp加载骨骼动画
CSharpGL(50)使用Assimp加载骨骼动画 在(http://ogldev.atspace.co.uk/www/tutorial38/tutorial38.html)介绍了C++用Asism ...
- 大数据与 AI 生态中的开源技术总结
本文由云+社区发表 作者:堵俊平 在数据爆炸与智能革命的新时代,新的平台与应用层出不穷,开源项目推动了前沿技术和业界生态快速发展.本次分享将以技术和生态两大视角来看大数据和人工智能技术的发展,通过分析 ...
- 前端笔记之CSS(下)浮动&BFC&定位&Hack
一.浮动 1.1 各个语言的主要知识点 HTML:标签语义化(那么怎么样布局才是合理的?没有绝对的对和错) CSS: 样式: 布局: 标准流(标准文档流.普通文档流):盒子模型(width/heigh ...