摘要

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

1.stm32主控硬件设计

2.stm32主控软件设计

3.底盘通信协议

4.底盘ROS驱动开发

5.底盘PID控制参数整定

6.底盘里程计标



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

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系列:(四)差分底盘设计——4.底盘ROS驱动开发的更多相关文章

  1. SLAM+语音机器人DIY系列:(四)差分底盘设计——6.底盘里程计标

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

  2. SLAM+语音机器人DIY系列:(四)差分底盘设计——1.stm32主控硬件设计

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

  3. SLAM+语音机器人DIY系列:(四)差分底盘设计——2.stm32主控软件设计

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

  4. SLAM+语音机器人DIY系列:(四)差分底盘设计——3.底盘通信协议

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

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

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

  6. SLAM+语音机器人DIY系列:(二)ROS入门——1.ROS是什么

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

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

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

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

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

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

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

随机推荐

  1. BZOJ_2962_序列操作_线段树

    Description 有一个长度为n的序列,有三个操作1.I a b c表示将[a,b]这一段区间的元素集体增加c,2.R a b表示将[a,b]区间内所有元素变成相反数,3.Q a b c表示询问 ...

  2. poj3352添加多少条边可成为双向连通图

    Road Construction Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 13311   Accepted: 671 ...

  3. ApplicationHost.config(IIS存储配置区文件)

    对于一个刚刚创建网站,以ASP.NET MVC5为例. 我们并没有在网页的配置文件(web.config)中配置一些处理程序或模块,如处理Session的SessionStateModule模块,映射 ...

  4. mysql5.7安装和修改密码

    mysql5.7安装 第一 下载 https://downloads.mysql.com/archives/community/ 首先下载mysql5.7.18zip安装包 根据电脑配置选择32/64 ...

  5. SignalR 中丰富多彩的消息推送方式

    在上一篇 SignalR 文章中,演示了如何通过 SignalR 实现了简单的聊天室功能:本着简洁就是美的原则,这一篇我们也来聊聊在 SignalR 中的用户和组的概念,理解这些基础知识有助于更好的开 ...

  6. 腾讯视频国际版(Android)电量测试方法研究与总结

    本文由云+社区发表 作者:腾讯移动品质中心TMQ 1.研究背景: 在2017年Google I/O大会上,Google发布了Google Play管理中心的新功能:Android vitals.当ap ...

  7. Django Admin管理入门

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

  8. css实现发光文字,以及一点点js特效

    效果图: 代码如下: </head> <style> body{ background-color:#000; } .textArea{ font-size:100px; co ...

  9. 在Hyper-V上安装RemixOS 的Android模拟器

    不想用实体机,想不想弄个快速的Android虚拟环境,今天我们就来说说把Android模拟器(RemixOS)安到Hyper-v上的办法. 1. 下载RemixOs  或者直接去 论坛获得下载地址 2 ...

  10. 微信小程序后端开发(Java语言)笔记

    前言: 因为是第一次真正接触后端开发,从编码到部署服务器到上线,所以做个笔记,也供和我一样的开发小白一些参考. 一.前期工作:开发环境与工具: 1. 编程语言:Java    #笔者还没学PHP,只想 ...