Starlink卫星动力学系统仿真建模第十讲-基于SMC和四元数的卫星姿态控制示例及Python实现


基于四元数与滑模控制的卫星姿态控制


一、基本原理
1. 四元数姿态表示

在这里插入图片描述

四元数运动学方程:
在这里插入图片描述

3. 滑模控制设计

在这里插入图片描述


二、代码实现(Python)
1. 四元数运算工具
import numpy as npdef quat_mult(q1, q2):"""四元数乘法"""w1, x1, y1, z1 = q1w2, x2, y2, z2 = q2w = w1*w2 - x1*x2 - y1*y2 - z1*z2x = w1*x2 + x1*w2 + y1*z2 - z1*y2y = w1*y2 - x1*z2 + y1*w2 + z1*x2z = w1*z2 + x1*y2 - y1*x2 + z1*w2return np.array([w, x, y, z])def quat_conj(q):"""四元数共轭"""return np.array([q[0], -q[1], -q[2], -q[3]])def quat_error(q_current, q_desired):"""计算误差四元数 q_e = q_desired ⊗ q_current^{-1}"""q_conj = quat_conj(q_current)return quat_mult(q_desired, q_conj)
2. 滑模控制器
class QuaternionSMC:def __init__(self, J, lambda_, K, dt):self.J = J          # 转动惯量矩阵 (3x3)self.lambda_ = lambda_self.K = K          # 切换增益self.dt = dtdef compute_control(self, q, omega, q_d, omega_d):# 计算误差四元数q_e = quat_error(q, q_d)q_e_v = q_e[1:]     # 提取向量部分 [q1, q2, q3]# 角速度误差omega_e = omega - omega_d# 滑模面 s = omega_e + lambda * q_e_vs = omega_e + self.lambda_ * q_e_v# 等效控制 u_eq = J*(d(omega_d)/dt - lambda*0.5*omega × q_e_v) + omega × J omega# 假设目标角加速度为0(omega_d为常数)u_eq = np.dot(self.J, -self.lambda_ * 0.5 * np.cross(omega, q_e_v)) \+ np.cross(omega, np.dot(self.J, omega))# 切换控制 u_sw = -K * sign(s)u_sw = -self.K * np.sign(s)# 总控制力矩u = u_eq + u_swreturn u
3. 卫星姿态动力学仿真
def simulate_satellite_attitude():# 参数初始化J = np.diag([100, 100, 80])  # 转动惯量 (kg·m²)lambda_ = 0.5K = 20.0dt = 0.01# 初始状态q = np.array([1.0, 0.0, 0.0, 0.0])  # 初始姿态(无旋转)omega = np.array([0.0, 0.0, 0.0])    # 初始角速度q_d = np.array([0.707, 0.0, 0.707, 0.0])  # 目标姿态(绕x轴旋转90度)omega_d = np.array([0.0, 0.0, 0.0])        # 目标角速度controller = QuaternionSMC(J, lambda_, K, dt)# 记录数据time = np.arange(0, 10, dt)q_history = []omega_history = []for t in time:# 计算控制力矩u = controller.compute_control(q, omega, q_d, omega_d)# 加入扰动(模拟太阳辐射压力)disturbance = np.array([0.1*np.sin(t), 0.1*np.cos(t), 0.05*np.sin(2*t)])u += disturbance# 更新角速度(欧拉积分)omega_dot = np.linalg.inv(J).dot(-np.cross(omega, J.dot(omega)) + u/J.diagonal()omega = omega + omega_dot * dt# 更新四元数(四阶龙格-库塔法)k1 = 0.5 * quat_mult(q, np.array([0, omega[0], omega[1], omega[2]]))k2 = 0.5 * quat_mult(q + 0.5*dt*k1, np.array([0, omega[0], omega[1], omega[2]]))k3 = 0.5 * quat_mult(q + 0.5*dt*k2, np.array([0, omega[0], omega[1], omega[2]]))k4 = 0.5 * quat_mult(q + dt*k3, np.array([0, omega[0], omega[1], omega[2]]))q = q + (dt/6)*(k1 + 2*k2 + 2*k3 + k4)q /= np.linalg.norm(q)  # 归一化# 记录数据q_history.append(q)omega_history.append(omega)return time, np.array(q_history), np.array(omega_history)

