Python、STK、MATLAB的连接和使用

news2024/11/25 19:47:08

写在前面

预备知识:

Python通过命令行调用MATLAB的简单实现。这篇文章讲明了如何使用 Python 调用 MATLAB 的原理和过程,并给出相应代码。

STK、MATLAB、SQL的连接和使用。这篇文章讲明了STK 11.2、MATLAB 2014a、SQL 2019的安装过程,以及互联过程,并给出相应代码。

本文在上面两篇文章的基础上,讲解如何使用 Python 驱动 STK。

实际上要通过MATLAB作为媒介,即先使用 Python 驱动 MATLAB,MATLAB 驱动 STK,这样间接地实现 Python 驱动 STK。

本文所使用软件版本如下:

  • Python:3.9.12
  • STK:11.6
  • MATLAB:2018b

本文所测试硬件版本如下:

  • 系统:Win 11
  • CPU:AMD Ryzen 7 6800H
  • GPU:AMD Radeon™ Graphics

安装和连接

STK、MATLAB、SQL的连接和使用里用的是 STK 11.2 和 MATLAB 2014a,于今而言版本过老,因此更换了新版本的 STK 和 MATLAB,并在本文作者硬件上做相应测试,可以跑通。

因为 STK 11.2 最高只支持 MATLAB 2016 的连接,因此本文将 STK 升级为 STK 11.6 版本。

请注意:先安装 MATLAB 2018b,再安装 STK 11.6。

