ROS学习笔记(15)小车巡墙驾驶

0.前提

前一章我讲解了拉氏变换和PID,这一章我来讲解一下小车巡墙驾驶的理论和部分代码。

1.前情回顾

1.拉氏变换

F(s)=\int_{0}^{+\infty}f(t)e^{-st}dt

拉普拉斯变换是要将时域问题转换成频域问题来处理。

2.PID控制器

转向角: \theta _{pi}=K_{p}*e(t)+K_{i}\int_{0}^{t}e(t)dt+K_{p}*\frac{d}{dt}e(t)

误差牺牲:e(t)=-(y+L*sin(\theta ))

3.具体参看上一篇文章

2.巡墙驾驶理论

在PID当中我们提到牺牲误差,那实际运用当中我们要如何得到牺牲误差呢?在何时去获取误差(这是一个时域问题)?

回答:我们可以在当前时间t利用雷达获取到右墙的距离,而现在这个时刻的距离认为是D_{t},参看下图将小车当前速度设定为v,与速度垂直的角度测得到墙距离b,距离by轴的角度为\beta,在该角度的基础上叠加一个角度\theta0<\theta \leq 70),测出一个距离a

按下图我们可以计算出角度\beta,这时我们也就知道了当前时刻我们所在的位置D_{t}=bcos(\beta )

既然我们得到了车和墙现在的距离,那我们设置一个我们的期望值(车和墙的距离)R_{t},计算牺牲误差e(t)=R_{t}-D_{t},在低速档的时候按照这个方式计算转向是完全ok的,但当我们小车行驶在超高速度时(雷拉洛的AK-787极速能达到260km/h!),按照这样的测距方式是来不及的,换而言之,在工业上这时不安全的,我们更希望超前预测计算距离。

按下图,我们假设小车按当前速度会向前行驶一段距离L,那我们计算的牺牲误差将会是e(t)=R_{t}-D_{t}-Lsin(\beta )

3. ROS实现巡墙驾驶关键解析

在PID计算中我们需要用到积分与微分,但在实际代码工程中如何实现积分和微分的计算呢?

1.微分(D控制器)

1.导数的定义

导数其实本质上就是关于x的函数f(x)x间的除法关系求极限。

2.D控制器公式

u(t)=K_{p}*\frac{d}{dt}e(t)

换个方式表达:

u(t)=K_{p}*\frac{e(t_{1})-e(t_{2})}{t_{1}-t_{2}}

其中t_{1}表示当前时间,t_{2}表示之前时间。涉及到时间的函数在ROS中如何获取?

这里我只给出c++的ROS获取当前时间:

roscpp/Overview/Time - ROS Wiki

2.积分(I控制器)

1.积分的定义

积分其实本质上就是关于x的函数f(x)x间的乘法法关系和求极限。

2.积分控制器公式

u(t)=K_{i}\int_{0}^{t}e(t)dt

换个方式

u(t)=K_{i}*\sum [e(t)*(t_{1}-t_{2})]

其中t_{1}表示当前时间,t_{2}表示之前时间。

3.PID

最后的PID公式

转向角:\theta _{pi}=K_{p}*e(t)+K_{i}*\sum [e(t)*(t_{1}-t_{2})]+K_{p}*\frac{e(t_{1})-e(t_{2})}{t_{1}-t_{2}}

其中t_{1}表示当前时间,t_{2}表示之前时间。

 误差牺牲:e(t)=-(y+L*sin(\theta ))

4.总结

好了PID的理论和一些代码思路我就讲到这里了,接下来就是大家自己去实践了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/13254.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

「AIGC算法」图搜索算法详解

本文主要介绍图搜索算法详解和简单实例 一、原理 图搜索算法是一组用于在图结构数据上执行搜索任务的算法。图由顶点&#xff08;或称为节点&#xff09;和边组成&#xff0c;广泛应用于表示各种关系&#xff0c;如网络、路径、社交关系等。图搜索算法可以分为两大类&#xff…

