单段时间最优S型速度规划算法

一,背景

在做机械臂轨迹规划的单段路径的速度规划时,除了参考《Trajectory Planning for Automatic Machines and Robots》等文献之外,还在知乎找到了这位大佬 @韩冰 写的在线规划方法:
https://zhuanlan.zhihu.com/p/585253101/editzhuanlan.zhihu.com/p/585253101/edit

从其输入条件和结果来看,在线规划的方法还是有一些精度、特殊条件情况的问题。

另外还有两个库,Reflexxes Motion Libraries 和 Ruckig ,它们都有开源的内容和商业化的内容。但是受限于我的开发平台,很难去调用、复现它们。

而以上文献中的离线规划方法限制性更大,只能实现起始结束条件速度加速度都为0的情况。

本文在以上文献中的离线规划方法的基础上,实现了更广泛的适用条件,并且在求解速度、最优解选择上进行了一定的优化。最终达到了以下效果:
1,可任意设置起始、结束状态的速度、加速度。可以等于或不为0、大于0、小于0、超出限制值等。
2,本文方法的主要思路还是和以上文献里的迭代搜索一样,设定在迭代终止条件匀速段时间小于1ms的情况下,各种测试用例的迭代次数最大12次,总的运算耗时少于20us。
3,迭代搜索实际上会有多个区间,各自有最优值。本文方法并没有求出所有解,但是根据公式特性尽可能的选择了一种最优解。

二,问题描述

可能对“速度规划”感兴趣的同学多少都了解这个问题的定义,但我在这里还是简单描述一下。

**已知:**一段路径有起点、终点(它无关坐标系、也无关路径形状轨迹),起点的位置值Ps,终点的位置值Pe。起点的速度Vs、加速度As,终点的速度Ve、加速度Ae,并限制整段路径的速度绝对值不超过Vlim,加速度绝对值不超过Alim,加加速度的绝对值不超过Jlim。

**求解:**时间最优的速度规划结果。

怎样理解这个“规划结果”呢?按照《Trajectory Planning … 》的内容,其求解结果应当包含7段位置关于时间的分段函数,一般情况如下图所示:
在这里插入图片描述

它由7段分段函数构成,如下:

加速区间(加加速段——匀加速段——减加速段)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

匀速区间 ( Ta <= t <= Ta + Tv )
在这里插入图片描述

减速区间(加减速段——匀减速段——减减速段)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
它可以理解为一系列的“时间-位置”插值点。在线规划方法的结果可以是一种计算方法,能够在已知当前点求出下一个周期时刻的位置点。而离线规划方法的结果也是一种计算方法/或数据,它能够用一系列的分段函数来表示位置关于时间的曲线函数。

再次强调下,
1,此类方法中速度规划的输入的位置是一段或多段路径的曲线距离,它无关坐标系、也无关路径形状轨迹。可以认为是一维的曲线距离关于时间的规划函数求解。
2,在插补运动中的应用场景可以参考后文——空间三维插补和速度规划。
3,而路径和速度规划的关系可以理解为:路径是上层确定的输入,在做速度规划时不会改变其路径;路径就像是铁轨,而速度规划则是控制铁轨上的火车时快时慢的沿着铁轨的运动。而无论火车跑得快或慢,都不影响铁轨的形状。

该问题的输入在应用上还有一点注意事项:路径和自由度的不同。
1,自由度可以理解为一个直线电机,它可以在导轨上任意的正向/负向运动,也就是说问题的输入Ps,Pe,Vs,Ve等可以是任意的正负值。
2,但是路径不同,路径可以认为是基于参数从0到100%的描述,这意味着其位置值是在路径的维度里相对0%点的曲线距离。
3,那么在应用上,路径的距离不能为负数,因为从0%往-100%的路径是不确定的,所以负的距离也失去了意义。
4,在大多数应用上,速度也最好没有负数,因为负数的速度意味着运动点将在中间一段路径上折返多次,这对于大多数应用是有害的。

三,梯形速度规划

首先我们简化问题,引入梯形速度规划,也可称为三段式。与如上问题的条件一样,但是不对加加速度进行限制,那么意味着允许加速度可以限制值内任意的快速变化。此部分可以直接参考教科书的3.2节。书中一般的规划结果如下图:
在这里插入图片描述