假如电脑里面没有 MATLAB 2018b 而先安装 STK 11.6 的话,STK 会认为你没有安装 MATLAB,于是不会自动设置与 MATLAB 的连接。所以一定要先安装 MATLAB,再安装 STK 11.6。如果真的先安装了 STK,再安装了 MATLAB 的话,可以下载一个[MATLAB Connectors 1.011](https://luwin1127.github.io/assets/download/files-2023-07-10/MATLAB Connectors v1.011.zip)。坦诚地讲,但这样的安装方式我没有实际测试过,结果未知。如果有效的话,欢迎通过邮件告知我,提前谢谢你。

两个软件的安装教程如下:

MATLAB 2018b的安装教程请见(https://luwin1127.github.io/assets/download/files-2023-07-10/MATLAB R2018b Win64 Crack.zip)。

STK的安装教程请见(https://luwin1127.github.io/assets/download/files-2023-07-10/Install manusrcipt of STK 11.6.pdf)。

两个软件安装好之后,打开MATLAB 2018b的“设置路径”,会看见导入3个关于STK的文件夹,分别是:

  • C\Program Files\AGI\STK 11\bin
  • C\Program Files\AGI\STK 11\bin\Matlab
  • C:\ProgramData\AGI\STK MATLAB

请将C:\ProgramData\AGI\STK MATLAB文件夹在路径中删除。经过测试发现,如若将此文件夹导入至 MATLAB 路径中,将会出现 MATLAB Command 窗口中无法正常退出的 Bug。

同样地,如果有其他解决方法的话,欢迎通过邮件告知我,提前谢谢你。

使用

将Python IDE、MATLAB 2018b 和 STK 11.6 打开,输入如下代码。

Python代码

下面是Python代码。

import os

# 运行 .m 文件
os.system("matlab -nojvm -nosplash -r \"cd D:\opps\Desktop\;matlab_to_stk;\";quit")

上面的代码虽然只有两行,但十分够用,也说明了Python的简洁美丽。

import os 代表导入 os 包。

os.system("matlab -nojvm -nosplash -r \"cd D:\opps\Desktop\;matlab_to_stk;\";quit") 中,每一条指令都值得单独说明:

  • matlab:调用 MATLAB 引擎;
  • -nojvm:调用 MATLAB 命令窗口,但不显示 MATLAB 界面元素(例如工作空间、脚本界面等),可减少内存消耗;
  • -nosplash:调用 MATLAB 时不显示版权页,这样显得清爽;
  • -r \"cd D:\opps\Desktop\;matlab_to_stk;\";-r 为执行 MATLAB 命令;\" 为使用双引号;cd D:\opps\Desktop\; 是将 MATLAB 的路径设置在 D:\opps\Desktop\ 下,可以设置为其他路径,根据用户把 matlab_to_stk.m 文件放的位置不同而不同;matlab_to_stk; 为执行 matlab_to_stk.m 文件;quit 为程序结束后关闭 MATLAB 命令窗口。

这样,就可以成功调用 matlab_to_stk.m 文件了。

MATLAB

下面是 MATLAB 的代码。

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% 功能说明:MATLAB与STK互联
% 作者:
% 版本:v1.0
% 时间:2023/7/10
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%% 1.初始化需要的接口函数
stkInit;                                % 建立连接
remMachine = stkDefaultHost;
conid = stkOpen(remMachine);            % 得到连接句柄(用于发送指令)
% 判断场景是否存在
scen_open = stkValidScen;
if scen_open == 1
    rtn = questdlg('Close the current scenario?');
    if ~strcmp(rtn,'Yes')
        stkClose(conid);
        return;
    else
        stkUnload('/*');
    end
end

%% 2.建立场景、航天器和观测站
% 建立场景
disp('创建场景中......');
disp('-------------------------');
stkNewObj('/','Scenario','TestScenario');

% 设定场景时间
disp('设定场景时间......');
disp('-------------------------');
% 设定场景开始时间
% startDate = '27'; startMonth = 'Nov'; startYear = '2019';
% startHour = '00'; startMin = '00';     startSec = '00.000';
% strStartTime = strcat(startDate,32,startMonth,32,startYear,32,startHour,':',startMin,':',startSec);% 逗号之间的“32”代表“空格”之意
strStartTime = '27 Nov 2019 00:00:00.000';

% 设定场景结束时间
% stopDate = '27'; stopMonth = 'Nov'; stopYear = '2019';
% stopHour = '02'; stopMin = '00'; stopSec = '00.000';
% strEndTime = strcat(stopDate,32,stopMonth,32,stopYear,32,stopHour,':',stopMin,':',stopSec);% 逗号之间的“32”代表“空格”之意
strEndTime = '28 Nov 2019 02:00:00.000';
stkSetTimePeriod(strStartTime,strEndTime,'GREGUTC');
stkSetEpoch(strStartTime,'GREGUTC');
stkSyncEpoch;

% 设定场景动画开始时间
strQuteBegTime = ['"' strStartTime '"']; % 时间写入命令是得加双引号,比较刻板
rtn = stkConnect(conid,'Animate','Scenario/TestScenario',['SetValues ' strQuteBegTime ' 10 0.1']);
% 下面这个用来参考格式
% rtn = stkConnect(conid,'Animate','Scenario/TestScenario','SetValues "27 May 2019 06:14:00.000" 60 0.1');
% 设定动画时间回到起始点
rtn = stkConnect(conid,'Animate','Scenario/TestScenario','Reset');

% 建立航天器
disp('建立航天器......');
disp('-------------------------');
stkNewObj('*/','Satellite','AoXiangI');

%% 3.设定星座中各卫星的属性
%--------------------------------------------------------------%
%               注意:这里的单位都是弧度(rad)
%                     千万别用错单位!
%--------------------------------------------------------------%
disp('仿真运行中......');
disp('-------------------------');
rtn = stkConnect(conid,'Animate','Scenario/TestScenario','Start End');
d2r = pi/180;
% 卫星积分起止时间、轨道历元时间、步长
t_start=0; t_stop=2*60*60; orbitEpoch=t_start; dt=10;
tSimu = t_start+1:t_stop/dt;
% 卫星初始轨道根数
a = 6928.137*1000;  e = 0.0; i = 53.0*d2r;
w = 0*pi/180; Raan = 160*pi/180; M = 0*d2r;

% 设置卫星轨道属性
stkSetPropClassical('*/Satellite/AoXiangI','J2Perturbation','J2000',t_start,t_stop,dt,orbitEpoch,a,e,i,w,Raan,M);
% 设置卫星姿态属性(下面写的这个是错的)
Qua = [sqrt(2)/2;0;0;sqrt(2)/2];  QuaMat = repmat(Qua,1,length(tSimu));
stkSetAttitudeCBI('*/Satellite/AoXiangI','AoXiangI',tSimu,QuaMat);

tic;
global satPos satVel
satPos = zeros(t_stop/dt,3);
satVel = zeros(t_stop/dt,3);
time   = zeros(1,t_stop/dt);
k = 1;
for t = 1:dt:t_stop
    [satPos1,satVel1] = stkPosVelCBI('*/Satellite/AoXiangI',t);
    satPos(k,:) = satPos1;
    satVel(k,:) = satVel1;
    k = k+1;
end
toc;

% 保存数据至csv中
col_str = {'sat_pos_x','sat_pos_y','sat_pos_z','sat_vel_x','sat_vel_y','sat_vel_z'};
res_table = table(satPos(:,1),satPos(:,2),satPos(:,3),satVel(:,1),satVel(:,2),satVel(:,1),'VariableNames',col_str);
writetable(res_table, 'satellite_data.csv');
stkClose(conid);

结果

最后,就可以得到下图所示结果。

在这里插入图片描述

容易出错的地方

1、设备有多个 MATLAB

当设备上有多个 MATLAB 版本时,比如有 MATLAB 2014a 和 MATLAB 2018b,STK 11.6 与 MATLAB 2018b 连接上可以正常使用,但使用命令行调用 MATLAB 引擎会出现没有连接上 STK 的问题。因为系统路径里默认是另一个版本的 MATLAB,调用 MATLAB 引擎时默认调用另一个版本的 MATLAB,而另一个版本的 MATLAB 没有与 STK 连接,所以无法正常使用。

解决方法是设置系统的路径变量,将与 STK 连接上的 MATLAB 加入系统路径变量中。

2、运行 .m 文件没有反应或报错

一定记得先打开 STK 11.6,再运行 MATLAB 程序。

最后

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

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

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

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

相关文章

超越99%的程序员,chatgpt用C++写个线程安全无锁环形队列

​肝了一个周末,我们一起来欣赏chatgpt写的代码吧。让其用C为我们写一个线程安全的环形队列,并逐步提出一些需求。 先看带锁的实现。 带锁版本 我对chatgpt的需求是: 用C实现线程安全的环形队列,提供代码注释,以及g…

Meetup 报名|07.22 StarRocks Friends 与你相约广州

夏日炎炎,经历了杭州和上海两站的成功活动后,社区开发者的热情依旧如火如荼!在更加炽热的七月,我们即将迎来 StarRocks & Friends 的第三站--广州! 社区依旧秉持连接 StarRocks 社区专家与用户共同探讨大数据领域…

MySQL数据库 - 基本数据类型

目录 一、数据类型分类 二、数据类型 1、tinyint 类型 有符号 tinyint 范围测试 无符号 tinyint 范围测试 2、bit 类型 3、float 类型 有符号 float 范围测试 无符号 float 范围测试 4、decimal 类型 5、char 类型 6、varchar 类型 7、日期类型 8、enum类型、set类型…

Codeforces Round 739 (Div. 3)

A.Dislike of Threes AC代码&#xff1a; #include<iostream> #include<algorithm> #include<cstring> using namespace std; const int N2e510; int f[N]; int cnt; int main() {for(int i1;;i){if(i%3!0&&i%10!3) f[cnt]i;if(cnt>1000) break…

第一阶段-第六章 Python的数据容器

目录 一、数据容器入门  1.学习目标  2.为什么要学习数据容器  3.什么是数据容器  4.本小节的总结 二、数据容器&#xff1a;list&#xff08;列表&#xff09;  2.1列表的定义  1.学习目标  2.为什么需要列表  3.列表的定义  4.本节的代码演示  5.本小节的…

【Java练习题汇总】《第一行代码JAVA》面向对象基础篇,汇总Java练习题——面向对象:特性、类与对象、数组、String、内部类... ~

Java练习题 面向对象基础篇 1️⃣ 面向对象基础篇 1️⃣ 面向对象基础篇 一、填空题 面向对象的三大特征&#xff1a;_______ 、_______ 、_______。类由_______和_______组成。运算符_______的作用是根据对象的类型分配内存空间。当对象拥有内存空间时&#xff0c;会自动调…

oceanbase基础

与mysql对比 分布式一致性算法 paxos 存储结构&#xff08;引擎&#xff09;用的是两级的 数据库自动分片功能&#xff0c;提供独立的obproxy路由写入查询等操作到对应的分片 多租户 方便扩展 存储层 http://www.hzhcontrols.com/new-1391864.html LSM tree&#xff0c;is very…

CnOCR 使用教程

目录 一、 简介二、使用教程三、效果展示 一、 简介 CnOCR 是 Python 3 下的文字识别&#xff08;Optical Character Recognition&#xff0c;简称OCR&#xff09;工具包&#xff0c;支持简体中文、繁体中文&#xff08;部分模型&#xff09;、英文和数字的常见字符识别&#…

[COCI2010-2011#6]STEP

目录 1.题目&#xff1a; 题目描述 输入格式 输出格式 2.思路 1.ans数组的维护 2.L and R 的维护 3.ne数组与pr数组的维护 4.len数组&#xff1a; 3.代码&#xff1a; 1.有注释版&#xff1a; 2.copy版&#xff1a; 1.题目&#xff1a; 题目描述 给定一个长度为N的…

Java设计模式-责任链(Chain of Responsibility)模式

介绍 Java责任链&#xff08;Chain of Responsibility&#xff09;设计模式是指很多处理对象构成一个链&#xff0c;链中前一个对象指向后一个对象。请求在链中传递&#xff0c;一个请求可以被一个或者多个对象处理。调用方&#xff08;即客户端&#xff09;不知道请求会被链中…

【UniApp开发小程序】项目创建+整合UI组件(FirstUI和uView)

创建项目 下图为初始化的项目的文件结构 引入组件 俗话说&#xff1a;“工欲善其事&#xff0c;必先利其器”&#xff0c;为了更加方便地开发出页面较为美观的小程序&#xff0c;我们先引入成熟的UI组件&#xff0c;再开始开发之旅。&#xff08;如果你是前端高手&#xff0…

ardupilot IMU陀螺仪方向的重要性

目录 文章目录 目录摘要1.简介---BMI088 方向2.控制摘要 本节主要记录IMU陀螺仪方向的重要性,欢迎批评指正!!! 1.简介—BMI088 方向 注意这个BMI088 的IMU方向,特别是是那个左上角的黑色点点,他的坐标系满足右手坐标系,但是我们无人机坐标系是北东地坐标系,因此需要把…

Cobalt Strike实战实例

客户端 初始化界面如下&#xff1a; 可以多个客户端同时连接&#xff0c;可以聊天。 msg 指定id 文字。 msg 文字。 创建监听器 这里出现了&#xff0c;监听设置不成功。原因是服务端的CS4.0报错了。我重新下载就可以了。如果这里有问题&#xff0c;可联系我。我帮你。这里解…

python+requests接口自动化测试

原来的web页面功能测试转变成接口测试&#xff0c;之前大多都是手工进行&#xff0c;利用postman和jmeter进行的接口测试&#xff0c;后来&#xff0c;组内有人讲原先web自动化的测试框架移驾成接口的自动化框架&#xff0c;使用的是java语言&#xff0c;但对于一个学java&…

Feign远程调用组件

Feign Feign是Netfix开发的一个轻量级REstFul的HTTP服务客户端,是以java接口注解的方式调用HTTP请求,而不用像java中通过封装HTTP请求报文的方式直接调用,可以帮助我们更加便捷,优雅的调用HTTP API Feign RestTemplate Ribbon Hystrix 本质:封装了HTTP调用流…

JAVA (static) 简述

前言&#xff1a; 在力扣上提交代码&#xff0c;发现用static定义变量&#xff0c;和不用static修饰变量&#xff0c;虽然每次运行的结果都一样&#xff0c;但是提交的结果却有通过与不通过两种情况。 测试题目&#xff1a;组合&#xff08;力扣&#xff09;dfs 回溯 剪枝 JA…

Redis数据结构 — List

目录 链表结构设计 ​编辑链表节点结构设计 链表的优势与缺陷 Redis 的 List 对象的底层实现之一就是链表。C 语言本身没有链表这个数据结构的&#xff0c;所以 Redis 自己设计了一个链表数据结构。 链表结构设计 typedef struct list {//链表头节点listNode *head;//链表尾…

【Matlab】智能优化算法_流向算法FDA

【Matlab】智能优化算法_流向算法FDA 1.背景介绍2.数学模型3.文件结构4.算法流程图5.详细代码及注释5.1 FDA.m5.2 initialization.m5.3 main.m5.4 Select_Functions.m 6.运行结果7.参考文献 1.背景介绍 在流域中&#xff0c;过量或有效降雨量是指流过地表且未渗入土壤的降雨量。…

使用可视化数据库工具 DBeaver

新建一个名为 test 的数据库&#xff1a;右击数据库点击新增&#xff0c;然后创建一张 test &#xff0c;utf8mb4 字符的&#xff0c;点击确定 在 test 数据库下新建一张数据表&#xff0c;如下所示&#xff1a;右击表&#xff0c;然后点击新建表 鼠标放列上面&#xff0c;右键…

安全狗重磅发布数据资产梳理系统

今年6月&#xff0c;浙江某科技有限公司因违反《中华人民共和国数据安全法》第四十五条及相关规定&#xff0c;公司及项目主管人员、直接责任人员分别罚款100万元、8万元、6万元。这也是《数据安全法》开始运行以来的首例“高额罚单”案件。实际上&#xff0c;这也给我国众多行…