基于PID-bang-bang控制算法的卫星姿态控制matlab仿真

2024-02-24 03:12

本文主要是介绍基于PID-bang-bang控制算法的卫星姿态控制matlab仿真,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

1.课题概述

2.系统仿真结果

3.核心程序与模型

4.系统原理简介

5.完整工程文件


1.课题概述

       基于PID-bang-bang控制算法的卫星姿态控制。仿真输出控制器的控制收敛曲线,卫星姿态调整过程的动画。

2.系统仿真结果

3.核心程序与模型

版本:MATLAB2022a

...........................................................%动画绘制部分if mod(t(i),3/Fcycle) < Tglobal  % 每隔一段时间绘制一次图形(降低绘图频率以提高效率)  % 计算卫星位置[x_sat, y_sat]            = func_satellite(x(1,i),Len1,Len2); % 计算推力向量位置[x1_th,y1_th,x2_th,y2_th] = func_thrust(u(i),x(1,i),Len1,Len2,Len3,Len4); figure(1); % 创建或激活图形窗口1  subplot(2,2,[1,3]); % 在2x2的子图布局中选择第1和第3个位置进行绘图  fill(x_sat,y_sat,'g'); % 绘制卫星位置(绿色填充)  hold on; % 保持当前图形,以便在同一张图上绘制更多内容  fill(r*cos(0:.1:2*pi),r*sin(0:.1:2*pi),'b'); % 绘制一个蓝色的圆(可能是表示卫星轨迹或参考圆)  fill(x1_th,y1_th,'r'); % 绘制推力向量的起点(红色填充)  fill(x2_th,y2_th,'r'); % 绘制推力向量的终点(红色填充)  hold off; % 释放当前图形,不再在同一张图上绘制更多内容  pbaspect([1 1 1]); % 设置绘图区域的宽高比和深度比为1:1:1,确保图形不会变形  axis([-4 4 -4 4]); % 设置坐标轴范围  subplot(2,2,2); % 在2x2的子图布局中选择第2个位置进行绘图  plot(t(1:i),x(1,1:i),'-b',... % 绘制角度随时间变化的曲线(蓝色实线)  'LineWidth',1,... % 设置线宽为1  'MarkerSize',6,... % 设置标记点大小为6  'MarkerEdgeColor','k',... % 设置标记点边缘颜色为黑色  'MarkerFaceColor',[0.9,0.0,0.0]); % 设置标记点填充颜色为红色(但这里实际上并不会显示标记点,因为plot函数没有添加标记点的选项)  hold on; % 保持当前图形,以便在同一张图上绘制更多内容  plot(t(1:i),x(2,1:i),'-r',... % 绘制角度速率随时间变化的曲线(红色实线)(注意:这里应该使用新的变量或不同的线型来区分两条曲线)  'LineWidth',1,... % 设置线宽为1(与上一条曲线相同,可能会覆盖)  'MarkerSize',6,... % 设置标记点大小为6(同上)  'MarkerEdgeColor','k',... % 设置标记点边缘颜色为黑色(同上)  'MarkerFaceColor',[0.9,0.9,0.0]); % 设置标记点填充颜色为黄色(同上)(但这里实际上并不会显示标记点)  title('状态'); % 设置子图标题为“状态”  legend('角度','角度速率'); % 添加图例,说明两条曲线分别代表什么  xlim([0 SimuTime]); % 设置x轴范围(时间范围)  ylim([-1.5 1.5]); % 设置y轴范围(角度和角度速率范围)(注意:这个范围可能不适合角度速率的显示)  subplot(2,2,4); % 在2x2的子图布局中选择第4个位置进行绘图(但实际上这里应该是第3个位置,因为上面只用了两个位置)  plot(t(1:i),u(1:i)); % 绘制控制器输出随时间变化的曲线  title('控制器输出'); % 设置子图标题为“控制器输出”  xlim([0 SimuTime]); % 设置x轴范围(时间范围)  ylim([-1.1 1.1]); % 设置y轴范围(控制器输出范围)  xlabel('时间'); % 设置x轴标签为“时间”  end  % 积分累积(注意:这里可能有一个逻辑错误,因为每次循环都在累积误差,但没有在pwm更新时刻重置或调整累积值)  Errsum = Errsum + Ref_pos - x(1,i); % 累积位置误差(但这里实际上是在累积位置误差的差值)  % 状态传播(更新下一个时刻的状态)  x(:,i+1) = x(:,i) + (Astate*x(:,i) + Bstate*u(i))/Fcycle; % 使用离散时间状态空间方程更新状态(但这里可能存在数组越界问题,因为当i=end时,x(:,i+1)会超出数组范围)  i = i + 1; % 循环计数器加1(但这里实际上存在一个问题:当i=end时,上面的代码会导致数组越界错误)  end
33