在此引入3段式速度规划,是因为它与7段式的问题有很多相似相关的地方,三段式的求解方式大致是:
1,假定规划的最大速度是否能达到速度限制值,若能达到则可根据理想公式(梯形模型)求解。
2,若不能达到则加速段的结尾速度应该等于减速段的起始速度,即最大速度,可根据三角形模型求解。

**相似性:**可以认为这个最大速度是一个未知数,计算出其他所需的物理量,得到代数方程,再求解这个方程即可。区别只是梯形规划的方程很简单,而S型规划的方程较复杂,但是整个流程是可以借鉴的。

**相关性:**S型规划可以分为3大段(加速段-匀速段-减速段),而其中的加速大段或减速大段每段里面又是3小段,在“速度——加速度——加加速度”层面的“加速度增大——加速度恒定——加速度减小”的过程,类似于三段式“位置——速度——加速度”层面的“速度增大——速度恒定——速度减小”的对应关系。计算公式也很类似。

三段式求解
按照以上求解方式,计算流程中主要存在分支[1]:按梯形模型计算 或者 按三角形模型计算。实际应用上还要考虑分支[2]:梯形/三角的开口方向是向上的还是向下的。开口方向并不是显然的根据距离的正负而决定的,例如以下两个例子:

例1:PosEnd - PosStart = 10.0; 结果如下,蓝色曲线为位置关于时间的变化,绿色曲线为速度关于时间的变化。
在这里插入图片描述
在这里插入图片描述

例2:PosEnd - PosStart = 5.0; 其他参数和例1完全相同,结果如下:
在这里插入图片描述

可以看到例1例2的距离都是正数,但是速度曲线的三角型开口一个朝上一个朝下。

我们可以用以下这种方式来判别速度梯形/三角形的开口方向:
1,先只做速度关于时间的规划,假设以最大加速度从起始速度规划到结束速度(速度曲线是一条直线,斜率为最大加速度),可以计算出此规划的运动距离。
2,若假设的运动距离 < 结束位置-起始位置,则说明还存在速度为正的区间,而为了时间最优,这个正速度应当尽量的大,即应当等于速度三角型模型的尖角速度或梯形模型的平台速度,同时也说明梯形/三角模型的开口应该朝下。
3,若假设的运动距离 > 结束位置-起始位置,则说明还存在速度为负的区间,而为了时间最优,这个负速度绝对值应当尽量的大,即应当等于速度三角型模型的尖角速度或梯形模型的平台速度,同时也说明梯形/三角模型的开口应该朝上。

整体解算过程如下:
1,首先判断1:若 VelStart > VelEnd,则预设加速度 Acc’ 为 -LimAcc,且;否则预设加速度 Acc’ 为 LimAcc。
2,然后只做从 VelStart 到 VelEnd 的匀变速规划,根据以下公式 1 计算预设的运动距离 Dist:
D i s t = V e l E n d 2 − V e l S t a r t 2 2 A c c (1) Dist = \frac {{VelEnd}^2-{VelStart}^2} {2{Acc}} \tag {1} Dist=2AccVelEnd2VelStart2(1)
在这里插入图片描述

