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

摘要                                            

运动底盘是移动机器人的重要组成部分,不像激光雷达、IMU、麦克风、音响、摄像头这些通用部件能够直接买到,很难买到通用的底盘。一方面是由于底盘的尺寸结构和参数是要与具体机器人匹配的;另外一方面是由于底盘包含软硬件整套解决方案,是不少机器人公司的核心技术,通常不会随便公开。出于强烈的求知欲与学习热情,我想本身DIY一整套两轮差分底盘,而且将完整的设计过程公开出去供你们学习。说干就干,本章节主要内容:html

1.stm32主控硬件设计python

2.stm32主控软件设计nginx

3.底盘通讯协议算法

4.底盘ROS驱动开发django

5.底盘PID控制参数整定编程

6.底盘里程计标ubuntu



4.底盘ROS驱动开发                  

对于作纯SLAM算法、机器人导航避障、或者别的须要用到移动底盘的应用,根据底盘的通讯协议,直接使用底盘ROS驱动实现跟底盘的交互。miiboo机器人底盘的ROS驱动代码组织如图36centos

(图36miiboo机器人底盘的ROS驱动代码组织网络

整个代码组织是一个完整的ROS功能包,功能包名为miiboo_bringup,功能包中包含两个ROS节点源码(base_controller.cpppid_set.cpp),不难看出这两个节点正是对底盘通讯协议中的DATA-uart2DEBUG-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基础

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技术交流群,一块儿讨论学习^_^

关于咱们:

视频教程:

 

https://www.bilibili.com/video/av61448040

相关文章
相关标签/搜索