GPOPS-II教程(5): 月球探测器着陆最优控制问题

文章目录

  • 问题描述
  • GPOPS代码
    • `main function`
    • `continuous function`
    • `endpoint function`
    • 仿真结果
  • 最后

问题描述

参考文献:[1] Meditch J. On the problem of optimal thrust programming for a lunar soft landing[J]. IEEE Transactions on Automatic Control, 1964, 9(4): 477-484.

考虑一类月球探测器着陆最优控制问题, x x x为月球探测器与月心的矢径,其动力学方程为

{ x ¨ = − k d d t ( ln ⁡ m ) − g , x ˙ = − k ln ⁡ m ( t ) m ( 0 ) − g t + x ( 0 ) . \left \{ \begin{aligned} \ddot x &= - k \frac{\text{d}}{\text{d}t}(\ln \ m) - g,\\ \dot x & = -k \ln{\frac{m(t)}{m(0)}} - g t + x(0). \end{aligned}\right. x¨x˙=kdtd(ln m)g,=klnm(0)m(t)gt+x(0).

x 1 = h x_1 = h x1=h x 2 = v x_2 = v x2=v x 3 = m x_3=m x3=m,可以得到

x ˙ 1 = v , x ˙ 2 = − k x 3 u − g , x ˙ 3 = m , u = m ˙ . \dot x_1 = v,\quad \dot x_2 = -\frac{k}{x_3}u-g,\quad \dot x_3=m,\quad u = \dot m. x˙1=v,x˙2=x3kug,x˙3=m,u=m˙.

性能指标如下:

J = ∫ t 0 t f m ˙ ( t ) d t = m ( 0 ) − m ( t f ) J = \int_{t_0}^{t_f} \dot m(t) \text{d}t = m(0) - m(t_f) J=t0tfm˙(t)dt=m(0)m(tf)

化简之后,月球探测器落地动力学方程为

{ x ˙ 1 = v , x ˙ 2 = u − g . \left \{ \begin{aligned} \dot x_1 &= v,\\ \dot x_2 &= u - g. \end{aligned}\right. {x˙1x˙2=v,=ug.

化简之后的性能指标为

J = ∫ t 0 t f u d t J = \int_{t_0}^{t_f} u \text{d}t J=t0tfudt

GPOPS代码

main function

%% 01.初始参数设置
%-------------------------------------------------------------------------%
%----------------------- 设置问题的求解边界 ------------------------------%
%-------------------------------------------------------------------------%
% 设置时间边界
t0min = 0;
t0max = 0;
tfmin = 0;
tfmax = 10;% 设置状态初值
h0 = 10;
v0 = -2;
% 设置状态终值
hf = 0;
vf = 0;% 设置状态边界
hmin = 0;
hmax =  20;
vmin = -10;
vmax =  10;% 设置控制量边界
umin = 0;
umax = 3;% 月球重力常数
setup.auxdata.g = 1.6;
%% 02.边界条件设置
%-------------------------------------------------------------------------%
%------------------------ 将求解边界设置于问题中 -------------------------%
%-------------------------------------------------------------------------%
setup.bounds.phase.initialstate.lower = [h0, v0];
setup.bounds.phase.initialstate.upper = [h0, v0];
setup.bounds.phase.state.lower = [hmin, vmin];
setup.bounds.phase.state.upper = [hmax, vmax];
setup.bounds.phase.finalstate.lower = [hf, vf];
setup.bounds.phase.finalstate.upper = [hf, vf];
setup.bounds.phase.control.lower = umin;
setup.bounds.phase.control.upper = umax;
setup.bounds.phase.integral.lower = -100;
setup.bounds.phase.integral.upper = 100;
setup.bounds.phase.initialtime.lower = t0min;
setup.bounds.phase.initialtime.upper = t0max;
setup.bounds.phase.finaltime.lower = tfmin;
setup.bounds.phase.finaltime.upper = tfmax;%% 03.初值猜测
%-------------------------------------------------------------------------%
%------------------------------- 初值猜想 --------------------------------%
%-------------------------------------------------------------------------%
h_guess = [h0; hf];
v_guess = [v0; vf];
u_guess = [umin; umin];
t_guess = [t0min; 5];
setup.guess.phase.state   = [h_guess, v_guess];
setup.guess.phase.control = u_guess;
setup.guess.phase.time    = t_guess;
setup.guess.phase.integral = 10;%% 04.设置GPOPS求解器参数
%-------------------------------------------------------------------------%
%---------------------------- 设置求解器参数 -----------------------------%        
%-------------------------------------------------------------------------%
setup.name = 'Moon-Lander-OCP';
setup.functions.continuous  = @mlocpContinuous;
setup.functions.endpoint   	= @mlocpEndpoint;
setup.nlp.solver            = 'ipopt';
setup.derivatives.supplier  = 'sparseCD';
setup.derivatives.derivativelevel = 'second';
setup.mesh.method           = 'hp1';
setup.mesh.tolerance        = 1e-4;
setup.mesh.maxiteration     = 45;
setup.mesh.colpointsmax     = 4;
setup.mesh.colpointsmin     = 10;
setup.mesh.phase.fraction   = 0.1*ones(1,10);
setup.mesh.phase.colpoints  = 4*ones(1,10);
setup.method = 'RPMintegration';
% setup.method = 'RPMdifferentiation';%% 05.求解
%-------------------------------------------------------------------------%
%----------------------- 使用 GPOPS2 求解最优控制问题 --------------------%
%-------------------------------------------------------------------------%
tic;
output = gpops2(setup);
toc;%% 06.画图
solution = output.result.solution;% 状态量
figure('Color',[1,1,1]);
plot(solution.phase.time, solution.phase.state,'-x','LineWidth',1.5);
xlabel('Time',...'FontWeight','bold');
ylabel('State',...'FontWeight','bold');
legend('Altitude','Velocity')
set(gca,'FontName','Times New Roman',...'FontSize',15,...'LineWidth',1.3);
print -dpng moonlander_state.png% 控制量
figure('Color',[1,1,1]);
plot(solution.phase.time, solution.phase.control,'-o','LineWidth',1.5);
xlabel('Time',...'FontWeight','bold');
ylabel('Control',...'FontWeight','bold');
set(gca,'FontName','Times New Roman',...'FontSize',15,...'LineWidth',1.3);
print -dpng moonlander_control.png

continuous function

function phaseout = mlocpContinuous(input)g = input.auxdata.g;t = input.phase.time;h = input.phase.state(:,1);v = input.phase.state(:,2);u = input.phase.control(:,1);dh = v;dv = -g + u;phaseout.dynamics = [dh, dv];phaseout.integrand = u;
end

endpoint function

function output = mlocpEndpoint(input)J = input.phase.integral;output.objective = J;
end

仿真结果

状态量:

在这里插入图片描述

控制量

在这里插入图片描述

最后

欢迎通过邮箱联系我:lordofdapanji@foxmail.com

来信请注明你的身份,否则恕不回信。

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

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

相关文章

Linux基础- 使用 Apache 服务部署静态网站

目录 零. 简介 一. linux安装Apache 二. 创建网页 三. window访问 修改了一下默认端口 到 8080 零. 简介 Apache 是世界使用排名第一的 Web 服务器软件。 它具有以下一些显著特点和优势: 开源免费:可以免费使用和修改,拥有庞大的社区支…

Web渗透:任意文件下载

任意文件下载漏洞(Arbitrary File Download Vulnerability)是一种常见的Web安全漏洞,它允许攻击者通过修改输入参数,从服务器下载任意文件,而不仅仅是预期的文件;通常这种漏洞出现在处理用户输入的地方&…

python CSSE7030

1 Introduction In this assignment, you will implement a (heavily) simplified version of the video game ”Into The Breach”. In this game players defend a set of civilian buildings from giant monsters. In order to achieve this goal, the player commands a s…

AI进阶指南第四课,大模型优缺点研究?

在上一篇文章中,我主要探讨了LM模型与企业级模型的融合。 但是,在文末对于具体的大模型优缺点只是简单地说明了一下,并不细致。 因此,在这一节,我将更为细致地说明一下大模型的优缺点。 一,隐私安全 将L…

2018年全国大学生数学建模竞赛A题高温服装设计(含word论文和源代码资源)

文章目录 一、部分题目二、部分论文三、部分Matlab源代码问题11 求解h1h22 已知h1h2求解温度分布 问题21 求解第二层最佳厚度 四、完整word版论文和源代码(两种获取方式) 一、部分题目 2018 年高教社杯全国大学生数学建模竞赛题目 A 题 高温作业专用服…

Linux C 程序 【02】创建线程

1.开发背景 上一个篇章,基于 RK3568 平台的基础上,运行了最简单的程序,然而我们使用了 Linux 系统,系统自带的多线程特性还是比较重要的,这个篇章主要描述线程的创建。 2.开发需求 设计实验: 创建一个线程…

入门JavaWeb之 JavaBean 实体类

JavaBean 有特定写法: 1.必须有一个无参构造 2.属性必须私有 3.必须有对应的 get/set 方法 一般用来和数据库的字段做映射 ORM:对象关系映射 表->类 字段->属性 行记录->对象 连接数据库 没有的话去 Settings -> Plugins 搜索 Data…

Vue-路由

路由简介 SPA单页面应用。导航区和展示区 单页Web应用整个应用只有一个完整的页面点击页面中的导航连接不会刷新页面,只会做页面的局部更新数据需要通过ajax请求获取 路由:路由就是一组映射关系,服务器接收到请求时,根据请求路…

[论文阅读笔记33] Matching Anything by Segmenting Anything (CVPR2024 highlight)

这篇文章借助SAM模型强大的泛化性,在任意域上进行任意的多目标跟踪,而无需任何额外的标注。 其核心思想就是在训练的过程中,利用strong augmentation对一张图片进行变换,然后用SAM分割出其中的对象,因此可以找到一组图…

k8s集群node节点加入失败

出现这种情况: [preflight] FYI: You can look at this config file with kubectl -n kube-system get cm kubeadm-config -o yaml [kubelet-start] Writing kubelet configuration to file "/var/lib/kubelet/config.yaml" [kubelet-start] Writing kub…

python 识别图片点击,设置坐标,离设置坐标越近的优先识别点击

import pyautogui import cv2 import numpy as np import mathdef find_and_click(template_path, target_x, target_y, match_threshold0.8):"""在屏幕上查找目标图片并点击。Args:template_path: 目标图片的路径。target_x: 预设的坐标 x 轴值。target_y: 预设…

OpenCV报错已解决:Vector析构异常OpencvAssert CrtlsValidHeapPointer

🎬 鸽芷咕:个人主页 🔥 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想,就是为了理想的生活! 引入 在使用OpenCV进行图像处理时,我们可能会遇到Vector析构异常OpencvAssert CrtlsValidHeapPointer的问题。本文将…

基于LMS自适应滤波的窄带信号宽带噪声去除(MATLAB R2021B)

数十年的研究极大的发展了自适应滤波理论,自适应滤波理论已经成为信号处理领域研究的热点之一。从理论上讲,自适应滤波问题没有唯一解。为了得到自适应滤波器及其应用系统,可以根据不同的优化准则推导出许多不同的自适应理论。目前该理论主要…

在eclipse中导入idea项目步骤

一、可以把其它项目的.project&#xff0c; .classpath文件拷贝过来&#xff0c;修改相应的地方则可。 1、.project文件只需要修改<name>xxx</name>这个项目名称则可 2、.classpath文件通常不用改&#xff0c; 二、右击 项目名 >选择“Properties”>选择 Re…

自动驾驶⻋辆环境感知:多传感器融合

目录 一、多传感器融合技术概述 二、基于传统方法的多传感器融合 三、基于深度学习的视觉和LiDAR的目标级融合 四、基于深度学习的视觉和LiDAR数据的前融合方法 概念介绍 同步和配准 时间同步 标定 摄像机内参标定&#xff08;使用OpenCV&#xff09; 摄像机与LiDAR外…

微软推出最新视觉基础模型Florence-2 可在浏览器运行

据微软官方消息&#xff0c;微软推出视觉基础模型Florence-2&#xff0c;该模型现已能够在支持WebGPU的浏览器中100%本地运行。Florence-2-base-ft是一个拥有2.3亿参数的视觉基础模型&#xff0c;采用基于提示的方法来处理广泛的视觉和视觉语言任务。 该模型支持多种功能&…

IDEA 插件推荐【一】

好使的插件可以让工作事倍功半。下面就推荐一些常用的IDEA插件&#xff0c;如果你有其他好使的插件&#xff0c;欢迎评论区留言分享出来~ 1.Key Promoter X Key Promoter X 插件&#xff0c;IDEA 快捷键提示工具。 在每次我们使用鼠标进行 IDEA 的某个操作&#xff0c;Key Pr…

lambda-map.merge

map.merge 结论: 1.当前传入的 key ,value biFunction 2.如果之前map不存在则直接put(当前key,当前value) 3.如果之前map已经有了,老value与 当前value 进入function处理后再 put(当前key,处理后的value)

IDEA使用Apidocx插件在RAP生成接口文档

第一步 安装插件&#xff0c;安装最新的1.1.7即可&#xff0c;插件与idea版本对照 第二步 输入对应的IP或域名&#xff0c;端口说明&#xff1a; 1. 38080&#xff1a;为后端数据 API 服务器&#xff08;rap2-delos&#xff09; 2. 3000&#xff1a;为前端静态资源服务&…

40岁学习java是否需要报班学习?

在开始前刚好我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「java的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“666”之后私信回复“666”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&#xff01;应该不需要。各种公开免费的…