速度规划:s形曲线应用(变速 停车)opencv c++显示(3)

理论篇

先看该篇,这里沿用了里面的变量。

应用推导篇

分为变速和停车两部分(字迹潦草,可结合代码看)
请添加图片描述

请添加图片描述
请添加图片描述
请添加图片描述

代码篇

变速函数入口:

velocityPlanner vp;
vp.SetParameters(0, 1);

停车函数入口:

ParkingVelocityPlanner vp;
vp.SetDistance(1, 0.4);

头文件:SpeedPlan.h

#ifndef SPEEDPLAN_H
#define SPEEDPLAN_H#include <opencv2/opencv.hpp> // 包含OpenCV头文件
#include <chrono>
#include <thread>#define _CRT_SECURE_NO_WARNINGS
#define a_max  1.0
#define J_s  0.5
#define v_max  4.0class VelocityPlanner
{
public:VelocityPlanner();~VelocityPlanner();virtual double GetSpeed(double t);virtual void SetParameters(double robot, double target);//private:double time0;double lasttime;double T0, T1, T2;double t0, t1, t2, t3;double v0, v1, v2, v3;double targetspeed0;double robotspeed0;double j, J;
};VelocityPlanner::VelocityPlanner() {J = J_s;
}
VelocityPlanner::~VelocityPlanner() {
}class ParkingVelocityPlanner :public VelocityPlanner
{
public:ParkingVelocityPlanner();~ParkingVelocityPlanner(); double GetSpeed(double t) override ;void SetDistance(double robot, double distance);void SetJ(double j);double S0, S1, S2, S3;double s_min, s_s;double distance0;private:double CalculateFitJ(double robot, double distance);};ParkingVelocityPlanner::ParkingVelocityPlanner()
{
}ParkingVelocityPlanner::~ParkingVelocityPlanner()
{
}#endif

主文件SpeedPlan.cpp

