【论文复现】【最优控制数值方法】使用Hermite-Simpson配点法计算双足行走机器人的最优步态研究(Matlab代码实现)

📅 发布时间:2026/7/10 15:34:27 👁️ 浏览次数:
【论文复现】【最优控制数值方法】使用Hermite-Simpson配点法计算双足行走机器人的最优步态研究(Matlab代码实现)
欢迎来到本博客❤️❤️博主优势博客内容尽量做到思维缜密逻辑清晰为了方便读者。⛳️座右铭行百里者半于九十。本文内容如下⛳️赠与读者‍做科研涉及到一个深在的思想系统需要科研者逻辑缜密踏实认真但是不能只是努力很多时候借力比努力更重要然后还要有仰望星空的创新点和启发点。建议读者按目录次序逐一浏览免得骤然跌入幽暗的迷宫找不到来时的路它不足为你揭示全部问题的答案但若能解答你胸中升起的一朵朵疑云也未尝不会酿成晚霞斑斓的别一番景致万一它给你带来了一场精神世界的苦雨那就借机洗刷一下原来存放在那儿的“躺平”上的尘埃吧。或许雨过云收神驰的天地更清朗.......第一部分——内容介绍文献1最优控制数值方法综述本文对最优控制的数值方法进行了综述。文章的目标是描述多年来为解决一般最优控制问题而发展的主要方法。特别是讨论了间接法和直接法这两个大类描述了每类中使用的主要方法并提供了大量相关文献的参考文献列表。随后讨论了几个重要的计算问题并介绍了用于求解最优控制问题的知名软件程序。最后给出了如何选择方法的建议。*引言最优控制是一门旨在确定动态系统的输入以在满足系统运动约束的同时优化即最小化或最大化特定性能指标的学科。由于大多数应用的复杂性最优控制问题通常通过数值方法求解。求解最优控制问题的数值方法可追溯到近五十年前的1950年代始于Bellman的工作。从那时起至今方法的复杂性以及相应应用的复杂性和多样性大大增加使最优控制成为与工程许多分支相关的学科。在深入综述细节之前有必要区分轨迹优化和最优控制这两个术语。通常这两个术语可以互换使用。在系统输入为静态参数且需要确定这些参数的值以及优化给定性能指标的轨迹的情况下即函数优化问题轨迹优化这一术语最为合适。另一方面在系统输入本身是函数且需要确定特定的输入函数和轨迹以优化给定性能指标的情况下即泛函优化问题适当的术语是最优控制。然而在许多情况下系统的一些输入是静态参数而其他输入是时间的函数。由于本文考虑的是需要确定时间函数和静态参数的数值方法即最优控制问题我们将使用更通用的术语最优控制问题。求解最优控制问题的数值方法分为两大类间接法和直接法。在间接法中使用变分法来确定原始最优控制问题的一阶最优性条件。间接方法导出一个多点边值问题求解该问题以确定称为极值线的候选最优轨迹。然后检查每个计算得到的极值线看它是否为局部最小值、最大值或鞍点。在局部最优解中选择成本最低的特定极值线。在直接法中最优控制问题的状态和/或控制以某种方式离散化问题被转换为非线性优化问题或非线性规划问题NLP。然后使用已知的优化技术求解NLP。可以看出间接法和直接法源于两种不同的哲学。一方面间接方法通过将最优控制问题转换为边值问题来间接求解问题因此得名间接。因此在间接方法中通过求解满足端点和/或内点条件的微分方程组来找到最优解。另一方面在直接方法中通过将无限维优化问题转换为有限维优化问题来找到最优解。间接法和直接法的两种不同哲学在最优控制界造成了分歧。专注于间接方法的研究者主要对微分方程理论感兴趣例如参见文献29而专注于直接方法的研究者更关注优化技术。虽然看似无关但这两种方法比最初看到的有很多共同之处。特别是正如我们将在本综述后面讨论的近年来研究人员深入研究了间接形式和直接形式之间的联系。这项研究发现许多直接方法的最优性条件具有明确定义的有意义的关系。因此随着时间的推移这两类方法正在融合。公开文献中已经发表了几篇关于最优控制的综述性著作。文献30提供了在现代数字计算机出现之前使用的计算技术的优秀概述。文献31总结了到那时为止基于梯度方法求解最优控制问题的进展。文献32提供了1950年至1985年最优控制的历史包括变分法根源的优雅历史视角一直追溯到17世纪。文献34提供了1990年代之前开发的最优控制常用方法的简要列表并强调了结合间接法和直接法称为混合方法的实用性。文献35简要描述了将连续时间最优控制问题转换为参数优化问题的方法。文献36提供了轨迹优化数值方法的优秀综述讨论了间接配点法和直接配点法。此外文献36对美国各地政府和研究中心的轨迹优化应用和发展提供了极好的视角。本文被认为是对所有先前发表的最优控制和轨迹优化综述文章的补充因为它反映了过去十年在计算最优控制方面所做的研究同时提供了1990年代之前所做的大量工作的总结。最后虽然在航空航天界已经做了大量的最优控制研究但本文试图借鉴其他工程学科例如化学工程和应用数学领域所做的工作。详细文章见第4部分。以下是该论文的中文翻译---**用于求解轨迹优化问题的软件**已经开发了各种各样的软件工具用于求解轨迹优化问题。这些软件程序大多使用直接法。一个使用间接法的知名软件程序是BNDSCO它采用多重打靶法。也许最古老的采用直接法的软件工具是轨迹仿真与优化程序POST。POST最初是为了解决运载火箭轨迹优化问题而开发的至今仍在用于此类应用。20世纪80年代末求解最优控制问题的可用工具发生了转变。这一转变与直接配点法威力的发现同时发生。第一个著名的直接配点软件是隐式仿真最优轨迹OTIS。OTIS是一种FORTRAN软件具有航空和航天领域通用问题的求解能力。OTIS在航空航天和国防工业中得到了广泛应用其理论基础见文献150。在OTIS开发之后不久出现的是稀疏最优控制软件SOCS。SOCS是一种功能极其强大的FORTRAN软件能够解决人们能够实际提出的最具挑战性的最优控制问题。使用SOCS解决的一些应用见文献152-156。最后另外三个直接配点FORTRAN程序是MISER、直接配点法DIRCOL、仿真与优化图形环境GESOP和非线性轨迹生成NTG。与OTIS和SOCS一样DIRCOL和GESOP使用局部直接配点技术而NTG专为微分平坦系统的快速轨迹生成而设计。近年来对最优控制在航天飞行中特定应用的兴趣促使开发了几个有用的程序。其中一个程序是任务设计与分析软件MIDAS它旨在为行星际航天飞行任务求解复杂的弹道日心转移轨迹。另一个最近开发的工具是NASA广义任务分析工具GMAT。过去几年中广泛使用的另一个工具是COPERNICUS。GMAT和COPERNICUS都旨在求解最优控制问题其中机动可以被视为脉冲或有限推力燃烧。虽然早期的软件程序使用FORTRAN等编译语言但近年来MATLAB在求解优化问题方面越来越受欢迎。MATLAB吸引力增加的原因在于MATLAB是一个极其简单的编程环境同时许多当今最强大的NLP求解器现在都可以在MATLAB中使用例如NLP求解器SNOPT和KNITRO的独立MATLAB mex版本现已可用。此外TOMLAB软件包促进了更多求解器在MATLAB中的使用。另外由于计算能力的重大改进MATLAB与编译语言之间的计算效率差距正在不断缩小。基于MATLAB的最优控制软件程序示例包括RIOTS 95、DIDO、DIRECT、PROPT、OPTCONTROLCENTRE和GPOPS。需要注意的是上述所有最优控制软件程序都包含使用梯度方法求解NLP。以较非正式的方式启发式方法也被用于求解最优控制问题。例如文献175、176中考虑了使用遗传算法的行星际轨迹优化问题而文献177和178中研究了使用遗传算法的低推力轨道转移。此外变分法技术与遗传算法一起被用于优化火星样品返回任务的低推力火星到地球轨迹。因此虽然梯度方法是最优控制的事实标准但上述研究表明遗传算法可能非常适合某些应用。**方法选择**选择求解最优控制问题的方法主要取决于要解决的问题类型和可以投入编码的时间。间接打靶法的优点是易于理解并且在收敛时产生高精度的解。不幸的是对于广泛的问题范围打靶法存在数值问题文献12中的以下引文优雅地总结了这一点 这些方法的主要困难在于起步即找到一端未指定条件的第一个估计值使其产生与另一端指定条件相当接近的解。这种特殊困难的原因是极值解往往对边界条件的小变化非常敏感……由于系统方程和欧拉-拉格朗日方程是耦合在一起的用猜测不佳的初始条件进行数值积分产生状态空间中的 wild 轨迹并不罕见。这些轨迹可能如此 wild以至于x(t)和/或λ(t)的值超出计算机的数值范围虽然上述引文指出了间接打靶法对未知边界条件极其敏感这一事实但它没有提到间接打靶的另一个或许更重要的缺点间接打靶需要推导最优控制问题的一阶最优性条件[见公式(55)-(60)]虽然对于简单问题可能可以推导出一阶最优性条件但对于复杂的最优控制问题推导这些条件是繁琐的、容易出错的有时是不可能的例如带有查表的问题。此外推导最优性条件的需要使得在通用软件程序中实现间接打靶变得困难。例如如果需要推导一阶最优性条件像POST这样的程序将几乎无法使用因为每个新问题都需要推导这些条件多重打靶法克服了一些标准打靶的数值困难但无法避免必须推导最优性条件的问题。直接法的精度和鲁棒性高度取决于所使用的直接法的形式。对于控制可以用简单方式参数化的问题例如时间的分段线性函数并且可以用少量优化参数准确表征的问题直接打靶法非常好。像POST这样的软件程序在运载火箭上升轨迹上表现良好因为这些问题可以用简单的控制参数化准确近似。随着问题复杂性的增加越来越明显的是求解最优控制问题的主力是直接配点法。直接配点法效果如此好的两个主要原因是高度复杂的问题可以用当今的NLP求解器来建立和求解。NLP求解器能够处理如此复杂的问题的原因是它们被设计为在初始猜测较差时也能收敛例如状态和控制中的直线猜测并且由于利用了约束和目标函数中导数的稀疏性计算效率极高。事实上SOCS软件的一个优点是SPRNLPSOCS中使用的NLP求解器利用了二阶导数的稀疏性。因此当SPRNLP处于NLP最小化解的邻域时它将以二次速率收敛二阶导数信息如果可用也被NLP求解器BARNLP、KNITRO和IPOPT使用。在许多情况下最优控制问题的求解是一种达到目的的手段即用户不想知道关于方法的所有细节而只是想使用软件程序提供结果以便能够解决感兴趣的特定问题。如果一个人不想成为与最优控制相关技术的专家建议获取一个封装好的软件包允许用户以直观的方式输入问题。然后软件可以简单地在感兴趣的问题上运行。然而始终重要的是要理解当出现问题时封装软件可能会有问题因为用户可能经常不理解原因。**结论**本文给出了求解最优控制问题的数值方法综述。求解最优控制问题的问题被分解为三个关键组成部分求解微分方程和积分函数、求解非线性优化问题以及求解非线性代数方程组。使用这些组成部分描述了求解最优控制问题的间接法和直接法两类方法。随后讨论了重要的计算问题并描述了几种不同的求解最优控制问题的软件工具。最后简要讨论了如何选择方法。文献2轨迹优化简介如何实现您自己的直接配点法摘要。本文是一篇关于数值轨迹优化的入门教程重点介绍直接配点法。这些方法相对简单易懂能够有效解决各种轨迹优化问题。在整篇论文中我们通过一系列四个示例问题来说明每一组新概念。我们首先使用梯形配点法求解一个简单的一维玩具问题然后逐步深入到使用Hermite-Simpson配点法计算双足行走机器人的最优步态。在此过程中我们涵盖了基本的调试策略和构建良好优化问题的指导原则。论文最后简要概述了其他轨迹优化方法。我们的主要目标是为读者提供必要的资源以理解并成功实现他们自己的直接配点法。关键词。轨迹优化最优控制直接配点法教程直接转录法机器人第二部分——运行结果部分代码%% OPTIMIZER N 250; % number of control intervals opti casadi.Opti(); % Optimization problem %% q opti.variable(2, N1); dq opti.variable(2, N1); ddq opti.variable(2, N1); tau opti.variable(2,N1); % control trajectory (throttle) q0 [0, 0]; qend [pi/4, -pi/3]; %% DINAMICA OK Kt 1; KT 0.01; T opti.variable(); J Kt*(tau(1)^2tau(2)^2)KT*T; opti.minimize(J); % race in minimal time dt T/N; % length of a control interval parameter [1.3,1.6;1000,850]; Max_torque 40000; for k 1:N % loop over control intervals ddq(:,k) B_f(parameter,q(:,k))\(tau(:,k) - G_f(parameter,q(:,k)) - C_f(parameter,q(:,k),dq(:,k))*dq(:,k)); dq_next dq(:,k) dt*ddq(:,k); opti.subject_to( dq(:,k1) dq_next); % close the gaps q_next q(:,k) dt*dq(:,k); opti.subject_to( q(:,k1) q_next); % close the gaps end %% BOUNDARIES opti.subject_to(T0); % Time must be positive opti.subject_to(q(1,N1) qend(1)); opti.subject_to(q(2,N1) qend(2)); % opti.subject_to(-Max_torque tau(1) Max_torque); % opti.subject_to(-Max_torque tau(2) Max_torque); %% INIT COND opti.set_initial(T, 1); opti.subject_to(q(1,1) q0(1)); % start at position 0 ... opti.subject_to(q(2,1) q0(2)); % start at position 0 ... % opti.subject_to(tau(1) 0); % start at position 0 ... % opti.subject_to(tau(2) 0); % ... from stand-still %% % ---- solve NLP ------ opti.solver(ipopt); % set numerical backend sol opti.solve(); % actual solve %% t linspace(0,sol.value(T),N1); q1_sol sol.value(q(1,:))*180/pi; q2_sol sol.value(q(2,:))*180/pi; figure hold on plot(t,sol.value(q)*180/pi); legend(q1,q2); title(angular position); grid on; hold off figure hold on plot(t,sol.value(tau)); legend(tau1,tau2); title(tau) grid on; hold off q_plot_end sol.value(q(:,end)); q_plot_begin sol.value(q(:,1)); plot_joint(parameter,q_plot_end) plot_joint(parameter,q_plot_begin)第三部分——参考文献文章中一些内容引自网络会注明出处或引用为参考文献难免有未尽之处如有不妥请随时联系删除。(文章内容仅供参考具体效果以运行结果为准)第四部分——本文完整资源下载资料获取更多粉丝福利MATLAB|Simulink|Python|数据|文档等完整资源获取