前面我们已经得到了当前底盘在世界坐标系中的位姿,这个位姿是通过融合ORB_SLAM2位姿和IMU积分得到的,在当前位姿已知的case下,给SLAM小车设置一个goal,我这里是通过上位机设置,然后使用上篇文章中的轨迹规划方法就可以得到一个路径Queue。
依次执行这个队列里的离散点,就可以到达设置的目标点了。本篇文章主要内容分享一下我是如何通过闭环控制使得小车在实际环境中从A点运动到目标点B点,才疏学浅,抛砖引玉。本文没有使用ROS里的Navigation包,而是自己封装了一个Navigaton类,集成了上篇文章里的轨迹规划和这篇里的运动控制,这样方便更好的自定义控制算法。
  • 运动控制逻辑框架
在一个二维平面中,小车从A点运动到B点主要有两种方式,一是在A点原地旋转到车头朝向B点,然后径直走向B点;二是从A到B沿着弧线走。两者的区别就像是,图(1)是纯旋转和位移的解耦,图(2)则是两者的耦合。

红点是当前点,蓝色是目标点,图例标反了

Visio画得图有点丑,大家将就点看。这两种方案我之前纠结了一会要用哪个,一方面现实中的车辆都是如(2)中所示转弯的,这种方式也很自然,但是相比与(1)走的路径也会更长一点,另外如果以我这个小车底盘原地转向肯定是要有滑动摩擦的,但是我的小车是差速转向没有特殊的转向轮,这样一来也不是很好控制。最终还是决定使用图(1)中的方式。
  • 闭环控制
其实系统在下位机那一层已经有一个速度环了。另外底层还有一个速度平滑队列,虽然不是但是可以抽象为电流环(速度整的越平滑,速度就增大或减小的越慢,也就是加速度越小,加速度直接和电机输出的扭矩挂钩,又有直流电机M = K*I)。
那么我们在TX2上要做的就是位置环了。
广义位置包括3个自由度的旋转和3个自由度的位移,旋转就是第一步中的先旋转底盘到小车朝向B点,位移就是沿着直线运动到B点了。我这里使用之前得到的小车位姿作为传感器反馈的真实实际值,使用位置式PID,实际上没有用到I,就叫PD控制器吧。
要控制的东西有两个:
  1. 旋转过程中旋转的角度;
  2. 直线运动中小车的朝向以及当前位置和B点的距离。
其中过程1很大的取决了最后的运动精度,过程2中虽然也在直线运动中不断矫正小车的朝向,但还是没有直接把过程1弄的更准确来的方便。
下层单片机中断接收TX2的速度命令cmd_vel,TX2和stm32通讯频率设置为25HZ。
bool fromPoseCmdvel(geometry_msgs::PoseStamped);
bool setTargetSpeed(float vLeft, float vRight, uint8_t direction);
bool setTargetOmega(float omega, float omegaBias);
bool posePidController(float targetAngle, float currentAngle);
bool posePidController(float target_x, float target_y, float current_x, float current_y, float targetAngle, float currentAngle);
float omegaPidController(float omegaTarget, float omegaActual);
float thetaPidController(float thetaTarget, float thetaActual);bool fromPoseCmdvel(geometry_msgs::PoseStamped);
  • 实验结果
2m直线运动,开始运动前的状态,红色起始点,蓝色目标点
 
 
2m的图找不到了,这里就放一个2.5m直线的图吧。运动后的误差,这里是放大了坐标图,目测误差很小。当然这并不是实际的误差,真正的误差还得通过尺子量。
 
 
尺子量的结果,这里是纵向长度,横向误差就不放了,肯定是小于纵向误差的。
 
 
我好像有找到了2m的结果图,在这里
 
  • 最后做了一个小小的避障实验
因为室内都是白墙,建的图效果不是很好
 
这里有个室外建图的,不过是在下一篇要讲的哈哈,提前透支素材。
 
 
下面是更早一些的图片
 
 
 
 

