梯形速度规划算法原理及代码

梯形速度规划的原理:梯形速度规划算法
对应的代码如下:

#pragma once
#include <cmath>
#include <iostream>
#include <vector>
struct SpeedPoint {SpeedPoint() {s = 0;speed = 0;t = 0;}double s;      // mdouble speed;  // m/sdouble t;      // s
};inline std::tuple<double, double, double> trapezoidalSpeedPlanningGetS(const double& max_speed, const double& init_speed,const double& aim_distance, const double& aim_speed,const double& aim_acc) {// 分类讨论,初始车速&最高速度的大小double valid_aim_speed = aim_speed;if (aim_speed > max_speed) {valid_aim_speed = max_speed;}double s1 =(std::pow(max_speed, 2) - std::pow(init_speed, 2)) / (2 * aim_acc);double s3 =(std::pow(max_speed, 2) - std::pow(valid_aim_speed, 2)) / (2 * aim_acc);double s2 = aim_distance - fabs(s1) - s3;if (s2 < 0) {s2 = 0;s1 = (2 * aim_acc * aim_distance - std::pow(init_speed, 2) +std::pow(valid_aim_speed, 2)) /(4 * aim_acc);if (fabs(s1) > aim_distance) {s1 = std::copysign(aim_distance, s1);s2 = s3 = 0;} elses3 = aim_distance - fabs(s1);}return std::tuple<double, double, double>(s1, s2, s3);
}/*** @brief trapezoidalSpeedPlanning: 梯形速度规划* @param max_speed* @param init_speed* @param aim_distance* @param aim_speed* @param aim_acc* s1: 加速段* s2: 匀速段* s3: 减速段* @return*/
inline std::vector<SpeedPoint> trapezoidalSpeedPlanning(const double& max_speed, const double& init_speed,const double& aim_distance, const double& aim_speed,const double& aim_acc) {std::vector<SpeedPoint> results;if (max_speed <= 0) {// to zero.return results;}double s1, s2, sk, s3;std::tuple<double, double, double> result_ss = trapezoidalSpeedPlanningGetS(max_speed, init_speed, aim_distance, aim_speed, aim_acc);s1 = std::get<0>(result_ss);s2 = std::get<1>(result_ss);s3 = std::get<2>(result_ss);sk = fabs(s1) + s2;const double delta_t = 0.1;double acculate_s = 0;double acculate_v = init_speed;double acculate_t = 0;SpeedPoint speed_point;double s1_sign = std::copysign(1, s1);double speed_m = std::sqrt(2 * aim_acc * s1 + init_speed * init_speed);for (; acculate_s < aim_distance;) {speed_point.s = acculate_s;speed_point.t = acculate_t;speed_point.speed = acculate_v;acculate_t += delta_t;results.push_back(speed_point);if (acculate_s <= fabs(s1)) {acculate_s += acculate_v * delta_t;acculate_v += aim_acc * delta_t * s1_sign;} else if (acculate_s < sk) {acculate_s += acculate_v * delta_t;} else {// 减速段acculate_s += acculate_v * delta_t;acculate_v -= aim_acc * delta_t;if (acculate_v <= 0) break;}}return results;
}inline double trapezoidalSpeedPlanningTime(const double& max_speed,const double& init_speed,const double& aim_distance,const double& aim_speed,const double& aim_acc) {if (max_speed <= 0) {// to zero.return INFINITY;}double s1, s2, s3;std::tuple<double, double, double> result_ss = trapezoidalSpeedPlanningGetS(max_speed, init_speed, aim_distance, aim_speed, aim_acc);double valid_aim_speed = aim_speed;if (aim_speed > max_speed) {valid_aim_speed = max_speed;}s1 = std::get<0>(result_ss);s2 = std::get<1>(result_ss);s3 = std::get<2>(result_ss);//  std::cout << "s1: " << s1 << ", s2: " << s2 << ", s3: " << s3 <<//  std::endl;double speed_m = std::sqrt(2 * aim_acc * s1 + init_speed * init_speed);double speed_final = std::sqrt(speed_m * speed_m + 0.2 - 2 * aim_acc * s3);if (fabs(speed_final - valid_aim_speed) > 1) return INFINITY;double time_1 = fabs(speed_m - init_speed) / aim_acc, time_2 = s2 / speed_m,time_3 = (speed_m - speed_final) / aim_acc;return time_1 + time_2 + time_3;
}
inline double GetSpeedPlanningTimeByReultS(const std::tuple<double, double, double>& result_ss,const double& max_speed, const double& init_speed,const double& aim_distance, const double& aim_speed,const double& aim_acc) {if (max_speed <= 0) {// to zero.return INFINITY;}double s1, s2, s3;double valid_aim_speed = aim_speed;if (aim_speed > max_speed) {valid_aim_speed = max_speed;}s1 = std::get<0>(result_ss);s2 = std::get<1>(result_ss);s3 = std::get<2>(result_ss);//  std::cout << "s1: " << s1 << ", s2: " << s2 << ", s3: " << s3 <<//  std::endl;double speed_m = std::sqrt(2 * aim_acc * s1 + init_speed * init_speed);double speed_final = std::sqrt(speed_m * speed_m + 0.2 - 2 * aim_acc * s3);if (fabs(speed_final - valid_aim_speed) > 1) return INFINITY;double time_1 = fabs(speed_m - init_speed) / aim_acc, time_2 = s2 / speed_m,time_3 = (speed_m - speed_final) / aim_acc;return time_1 + time_2 + time_3;
}inline SpeedPoint trapezoidalSpeedPlanningPointByS(const double& s1, const double& s2, const double& s3, const double& s,const double& init_speed, const double& aim_acc) {SpeedPoint speed_point;double speed_m = std::sqrt(2 * aim_acc * s1 + init_speed * init_speed);speed_point.s = s;double s1_sign = std::copysign(1, s1);if (s <= fabs(s1)) {double vt = sqrt(2 * aim_acc * s1_sign * s + init_speed * init_speed);speed_point.speed = vt;speed_point.t = (vt - init_speed) / (aim_acc * s1_sign);} else if (s < fabs(s1) + s2) {double v1_t = speed_m;speed_point.speed = v1_t;// s1_t + (s - fabs(s1)) / v1_t;speed_point.t =(v1_t - init_speed) / (aim_acc * s1_sign) + (s - fabs(s1)) / v1_t;} else {// 减速段double v1_t = speed_m;double t1 = fabs(speed_m - init_speed) / aim_acc;double t2 = s2 / v1_t;double end_speed_2 = v1_t * v1_t - 2 * aim_acc * (s - s2 - fabs(s1));if (end_speed_2 < 1e-2)speed_point.speed = 0;elsespeed_point.speed = sqrt(end_speed_2);speed_point.t = t1 + t2 + (v1_t - speed_point.speed) / aim_acc;}return speed_point;
}

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

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

相关文章

推荐开源项目-网络应用协议框架Socket.D

基于事件和语义消息流的网络应用协议 Socket.D 0 代码仓库地址1 该开源项目特点2 项目结构3 核心理念-协议帧Frame4 结束语 0 代码仓库地址 https://gitee.com/noear/socketd 1 该开源项目特点 代码风格优雅文档说明齐全测试用例非常人性化上手快&#xff0c;代码用例很多代…

JDBC链接MySQL,实现对Goods表的增删改查并封装JDBC

项目目录结构 数据库配置 1.创建goods表 2.创建goods实体 package homework.MyJDBC;public class Goods {private int id;private String gId;private String gName;private float gPrice;private int gNum;public int getId() {return id;}public void setId(int id) {this.i…

Qt之自定义QToolTip,去掉显示动画和隐藏延时

一.效果 先来看看Qt原生QToolTip的缺点: 1.当提示内容无变化时,弹窗无法移动。只能先传个空字符串强制弹窗隐藏,然后在新位置再传个字符串。 If the text is the same as the currently shown tooltip, the tip will not move. You can force moving by first hiding the t…

晶圆划片机助力LED陶瓷基板高效切割:科技提升产业新高度

博捷芯半导体划片机在LED陶瓷基板制造领域&#xff0c;晶圆划片机作为一种先进的切割工具&#xff0c;正在为提升产业效率和产品质量发挥重要作用。通过精确的切割工艺&#xff0c;晶圆划片机将LED陶瓷基板高效地切割成独立的芯片&#xff0c;为LED产业的快速发展提供了有力支持…

ViT:视觉 Transformer

ViT&#xff1a;视觉 Transformer 网络结构Transformer 编码器MLP 头CNN 和 Transformer 网络结构 Transformer 的优势&#xff1a;注意力机制相当于一个多标签检索系统&#xff0c;位置嵌入能知道每个单词的位置&#xff0c;而且适合并行。 尝试把 Transformer 迁移到视觉领…

SpringBoot 面试题和答案,最新面经

覆盖了SpringBoot的方方面面。问题从SpringBoot的自动配置和起步依赖开始&#xff0c;接着深入到环境配置&#xff0c;再到异常处理、定时任务和异步处理等实用技能。每一个问题都能让你受到SpringBoot的强大和灵活性。 1. SpringBoot中核心特性有哪些&#xff1f; SpringBoo…

鸿蒙(HarmonyOS)应用开发——简易版轮播图

简述 轮播图在应用中&#xff0c;已经很常见的展现方式。像uniapp、iview&#xff0c;viewUI等前端组件框架&#xff0c;都提供了轮播图组件。那么在harmonyOS中&#xff0c;如果要实现轮播&#xff0c;我们是使用swiper 组件 swiper组件 swiper 组件是一种容器组件。它提供…

jmeter接口自动化测试通过csv文件读取用例并执行测试

最近在公司测试中经常使用jmeter这个工具进行接口自动化&#xff0c;简单记录下~ 一、在csv文件中编写好用例 首先在csv文件首行填写相关参数&#xff08;可根据具体情况而定&#xff09;并编写测试用例。脚本可通过优先级参数控制执行哪些接口&#xff0c;通过端口参数同时执…

【WebRTC】【Unity】Unity Web RTC1-Unity中简单实现远程画面

【项目资源下载】 本篇配套直接打开可用的项目包地址&#xff0c;欢迎下载&#xff1a; https://download.csdn.net/download/weixin_41697242/88612084 【背景】 想要在Unity中实现实时远程桌面&#xff0c;找到了Render Streaming这个手段&#xff0c;本篇介绍相应的使用方…

CSS层叠样式表一

1&#xff0c;CSS简介 1.1 CSS-网页的美容师 CSS的主要使用场景就是美化网页&#xff0c;布局页面的 CSS也是一种标记语言 CSS主要用于设置HTML页面中的文本内容&#xff08;字体&#xff0c;大小&#xff0c;对齐方式等&#xff09;、图片的外形&#xff08;宽高、边框样式…

三天精通Selenium Web 自动化 - Selenium(Java)环境搭建 (new)

0 背景 开发工具idea代码管理mavenjdk1.8webdriver chrome 1 chromedriver & chrome chromedriver和chrome要对应上&#xff1a; chomedriver下载地址&#xff1a;淘宝镜像 这里用的是 chromedriver88-0-4324-96.zipchrome下载地址&#xff1a;如何降级和安装旧版本的C…

【华为OD题库-083】玩牌高手-Java

题目 给定一个长度为n的整型数组&#xff0c;表示一个选手在n轮内可选择的牌面分数。选手基于规则选牌&#xff0c;请计算所有轮结束后其可以获得的最高总分数。 选择规则如下: 1.在每轮里选手可以选择获取该轮牌面&#xff0c;则其总分数加上该轮牌面分数&#xff0c;为其新的…

NC 比telnet 强大网络命令

1. 扫描端口 nc -vz google.com 80 使用nc -vz参数可以进行端口扫描&#xff0c;-v表示输出详细信息&#xff0c;-z表示只扫描端口而不发送数据。 nc -nvuz 82.156.125.169 666 nc -nvz 192.168.1.110 1521 --u udp nc -nvz 82.156.125.169 20-24 $ nc -vz -n …

代码随想录刷题题Day11

刷题的第十一天&#xff0c;希望自己能够不断坚持下去&#xff0c;迎来蜕变。&#x1f600;&#x1f600;&#x1f600; 刷题语言&#xff1a;C / Python Day11 任务 ● 理论基础 ● 递归遍历 ● 迭代遍历 ● 统一迭代 1 二叉树理论基础 1.1 二叉树的种类 &#xff08;1&…

CentOS7安装JDK8

1. 下载JDK 下载地址&#xff1a;https://www.oracle.com/cn/java/technologies/javase/javase8u211-later-archive-downloads.html 2. 解压JDK tar -zxvf jdk-8u341-linux-x64.tar.gz -C /usr/local/3. 配置环境变量 打开 /etc/profile vim /etc/profile末尾加上 export…

一文了解 Go 方法

前言 在前面的 一文熟悉 Go 函数 文章中&#xff0c;介绍了 Go 函数的声明&#xff0c;函数的几种形式如匿名函数、闭包、基于函数的自定义类型和函数参数详解等&#xff0c;而本文将对方法进行介绍&#xff0c;方法的本质就是函数&#xff0c;介绍方法的同时也会顺带对比其与函…

算法基础之分解质因数

分解质因数 核心思想&#xff1a;试除法(从小到大枚举所有数) #include<iostream>#include<algorithm>using namespace std;void div(int n){for(int i2;i<n/i;i){if(n%i 0) //找到最小质数i{int s0;while(n%i 0){n/i;s; //记录指数}cout<<i<<&…

js基础:简介、变量与数据类型、流程循环控制语句、数组及其api

JS基础&#xff1a;简介、变量与数据类型、流程循环控制语句、数组及其api 一、简介 1、js概述 tip&#xff1a;JavaScript是什么&#xff1f; 有什么作用&#xff1f; JavaScript&#xff08;简称JS&#xff09;是一种轻量级的、解释性的编程语言&#xff0c;主要用于在网页…

React系列:实现子组件A->父组件-子组件B变量流传

🍁 作者:知识浅谈,CSDN博客专家,阿里云签约博主,InfoQ签约博主,华为云云享专家,51CTO明日之星 📌 擅长领域:全栈工程师、爬虫、ACM算法 💒 公众号:知识浅谈 🔥网站:vip.zsqt.cc React系列总结 🎈useState的使用 创建响应式变量的时候,在react是需要使用u…

企业核心架构(高可用 ,高并发 ,高复用)

标题&#xff1a;构建高可用、高并发和高复用的应用系统 摘要&#xff1a;在当今互联网时代&#xff0c;提供高可用、高并发和高复用的应用系统对于确保用户体验和系统稳定性至关重要。本文将介绍一些常用的技术和最佳实践&#xff0c;以实现高可用性、高并发性和高复用性。并…