前面我们已经得到了当前底盘在世界坐标系中的位姿,这个位姿是通过融合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. Kubernetes-4.Pods

    docker version:19.03.14 kubernetes version:1.19.4 ** 已了解Kubernetes的组成.安装.以及kubectl基本命令使用 本文概述Kuberne ...

  2. 【开源】.net微服务开发引擎Anno 让复杂的事简单点- 日志、链路追踪一目了然 (上)

    1.Anno简介? Anno是一个微服务框架引擎.入门简单.安全.稳定.高可用.全平台可视化监控.依赖第三方框架少.详情请查看<[开源].net微服务开发引擎Anno开源啦> 本章主题:. ...

  3. 剑指 Offer 67. 把字符串转换成整数 + 字符串

    剑指 Offer 67. 把字符串转换成整数 Offer_67 题目描述 题解分析 java代码 package com.walegarrett.offer; /** * @Author WaleGa ...

  4. 【Arduino学习笔记01】关于Arduino引脚的一些笔记

    参考链接:https://www.yiboard.com/thread-831-1-1.html Arduino Uno R3 - 引脚图 Arduino Uno R3 - 详细参数 Arduino ...

  5. 文件查询 select name,age where age>22

    # 员工信息表: 完善代码,背下来给代码加注释column_dic = {'id': 0, 'name': 1, 'age': 2, 'phone': 3, 'job': 4} # 将文件每一列的名字 ...

  6. WPF 基础 - 图片与 base64

    1. base64 转图片 将 base64 转成 byte[] 将 byte[] 作为内存流保存到一个 BitmapImage 实例的流的源 把 BitmapImage 作为目标图片的 Source ...

  7. 2019 GDUT Rating Contest III : Problem C. Team Tic Tac Toe

    题面: C. Team Tic Tac Toe Input file: standard input Output file: standard output Time limit: 1 second M ...

  8. webpack核心模块tapable用法解析

    前不久写了一篇webpack基本原理和AST用法的文章,本来想接着写webpack plugin的原理的,但是发现webpack plugin高度依赖tapable这个库,不清楚tapable而直接去 ...

  9. 利用flex解决input定位的问题

    用简单的布局搞定input框使用fixed下输入的问题 最近在做移动端H5聊天应用发现,当input框在最底部并且使用 position:fixed 属性的时候在苹果手机中会出现不兼容的情况 ​

  10. Line-line Intersection Gym - 102220C

    题目链接:https://vjudge.net/problem/Gym-102220C 题意:求n 条直线两两相交有几对(也可以重合). 思路:用map和pair存所有直线的斜率和与X轴的交点,假设与 ...