S型曲线规划

news2025/1/17 3:40:06

s

#include "stdio.h"


typedef struct S_CTRL{
#define SSPD_BUF_LEN 100
    struct{
        float aMax;
        float aMin;
        float vMax;
        float J;/* 加加速度 */
        int t[7];
        int T[7];

        int tMax;
    }in;
    struct{
        float accBuf[SSPD_BUF_LEN];
        float decBuf[SSPD_BUF_LEN];
        long  S[7];
        long  V[7];
    }out;
}S_CTRL;



S_CTRL sCR = {
        {
                .aMax = 1400000.0, /* R/Min^2 */
                .aMin = -1400000.0,/* R/Min^2 */
                .vMax = 3000.0,    /*   RPM   */
                .J = 30.0,        /* R/Min^3 */
                {
                    0
                },
                {
                        40,20,40,0,40,20,40
                    },

                .tMax = 200

        }

};

#define _T(sCTRL,i) ((sCTRL).in.T[(i)-1])
#define s (sCR)
int main(){

    float v = 0;
    float pos = 0;
    float tao = 0;
    int t1 = 40;
    int t2 = 60;
    int t3 = 100;

    sCR.in.t[0] = sCR.in.T[0];
    sCR.in.t[1] = sCR.in.T[1]+sCR.in.t[0];
    sCR.in.t[2] = sCR.in.T[2]+sCR.in.t[1];
    sCR.in.t[3] = sCR.in.T[3]+sCR.in.t[2];
    sCR.in.t[4] = sCR.in.T[4]+sCR.in.t[3];
    sCR.in.t[5] = sCR.in.T[5]+sCR.in.t[4];
    sCR.in.t[6] = sCR.in.T[6]+sCR.in.t[5];


//    sCR.in.T[0] = sCR.in.t[0]-0;
//    sCR.in.T[1] = sCR.in.t[1]-sCR.in.t[0];
//    sCR.in.T[2] = sCR.in.t[2]-sCR.in.t[1];
//    sCR.in.T[3] = sCR.in.t[3]-sCR.in.t[2];
//    sCR.in.T[4] = sCR.in.t[4]-sCR.in.t[3];
//    sCR.in.T[5] = sCR.in.t[5]-sCR.in.t[4];
//    sCR.in.T[6] = sCR.in.t[6]-sCR.in.t[5];


    for(int i=0;i<7;i++){
        printf("t[%d] = %d\n",i,sCR.in.t[i]);
    }

    float J_tmp = 0;
    J_tmp = -(sCR.in.J);
    int flag = 0;
    for(int time = 0;time<sCR.in.tMax;time++)
    {
        if(time<sCR.in.t[0]){/* T1 */
            tao = time;
            v = (sCR.in.J)*(tao)*(tao)/2;
            pos = (sCR.in.J)*tao*tao*tao/6;
            flag = 1;
        }else if(time<sCR.in.t[1]){/* T2 第二段速度文档中公式是错的 */
            if(time == sCR.in.t[0]){
                sCR.out.S[0] = (sCR.in.J)*tao*tao*tao/6;
                sCR.out.V[0] = (sCR.in.J)*(tao)*(tao)/2;
            }

            tao = time-t1;
              v = (sCR.in.J)*_T(s,1)*(_T(s,1)/2+tao);
              pos = sCR.out.S[0] + (sCR.out.V[0])*tao + (sCR.in.J)*_T(s,1)*tao*tao/2;
            flag = 2;
        }else if(time<sCR.in.t[2]){/* T3 */
            if(time == sCR.in.t[1]){
                sCR.out.S[1] = sCR.out.S[0] + (sCR.out.V[0])*tao + (sCR.in.J)*_T(s,1)*tao*tao/2;
                sCR.out.V[1] = (sCR.in.J)*_T(s,1)*(_T(s,1)/2+tao);
            }
            tao = time-t2;
            v = (sCR.in.J)*(_T(s,1)*_T(s,2)+_T(s,1)*_T(s,1)/2+_T(s,1)*tao-tao*tao/2.0);
            pos = sCR.out.S[1]+sCR.out.V[1]*tao+(sCR.in.J)*_T(s,1)*tao*tao/2-(sCR.in.J)*tao*tao*tao/6;
            flag = 3;
        }else if(time<sCR.in.t[3]){/* T4 */
            //nothing..
            if(time == sCR.in.t[2]){
                sCR.out.S[2] =  sCR.out.S[1]+sCR.out.V[1]*tao+(sCR.in.J)*_T(s,1)*tao*tao/2-(sCR.in.J)*tao*tao*tao/6;//上个位置公式的末尾速度
                sCR.out.V[2] = (sCR.in.J)*(_T(s,1)*_T(s,2)+_T(s,1)*_T(s,1)/2+_T(s,1)*tao-tao*tao/2.0);//上个速度公式的末尾速度
            }
            v = (sCR.in.J)*_T(s,1)*(_T(s,1)+_T(s,2));
            pos = sCR.out.S[2] + sCR.out.V[2]*tao;
        }else if(time<sCR.in.t[4]){/* T5 */
            if(time == sCR.in.t[3]){
                /* T4 没用到,所以这里用T3的 */
                sCR.out.S[3] = sCR.out.S[1]+sCR.out.V[1]*tao+(sCR.in.J)*_T(s,1)*tao*tao/2-(sCR.in.J)*tao*tao*tao/6;
                sCR.out.V[3] = (sCR.in.J)*(_T(s,1)*_T(s,2)+_T(s,1)*_T(s,1)/2+_T(s,1)*tao-tao*tao/2.0);
            }
            tao = time-sCR.in.t[3];
            v = (sCR.in.J)*(_T(s,1)*_T(s,1)+_T(s,1)*_T(s,2)-tao*tao/2);
            pos = sCR.out.S[3]+sCR.out.V[3]*tao-(sCR.in.J)*tao*tao*tao/6;
        }else if(time<sCR.in.t[5]){/* T6 */
            if(time == sCR.in.t[4]){
                sCR.out.S[4] = sCR.out.S[3]+sCR.out.V[3]*tao-(sCR.in.J)*tao*tao*tao/6;
                sCR.out.V[4] = (sCR.in.J)*(_T(s,1)*_T(s,1)+_T(s,1)*_T(s,2)-tao*tao/2);
            }
            tao = time-sCR.in.t[4];
            v = (sCR.in.J)*_T(s,1)*(_T(s,2)+_T(s,1)/2-tao);
            pos = sCR.out.S[4] + sCR.out.V[4]*tao-(sCR.in.J)*_T(s,1)*tao*tao/2;
        }else if(time<sCR.in.t[6]){/* T7 最后一段速度文档中公式是错的 */
            if(time == sCR.in.t[5]){
                sCR.out.S[5] = sCR.out.S[4] + sCR.out.V[4]*tao-(sCR.in.J)*_T(s,1)*tao*tao/2;
                sCR.out.V[5] = (sCR.in.J)*_T(s,1)*(_T(s,2)+_T(s,1)/2-tao);
            }
            tao = time-sCR.in.t[5];
//            v = (sCR.in.J)*(T1*T2+T1*T1/2-T1*tao+tao*tao/2);
              v = (sCR.in.J)*(_T(s,1)*_T(s,2)+_T(s,1)*_T(s,1)/2-(_T(s,1)*_T(s,6))-_T(s,1)*tao+tao*tao/2);
              pos = sCR.out.S[5]+sCR.out.V[5]*tao-(sCR.in.J)*_T(s,1)*tao*tao/2+(sCR.in.J)*tao*tao*tao/6;
        }


//        sCR.out.accBuf[time] = v;
//        printf("v[%d]%d=%f\n",time,flag,v);
//        printf("%d->%f\n",time,v);
//        printf("%f\n",v);
        printf("%f\n",pos);
    }

    return 0;
}

















