聊聊如何设计(电子)凸轮运动方程自动生成器(一)
本帖最后由 从零开始 于 2022-5-14 15:36 编辑上次在小铁匠帖子里答应聊聊如何设计凸轮方程自动生成器, (我的理解)且它应该包含一个高级功能---在任一完整的传统方程曲线(双停留方程)中间,对某一个或多个点的位移/速度/加速度进行编辑/修改,它已经不再是原来那段曲线了, 但它还是要满足凸轮方程基本要求,也许还需要尽量与原曲线贴近,也许还需要并保持高阶连续性. 该如何实现呢.
读完norton的手册,知道他(米国佬)是可以实现的,而且知道他的方法(b-样条),目前用的凸轮设计软件,发现他(德国佬)也是可以实现的,具体的方法不得而知, 我尝试用埃尔米特样条(Hermite Spline or interpolation)来达到他的效果,结果效果总是差那么一点,将来可能会用b-spline 或 NURBS试一试... 所以不算完全参透了德国人的实现方法.
言归正传. 该如何设计(电子)凸轮运动方程自动生成器?
先记住凸轮方程设计的最最基础的要求 "加速度连续, 跃度值有限"
先说我手上的这个德国软件(OPTIMUS MUTUS)是怎么做的.
1.基础功能
任何一个凸轮设计或运动方程设计(motion designer or planner)的最最基础功能, 就是在两个停留段中间加入双停留方程, 这个不在话下, 知道了方程式,大家都可以做.
经典的双停留方程包括: modified sine, sine acceleration, 3-4-5 polynomial, 4-5-6-7 polynomial, Gutman F-3, Freudenstein 1-3, Berzak D, Berzak E 等等等等.
2.复杂功能
复杂一点的功能是, 曲线与直线(非水平线)的, 曲线与曲线的相互衔接, 并满足凸轮方程设计的最基础的要求 "加速度连续, 跃度值有限"
德国那边的做法,把凸轮方程中的边界点, 根据边界条件的不同分为四个类型:
R : v=0, a=0
U: v=0, a≠0
G: v≠0, a=0
B: v≠0, a≠0
因此任意两个边界点之间的曲线的类型可能是 R-R, R-U, R-G, R-B, U-U, U-R ...等等, 共16种,比如R-R就是经典"双停留"方程,而其他类型的曲线其实也根据经典曲线,或组合,或裁剪,或改变系数得来,当然对于软件设计者来说,这中间有大量繁琐的工作要做,德国软件提供了56种方程,适合各种边界条件.因此在边界点之间选择正确的曲线, 就可以衔接成完整的方程,满足最基础的需求. 比如在双停留曲线之间,增加一个控制点(边界点), 改变s,v,a, 这时成了一个R-B 和一个B-R曲线的组合曲线.
3.高级功能, 跃度(jerk)优化,(甚至ping 优化)
由上一步实现的方程,保证了最基础的要求,加速度连续, 但是其跃度却不一定是连续, 德国软件提供了跃度,和ping优化的高级功能, 当你选择对运动方程进行跃度优化时,软件会自动生成新的方程,新方程不仅满足各个边界点的边界条件不变(s,v,a不变), 还能使jerk,甚至ping在边界点都是连续的, 甚至在大多数情况下,不仔细观察看不出位移,速度和加速度曲线的变化!!! 我尝试用hermite多项式样条来实现, 但跃度曲线始终无法像这个软件那样的"自然和柔和", 由于他的英文帮助文档写的不详细,德语文档里面我用bing翻译,找了许久没找到.
所以具体用什么方法不得而知,我猜测他还是用某种样条实现的hermite插值, 而且有他自己的优化方法在其中.
再说说Norton的实现方法,
他把上述2,3的功能融合成了一个(也可以说弃用了上述第二条), 统一用b-样条实现, 其实也可以看作是hermite插值法的b-spline实现, 其本质是将b-spline基函数线性组合成一个满足各个边界条件的方程.具体方法各位可以看看我以前的贴子.
他所用的b-spline有两个重要的优点:
1. 可以任意指定边界点的边界条件的个数,
2. 可以通过调整节点(knots)来调整基函数(basis function), 进而调整最终曲线的形状;
我至今还惊叹这个方法的精妙...
补充: Hermite interpolation 埃尔米特插值, 是一个插值方法或者思想,不仅要穿过插值点,同时满足与插值点处的导数(一阶,二阶,三阶甚至更高阶)相等.
比如 三次多项式样条(cubic spline)可以实现对位移和速度进行插值;
五次多项式样条quintic spline)可以实现对位移和速度,加速度进行插值;
七次多项式样条(septic spline)可以实现对位移和速度,加速度和跃度进行插值;
以下是我编程实现的两个例子:
第一个,是对Gutman F-3的加速度曲线(此曲线两个端点跃度不为零)进行三次hermite插值, 并强制使两个端点的跃度(加速度一阶导数)为零,得到一个新的跃度连续的加速度, 你可以再通过积分和适当的缩放,就可以得到一个新的跃度连续的方程;
第二个, 是对一个由两段曲线连起来的曲线进行七次hermite插值, (原曲线的跃度再两端和衔接点处不连续), 使其变成一个跃度连续的曲线, 不足之处是连接点和端点处出现了明显的"龙格效应"
原来的位移曲线
原来的跃度曲线
插值后的位移曲线
插值后的加速度曲线
插值后的跃度曲线对比原曲线, 虽然连续了,但是也"震荡"了.
总结和体会:
1. Hermite 插值 和样条 等是(电子)凸轮运动方程设计和路径规划的重要工具, 需要了解和掌握;
2. 多项式样条实现的hermite插值, 贝塞尔样条,b-spine样条的方法本质上都可以看作八爷所说的"叠加法", 应为他们所得方程最终稿都是由基函数的线性组合.(大家可以搜一下hermite spline,bernstein polynomial 和b-spline basis functions 帮助理解)
hermite spline的basis 是 贝塞尔样条基函数(亦即bernstein polynomial)的子集,贝塞尔样条基函数又是b-spline basis functions 的子集, ,b-spline再bezier样条的基础上加了节点(knots), NURBS又在b-spline的基础上加了权重(weight). 这些工具都可以用来设计凸轮运动方程.
3. 样条曲线的次数并非越高越好,因为可能有runge现象出现.
4. 如果是常规的双停留凸轮, 老实用经典的方程就好了.
5. 如果由特殊的需要, 需要在曲线的中间增加一个或多个控制点, 样条可以排上大用场.
6. 优化都是有代价的,比如跃度的优化,可能导致加速度的变换, 进而改进惯性力的频率成分.7. 当振动问题比较显著的时候, 应该使用跃度优化.
大侠数学功底真好,等我研究一下再向大侠请教。 型值点稀了形状控制比较难,型值点密了会出现多余的振动。 入魔了啊,这样能赚到钱吗
页:
[1]