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


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


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

在这里插入图片描述

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

3. 滑模控制设计

在这里插入图片描述


二、代码实现(Python)
1. 四元数运算工具
import numpy as np

def quat_mult(q1, q2):
    """四元数乘法"""
    w1, x1, y1, z1 = q1
    w2, x2, y2, z2 = q2
    w = w1*w2 - x1*x2 - y1*y2 - z1*z2
    x = w1*x2 + x1*w2 + y1*z2 - z1*y2
    y = w1*y2 - x1*z2 + y1*w2 + z1*x2
    z = w1*z2 + x1*y2 - y1*x2 + z1*w2
    return 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 = dt
    
    def 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_v
        s = 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_sw
        return u
3. 卫星姿态动力学仿真
def simulate_satellite_attitude():
    # 参数初始化
    J = np.diag([100, 100, 80])  # 转动惯量 (kg·m²)
    lambda_ = 0.5
    K = 20.0
    dt = 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 plt

time, 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. 执行器饱和
    • 在控制律中增加力矩限幅,避免超出执行器能力。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

linux 命令+相关配置记录(持续更新...)

linux 命令记录相关配置记录 磁盘切换 cd D:#这里表示切换到D盘查看wsl 安装的linux 子系统 wsl --list -vwsl 卸载 linux 子系统 wsl --unregister -xxx # xxx 表示子系统的名字备份Linux 子系统 导出 wsl --export xxx yyy # xxx 表示子系统的名字 yyy 表示压…

山东大学软件学院nosql实验一环境配置