在这里插入图片描述

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

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

相关文章

电商API接口的研发和应用!

API&#xff08;Application Programming Interface&#xff0c;应用程序编程接口&#xff09;指的是为不同的软件应用程序提供编程接口的一组协议、规则以及工具的集合&#xff0c;以便它们能够互相交互&#xff0c;实现数据通信和功能调用。API已成为了现代软件开发和商业应用…

Linux系统部署部署excalidraw-cn白板工具

Linux系统部署部署excalidraw-cn白板工具 一、excalidraw-cn介绍二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍2.3 Yarn介绍 三、检查本地环境3.1 检查本地操作系统版本3.2 检查系统内核版本3.3 检查系统是否安装yarn 四、部署Node.js 环境4.1 下载Node.js安装包4.2 解压N…

Docker技术--Docker中的网络问题

1.docker中的网络通信 如果想要弄清楚docker中的网络通信问题,其实需要弄清楚这几个问题就可以:容器与容器之间的通信、容器与外部网络之间的通信、外部网络与容器之间的通信。 -a:容器与容器之间的通信,如下所示: 在默认情况下,docker使用网桥(Bridge模式)与NAT通信。这…

Java监听mysql的binlog 报错解决办法

报错&#xff1a;com.github.shyiko.mysql.binlog.network.AuthenticationException: Client does not support authentication protocol requested by server; consider upgrading MySQL client 解决方案&#xff1a;在mysql中执行以下命令 alter user rootlocalhost identi…