3,判断2-1:若 Dist <= PosEnd - PosStart,则梯形/三角模型开口朝下,接下来判断是梯形模型还是三角模型.假设是梯形模型,根据以下公式 2 代入 Acc’ = -LimAcc, Vel’ = LimVel 计算匀速段耗时:
t 2 = P o s E n d − P o s S t a r t V e l ′ − V e l ′ 2 − V e l E n d 2 2 V e l ′ ∗ A c c ′ − V e l ′ 2 − V e l S t a r t 2 2 V e l ′ ∗ A c c ′ (2) t2 = \frac {PosEnd-PosStart} {Vel'} - \frac {{Vel'}^2 - VelEnd^2} {2 Vel' * Acc'} -\frac {{Vel'}^2 - VelStart^2} {2 Vel' * Acc'} \tag {2} t2=VelPosEndPosStart2VelAccVel2VelEnd22VelAccVel2VelStart2(2)
在这里插入图片描述

4,判断3-1:若 t2 >=0.0 ,则确定模型就是梯形模型。若 t2 < 0.0,则确定模型为三角模型。需要使用以下公式 3 进一步计算三角型的尖峰速度:
M a x V e l = A c c ′ ( P o s S t a r t − P o s E n d ) + 1 2 ( V e l E n d 2 + V e l S t a r t 2 ) (3) MaxVel = \sqrt {Acc' {(PosStart-PosEnd) }+ \frac{1}{2} ({{VelEnd}}^2+{{VelStart}}^2)} \tag {3} MaxVel=Acc(PosStartPosEnd)+21(VelEnd2+VelStart2) (3)
在这里插入图片描述

5,经过以上分支的计算,轨迹的其他信息都可以简单的求得。

6,判断2-2:若 Dist > PosEnd - PosStart,则梯形/三角模型开口朝上,接下来判断是梯形模型还是三角模型.假设是梯形模型,根据以上公式 2 代入 Acc’ = LimAcc, Vel’ = -LimVel 计算匀速段耗时。

7,判断3-2:在判断2-2的基础上,若 t2 >=0.0 ,则确定模型就是梯形模型。若 t2 < 0.0,则确定模型为三角模型。需要使用以上公式 3 进一步计算三角型的尖峰速度:-MaxVel。

这样就完成了梯形速度规划的求解。

四,S型速度规划编辑此区域

匀速段距离关于速度的函数
以上相似性已经分析过,两者的求解流程相似,可以认为匀速段的速度是一个未知数,计算出其他所需的物理量,得到代数方程,再求解这个方程即可。
1,同样的也是先假设匀速段速度能达到±LimVel,若能达到,则可以直接计算出规划结果,并且匀速段的速度尽可能的大,所以整体耗时会更小。
2,若无法达到则是三角型模型,匀速段的耗时接近于0,且当匀速段的速度尽可能大的时候,整体耗时会更小。所以需要求解以上这个方程,方程的自变量是假设的匀速段速度,需要求解当匀速段耗时=0时绝对值最大的解。
3,而考虑到匀速段速度定义域包含0,时间 = 距离 / 速度,那么匀速段耗时关于匀速段速度的函数将不连续,更一般的情况,建立匀速段距离关于匀速段速度的函数 Sc = F(Vc)。

加速区间/减速区间
以上相关性已经分析过,梯形速度规划的三段式,类似于S型速度规划里的加速区间/减速区间,加速区间/减速区间可以称为三段式梯形加速度规划。其计算方式几乎完全一样。只用将梯形速度规划里的时间,位置,速度,加速度,替换为自变量,因变量,一阶导,二阶导这样一个更通用的数学形式;然后再在S型速度规划的加速区间/减速区间里用物理量再替换回来,即替换回:时间,速度,加速度,加加速度。而通过以上 Sc = F(Vc) 的定义,Vc变成了自变量或者说已知量,所以可以直接使用梯形速度规划的计算方式来求解梯形加速度规划,进一步积分计算得规划中的各位置量。

即,假设已知匀速段速度Vc,可计算得唯一的Sacc和Sdec表示加速区间和减速区间的距离增量。这样也就求出了Sc = PosEnd - PosStart - Sacc(Vc) - Sdec(Vc) = F(Vc)。

而除了位置积分之外不再需要额外的计算公式,位置积分公式如下:
P ( t ) = P 0 + V 0 t + A 0 t 2 2 + J t 3 6 (4) P(t)=P_{0}+V_{0} t + \frac {A_{0} {t}^2} {2} + \frac {J {t}^3} {6} \tag {4} P(t)=P0+V0t+2A0t2+6Jt3(4)
在这里插入图片描述

典型函数图像
一般而言,以上F(Vc) = 0的求解存在多解的情况。尤其是直接在 [-LimVel , LimVel] 搜索可能并不能得到更优的解。

为了优化求解过程,并且进一步理解 Sc = F(Vc) 函数,可以观察一下函数图像。

例1,输入参数:
在这里插入图片描述
Sc = F(Vc) 函数图像结果:
在这里插入图片描述
上图蓝线为Vc,绿线为Sc,两尖角处Vc为 -47.75 和 125。这两个Vc点也是该组数据计算时的分段函数区间分界点,Vc = -47.75 对应“加速区间”计算时的判断2-1和2-2的临界点,即“加速区间”的梯形或三角形模型是开口朝上还是朝下;而 Vc = 125 对应“减速区间”计算时的判断2-1和2-2的临界点,即“减速区间”的梯形或三角形模型是开口朝上还是朝下.

例2,输入数据:
在这里插入图片描述
Sc = F(Vc) 函数图像结果:
在这里插入图片描述
上图蓝线为Vc,绿线为Sc,两尖角处Vc为 95.416667 和 141.666667,也是该组输入数据的“加速区间”和“减速区间”开口朝上朝下的临界点。放大细节如下:
在这里插入图片描述
红线为匀速段的拟定耗时,正数为有效的结果。

例3,输入数据:
在这里插入图片描述
Sc = F(Vc) 函数图像结果:
在这里插入图片描述
上图蓝线为Vc,绿线为Sc,两尖角处Vc为 73.333333 和 -85.666667,也是该组输入数据的“加速区间”和“减速区间”开口朝上朝下的临界点。放大细节如下:
在这里插入图片描述
通过观察以上典型图像,对搜索的区间进行了优化,在一般情况下可以提高计算效率(缩小了搜索范围), 且得到更优时间的解。具体的原理/证明等并不严格,具体实现参考下文“示例代码——三 搜索范围的确定”。

五,数值方法求解

基于以上内容已求得函数 Sc = F(Vc) = PosEnd - PosStart - Sacc(Vc) - Sdec(Vc)。其中Sacc(Vc)和Sdec(Vc)都是4段分段函数组合成的连续函数,其中涉及 根号Vc 的表达式。

则 F(Vc) 也是由分段函数组合成的连续函数,根据Sacc(Vc)和Sdec(Vc)的分段组合,它有4x4=16种具体的组合形式,且在一具体函数种同时最多存在7种组合,其中也包含根号Vc的复杂表达式。直接求解其解析解是较为困难的,结合《Trajectory Planning … 》的内容,可以使用以下这样一种数值计算方法:
1,首先设 Vc1 = LimVel,若求得 Sc1 >= 0 则直接得到了时间最优解,否则下一步;
2,设Vc2 = -LimVel,若求得 Sc2 <= 0 则直接得到了时间最优解,否则下一步;
3,由于函数 F(Vc) 在定义域 [-LimVel , LimVel] 内连续,且存在 F(LimVel) < 0 和 F(-LimVel ) >0,根据中值定理,在区间 [-LimVel , LimVel] 内必定存在一个Vc使得 F(Vc) = 0,也就是要求解的结果。
4,在区间内的求解,最起码的可以采用二分法进行迭代搜索。还可以采用其他经典数值计算的求根方法,加快求解效率。

割线法
割线法,又称弦割法、弦法,是基于牛顿法的一种改进,基本思想是用弦的斜率近似代替目标函数的切线斜率,并用割线与横轴交点的横坐标作为方程式的根的近似。适用于原函数不方便求导的情况。

割线方程:给定函数 f(x) 上两点 x[n-1] , y[n-1] 和 x[n] , y[n],这两点所在的直线即为割线,方程为:

y - y[n] = (y[n] - y[n-1]) / (x[n] - x[n-1]) * (x - x[n]);

割线法即通过以上两点 x[n-1] 和 x[n] 及其割线方程,求得割线与X轴的交点横坐标作为 x[n+1],求得此点的函数值 y[n+1],再代入 x[n] 和 x[n+1] 不断迭代,直至精度满足需求。

搜索优化
牛顿法存在不一定收敛的情况,除开函数本身可能无解,迭代搜索过程中的计算也可能导致不收敛。牛顿下山法是对牛顿法的一种改进,它确保每一步迭代的范围都是缩小的。

在以上割线法中也有类似不收敛的问题,也可以采用类似下山法的思路进行优化,具体实现查看附件代码里的方法 M_Iteration。

其他方法
还有很多其他求根求最值的数值方法。例如 [Boost.Math](Chapter 10. Root Finding & Minimization Algorithms - 1.85.0 (boost.org)) 里的 TOMS Algorithm 748 算法,Brent-Dekker algorithm 布伦特方法,Muller Method 米勒法等等。

六,示例代码

代码见附件 Code_VelPlanS7Single.pdf 文档。代码中的Class_VelPlanS7_Single为规划处理,VP_S7_Time2Position为按时间插值位置,Test为两个单元测试例程。
一 初始化
代码中为 M_Init 方法内容,进行初始化参数、范围判定等。注意以下内容:

1,支持设置 StartAcc, EndAcc。需要在 [-LimAcc , LimAcc] 内。也可以超出,超出要另外处理。2,temp1、temp3、temp4、temp6、temp8、temp9 等是后续的迭代计算中的一些不变量, 为了减少每次迭代计算量而做的化简。3,VpeakStart、VpeakEnd 也是由已知条件得到的常量。它们的意义在于,若已知7段式的匀速段速度V,则可以计算出7段式所有的信息,记计算出的匀速段距离为S2,加速段距离为S1,减速段路径为S3. 即把问题理解为一个函数 :(S1,S2,S3) = function( Vmax )。也对应代码中的 M_V2S 方法。而这个函数是基于两个小函数 S1 = F(Vmax) 和 S3 = G(Vmax)。各自有4种情况,而VpeakStart、VpeakEnd就是这各自4种情况中的2类的分界点,即以上“加速区间”/“减速区间”梯形或三角性模型开口朝上/开口朝下的临界点。

二 极限速度判断
7段式时间最优速度规划的思路是,使得匀速段的速度尽可能的大。所以一开始先假设能达到正负极限速度,看能不能满足条件( 匀速段的时间 > 0)。若满足条件,则直接得到最优结果。若不满足条件,则需要在 ( -LimVel , LimVel ) 之间搜索。由于函数的连续性,在此区间内一定有解。
在这里插入图片描述

三 搜索范围的确定
代码 line 18 ~ 108,搜索范围这里根据函数的特性,采用了一定方式进行处理,较快较优的得到一个更合适的范围。

背景是这样一个分段函数 Sc = F(Vc) 函数图像如上图。然后要找函数的零点,且在多个零点中找 V值绝对值更大的。上图只是示意,实际横纵坐标轴可能根据输入条件平移。该方法并没有找出所有的零点,而是根据函数的性质,将所有区间分为3部分 [ -LimVel, Vpeak1 ] , [ Vpeak1 , Vpeak2 ] , [ Vpeak2 , LimVel ]。 先去看看例如Vpeak2~LimVel 里面有没有根。没有就去看看Vpeak1~-LimVel。都没有那就在 [ Vpeak1 , Vpeak2 ] 里面。

也可以直接在 ( -LimVel , LimVel )之间搜索,但数据测试来看以上方法效果更好。

四 迭代搜索
方法 M_Iteration 内为迭代搜索。还是以上说明的函数:(S1,S2,S3) = function( Vmax )

可以认为是单输入单输出的,输入Vmax,输出S2。求使得S2=0的解即是最优的结果。

函数本身是连续的,且搜索的上下界一正一负,所以各种搜索方法应当都可以搜索得到一个解。

这里采用割线法,且排除掉了割线范围变大的情况。结果效果比较好,迭代收敛速度快。

五 按时间插值位置
VP_S7_Time2Position为按时间插值位置的函数,即输入时间,输出位置等。即7段式的7段不同函数。

注意看下规划的结果、此函数的输入:
在这里插入图片描述
规划结果基本包含了所有信息,以减少插值函数的计算量。包括各段的时间 t1~t7, 加加速度 jerk 、加速度、速度、位置。

七,后文

所有解
以上数值方法求解中由提到,“…分段组合,它有4x4=16种具体的组合形式,且在一具体函数种同时最多存在7种组合,其中也包含根号Vc的复杂表达式…”。针对具体的16种组合的函数表达式,求出所有的解,再判断解的可行性/时间最优,也是一种规划求解方式。

“背景”中介绍的 Ruckig 基本采用这种思路,它根据Jerk的正负零的情况以及是否达到LimVel/LimAcc/LimDec的情况,将所有的类型分为32种,依次计算每一种,并提到其中最复杂的单一种类可变为6次多项式的求根。它在求出所有类型的解后,用每个解中的每一小段时间是否大于0等条件进行可行性判断,并再在所有可行解中选择时间最优的解。

实际上可以很容易的排除 ±LimVel 的情况,将总数量总32种减少为16种,并且在其中一些涉及根式的计算中,不再设定关于匀速段速度Vc的方程,而是设定关于最大加速度/减速度的方程,可以转为更低次的方程求解。

这种求出所有解的方式能够得到真正的时间最优解,但是在计算时间上并不一定有优势。在一些需要定时规划的应用场景中,可能会更有优势。

连续多段速度规划
单段式速度规划是连续多段速度规划的基础,连续多段速度规划也是轨迹规划中需要解决的问题之一。一般来说都需要采用速度前瞻的处理方式进行规划。

一种连续多段轨迹的速度规划算法原理为:
1,在算法的初始阶段设第一段的起始速度=0,最后一段的结束速度=0;假设相邻段的衔接速度可以不为0,而衔接加速度=0。
2,在每一段内,按照从起始速度V0加速到结束速度V1,计算能够加速到的最大V1。最大V1的目标值 TargetV[i] = min( LimVel[i] , LimVel[i+1] )。
3,每一段内的加速曲线仍然是3段式的(梯形加速度曲线),只用判断梯形模型/三角模型的临界情况,即可算得实际能加速的最大V1.
4,若 TargetV[i] < TargetV[i+1] ,则用以上的加速计算,确定结束速度V[i+1];若 TargetV[i] >= TargetV[i+1],则不用计算,暂时设V[i+1] = TargetV[i+1].
5,按i从小到大的顺序,即正向依次算得所有V[i]。
6,再按照以上类似的方式,按i从大到小的顺序,即反向依次再算一遍V[i],该过程中 TargetV[i] 为正向计算得到的 V[i]。这样在正向计算中“减速模式”未精确计算的V[i]都得到了计算。所有的V[i]都正向/反向可达且为最大值。
7,这样正向计算+反向计算后,就确定了所有衔接点的速度,且设定加速度=0,这样每一段进行单段式求解的条件就都具备了,按单段式依次求解即可。

若连续多段速度规划不是预先已知所有段的轨迹,而是通过缓存队列的方式动态加载的(有称为DMA功能),则还需要进一步修改算法,并考虑实时插补的运动耗时与前瞻规划处理的计算耗时之间的同步影响。

空间三维插补和速度规划
以上做的都是速度规划,它已知的是一段轨迹/路径的距离,而不用考虑轨迹/路径的形状。如何将速度规划与空间中轨迹规划联系起来呢?

首先通过一个简单的例子,空间中的三维直线路径的插补,来展示它们之间的协作。

空间中的三维直线路径可以有很多种方程表示,在此可以用参数方程的方式表示为:
在这里插入图片描述
u是参数从0到1变化,其他的ab为系数,由起点终点计算得到。

xyz(t)的空间三维关于时间的插值问题可以转为u(t)参数关于时间的插值问题,也就是速度规划问题。直线插补的合成最大速度/最大加速度为输入参数,直线距离确定。可以转到参数u,即u的值从0到1,并且等效计算u的最大速度/最大加速度等,这样就可以进行 u(t) 的速度规划了。然后在实时插补中,每一个插补时刻t对应速度规划结果u(t)的一个u值,再通过以上路径的参数方程求出x/y/z,即得到了 xyz(t) 的空间直线插值结果。

其他路径的计算流程也是差不多的,例如空间圆弧路径,通过静态的坐标转换可以表示为某平面内的圆弧,进一步表示为xyz关于圆心角theta的参数方程。
在这里插入图片描述
在这里插入图片描述

然后也是如上流程:
1,从路径得到整体的路径参数方程,及路径长度,速度限制,加速度限制等;
2,按路径长度进行速度规划,得到路径距离Dist(t);
3,按照速度规划结果进行实时插值,并由Dist计算得到参数值u;
4,再由参数值计算路径上的坐标值。
这套方法实际上是把空间多维路径归一化到共同的一个参数。它适用于任意空间三维位置路径的插补。一些复杂路径需要额外做一些工作,包括:1 计算复杂路径的欧式空间积分距离;2 在实时速度插值时,已知路径上的距离Dist(t),求参数u。

多维度时间同步速度规划
空间中的三维位置(x,y,z)所构成的路径,可以变为一维的曲线距离,按照一维进行速度规划。但是有时涉及多个独立维度的时间同步速度规划,这时需要处理的一个基本问题是:两组/多组速度规划曲线如何时间同步,或者说确定时间的速度规划。

一般来说,可以通过以上“所有解”的方式,确定所有可行的区间,从Sc=F(Vc)来说,它是自变量Vc的定义域区间,同时也是按Vc求得的整段耗时t 的值域区间。多个自由度的可行耗时 t 区间如下图所示:
在这里插入图片描述
若是多个自由度需要进行时间同步,则如上图所示按照可行区间的边界值从小到大进行判定,是否在所有可行区间内,灰色为不可行的实时间区间,最终得到粗黑线T3a为这三个自由度的最小可同步时间。这样来确定最小的同步时间

若是单个自由度需要进行确定时间的规划,则先看设定的耗时是否在可行区间内,不在则没有解,若在则可以在区间内通过数值迭代的方式求解,或通过确定的(以上"所有解"中16种组合之一)解析式直接求解。

以上只是单段的多自由度时间同步,在解决以上这些基础问题后,还要考虑的是连续多段的多维度同步规划如何让整体的时间更优,这才是真正的难点。

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

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

相关文章

单片机的学习(15)--LCD1602

LCD1602 14.1LCD1602的基础知识1.LCD1602介绍2.引脚及应用电路3.内部结构框图4.时序结构5.LCD1602指令集6.字符值7.LCD1602操作流程 14.2LCD1602功能函数代码1.显示一个字符&#xff08;1&#xff09;工程目录&#xff08;2&#xff09;main.c函数&#xff08;3&#xff09;LCD…

oj E : 投资项目的方案

Description 有n种基础的投资项目&#xff0c;每一种的单位收益率为profitn&#xff0c;存在m种投资组合&#xff0c;限制每一种的投资总额不能超过invest_summ 每种投资组合中项目所需的单位投入是不同的&#xff0c;为costmn 求&#xff1a;使得收益率之和最高的每种项目投…

基于机器学习的制冷系统过充电和欠充电故障诊断(采用红外热图像数据,MATLAB)

到目前为止&#xff0c;制冷系统故障诊断方法已经产生很多种&#xff0c;概括起来主要有三大类&#xff1a;基于分析的方法&#xff0c;基于知识的方法和基于数据驱动的方法。基于分析的方法主要获得制冷系统的数学模型&#xff0c;通过残差来检测和诊断故障。如果存在残差且很…

[JS]BOM操作

介绍 BOM(Browser Object Model)是浏览器对象模型 window对象是一个全局对象, 也是JS中的顶级对象通过var定义在全局作用域中的变量和函数都会变成window对象的属性和方法window对象下的属性和方法调用时一般省略window 间歇函数 定时器 定时器是间歇函数的一种, 可以每个每…

酒店客房管理系统(Java+MySQL)

技术栈 Java: 作为主要编程语言。Swing GUI: 用于开发图形用户界面。MySQL: 作为数据库管理系统。JDBC: 用于连接和操作MySQL数据库。 功能要点 管理登录认证 系统提供管理员登录认证功能。通过用户名和密码验证身份&#xff0c;确保只有授权的用户可以访问和管理酒店客房信…

【three.js案例二】时空隧道

import * as THREE from ./build/three.module.js // 引入轨道控制器扩展库OrbitControls.js import { OrbitControls } from three/addons/controls/OrbitControls.js; // 引入dat.gui.js的一个类GUI import { GUI } from three/addons/libs/lil-gui.module.min.js;// 场景 co…

名企面试必问30题(十)——你有自己的方法论吗?

1.思路 第一&#xff0c;方法论指的是做某些事情或业务的套路&#xff0c;但它没有绝对的正确性&#xff0c;每个人都可以拥有专属的方法论。 第二&#xff0c;方法论必定源自于自身实战经验的总结。 2.参考解答 “在软件测试工作中&#xff0c;我逐渐形成了自己的一套方法论。…

数字化那点事:一文读懂数字乡村

一、数字乡村的定义 数字乡村是指利用信息技术和数字化手段&#xff0c;推动乡村社会经济发展和治理模式变革&#xff0c;提升乡村治理能力和公共服务水平&#xff0c;实现乡村全面振兴的一种新型发展模式。它包括农业生产的数字化、乡村治理的智能化、乡村生活的现代化等方面…

记一次小程序渗透

这次的小程序渗透刚好每一个漏洞都相当经典所以记录一下。 目录 前言 漏洞详情 未授权访问漏洞/ 敏感信息泄露&#xff08;高危&#xff09; 水平越权&#xff08;高危&#xff09; 会话重用&#xff08;高危&#xff09; 硬编码加密密钥泄露&#xff08;中危&#xff0…

熟练掌握爬虫技术

一、Crawler、Requests反爬破解 1. HTTP协议与WEB开发 1. 什么是请求头请求体&#xff0c;响应头响应体 2. URL地址包括什么 3. get请求和post请求到底是什么 4. Content-Type是什么1.1 简介 HTTP协议是Hyper Text Transfer Protocol&#xff08;超文本传输协议&#xff09;…

2024最新boss直聘岗位数据爬虫,并进行可视化分析

前言 近年来,随着互联网的发展和就业市场的变化,数据科学与爬虫技术在招聘信息分析中的应用变得越来越重要。通过对招聘信息的爬取和可视化分析,我们可以更好地了解当前的就业市场动态、职位需求和薪资水平,从而为求职者和招聘企业提供有价值的数据支持。本文将介绍如何使…

python自动化办公之PyPDF2

用到的库&#xff1a;PyPDF2 实现效果&#xff1a;打开pdf文件&#xff0c;把每一页的内容读出来 代码&#xff1a; import PyPDF2 # 打开pdf文件 fileopen(friday.pdf,rb) # 创建pdf文件阅读器对象 readerPyPDF2.PdfReader(file) # 获取pdf文件的总页数 total_pageslen(rea…

Amazon Q——2023 re:Invent 大会的 AI 革新之星

引言 在2023年的 re:Invent 大会上&#xff0c;亚马逊云科技&#xff08;亚马逊云科技&#xff09;不仅展示了包括 Amazon Graviton3、Amazon SageMaker Studio Lab、Amazon Connect Wisdom、Amazon QuickSight Q 和 Amazon Private 5G 在内的多项创新产品&#xff0c;还发布了…

【python爬虫】豆瓣爬虫学习

文章目录 网页地址爬虫目标技术栈爬虫代码注意事项 Python爬虫学习&#xff1a;我们可以选择一个相对简单的网站进行数据抓取。这里以抓取“豆瓣电影Top250”的信息为例&#xff0c;这个网站提供了丰富的电影数据&#xff0c;包括电影名称、评分、导演、演员等信息。 网页地址…

AI大模型技术在音乐创造的应用前景

大模型技术在音乐创作领域具有广阔的应用前景&#xff0c;可以为音乐家、作曲家和音乐爱好者提供以下方面的帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 音乐创作辅助&#xff1a;大模型可以帮助音乐家和作曲家生成旋律、和声…

算法金 | 协方差、方差、标准差、协方差矩阵

大侠幸会&#xff0c;在下全网同名「算法金」 0 基础转 AI 上岸&#xff0c;多个算法赛 Top 「日更万日&#xff0c;让更多人享受智能乐趣」 抱个拳&#xff0c;送个礼 1. 方差 方差是统计学中用来度量一组数据分散程度的重要指标。它反映了数据点与其均值之间的偏离程度。在…

Flask无法Debug

问题描述 Flask Debug的时候&#xff0c;可能会无法进入断点。我使用的是pycharm CE版本。 解决方案 确保pycharm安装路径不带空格。&#xff08;带空格路径导致debug程序启动报错&#xff09;Gevent compatible&#xff0c;这个东西老的pycharm版本必须勾选它&#xff0c;新…

中霖教育靠谱吗?在职备考一建好通过吗?

中霖教育靠谱吗?在职备考一建好通过吗? 课程设置&#xff1a;报名后会进行测评&#xff0c;了解学员的知识掌握情况、时间安排和记忆思维特点等&#xff0c;制定更适合的学习计划。 课程以考试通过为目标&#xff0c;去繁化简&#xff0c;只讲有用的干货&#xff0c;帮助快…

VLOOKUP函数在表格的简单运用-两个表匹配

1.什么是VLOOKUP&#xff1f; VLOOKUP是Excel中的一个内置函数&#xff0c;主要用于在区域或表格的首列查找指定的值&#xff0c;并返回该行中其他列的值。它特别适用于跨表格数据匹配 2.函数运用 2.1.这边两个表取名a表和b表&#xff0c;做为我们的实例表。 表格a包含&…

Search for documents with similar texts

题意&#xff1a;搜索具有相似文本的文档 问题背景&#xff1a; I have a document with three attributes: tags, location, and text. 我有一份文档&#xff0c;包含三个属性&#xff1a;标签、位置和文本。 Currently, I am indexing all of them using LangChain/pgvecto…