三、使用示例

在这里插入图片描述

可视化代码
import matplotlib.pyplot as plttime, q_history, omega_history = simulate_satellite_attitude()# 绘制四元数误差
plt.figure()
plt.plot(time, q_history[:, 0], label='q0')
plt.plot(time, q_history[:, 1], label='q1')
plt.plot(time, q_history[:, 2], label='q2')
plt.plot(time, q_history[:, 3], label='q3')
plt.xlabel('Time (s)')
plt.ylabel('Quaternion')
plt.legend()
plt.title('Attitude Quaternion')# 绘制角速度
plt.figure()
plt.plot(time, omega_history[:, 0], label='ω_x')
plt.plot(time, omega_history[:, 1], label='ω_y')
plt.plot(time, omega_history[:, 2], label='ω_z')
plt.xlabel('Time (s)')
plt.ylabel('Angular Velocity (rad/s)')
plt.legend()
plt.title('Angular Velocity')
plt.show()

四、改进与注意事项

在这里插入图片描述

  1. 自适应增益
    • 根据扰动估计动态调整 ( K ),降低保守性。
  2. 执行器饱和
    • 在控制律中增加力矩限幅,避免超出执行器能力。

五、总结
  • 优势
    • 四元数避免奇异性,滑模控制提供强鲁棒性,适合存在扰动和模型不确定性的卫星姿态控制。
  • 挑战
    • 抖振可能影响执行器寿命,需结合高阶滑模或滤波技术。
  • 应用扩展
    • 可结合姿态确定系统(如星敏感器、陀螺仪)实现闭环控制。

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

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

相关文章

CSS—引入方式、选择器、复合选择器、文字控制属性、CSS特性

目录 CSS 1.引入方式 2.选择器 3.复合选择器 4.文字控制属性 5.CSS特性 CSS 层叠样式表,是一种样式表语言,用来描述HTML文档的呈现 书写时一般按照顺序:盒子模型属性—>文字样式—>圆角、阴影等修饰属性 1.引入方式 引入方式方…

OpenHarmony-4.基于dayu800 GPIO 实践(2)

基于dayu800 GPIO 进行开发 1.DAYU800开发板硬件接口 LicheePi 4A 板载 2x10pin 插针,其中有 16 个原生 IO,包括 6 个普通 IO,3 对串口,一个 SPI。TH1520 SOC 具有4个GPIO bank,每个bank最大有32个IO:  …

win11 24h2 远程桌面 频繁断开 已失去连接 2025

一、现象 Windows11自升级2025年2月补丁后版本号为系统版本是26100.3194,远程桌面频繁断开连接,尝试连接,尤其在连接旧的server2012 二、临时解决方案 目前经测试,在组策略中,远程桌面连接客户端,关闭客户…

rust学习笔记6-数组练习704. 二分查找

上次说到rust所有权看看它和其他语言比有什么优势,就以python为例 # Python3 def test():a [1, 3, -4, 7, 9]print(a[4])b a # 所有权没有发生转移del b[4]print(a[4]) # 由于b做了删除,导致a再度访问报数组越界if __name__ __main__:test() 运行结…

Windows安装NVIDIA显卡CUDAD调用GPU,适用于部署deepseek r1

显卡、显卡驱动、CUDA之间的关系 显卡:(GPU),主流是NVIDIA的GPU,因为深度学习本身需要大量计算。GPU的并行计算能力,在过去几年里恰当地满足了深度学习的需求。AMD的GPU基本没有什么支持,可以不…

基于无人机遥感的烟株提取和计数研究

一.研究的背景、目的和意义 1.研究背景及意义 烟草作为我国重要的经济作物之一,其种植面积和产量的准确统计对于烟草产业的发展和管理至关重要。传统的人工烟株计数方法存在效率低、误差大、难以覆盖大面积烟田等问题,已无法满足现代烟草种植管理的需求…

《深度学习实战》第3集:循环神经网络(RNN)与序列建模

第3集:循环神经网络(RNN)与序列建模 引言 在深度学习领域,处理序列数据(如文本、语音、时间序列等)是一个重要的研究方向。传统的全连接网络和卷积神经网络(CNN)难以直接捕捉序列中…

