前面我们已经得到了当前底盘在世界坐标系中的位姿,这个位姿是通过融合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. HTTP头Content-Type类型记录

    默认发POST格式 Content-Type: application/x-www-form-urlencoded Content-Type: application/x-www-form-urlen ...

  2. go中errgroup源码解读

    errgroup 前言 如何使用 实现原理 WithContext Go Wait 错误的使用 总结 errgroup 前言 来看下errgroup的实现 如何使用 func main() { var ...

  3. 为什么要从 Linux 迁移到 BSD 4

    为什么要从 Linux 迁移到 BSD 4 许可证问题 Linux GPL 许可证对开发者的要求比较严格,它是一种开源的反模式,因为它强制发布所有修改过的源代码,并且阻止其他开源项目的集成,例如 GP ...

  4. 如何下载Image Properties Context Menu(图片)插件

    如何下载Image Properties Context Menu(图片)插件 可以通过:http://www.cnplugins.com/zhuanti/four-image-processing. ...

  5. Jmeter 分布式架构和服务器性能监控解决方案

    在对项目做大并发性能测试时,常会碰到并发数比较大(比如需要支持10000并发),单台电脑的配置(CPU和内存)可能无法支持,这时可以使用Jmeter提供的分布式测试的功能来搭建分布式并发环境 . 一. ...

  6. unittest系列(一)unittest简介和示例

    unittest - 单元测试框架 单元测试框架是受到 JUnit 的启发,与其他语言中的主流单元测试框架有着相似的风格.其支持测试自动化,配置共享和关机代码测试.支持将测试样例聚合到测试集中,并将测 ...

  7. SpringMVC源码分析和启动流程

    https://yq.aliyun.com/articles/707995 在Spring的web容器启动时会去读取web.xml文件,相关启动顺序为:<context-param> -- ...

  8. python网络编程TCP服务多客户端的服务端开发

    #服务多客户端TCP服务端开发 2 #方法说明 3 """ 4 bind(host,port)表示绑定端口号,host是ip地址,ip地址一般不进 行绑定,表示本机的任何 ...

  9. Paint Chain HDU - 3980

    题目链接:https://vjudge.net/problem/HDU-3980 题意:由n个石头组成的环,每次只能取连续的M个,最后不能取得人输. 思路:这样就可以先把它变成链,然后在链上枚举取m个 ...

  10. PTA 链表逆置

    6-3 链表逆置 (20 分)   本题要求实现一个函数,将给定单向链表逆置,即表头置为表尾,表尾置为表头.链表结点定义如下: struct ListNode { int data; struct L ...