环境:前端vue后端springboot 软件环境: MongoDB MongoDBCompass 实验步骤与内容: 在官网下载安装包(最新版) 配置环境环境变量 在“高级系统设置-环境变量”中,可以将MongoDB添加到环境变量Path中(D:\…

云手机如何进行经纬度修改

云手机如何进行经纬度修改 云手机修改经纬度的方法因不同服务商和操作方式有所差异,以下是综合多个来源的常用方法及注意事项: 通过ADB命令注入GPS数据(适用于技术用户) 1.连接云手机 使用ADB工具连接云手机服务器,…

Deepseek本地化部署指南:在Linux环境下部署,windows远程web-ui访问(Ubuntu环境+window环境)

一、在Ubuntu服务器上部署DeepSeek模型 要在Ubuntu上通过Ollama安装和使用DeepSeek模型,可以按照以下步骤操作: 安装Ollama 1、使用命令安装Ollama 命令语句:curl -sSfL https://ollama.com/install.sh | sh 2、验证安装是否成功 安装完…

数据库(MySQL)二

MySQL 六、MySQL索引视图6.1 索引底层原理6.1.1 索引hash算法6.1.2 索引二叉树算法6.1.3 索引平衡二叉树算法6.1.4 索引BTREE树算法6.1.5 普通SQL全表扫描过程 6.2 索引分类6.2.1 按数据结构层次分类6.2.2 按字段数量层次分类6.2.3 按功能逻辑层次分类(面试题&#…

element ui的select选择框

我们首先先试一下&#xff0c;这个东西怎么玩的 <el-select v-model"select" change"changeSelect"><el-option value"香蕉"></el-option><el-option value"菠萝"></el-option><el-option value&quo…

git 的一些操作总结

1. Git 分支及基础操作指令 1.1 创建分支 # 创建新分支 git branch <branch_name># 创建并切换到新分支 git checkout -b <branch_name>1.2 切换分支 # 切换到指定分支 git checkout <branch_name># 切换到上一个分支 git checkout -1.3 查看分支 # 查看…

华为2025年技术发布会:智能汽车核心技术大爆发

近日&#xff0c;华为在鸿蒙智行尊界技术发布会上发布了多项智能汽车核心技术&#xff0c;涵盖智能驾驶、安全防护、通信系统、座舱交互及电池技术等领域&#xff0c;标志着其从“被动智能”向“自主智能”的战略升级。 以下是核心技术的综合梳理&#xff1a; 六大核心创新 途…

计算机视觉算法实战——产品分拣(主页有源码)

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​ 1. 领域简介✨✨ 产品分拣是工业自动化和物流领域的核心技术&#xff0c;旨在通过机器视觉系统对传送带上的物品进行快速识别、定位和分类&a…

WIN10 本地部署 BGE Embedding 向量化模型

WIN10 本地部署 BGE Embedding 向量化模型 1.下载 BGE 模型2.安装1.创建虚拟环境2.安装依赖3.本地测试 3.将服务封装为HTTP可调用形式1.生成向量值2.相似度测试 1.下载 BGE 模型 Hugging Face 官网 最好是科学上网&#xff0c;或者从其他渠道下载 2.安装 本文通过 Anconda …

8.spring对logback的支持

文章目录 一、入口二、源码解析LoggingApplicationListener 三、其它支持四、总结 本节以logback为背景介绍的 一、入口 gav: org.springframework.boot:spring-boot:3.3.4 spring.factories文件中有如下两个配置 org.springframework.boot.logging.LoggingSystemFactory\ …

【数据结构】(11) Map 和 Set

一、Map 和 Set 的简介 1、Set 和 Map Map 和 Set 是集合类框架学习的最后一部分。Map 和 Set 都是接口&#xff0c;需要通过 TreeSet、HashSet 和 TreeMap、HashMap 实例化。注意&#xff0c;Set 实现了 Collection&#xff0c;Map 并没有。 Set 存放的是键&#xff08;Key&a…

Word(2010)排版技巧

设置标题样式 选择需要设置的标题 如下图所示。选择文字后&#xff0c;点击对应的样式即可设置。 设置标题格式 设置字体格式 设置段落格式 显示所有样式 标题样式展示 建议 建议新建一个正文样式&#xff0c;可以命名为正文1&#xff0c;因为所有的样式参考的“样式基准…

Docker(Nginx)部署Vue

简介&#xff1a;目标使用docker将vue生成的dist文件&#xff0c;结合nginx生成镜像&#xff0c;然后运行&#xff1b; 1、首选确保vue项目正确运行&#xff0c;并能正确打包dist文件&#xff1b; 2、查看已经生成的dist文件 3、将dist文件打包为rar文件或者zip文件&#xf…

Helix——Figure 02发布的通用人形机器人控制VLA:不用微调即可做多个任务的快与慢双系统,让两个机器人协作干活(含清华HiRT详解)

前言 过去一周&#xff0c;我花了很大的心思、力气&#xff0c;把deepseek的GRPO、MLA算法的代码解析通透&#xff0c;比如GRPO与PPO的详细对比&#xff0c;再比如MLA中&#xff0c;图片 公式 代码的一一对应&#xff0c;详见此专栏《火爆全球的DeepSeek系列模型》 2.20日晚&…

【学习笔记】LLM+RL

文章目录 1 合成数据与模型坍缩&#xff08;model collapse&#xff09;,1.1 递归生成数据与模型坍缩1.2 三种错误1.3 理论直觉1.4 PPL指标 2 基于开源 LLM 实现 O1-like step by step 慢思考&#xff08;slow thinking&#xff09;&#xff0c;ollama&#xff0c;streamlit2.1…

七.智慧城市数据治理平台架构

一、整体架构概览 智慧城市数据治理平台架构描绘了一个全面的智慧城市数据治理平台&#xff0c;旨在实现城市数据的统一管理、共享和应用&#xff0c;为城市运行、管理和决策提供数据支撑。整体架构呈现出分层、模块化、集约化的特点&#xff0c;并强调数据安全和标准规范。 智…

家用路由器的WAN口和LAN口有什么区别

今时今日&#xff0c;移动终端盛行的时代&#xff0c;WIFI可以说是家家户户都有使用到的网络接入方式。那么路由器当然也就是家家户户都不可或缺的设备了。而路由器上的两个实现网络连接的基础接口 ——WAN 口和 LAN 口&#xff0c;到底有什么区别&#xff1f;它们的功能和作用…

SpringSecurity的核心过滤器-CsrfFilter

Spring Security除了认证授权外功能外,还提供了安全防护功能。本文我们来介绍下SpringSecurity中是如何阻止CSRF攻击的。 一、什么是CSRF攻击 跨站请求伪造(英语:Cross-site request forgery),也被称为 one-click attack 或者 session riding,通常缩写为 CSRF 或者 XSRF…

hbase笔记总结1

hbase是nosql的一种&#xff0c;非关系型数据库&#xff0c;not only sql&#xff0c;可处理大规模、高并发的数据&#xff0c;是web2.0以后的产物hbase的扩展性和灵活性更好&#xff0c;而且筛选能力相较于MySQL更优nosql的四大特点&#xff1a; 灵活的数据模型 &#xff08;1…