JS将对象转为字符串

使用JSON.stringify()将对象转换为字符串 var person {name: Jack,age: 27 }console.log("person&#xff1a;"); console.log(person);var result JSON.stringify(person);console.log("result&#xff1a;"); console.log(result); console.log(&qu…

3D模型轻量化引擎HOOPS平台助力3D开发实现大模型轻量化渲染、3D模型格式转换!

一、包含的软件开发工具包 HOOPS Web平台帮助开发人员构建基于Web的工程应用程序&#xff0c;提供高级3D Web可视化、准确快速的CAD数据访问和3D数据发布。 HOOPS Web平台包括三个集成软件开发工具包 (SDK)&#xff1a; &#xff08;1&#xff09;Web端3D可视化引擎 HOOPSCom…

python的csv库:保存数字仅有15位,精度丢失的解决办法

废话不多说&#xff0c; 如果在字符串后添加制表符‘/t’能够解决问题&#xff0c;那么这确实是一个有效的解决方案。制表符‘/t’在CSV文件中可以被视为分隔符&#xff0c;确保数据不会被自动格式化或截断。 import csvdata [#15位数字["123456789012345"],#16位数…

Java集合体系

Java集合体系 一、概念二、集合分类 - java.util1、单列集合&#xff1a;一条数据只有一列1.1 List集合1.2 Set集合 2、双列集合&#xff1a;一条数据有两列2.1 特点2.2 Map接口的常用方法2.3 Map接口的常用实现类2.3.1 HashMap&#xff1a;key元素无序2.3.2 LinkedHashMap&…

微信开发之一键踢出群聊的技术实现

简要描述&#xff1a; 删除群成员 请求URL&#xff1a; http://域名地址/deleteChatRoomMember 请求方式&#xff1a; POST 请求头Headers&#xff1a; Content-Type&#xff1a;application/jsonAuthorization&#xff1a;login接口返回 参数&#xff1a; 参数名必选…

02 字母异位词分组

字母异位词分组 题解 哈希 给你一个字符串数组&#xff0c;请你将 字母异位词 组合在一起。可以按任意顺序返回结果列表。 字母异位词 是由重新排列源单词的所有字母得到的一个新单词。 题解 哈希 class Solution { public:vector<vector<string>> groupAnagram…

计网(第四章)(网络层)(六)

一、路由选择协议&#xff08;动态路由自动获取路由信息&#xff09;概述&#xff1a; 之前有提到过路由条目分为静态和动态两种。相应地&#xff0c;路由选择也就有静态和动态两种。 在第五节&#xff08;计网第四章&#xff08;网络层&#xff09;&#xff08;五&#xff0…

unapp 开发微信小程序 使用wx.createSelectorQuery()时候一直获取不到元素信息。

在自定义组件中&#xff0c;使用wx.createSelectorQuery() 不能用wx. 而是this.createSelectorQuery() 微信文档&#xff1a; 但是在uni的官方文档中并没有关于需要切换this的介绍&#xff0c;是用uni.createSelectorQuery()在自定义组件内部也是无效的。 以下是我在项目中使用…

【前端】常用功能合集

目录 js跳转到新标签打开PDF文件js每十个字符换行 es6用表达式或变量名作为对象的属性名 vuev-for插值、:style、:class父组件加载完后再加载子组件keep-alive缓存跨域请求第三方接口跨域请求之callback&#xff08;不建议&#xff09;读取本地文件浏览器播放提示音audio jquer…

【【萌新的STM32学习-19-蜂鸣器实验】】

萌新的STM32学习-19-蜂鸣器实验 STM32在正点原子的视频中并未讲述关于蜂鸣器的实验&#xff0c;我们自己探究一下作为简单的HAL库入门 蜂鸣器每隔 300ms 响或者停一次。LED0 每隔 300ms 亮或者灭一次。LED0 亮的时候蜂鸣器不叫&#xff0c;而 LED0 熄灭的时候&#xff0c;蜂鸣…

【类与对象】①认识类与对象

文章目录 1.初步认识2.类的定义3.类的访问限定符及封装4. 类的封装5.类的作用域6.类的实例化7.类的对象模型8.this指针 1.初步认识 C与C异同点&#xff1a; C语言是面向过程的&#xff0c;关注的是过程&#xff0c;分析出求解问题的步骤&#xff0c;通过函数调用逐步解决问题…

leetcode189. 轮转数组

题目&#xff1a; 给定一个整数数组 nums&#xff0c;将数组中的元素向右轮转 k 个位置&#xff0c;其中 k 是非负数。 示例&#xff1a; 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2…

C语言每日一练-----Day(4)

本专栏为c语言练习专栏&#xff0c;适合刚刚学完c语言的初学者。本专栏每天会不定时更新&#xff0c;通过每天练习&#xff0c;进一步对c语言的重难点知识进行更深入的学习。 今日练习题关键字&#xff1a;记负均正    旋转数组的最小数字    二分查找 &#x1f493;博主…

Android自动化测试中操作技巧合集(建议收藏)

Android自动化测试中短信验证码的操作技巧 一、内容提供器机制简介 Android 系统采用了内容提供器(ContentProvider)机制来管理不同应用的数据访问。内容提供器为不同应用间的数据共享提供了接口&#xff0c;它们像是一个中央数据仓库&#xff0c;各个应用可以通过内容 URI 来存…

比较差值结构的两种排斥作用

( A, B )---3*30*2---( 1, 0 )( 0, 1 ) 让网络的输入只有3个节点&#xff0c;AB训练集各由6张二值化的图片组成&#xff0c;让差值结构中有两个点&#xff0c;一种情况两个点都属于A&#xff0c;一种情况两个点分别来自A和B。排列组合所有可能&#xff0c;统计迭代次数并排序。…

【C++多态】

目录 1.多态的概念2.多态的定义及实现2.1多态的构成条件2.2虚函数的一些细节2.3析构函数可以是虚函数吗&#xff1f;2.4 重载、覆盖(重写)、隐藏(重定义)的对比 3.抽象类4.多态的原理4.1虚函数表4.2虚函数地址的打印4.3多继承的函数虚表 1.多态的概念 什么是多态&#xff1f; …