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

    docker version:19.03.14 kubernetes version:1.19.4 本文介绍使用kubeadm安装Kubernetes集群的简单过程. 目录 使用kubeadm安装k8 ...

  2. Flask:数据库管理

    为什么不使用SQL语句,而使用ORM框架管理数据库?首先,在python程序中嵌入原生SQL语句,不方便维护,ORM框架使用面向对象思想,使用较方便:第二,如果更换底层数据库引擎,ORM框架不需要修改 ...

  3. Shiro反序列化漏洞检测、dnslog

    目录 信息收集 poc 参考 信息收集 poc # pip install pycrypto import sys import base64 import uuid from random impo ...

  4. nginx错误分析 `104: Connection reset by peer`

    故障描述 应用从虚拟机环境迁移到kubernetes环境中,有些应用不定时出现请求失败的情况,且应用没有记录任何日志,而在NGINX中记录502错误.我们查看了之前虚拟机中的访问情况,没有发现该问题. ...

  5. 剑指 Offer 63. 股票的最大利润 + 动态规划

    剑指 Offer 63. 股票的最大利润 Offer_63 题目描述 方法一:暴力法 package com.walegarrett.offer; /** * @Author WaleGarrett ...

  6. 剑指 Offer 56 - II. 数组中数字出现的次数 II + 位运算

    剑指 Offer 56 - II. 数组中数字出现的次数 II Offer_56_2 题目详情 解题思路 java代码 package com.walegarrett.offer; /** * @Au ...

  7. POJ-2236(并查集)

    Wireless NetWork POJ-2236 需要注意这里的树的深度需要初始化为0. 而且,find函数需要使用路径压缩,这里的unint合并函数也使用了优化(用一开始简单的合并过不了). #i ...

  8. 基于ABP框架的SignalR,使用Winform程序进行功能测试

    在ABP框架里面,默认会带入SignalR消息处理技术,它同时也是ABP框架里面实时消息处理.事件/通知处理的一个实现方式,SignalR消息处理本身就是一个实时很好的处理方案,我在之前在我的Winf ...

  9. MySql历史与架构

    MySQL 逻辑架构

  10. android分析之智能指针

    智能指针是一个包装类,该类有一个指针指向真正的类对象 引用计数型智能指针,该引用计数是在应该被真正类所持有,而非包装类(智能指针) 为了方便,会将引用计数单独实现在一个类中,这样所有继承它的类都有计数 ...