#include <iostream>
#include "SpeedPlan.h"using namespace std;void VelocityPlanner::SetParameters(double robot, double target) {robotspeed0 = robot;targetspeed0 = target;double errorspeed = target - robot;double T1_max = abs(a_max / J);bool trilogy = abs(errorspeed) > J * T1_max * T1_max ? true : false;//三段式if (trilogy) {//计算时间T1 T2T1 = T1_max;T2 = abs(errorspeed) / a_max - T1;}//两段式else {T1 = pow(abs(errorspeed) / J, 0.5);T2 = 0;}T0 = 0;t0 = T0;t1 = t0 + T1;t2 = t1 + T2;t3 = t2 + T1;if (errorspeed < 0) {j = -J;}else {j = J;}auto currentTime = std::chrono::system_clock::now();auto currentTime_ms = std::chrono::time_point_cast<std::chrono::milliseconds>(currentTime);//毫秒auto valueMS = currentTime_ms.time_since_epoch().count();time0 = valueMS * 0.001;lasttime = time0;//std::cout << "Milliseconds: " << "    " << typeid(valueMS).name() << "  " << valueMS << std::endl;//std::cout << "errortime: " << "    " << typeid(time0).name() << "  " << time0 << std::endl;v0 = robot;v1 = v0 + j * T1 * T1 * 0.5;v2 = v1 + j * T1 * T2;//v3 = target;v3 = v2 + j * T1 * T1 * 0.5;
}double VelocityPlanner::GetSpeed(double t) {double period = t - time0;double temp = 0.0;if (period < t0) {return v0;}else if (period < t1) {temp = period - t0;return v0 + j * temp * temp * 0.5;}else if (period < t2) {temp = period - t1;return v1 + j * T1 * temp;}else if (period < t3) {temp = period - t2;return v2 + j * T1 * temp - j * temp * temp * 0.5;}else {return v3;}}void ParkingVelocityPlanner::SetDistance(double robot,double distance)
{distance0 = distance;//急刹段内T2 = robot / a_max;s_min = 0.5 * a_max * T2 * T2;if (distance < s_min) {cout << "急刹,速度规划失效!" << endl;return;}//s形规划SetParameters(robot, 0);S1 = v0 * T1 + j * pow(T1, 3)/6;S2 = v1 * T2 + 0.5 * j * T1 * T2 * T2;S3 = v2 * T1 + j * pow(T1, 3) / 3;s_s = S1 + S2 + S3;T0 = (distance - s_s) / robot;t0 = T0;t1 = t0 + T1;t2 = t1 + T2;t3 = t2 + T1;if (distance >= s_s) {cout << "s形速度规划!" << endl;cout << "j: " << j << endl;cout << "a_max  a: " << a_max << " " << j * T1 << endl;cout << "s_s: " <<s_s<<" "<<distance << endl;cout << "t0-3: " <<t3<<" "<<t0<<" " << t3 - t0 << endl;return;}//拟合规划double j_adaptive = CalculateFitJ(robot, distance);SetJ(j_adaptive);SetParameters(robot, 0);cout << "拟合速度规划!" << endl;cout << "j: " << j << endl;cout << "s_s: " << distance << endl;cout << "T0-3: " << t3-t0<< endl;cout << "a_max  a: " << a_max << " " << j * T1 << endl;}double ParkingVelocityPlanner::CalculateFitJ(double robot, double distance) {//两段式T2 = 0;T1 = distance / robot;double j_temp = robot / T1 / T1;if (j_temp * T1 <= a_max) {return j_temp;}//三段式T1 = 2 * distance / robot - robot / a_max;T2 = robot / a_max - T1;j_temp = a_max / T2;return j_temp;
}void ParkingVelocityPlanner::SetJ(double j) {J = j;
}double ParkingVelocityPlanner::GetSpeed(double t) {//急刹if (distance0 < s_min) {return 0;}//拟合规划else{double period = t - time0;double temp = 0.0;if (period < t0) {return v0;}else if (period < t1) {temp = period - t0;return v0 + j * temp * temp * 0.5;}else if (period < t2) {temp = period - t1;return v1 + j * T1 * temp;}else if (period < t3) {temp = period - t2;return v2 + j * T1 * temp - j * temp * temp * 0.5;}else {return v3;}}
}int main() {//VelocityPlanner vp;//vp.SetParameters(0, 1);//cout << "时间:" << vp.t3 - vp.t0 << endl;ParkingVelocityPlanner vp;vp.SetDistance(1, 0.4);auto currentTime = std::chrono::system_clock::now();auto currentTime_ms = std::chrono::time_point_cast<std::chrono::milliseconds>(currentTime);//毫秒auto valueMS = currentTime_ms.time_since_epoch().count();double time = valueMS * 0.001;bool flag = false;double last_vt = 0, last_t = 0;cv::Mat canvas(600, 600, CV_8UC3, cv::Scalar(255, 255, 255)); // 创建一个300x300像素的画布cv::line(canvas, cv::Point(0, 0), cv::Point(0, 600), cv::Scalar(255, 0, 0), 4);//y周  (x,y)cv::line(canvas, cv::Point(0, 0), cv::Point(600, 0), cv::Scalar(255, 0, 0), 4);//x周  (x,y)double tf = vp.t3 * 1.25;// 总时间double kx = 500 / tf, ky = 300 / max(vp.v3, vp.v0);double period;double cyclicality = tf / 100;for (double t = time; t <= time + tf; t += cyclicality) {//double s_t = PathCurve(t);period = t - time;double v_t = vp.GetSpeed(t);if (!flag) {cv::circle(canvas, cv::Point(period * kx, v_t * ky), 2, cv::Scalar(0, 0, 255), -1);}else {cv::circle(canvas, cv::Point(period * kx, v_t * ky), 2, cv::Scalar(0, 0, 255), -1);cv::line(canvas, cv::Point(last_t * kx, last_vt * ky), cv::Point(period * kx, v_t * ky), cv::Scalar(255, 0, 0), 1);//y周  (x,y)}last_vt = v_t;last_t = period;std::cout << period << "时刻速度:" << "    " << v_t << std::endl;}cv::line(canvas, cv::Point(vp.t0 * kx, vp.v0 * ky), cv::Point(vp.t0 * kx, 0), cv::Scalar(100, 0, 0), 1);//y周  (x,y)cv::circle(canvas, cv::Point(vp.t0 * kx, vp.v0 * ky), 5, cv::Scalar(0, 0, 255), -1);cv::line(canvas, cv::Point(vp.t1 * kx, vp.v1 * ky), cv::Point(vp.t1 * kx, 0), cv::Scalar(100, 0, 0), 1);//y周  (x,y)cv::circle(canvas, cv::Point(vp.t1 * kx, vp.v1 * ky), 5, cv::Scalar(0, 0, 255), -1);//cv::putText(canvas, "(" + std::to_string(vp.t1) + "," + std::to_string(vp.v1) + ")", cv::Point(vp.t1 * kx, vp.v1 * ky), cv::FONT_HERSHEY_SIMPLEX, 1.5, cv::Scalar(0, 255, 0), 2);cv::line(canvas, cv::Point(vp.t2 * kx, vp.v2 * ky), cv::Point(vp.t2 * kx, 0), cv::Scalar(100, 0, 0), 1);//y周  (x,y)cv::circle(canvas, cv::Point(vp.t2 * kx, vp.v2 * ky), 5, cv::Scalar(0, 0, 255), -1);//cv::putText(canvas, "(" + std::to_string(vp.t2) + "," + std::to_string(vp.v2) + ")", cv::Point(vp.t2 * kx, vp.v2 * ky), cv::FONT_HERSHEY_SIMPLEX, 1.5, cv::Scalar(0, 255, 0), 2);cv::line(canvas, cv::Point(vp.t3 * kx, vp.v3 * ky), cv::Point(vp.t3 * kx, 0), cv::Scalar(100, 0, 0), 1);//y周  (x,y)cv::circle(canvas, cv::Point(vp.t3 * kx, vp.v3 * ky), 5, cv::Scalar(0, 0, 255), -1);//cv::putText(canvas, "(" + std::to_string(vp.t3) + "," + std::to_string(vp.v3) + ")", cv::Point(vp.t3 * kx, vp.v3 * ky), cv::FONT_HERSHEY_SIMPLEX, 1.5, cv::Scalar(0, 255, 0), 2);// 创建镜像图像矩阵  cv::Mat mirror_img;cv::flip(canvas, mirror_img, 0);  // 水平镜像,flipCode=1  cv::imshow("Image", mirror_img);cv::waitKey(); // 等待10秒return 0;
}

