刚体动力学算法 Chapter 5 逆动力学

博客围绕递归牛顿 - 欧拉算法展开,介绍了逆动力学概念及该算法在运动树逆动力学计算中的应用。阐述了算法复杂度、递归关系,推导了算法各步骤方程,对比了基本版、刚体坐标版和原始版算法,还提及算法的发展历程及不同算法复杂度对比。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Chapter 5 Inverse Dynamics

逆动力学是指在刚体系统中寻找产生给定加速度所需的力。逆动力学计算在运动控制系统、轨迹设计和优化(例如用于机器人和动画角色)、机械设计以及某些正向动力学算法中都有应用。最后一个应用在第6章中介绍。逆动力学计算可以用以下方程表示:
τ=ID(model⁡,q,q˙,q¨), \boldsymbol{\tau}=\mathrm{ID}(\operatorname{model}, \boldsymbol{q}, \dot{\boldsymbol{q}}, \ddot{\boldsymbol{q}}), τ=ID(model,q,q˙,q¨),

其中 q,q˙,q¨\boldsymbol{q}, \dot{\boldsymbol{q}}, \ddot{\boldsymbol{q}}q,q˙,q¨τ\boldsymbol{\tau}τ 分别是广义位置、速度、加速度和力的向量,而 model 是特定刚体系统的系统模型。

本章介绍了一种计算运动树逆动力学的算法。闭环系统的算法将在第8章中出现。运动树的逆动力学计算特别容易,这就是我们为什么从这个问题开始的原因。该算法称为递归牛顿-欧拉算法,它是最简单、最高效的算法。它的计算复杂度为 O(n)O(n)O(n),这意味着计算量与树中的刚体或关节变量数量呈线性增长。首先介绍基本形式的算法,然后添加实现细节,最后将空间向量版本与原始的3D向量版本进行比较。本章还涵盖算法复杂度的主题,并解释了为什么递归算法如此高效。

5.1 算法复杂度

我们将算法的计算成本定义为其操作数量,即在执行算法过程中执行的算术操作次数。如果算法涉及实数运算(如动力学算法),则习惯上仅计算浮点操作。因此,忽略了整数操作,例如计算数组索引或递增循环变量所需的操作。

算法的计算复杂度是衡量成本如何随问题规模增长的一种指标。我们使用“大O”符号来指定这个数量。如果一个算法的复杂度被描述为 O(np)O\left(n^{p}\right)O(np),其中 nnn 是问题的规模,那么当 n→∞n \rightarrow \inftyn 时,成本将与 npn^{p}np 成比例增长。更准确地说,如果存在正常数Cmin⁡,Cmax⁡C_{\min },C_{\max }CminCmaxnmin⁡n_{\min }nmin,使得计算成本至少为 Cmin⁡f(n)C_{\min } f(n)Cminf(n),但对于所有 n>nmin⁡n>n_{\min }n>nmin,不超过 Cmax⁡f(n)C_{\max } f(n)Cmaxf(n) ,则称算法具有 O(f(n))O(f(n))O(f(n)) 复杂度。

表达式 O(f(n))O(f(n))O(f(n)) 可以解释为所有在 n→∞n \rightarrow \inftyn 时与 f(n)f(n)f(n) 成比例增长的函数集合。因此,像“算法XXXO(f(n))O(f(n))O(f(n)) ”这样的说法意味着 XXX 的成本,表示为 nnn 的函数,是集合 O(f(n))O(f(n))O(f(n)) 的元素。类似地,表达式 O(f(n))=O(g(n))O(f(n))=O(g(n))O(f(n))=O(g(n)) 是一个集合相等,意味着 g(n)∈O(f(n))g(n) \in O(f(n))g(n)O(f(n)) 且反之亦然。在引用复杂度时,我们选择集合中最简单的函数作为 OOO 的参数。例如,如果算法的精确成本由多项式 a0+a1n+⋯+apnpa_{0}+a_{1} n+\cdots+a_{p} n^{p}a0+a1n++apnp 给出,则与该多项式成比例增长的最简单函数是 npn^{p}np,因此我们引用复杂度为 O(np)O\left(n^{p}\right)O(np) 。通常,只有 fff 中增长最快的组成部分才重要。如果 fff 收敛到常数,则称 fffO(1)O(1)O(1)

算法的复杂度取决于问题规模的衡量方式。例如,矩阵求逆的复杂度被认为是 O(n3)O\left(n^{3}\right)O(n3) ,因为求逆一个 n×nn \times nn×n 矩阵的成本随着 n→∞n \rightarrow \inftyn 而以 n3n^{3}n3 成比例增长。这个数字依赖于 nnn 是矩阵的维度。如果 nnn 是矩阵中元素的数量,那么复杂度数字将是 O(n1.5)O\left(n^{1.5}\right)O(n1.5)。更一般地,如果 mmmnnn 是问题规模的两种不同衡量方式,并且 m=g(n)m=g(n)m=g(n),那么 O(f(m))=O(f(g(n)))O(f(m))=O(f(g(n)))O(f(m))=O(f(g(n)))