软件篇-05-融合ORB_SLAM2和IMU闭环控制SLAM底盘运动轨迹的更多相关文章

  1. 软件篇-03-基于ORB_SLAM2手写SLAM稠密地图构建实现

    本文使用的方法不是从内部修改ORBSLAM2源码以获取稠密点云,而是先从ZED2 sdk获取以摄像头坐标系为描述的三维点云/作为点云地图的一个子集,然后融合IMU与ORB_SLAM2进行实时定位,通过 ...

  2. iOS系列 基础篇 05 视图鼻祖 - UIView

    iOS系列 基础篇 05 视图鼻祖 - UIView 目录: UIView“家族” 应用界面的构建层次 视图分类 最后 在Cocoa和Cocoa Touch框架中,“根”类时NSObject类.同样, ...

  3. GSM Sniffing入门之软件篇:GSMTAP抓取与SMS(Short Message Service)

    重点介绍如何利用50元左右的设备,抓包并还原SMS短信内容: ps:研究GSM Sniffing纯属个人兴趣,能抓SMS报文只是捡了个明文传输的漏子,切勿用于非法用途.就像sylvain说的,osmo ...

  4. FSG压缩壳和ImportREC的使用 - 脱壳篇05

    FSG压缩壳和ImportREC的使用 - 脱壳篇05 让编程改变世界 Change the world by program FSG这个壳可以说是有点儿不守妇道,尼玛你说你一个压缩壳就实现压缩功能得 ...

  5. [知乎]老狼:深入PCI与PCIe之二:软件篇

    深入PCI与PCIe之二:软件篇 https://zhuanlan.zhihu.com/p/26244141 我们前一篇文章(深入PCI与PCIe之一:硬件篇 - 知乎专栏)介绍了PCI和PCIe的硬 ...

  6. 智能家居-3.基于esp8266的语音控制系统(软件篇)

    智能家居-1.基于esp8266的语音控制系统(开篇) 智能家居-2.基于esp8266的语音控制系统(硬件篇) 智能家居-3.基于esp8266的语音控制系统(软件篇) 赞赏支持 QQ:505645 ...

  7. OA办公软件篇(一)—组织架构

    OA办公软件篇(一)-组织架构 背景 作用 迭代历程 具体实现 写在最后   背景 在说组织架构之前,我们先来说说OA本身. 百度百科解释OA为:办公自动化(Office Automation,简称O ...

  8. OA办公软件篇(二)—权限管理

    权限管理的背景 权限管理的作用 迭代历程 关键名词释义 权限管理模型 具体实现 写在最后   权限管理的背景 在OA办公软件篇(一)-组织架构一文中,我们说到组织架构是软件系统的权限体系的重要搭建依据 ...

  9. OA办公软件篇(三)—审批流

    背景 作用 迭代历程 具体实现 写在最后   背景 在前面两篇文章中,我们分别讲了组织架构和权限管理,今天我们来讲一个跟组织架构关系比较密切的功能-审批流. 审批流,通俗来说就是一个完整的审批流程,是 ...

随机推荐

  1. C++核心篇

    C++核心编程 本阶段主要针对C++面向对象编程技术做详细讲解,探讨C++中的核心和精髓. 1 内存分区模型 C++程序在执行时,将内存大方向划分为4个区域 代码区:存放函数体的二进制代码,由操作系统 ...

  2. PUToast - 使用PopupWindow在Presentation上模拟Toast

    PUToast Android10 (API 29) 之前 Toast 组件默认只能展示在主 Display 上,PUToast 通过构造一个 PopupWindoww 在 Presentation ...

  3. HDOJ-6666(简单题+模拟题)

    quailty and ccpc hdoj-6666 题目很简单,按照题目的意思模拟就行了,排序. #include<iostream> #include<cstdio> #i ...

  4. SQL字符串传参

    technicianCode in('${techList.collect { it.technicianCode }.join("','")}')

  5. Spring AOP的源码流程

    一.AOP完成日志输出 1,导入AOP模块 <dependency> <groupId>org.springframework</groupId> <arti ...

  6. yolo训练数据集

    最近了解了下yolov3的训练数据集部分,总结了以下操作步骤:(基于pytorch框架,请预先装好pytorch的相关组件) 1.下载ImageLabel软件对图片进行兴趣区域标记,每张图片对应一个x ...

  7. 部署Angular应用到Github pages

    https://jeneser.github.io/blog/2017/08/08/angular-deploying-app-github-pages/ Published: August 08, ...

  8. MySQL中where和on,where和having 的区别

    where和on的区别 用到连接查询时on会常用到,我们以左连接为例,来了解on的作用. on是在生成临时表使用的条件,不管on子句的条件是否为真,其都会返回左表的数据,如果条件为真则右表对应的数据也 ...

  9. 递归函数初步理解---python实现(汉诺塔问题)

    递归常被用来描述以自相似的方法重复事物的过程,在程序中指的是在函数定义中使用函数自身的方法. 递归是一个树结构,分为递推和回归的过程,当递推到达底部时,就会开始回归. 问题描述:A比B大两岁,B比C大 ...

  10. effective解读-第一条 静态工厂创建对象代替构造器

    好处 有名称,能见名知意.例如BigInteger的probablePrime方法 享元模式.单例模式中使用 享元模式:创建对象代价很高,重复调用已有对象,例如数据库连接等.享元模式是单例模式的一个拓 ...