【前沿探索篇七】【DeepSeek自动驾驶:端到端决策网络】

第一章 自动驾驶的"感官革命":多模态神经交响乐团 1.1 传感器矩阵的量子纠缠 我们把8路摄像头+4D毫米波雷达+128线激光雷达的融合称为"传感器交响乐",其数据融合公式可以简化为: def sensor_fusion(cam, radar, lidar):# 像素级特征提取 (ResNet-152…

可狱可囚的爬虫系列课程 13:Requests使用代理IP

一、什么是代理 IP 代理 IP(Proxy IP)是一个充当“中间人”的服务器IP地址,用于代替用户设备(如电脑、手机等)直接与目标网站或服务通信。用户通过代理IP访问互联网时,目标网站看到的是代理服务器的IP地址&…

https:原理

目录 1.数据的加密 1.1对称加密 1.2非对称加密 2.数据指纹 2.1数据指纹实际的应用 3.数据加密的方式 3.1只使用对称加密 3.2只使用非对称加密 3.3双方都使用对称加密 3.4非对称加密和对称加密一起使用 4.中间人攻击 5.CA证书 5.1什么是CA证书 CA证书的验证 6.https的原理 1.数据…

Github项目管理之 其余分支同步main分支

文章目录 方法:通过 Pull Request 同步分支1. **创建一个从 main 到目标分支的 Pull Request**2. **合并 Pull Request** 注意事项总结 在 GitHub 网页上,你可以通过 Pull Request 的方式将一个分支(例如 main 分支)的修改同步到…

Aseprite绘画流程案例(5)——花盆

1.最终图片效果 参考素材来源于:手绘像素画第三课:像素画盆花示范(无参考图)_哔哩哔哩_bilibili 2.流程 1.新建画布40X27的画布,打开显示网格,背景色为白色 2.画出梯形的盆 3.给盆进行亮暗对比上色 4.添…

【模板】csdn markdown语法演示

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

【Python系列】PYTHONUNBUFFERED=1的作用

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Adobe After Effects的动画制作

作者:余佳琪 目录 一、 前言 二、 可动骨骼的选择 三、 运动曲线的设置 四、 图层的选定与应用 五、 插件的应用(阴影,高光,特效) 六、 导出 一、 前言 在当今世界&#x…

可狱可囚的爬虫系列课程 14:10 秒钟编写一个 requests 爬虫

一、前言 当重复性的工作频繁发生时,各种奇奇怪怪提高效率的想法就开始萌芽了。当重复代码的模块化封装已经不能满足要求的时候,更高效的方式就被揭开了神秘的面纱。本文基于这样的想法,来和大家探讨如何 10 秒钟编写一个 requests 爬虫程序。…

QNX上如何抓tracelogger日志

背景 因QNX侧 QVM的分析CPU负载问题在android侧使用trace无法分析,故QNX侧的CPU负载问题需要用到tracelogger日志分析。 例如:使用hogs -l 42|grep qvm 中发现qvm的cpu负载 30%多 但是使用trace日志在Perfetto又查不到qvm信息,则需要抓取qn…

DeepSeek开源周 Day02:从DeepEP开源趋势重新审视大模型Infra

DeepEP 今天DeepSeek开源周第二天,开放了DeepEP仓库,属实看了下源码,和昨天FlashMLA一样,C权重(包括CUDA)还是占据了绝对部分,作为调包侠的我,看到之后望而却步,想看原理…

【Ambari】Ranger KMS

目录 一、Ranger KMS介绍 二、KMS基于Ranger插件安装 一、Ranger KMS介绍 Ranger KMS是把数据存储入后台数据库中。通过Ranger Admin可以集中化管理KMS服务。 Ranger KMS有三个优点 l Key management Ranger admin 提供了创建,更新,删除密钥的Web UI…

055 SpringCache

文章目录 缓存一致性Spring Cachepom.xmlapplication.ymlCubemallProductApplication.javaSpringCache改造三级分类MyCacheConfig.java缓存一致性 缓存一致性 锁 设置过期时间 读写锁 设置过期时间 Spring Cache 1.读模式 缓存穿透:查询一个null数据,…