4.系统原理简介

       PID(比例-积分-微分)控制器是一种广泛使用的控制算法,它通过计算误差信号的比例、积分和微分项来调整系统的输出,以减小误差并达到期望的控制目标。Bang-Bang控制则是一种简单的双模态控制策略,其中控制器输出在两个极值之间切换,通常用于实现快速响应。

        在卫星姿态控制中,PID-Bang-Bang控制算法可能结合了两者的特点:当误差较大时,采用Bang-Bang控制以快速减小误差;当误差较小时,切换到PID控制以实现更精细的调整。在卫星姿态控制系统中,PID控制器(比例-积分-微分控制器)与bang-bang控制结合使用,能够有效克服单一控制策略的局限性,实现对卫星姿态的精确、快速调节。

  1. PID控制器: 基于误差(e(t))进行工作,误差为期望姿态角(θ_d)与实际姿态角(θ)之差,即 e(t) = θ_d - θ。PID控制器输出(u(t))由以下三部分组成:

    u(t) = K_p * e(t) + K_i * ∫e(t)dt + K_d * de(t)/dt

    其中:

    • K_p是比例增益,它直接影响系统对当前误差的响应速度。
    • K_i是积分增益,用于消除稳态误差,防止误差累积。
    • K_d是微分增益,通过预测未来误差变化趋势,提高系统的动态性能和稳定性。
  2. Bang-Bang控制: Bang-Bang控制是一种开关型控制策略,其输出要么是最大值U_max,要么是最小值U_min,取决于当前误差是否超出设定的阈值。在卫星姿态控制中,当卫星姿态偏差超出预定范围时,bang-bang控制器会立即输出最大或最小控制力矩,以尽快纠正姿态。

  3. PID-bang-bang混合控制: 在实际应用中,PID控制可提供连续且平滑的控制输出,但可能在某些极端条件下反应不足;而bang-bang控制虽然反应迅速,但易导致系统震荡。因此,将两者结合,通常会在正常状态下采用PID控制,而在姿态偏差过大、需要快速响应时切换至bang-bang控制。

       综合以上,PID-bang-bang混合控制的具体实施可能是:当卫星姿态误差e(t)在一定范围内时,采用PID控制输出u_PID(t);当误差超出预设阈值时,则切换为bang-bang控制,输出u_BB(t)。这样既能保证姿态控制的稳定性和精确性,又能应对突发的大偏差情况,实现对卫星姿态的有效控制。

5.完整工程文件

v

v

这篇关于基于PID-bang-bang控制算法的卫星姿态控制matlab仿真的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/740775

相关文章

基于UE5和ROS2的激光雷达+深度RGBD相机小车的仿真指南(五):Blender锥桶建模

前言 本系列教程旨在使用UE5配置一个具备激光雷达+深度摄像机的仿真小车,并使用通过跨平台的方式进行ROS2和UE5仿真的通讯,达到小车自主导航的目的。本教程默认有ROS2导航及其gazebo仿真相关方面基础,Nav2相关的学习教程可以参考本人的其他博客Nav2代价地图实现和原理–Nav2源码解读之CostMap2D(上)-CSDN博客往期教程: 第一期:基于UE5和ROS2的激光雷达+深度RG

三相直流无刷电机(BLDC)控制算法实现:BLDC有感启动算法思路分析

一枚从事路径规划算法、运动控制算法、BLDC/FOC电机控制算法、工控、物联网工程师,爱吃土豆。如有需要技术交流或者需要方案帮助、需求:以下为联系方式—V 方案1:通过霍尔传感器IO中断触发换相 1.1 整体执行思路 霍尔传感器U、V、W三相通过IO+EXIT中断的方式进行霍尔传感器数据的读取。将IO口配置为上升沿+下降沿中断触发的方式。当霍尔传感器信号发生发生信号的变化就会触发中断在中断

matlab读取NC文件(含group)

matlab读取NC文件(含group): NC文件数据结构: 代码: % 打开 NetCDF 文件filename = 'your_file.nc'; % 替换为你的文件名% 使用 netcdf.open 函数打开文件ncid = netcdf.open(filename, 'NC_NOWRITE');% 查看文件中的组% 假设我们想读取名为 "group1" 的组groupName

利用matlab bar函数绘制较为复杂的柱状图,并在图中进行适当标注

示例代码和结果如下:小疑问:如何自动选择合适的坐标位置对柱状图的数值大小进行标注?😂 clear; close all;x = 1:3;aa=[28.6321521955954 26.2453660695847 21.69102348512086.93747104431360 6.25442246899816 3.342835958564245.51365061796319 4.87

C# double[] 和Matlab数组MWArray[]转换

C# double[] 转换成MWArray[], 直接赋值就行             MWNumericArray[] ma = new MWNumericArray[4];             double[] dT = new double[] { 0 };             double[] dT1 = new double[] { 0,2 };

perl的学习记录——仿真regression

1 记录的背景 之前只知道有这个强大语言的存在,但一直侥幸自己应该不会用到它,所以一直没有开始学习。然而人生这么长,怎就确定自己不会用到呢? 这次要搭建一个可以自动跑完所有case并且打印每个case的pass信息到指定的文件中。从而减轻手动跑仿真,手动查看log信息的重复无效低质量的操作。下面简单记录下自己的思路并贴出自己的代码,方便自己以后使用和修正。 2 思路整理 作为一个IC d

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《考虑燃料电池和电解槽虚拟惯量支撑的电力系统优化调度方法》

本专栏栏目提供文章与程序复现思路,具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源程序擅长文章解读,论文与完整源程序,等方面的知识,电网论文源程序关注python

libsvm在matlab中的使用方法

原文地址:libsvm在matlab中的使用方法 作者: lwenqu_8lbsk 前段时间,gyp326曾在论坛里问libsvm如何在matlab中使用,我还奇怪,认为libsvm是C的程序,应该不能。没想到今天又有人问道,难道matlab真的能运行libsvm。我到官方网站看了下,原来,真的提供了matlab的使用接口。 接口下载在: http://www.csie.ntu.edu.

Matlab/Simulink中PMSM模型的反电动势系数和转矩系数

Matlab/Simulink中PMSM模型的反电动势系数和转矩系数_matlab pmsm-CSDN博客

MATLAB层次聚类分析法

转自:http://blog.163.com/lxg_1123@126/blog/static/74841406201022774051963/ 层次聚类是基于距离的聚类方法,MATLAB中通过pdist、linkage、dendrogram、cluster等函数来完成。层次聚类的过程可以分这么几步: (1) 确定对象(实际上就是数据集中的每个数据点)之间的相似性,实际上就是定义一个表征