对于动力学算法,问题的规模是刚体系统的规模。如果系统是一个运动链,那么有两种合理的系统规模衡量方式:刚体数量 NBN_{B}NB 和自由度数量 nnn。如果链中的每个关节至少有一个自由度,则这两个数字满足 NB≤n≤6NBN_{B} \leq n \leq 6 N_{B}NBn6NB,这意味着

O(NBp)=O(np). O\left(N_{B}^{p}\right)=O\left(n^{p}\right) . O(NBp)=O(np).

因此,在引用复杂度时,无需区分 NBN_{B}NBnnn

5.2 递归关系

现代动力学算法是递归的,它们比非递归的前身快几个数量级。它们之所以被称为递归,是因为它们利用递归关系来计算中间结果的序列。正是递归关系的使用导致了它们的高效性;因此,让我们花一点时间来看看这些递归关系是如何工作的。递归关系是一个公式,它根据前面的元素定义了序列中的下一个元素。这个公式连同一组初始值提供了序列的递归定义。例如,斐波那契数列0,1,1,2,3,5,8,13,…0,1,1,2,3,5,8,13, \ldots0,1,1,2,3,5,8,13,可以通过递归关系 Fi=Fi−1+Fi−2F_{i}=F_{i-1}+F_{i-2}Fi=Fi1+Fi2 和初始值 F0=0F_{0}=0F0=0F1=1F_{1}=1F1=1 来定义。对于刚体系统,在根据 第4.1.2节 的规则编号的情况下,刚体速度序列 v0,v1,v2,…\boldsymbol{v}_{0}, \boldsymbol{v}_{1}, \boldsymbol{v}_{2}, \ldotsv0,v1,v2,可以通过递归关系 vi=vλ(i)+Siq˙i\boldsymbol{v}_{i}=\boldsymbol{v}_{\lambda(i)}+\boldsymbol{S}_{i} \dot{\boldsymbol{q}}_{i}vi=vλ(i)+Siq˙i 和给定的 v0\boldsymbol{v}_{0}v0 的初始值来定义。

让我们来看看使用递归关系和不使用递归关系计算刚体速度的任务。为了简化问题,假设系统是一个无分支的运动链,具有1自由度关节。这意味着 λ(i)=i−1\lambda(i)=i-1λ(i)=i1 ,并且关节 iii 上的速度是关节轴向量 sis_{i}si 与标量关节速度变量 q˙i\dot{q}_{i}q˙i 的乘积。刚体速度的递归关系如下:

vi=vi−1+siq˙i(5.2) \boldsymbol{v}_{i}=\boldsymbol{v}_{i-1}+\boldsymbol{s}_{i} \dot{q}_{i} \tag{5.2} vi=vi1+siq˙i(5.2)

在初始条件 v0=0\boldsymbol{v}_{0}=\mathbf{0}v0=0 下,刚体速度的非递归公式为:

vi=∑j=1isjq˙j(5.3) \boldsymbol{v}_{i}=\sum_{j=1}^{i} \boldsymbol{s}_{j} \dot{q}_{j} \tag{5.3} vi=j=1isjq˙j(5.3)

m\mathrm{m}ma\mathrm{a}a 分别表示标量-向量乘法和向量加法的成本。方程5.2 的一次应用成本为 m+a\mathrm{m}+\mathrm{a}m+a,方程5.3 的成本为 i m+(i−1)i \mathrm{~m}+(i-1)i m+(i1) a。通过方程5.2 计算前 nnn 个刚体速度的成本为 n( m+a)n(\mathrm{~m}+\mathrm{a})n( m+a),通过方程5.3 的成本为 12(n(n+1)m+n(n−1)a)\frac{1}{2}(n(n+1) \mathrm{m}+n(n-1) \mathrm{a})21(n(n+1)m+n(n1)a)。因此,使用方程5.2 可以得到高效的 O(n)O(n)O(n) 计算,而方程5.3 导致低效的 O(n2)O\left(n^{2}\right)O(n2) 计算。

这种低效的原因并不难理解。如果我们使用方程5.3 进行计算,那么我们最终需要计算的是
v1=s1q˙1v2=s1q˙1+s2q˙2⋮⋮vn=s1q˙1+s2q˙2+⋯+snq˙n. \begin{aligned} \boldsymbol{v}_{1} & =\boldsymbol{s}_{1} \dot{q}_{1} \\ \boldsymbol{v}_{2} & =\boldsymbol{s}_{1} \dot{q}_{1}+\boldsymbol{s}_{2} \dot{q}_{2} \\ & \vdots \\ & \vdots \\ \boldsymbol{v}_{n} & =\boldsymbol{s}_{1} \dot{q}_{1}+\boldsymbol{s}_{2} \dot{q}_{2}+\cdots+\boldsymbol{s}_{n} \dot{q}_{n} . \end{aligned} v1v2vn=s1q˙1=s1q˙1+s2q˙2=s1q˙1+s2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值