【半监督学习】半监督学习中的时间集合

在本文中&#xff0c;我们提出了一种在半监督环境下训练深度神经网络的简单而高效的方法&#xff0c;在这种环境下&#xff0c;只有一小部分训练数据是有标签的。我们引入了self-ensembling技术&#xff0c;即利用网络在不同历时&#xff0c;最重要的是在不同正则化和输入增强条…

充电桩战火重燃,特来电、星星充电上演“龙虎斗”

配图来自Canva可画 小米Su7真的太火了&#xff0c;上市40天锁单量超过10万供不应求&#xff0c;给新能源汽车行业带来了新的活力&#xff0c;也促进了充电桩行业的发展。 据中国汽车工业协会数据&#xff0c;4月份新能源汽车产销分别完成87万辆和85万辆&#xff0c;同比分别增…

[LeetCode #202] 快乐数

目录 题目描述&#xff1a; 解题思路&#xff1a; 解题代码: 题目描述&#xff1a; 编写一个算法来判断一个数 n 是不是快乐数。 「快乐数」 定义为&#xff1a; 对于一个正整数&#xff0c;每一次将该数替换为它每个位置上的数字的平方和。然后重复这个过程直到这个数变…

地表最强ChatGPT爆了!我来告诉你,它都有什么用

OpenAI刚刚发布了全新的 "GPT-4o"&#xff0c;它不仅可以通过语音、视觉和文本进行推理&#xff0c;还在速度和价格上有了巨大的突破。它的速度提高了2倍&#xff0c;价格却降低了50%&#xff0c;而且生成速率比GPT-4 Turbo高出5倍。最令人惊喜的是&#xff0c;它将对…

【prometheus】prometheus基于consul服务发现实现监控

目录 一、consul服务发现简介 1.1 consul简介 二、prometheus配置 2.1 node-exporter服务注册到consul 2.2 修改prometheus配置文件 【Prometheus】概念和工作原理介绍_prometheus工作原理-CSDN博客 【Prometheus】k8s集群部署node-exporter 【prometheus】k8s集群部署p…

Python全栈自动化测试-Python基础07--分支结构if

目录 前言 一、单项分支 二、双向分支 三、多向分支 四、巢状分支&#xff08;嵌套分支&#xff09; 五、if中的判断条件 1.条件--固定值 2.条件--运算符 总结 前言 在Python编程中&#xff0c;分支结构是一种至关重要的控制流机制&#xff0c;它允许程序根据特定条件…

[前端] 深度选择器deep使用介绍(笔记)

参考文献 深度选择器 深度选择器deep使用说明 在 Vue 中&#xff0c;为了实现组件内部样式对组件外部元素的穿透覆盖&#xff0c;可以使用 CSS 的 deep 选择器&#xff08;也称为 >>> 或 /deep/&#xff09;或 v-deep 指令。然而&#xff0c;这两个方法在 Vue 3 中…

C语言之旅:动态内存管理

目录 一.为什么要有动态内存分配 二.malloc和free 2.1 malloc 2.2 free 2. 3malloc和free的使用 三. calloc 四. raelloc 4.1 代码示例&#xff1a; 4.2 注意事项&#xff1a; 4.3 对动态开辟空间的越界访问 4.4 对非动态开辟内存使⽤free释放 4.5 使用free释放⼀块…

在Python中防止某些字段被Pickle序列化

在Python中&#xff0c;如果你想防止某些字段被pickle序列化&#xff0c;可以使用__reduce__()方法来自定义pickle行为。__reduce__()方法允许你返回一个元组&#xff0c;其中包含要在对象被pickle时调用的函数以及传递给该函数的参数。下面就是我遇到的问题以及最终解决方案。…

2D Chests Assets - Mega Pack

科幻/奇幻/经典主题的箱子和容器。AAA质量,高分辨率,VFX,源PSD文件。 这是一个带有手绘套装的大包装: -【梦幻之栗】 -【科幻钱包】 AAA质量。高分辨率。一切都已准备就绪,可供使用。包括PSD文件。 在1.1版本中添加了VFX并将项目更新为URP。请注意,新的VFX仅适用于URP/HD…

C# WinForm —— 20 RichTextBox 介绍

1. 简介 富文本框&#xff0c;拥有TextBox的所有功能&#xff0c;&#xff0c;但还有更多高级的文本输入和编辑功能&#xff0c;比如设置字体颜色、样式、段落、图片、超链接等 2. 常用属性 属性解释(Name)控件ID&#xff0c;在代码里引用的时候会用到,一般以 rtxt 开头Acce…

Python中的数据可视化:填充等高线图matplotlib.pyplot.contourf()

【小白从小学Python、C、Java】 【考研初试复试毕业设计】 【Python基础AI数据分析】 Python中的数据可视化&#xff1a; 填充等高线图 matplotlib.pyplot.contourf() [太阳]选择题 关于代码描述正确的是&#xff1f; import matplotlib.pyplot as plt import numpy as np x …

java数据结构与算法(二叉树前序遍历)

前言 二叉树的前序遍历是一种特定的遍历方法&#xff0c;按照根节点、左子树、右子树的顺序进行遍历。和中序遍历和后续遍历类似&#xff0c;只是先将遍历到的根节点先做输出。 实现原理 前序遍历的具体过程如下&#xff1a; 前序遍历是一种用于二叉树的遍历方式&#xff0…

【奈学科技】P7大前端架构师1期

课程概述 一门专为有志于成为大前端架构师人群量身打造的课程。课程内容深度剖析大前端架构各环节核心架构&#xff08;组件化架构、微内核架构、微前端架构、前后端分离架构&#xff09;并对其进行排列组合形成大前端全局架构观以及培养架构师必备的架构思维模型。史无前例的…

基于若依的ruoyi-vue3.8.7的flowable支持指定接收人的流程审批前端部分

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 http://218.75.87.38:9666/ 更多nbcio-boot功能请看演示系统 gitee源代码地址 后端代码&#xff1a; h…

基于BF算法和KMP算法的病毒感染检测

案例引入&#xff1a; 实验任务&#xff1a; 代码实现&#xff1a; 注意&#xff1a;我以项目的形式编写此代码&#xff0c;编译环境为VS2022&#xff0c;代码移植可能会导致错误 mystring.h&#xff1a;存放结构体以及函数声明 #define _CRT_SECURE_NO_WARNINGS #pragma on…

在电脑本地运行llama3-8b模型

文章目录 流程我的案例api调用llama.cpp 流程 ollama支持可运行的模型,图片这里只是一部分而已,只需要下载下面的软件和模型文件,即可直接运行,而无需配置其他 模型文件下载地址 https://ollama.com/library 支持的部分模型,实际上更多,这里只是显示部分 登陆ollama官网 htt…

cpu卡片详解(FM1208)

​ 目录 ​1. 引言 1.1 FM1208 CPU卡芯片 2. FM1208 CPU卡芯片概述 2.1 FM1208及其在智能卡中的作用 2.2 FM1208功能框图 3.FM1208的技术规格 4.FM1208工作流程 5.&#xff26;&#xff2d;1208文件结构 6.FM1208与其他智能卡技术的比较 7.FM1208安全特性 7.1 DES/…

解决kali Linux2024无法获取动态IPv4地址(DHCP)解决方案

用root用户启动终端 进入根目录&#xff0c;选择配置文件 cd到根目录下/../etc/network找到interfaces文件 编辑interfaces文件 vi interfaces&#xff0c;编辑interfaces文件 输入如下命令 打开虚拟网络编辑器 选择虚拟机选项卡&#xff0c;编辑&#xff0c;打开虚拟网络编…