在这里插入图片描述

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

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

相关文章

6 scala-面向对象编程基础

Scala 跟 Java 一样&#xff0c;是一门面向对象编程的语言&#xff0c;有类和对象的概念。 1 类与对象 与 Java 一样&#xff0c;Scala 也是通过关键字 class 来定义类&#xff0c;使用关键字 new 创建对象。 要运行我们编写的代码&#xff0c;同样像 Java 一样&#xff0c;…

uniapp小程序端使用计算属性动态绑定style样式踩坑

踩坑点: 使用uniapp编译小程序端动态绑定复杂style使用计算属性方式&#xff0c;return必须返回json字符串格式&#xff0c;不能返回object&#xff0c;否则会不起作用。 代码总览 视图层 逻辑层&#xff08;注意这里是使用的计算属性哈&#xff09; 这里我封装成了一个个性化…

蓝桥杯嵌入式第9届真题(完成) STM32G431

蓝桥杯嵌入式第9届真题(完成) STM32G431 题目 分析和代码 main.h /* USER CODE BEGIN Header */ /********************************************************************************* file : main.h* brief : Header for main.c file.* …

Ubuntu Desktop - Terminal 输出全部选中 + 复制

Ubuntu Desktop - Terminal 输出全部选中 复制 1. Terminal2. Terminal 最大化3. Edit -> Select All4. Copy & PasteReferences 1. Terminal 2. Terminal 最大化 3. Edit -> Select All 4. Copy & Paste Edit -> Copy or Shift Ctrl C Edit -> Paste…

PV、UV、IP

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言1. PV1.1 PV 计算1.2 PV 的影响因素 2. UV2.1 UV 计算2.2UV 的影响因素 3. IP3.1 IP和UV①UV大于IP②UV小于IP 三者的关系PV 和 UV 前言 PV、UV、IP是我们在运…

印度5G不是比中国先进,而是印度用户敢用,中国用户不敢用!

分析机构OpenSignal给出的数据指出中国手机用户的平均速率比印度用户还要低&#xff0c;这说明中国5G落后于印度&#xff0c;其实这是片面的说法&#xff0c;中国运营商的5G网络能力肯定强于印度运营商&#xff0c;但是中国用户不敢用&#xff0c;而印度用户敢用&#xff0c;这…

mysql经典4张表问题

1.数据库表结构关联图 2.问题&#xff1a; 1、查询"01"课程比"02"课程成绩高的学生的信息及课程分数3.查询平均成绩大于等于60分的同学的学生编号和学生姓名和平均成绩4、查询名字中含有"风"字的学生信息5、查询课程名称为"数学"&…

java的excel列行合并模版

1.效果 2.模版 <tableborder"1"cellpadding"0"cellspacing"0"class"tablebor"id"TABLE"><tr align"center" class"bg217"><td style"background-color: #008000; color: #ffffff;p…

【初中生讲机器学习】6. 分类算法中常用的模型评价指标有哪些?here!

创建时间&#xff1a;2024-02-07 最后编辑时间&#xff1a;2024-02-09 作者&#xff1a;Geeker_LStar 你好呀~这里是 Geeker_LStar 的人工智能学习专栏&#xff0c;很高兴遇见你~ 我是 Geeker_LStar&#xff0c;一名初三学生&#xff0c;热爱计算机和数学&#xff0c;我们一起加…

Web 扫描神器:Gobuster 保姆级教程(附链接)

一、介绍 Gobuster 是一款用于目录和文件枚举的开源工具。它主要用于在Web应用程序或网站上查找隐藏的目录和文件&#xff0c;从而进行信息收集或渗透测试。以下是 Gobuster 的一些主要特点和功能&#xff1a; 快速且高效&#xff1a; Gobuster 被设计为快速、高效的工具&…

第九个知识点:内部对象

Date对象: <script>var date new Date();date.getFullYear();//年date.getMonth();//月date.getDate();//日date.getDay();//星期几date.getHours();//时date.getMinutes();//分date.getSeconds();//秒date.getTime();//获取时间戳&#xff0c;时间戳时全球统一&#x…

【人工智能】神奇的Embedding:文本变向量,大语言模型智慧密码解析(10)

什么是嵌入&#xff1f; OpenAI 的文本嵌入衡量文本字符串的相关性。嵌入通常用于&#xff1a; Search 搜索&#xff08;结果按与查询字符串的相关性排序&#xff09;Clustering 聚类&#xff08;文本字符串按相似性分组&#xff09;Recommendations 推荐&#xff08;推荐具有…

牛客周赛 Round 32 F.小红的矩阵修改【三进制状态压缩dp】

原题链接&#xff1a;https://ac.nowcoder.com/acm/contest/75174/F 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld 题目描述 小红拿到了一个字符矩阵&#xff0c;矩阵中仅包含&q…

spring boot学习第十一篇:发邮件

1、pom.xml文件内容如下&#xff08;是我所有学习内容需要的&#xff0c;不再单独分出来&#xff0c;包不会冲突&#xff09;&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"…

《CSS 简易速速上手小册》第3章:CSS 响应式设计(2024 最新版)

文章目录 3.1 媒体查询基础&#xff1a;网页的智能眼镜3.1.1 基础知识3.1.2 重点案例&#xff1a;适应三种设备的响应式布局3.1.3 拓展案例 1&#xff1a;改变字体大小3.1.4 拓展案例 2&#xff1a;暗模式适配 3.2 响应式图片和视频&#xff1a;让内容自由呼吸3.2.1 基础知识3.…

LeetCode周赛——384

1.修改矩阵&#xff08;模拟&#xff09; class Solution { public:vector<vector<int>> modifiedMatrix(vector<vector<int>>& matrix) {int n matrix.size();int m matrix[0].size();vector<int> ans(m);for(int i 0; i < m; i)for(…

操作系统——内存管理(附带Leetcode算法题LRU)

目录 1.内存管理主要用来干什么&#xff1f; 2.什么是内存碎片&#xff1f; 3.虚拟内存 3.1传统存储管理方式的缺点&#xff1f; 3.2局部性原理 3.3什么是虚拟内存&#xff1f;有什么用&#xff1f; 3.3.1段式分配 3.3.2页式分配 3.3.2.1换页机制 3.3.2.2页面置换算法…

计算机网络——08应用层原理

应用层原理 创建一个新的网络 编程 在不同的端系统上运行通过网络基础设施提供的服务&#xff0c;应用进程批次通信如Web Web服务器软件与浏览器软件通信 网络核心中没有应用层软件 网络核心没有应用层功能网络应用只能在端系统上存在 快速网络应用开发和部署 网络应用…

【MySQL】数据库和表的操作

数据库和表的操作 一、数据库的操作1. 创建数据库2. 字符集和校验规则&#xff08;1&#xff09;查看系统默认字符集以及校验规则&#xff08;2&#xff09;查看数据库支持的字符集&#xff08;3&#xff09;查看数据库支持的字符集校验规则&#xff08;4&#xff09;校验规则对…

Powershell Install 一键部署Openssl+certificate证书创建

前言 Openssl 是一个方便的实用程序,用于创建自签名证书。您可以在所有操作系统(如 Windows、MAC 和 Linux 版本)上使用 OpenSSL。 Windows openssl 下载 前提条件 开启wmi,配置网卡,参考 自签名证书 创建我们自己的根 CA 证书和 CA 私钥(我们自己充当 CA)创建服务器…