Answers:
首先,我们需要定义最优。由于您没有说出什么是最佳选择,因此大多数人会选择二次表达式。例如,假设您当前的关节角度由矢量。我们可以考虑最小化所需的运动-有错误→ X = → α - → α小号吨一个ř 吨,可以定义一个成本函数对一些矩阵。我们通常使用对角矩阵,但是任何正定矩阵都可以。 Q
在具有两个关节角度的简化示例中,如果关节的电机便宜(也许更靠近末端执行器),我们的成本函数可能为
,即 关节 b的运动成本是关节 a的两倍。
现在,运动方程是一个矩阵公式,用Denavit-Hartenberg表示是:
,其中右手侧表示的位置(X ,ÿ ,Ž )和取向(当前被设置为零旋转),给定关节角度。
由于我们不在乎方向,仅在乎位置,因此我们可以截断最后一个变换矩阵的前3列和第一个变换矩阵的最后一行。我们可以等效地将该公式表示为:
乘以左侧,我们得到三个方程。如果参数是线性的,则很容易求解。如果所有执行器都是线性执行器,就是这种情况。在这种情况下,问题实际上是二次程序。我们可以重新排列左侧以获得等式:
对于某些矩阵 K, K → x = [ x y z ]。
二次程序是一个问题,可以用以下形式表示:
最小化
除,ê → X = → d
为了解决这个问题,您可以使用多种算法,例如,内部点,活动集等。只要找到一个合适的库,它就会为您解决。
非线性方程组更难求解。这称为非线性编程,但是如果您有旋转关节,它就是您所拥有的。
本质上,您具有非线性函数,而不是矩阵方程。
用于解决此问题的算法甚至更加复杂,但包括内部点,顺序二次规划(SQP),活动集,信任区反射算法。显然,关于这些算法如何工作的解释非常冗长,我将其排除在此答案范围之外。可以说,仅用于二次编程的算法的内容量本身就是一个完整的过程。
您只需要找到一个库来解决问题,编写一个有效的实现将花费很长时间,并且有效的实现一次可以处理100个(或更多)变量。例如,如果您使用MATLAB,则可以从“优化工具箱”中找到有关如何使用函数fmincon的文档。
要在线解决该问题,您可能需要C ++或其他本机实现,例如NLopt。请注意,这可能不是微控制器可以快速解决的问题,并且许多库可能还具有其他依赖关系,这些依赖关系在微控制器上不易使用(因为它们旨在用于计算机)。
如果您不担心效率,只是想自己编写一些代码,那么假设有一个可以调用来解决运动学反问题的函数,您可以简单地执行梯度下降方法。例如,任意选择一个随机的起始方向,解决反问题,然后检查成本函数。然后,您可以使用扰动分析来检查如何改变方向。例如,如果您检查当前方向周围的相似方向(即立方网格中的8个点),则可以得到成本函数在每个方向上如何变化的二阶近似值。
使用二阶近似(因为它是多元的-定向为3维,所以称为Hessian矩阵),您可以找到成本函数的梯度的零交叉(即,预测的局部最小值)。
使用新的预测方位,只需再次将其放置在逆求解器中,然后重复进行直到精度足够。
请注意,这可能不会那么有效,因为逆运动学问题本身必须迭代解决(因此,您反复使用本身需要一段时间才能解决的函数)。而且,所涉及的代码可能少于成熟的优化算法,但它仍然是相当可观的,并且对时间的投入并不小。
使用这两种方法(作为非线性程序正式求解或使用函数迭代求解反问题),如果存在多个局部极小值,则求解可能不是最佳的。在这种情况下,您可以尝试使用各种方法来找到全局最小值。即使使用非线性编程求解器,也应使用初始值(例如,关节角度)为它播种。您可以使用各种方式生成的种子重复运行任一方法:
或其他自定义方法。
但是请注意,如果有很多最小值,则没有很好的方法来保证找到全局最小值。您只能提高机会。