热气RCS(Reaction Control System)是航天器在真空中进行姿态调整和轨道机动的重要系统。它通过喷射高温燃气产生推力和力矩,实现俯仰、偏航、滚转以及平移控制。在《朱诺新起源》中,我们可以利用Vizzy编程,将玩家的操控指令实时分配至各个喷口,实现高精度的世界坐标系控制——本教程将带你从零搭建一套完整的热气RCS控制程序,深入理解矢量运算、坐标转换与推力分配的核心原理。
坐标系与轴向解析
在开始制作之前,我们需要了解飞船的坐标系和世界坐标系:
1. 飞船本地坐标系(Craft Local Axes)
飞船自身有一个随姿态变化的坐标系,三个轴分别对应:
- 滚转轴(Roll):指向机头方向(前进方向)。绕此轴旋转,飞船左右倾斜。
- 俯仰轴(Pitch):指向右翼方向(或右侧)。绕此轴旋转,机头上下俯仰。
- 偏航轴(Yaw):指向上方(天顶方向)。绕此轴旋转,机头左右偏转。

这三个轴始终相互垂直,构成一个右手坐标系。在Vizzy中,可以通过以下模块获取它们在世界坐标系下的单位矢量:

2.PCI坐标系(世界绝对坐标系)
PCI(Planet Centered Inertial)是以行星中心为原点、方向固定的惯性坐标系。
其三个轴为:
X轴:指向东方向(经度增加方向),与赤道面相切。
Y轴:指向北极方向(行星自转轴)。
Z轴:指向天顶方向(从行星中心向外),与赤道面垂直。
游戏中所有绝对位置(`[nav] [Position]`)、绝对速度(`[velocity] [Orbit]`)等都采用PCI坐标。此外,`[nav] [North]` 和 `[nav] [East]` 分别返回指向地理北极和地理东方的单位矢量(也属于PCI坐标系)。

3.轴向之间的转换关系
在RCS控制中,我们常需要将玩家输入(如“向前平移”)映射到**世界坐标系**中的期望推力,再转换回飞船本地坐标系以分配给喷口。这需要通过点积实现:
- 世界期望推力 = (输入向前) * (北向) + (输入向右) * (东向) + (输入向上) * (天顶)` - 本地前向分量 = 点积(世界期望推力, 滚转轴) - 本地右向分量 = 点积(世界期望推力, 俯仰轴) - 本地向上分量 = 点积(世界期望推力, 偏航轴)
旋转控制同理:期望力矩用世界轴表示,再点积飞船各轴得到本地指令。

因为你游的奇怪特性,ROLL需要取负数(有可能是玩家输入与游戏内控制轴的符号约定不一致造成的)

引擎选择:为什么采用挤压循环发动机
在热气RCS系统中,推力来源的选择至关重要。我们推荐采用挤压循环发动机(Pressure-Fed Engine),主要有以下原因:
1. 无电力依赖
挤压循环发动机依靠高压气体(如氦气)将推进剂挤入燃烧室,无需涡轮泵,因此不消耗电力。这对于电力紧张的航天器(尤其是早期或深空任务)尤为关键,可以简化供电系统。
2. 响应速度快
由于没有复杂的涡轮启动过程,挤压循环发动机的阀门打开后,推进剂几乎瞬间进入燃烧室,推力响应延迟极短。这对需要精确、快速机动的RCS控制非常重要,能够实现微秒级的姿态调整。
3. 价格低廉,结构简单
相比燃气发生器循环或分级燃烧循环,挤压循环发动机没有高速旋转部件,结构简单,制造成本低,可靠性高。在游戏中,这对应较低的零件价格和更少的故障点。
4. 燃料消耗少,适合短时工作
挤压循环发动机通常用于需要多次、短时间点火的场合(如RCS)。虽然其比冲略低于泵压式发动机,但对于RCS所需的微量推力而言,绝对燃料消耗量很小,且可多次重启,完全满足航天器姿态控制和轨道修正的需求。
综上所述,挤压循环发动机是热气RCS的理想选择,它在不增加电力负担的前提下,提供了快速、可靠的推力响应,完美适配RCS的工作特性。
引擎数据调整:让RCS发动机听话
在热气RCS系统中,我们需要发动机能够快速响应Vizzy的指令,并且不会对周围部件造成热损伤。以下将以游戏自带的 Mage Engine 为例,逐步调整其参数,使其完美适配RCS控制。
### 第一步:选择基础发动机
1. 进入建造界面,在发动机分类中找到 Mage Engine(或任意初始模板中的液体发动机)。
2. 将其放置在飞船上,作为RCS的推力源。
### 第二步:切换为挤压循环
在发动机属性面板中找到 Power Cycle(动力循环)选项,将其从默认的 Gas Generator(燃气发生器循环)改为 Pressure Fed(挤压循环)。 挤压循环不依赖涡轮泵,不消耗电力,且响应速度极快,非常适合需要频繁点火的RCS。
### 第三步:禁用万向节
将 Gimbal Range(摇摆范围)直接拖到 0°。 RCS发动机通常不需要矢量摆动,推力方向固定即可。禁用摇摆可避免意外干扰。
### 第四步:展开设置并调整燃料与激活
1. 展开 Additional Settings(附加设置)面板。
2. 将 Fuel Line(燃料管路)设为 On ,确保发动机能获得燃料。
3. 关闭 Autoactivation(自动激活),防止发动机在分级时自动点火。
4. 找到下方的 Stage Activation(阶段激活),将发动机所在级设置为 None。
我们希望RCS发动机完全由Vizzy程序控制,而不是被传统的分级触发,这样可以精确控制点火时机和推力大小。
### 第五步:关闭尾焰热损伤
1. 点击 Edit Hidden Properties(编辑隐藏属性)
2. 在 RocketEngine 分类下找到 Heat Transfer Override(热传递覆盖),将其默认值 1改为 0。 3. 点击 Apply 应用修改。
RCS喷口通常紧贴箭体,过高的尾焰温度会损坏周围零件。将热传递覆盖设为0,可完全消除尾焰的热损伤,避免在机动过程中意外烧毁。
### 第六步:绑定节流阀输入变量
现在最关键的一步:让发动机的节流阀(Throttle)能够接收Vizzy程序中变量 `rcs` 的值。
1. 在发动机属性中找到 Input 下拉菜单,选择 Throttle(节流阀)。
2. 在右侧的输入框中,删除默认内容,输入 .VZ.rcs(注意大小写和标点符号)。
格式说明: .VZ. 表示引用本零件(即该发动机所在的零件)的Vizzy飞行程序中的变量。
rcs 是我们将在程序中创建的变量名(可以任意命名,但必须与程序中一致)。
如果我们将前面的零件名删除,只保留 .VZ.rcs,则表示从当前零件的Vizzy中读取变量 rcs。
这样一来,当我们编写Vizzy程序时,只需设置一个名为 rcs 的变量(范围0~1),发动机的推力就会自动跟随该变量的值变化,实现程序化控制。



最终引擎数据应为上图
热气RCS控制Vizzy程序原理详解
### 第一步:搭建实时控制框架

- on start:程序入口,仅执行一次。
- while true:无限循环,确保控制指令持续更新。
- wait 0 seconds:每帧循环一次,不等待,实现最高频率的控制(受你游戏帧率限制)。
同时,我们创建一个变量 rcs 作为中间存储,用于后续计算。
## 第二步:将玩家输入转化为发动机的推力指令
核心公式:
我们的目标是把玩家的平移和旋转操作,转化为每个发动机应该输出的推力大小(即节流阀开度)。变量 `rcs` 最终将保存这个推力值,正值代表发动机点火,负值或零则关闭。
公式分为两个部分:
**平移控制**和**姿态控制**
##第三步:平移控制——计算发动机对平移的贡献
1. 获取发动机在世界中的推力方向
发动机在建造时有一个固定的喷气方向(假设是本地坐标系的 Y 轴正向)。使用 `Local to PCI` 模块,将本地矢量 `vec(0,0,0)` 转换到全局坐标系`vec(0,1,0)`,得到发动机实际推力的单位方向向量。使用模块:
part(0)This Part ID (模块part(0)Acivated中选择)
Part(0)Local to PCI (0,0,0)
Vec(0,0,0) (改为Vec(0,1,0))
拼接,得到:

2. 获取飞船的三个基准轴
玩家期望的平移方向是相对于世界坐标系的(例如向前 = 北,向右 = 东,向上 = 天顶)。但我们需要知道飞船自身的轴向,才能将输入映射到世界方向。用 `nav` 模块获取三个轴:
`nav Craft Roll Axis` —— 机头方向
`nav Craft Pitch Axis` —— 右翼方向
`nav Craft Yaw Axis` —— 天顶方向
使用模块:
nav Position (改为nav Craft Pitch Axis ,nav Craft Yaw Axis ,nav Craft Roll Axis ,)
Input(Throttle) (改为Translate Right ,Translate UP ,Translate Forward)
布尔运算中的乘号,Pitch对应 Right,Yaw对应UP,Roll对应Forward

3.合成玩家期望的平移向量
玩家输入有三个:向前(Translate Forward)、向右(Translate Right)、向上(Translate Up)。将每个输入乘以其对应的世界方向(即飞船的相应轴向),再相加,就得到了玩家希望飞船整体平移的期望向量。
*注:具体取决于喷口布局和输入设备,若实际控制方向反了,可在程序中用 `0 -` 调整。

4.计算发动机对平移的贡献
将发动机的推力方向与期望平移向量做点积。点积结果越大,说明发动机的推力方向与期望方向越一致,应该提供更大的推力;如果为负,则说明方向相反,应关闭。使用模块:(0,0,0)dot(0,0,0)
连接:

## 第四步:姿态控制——计算发动机对旋转的贡献
1. 计算发动机产生的扭矩:
发动机点火时,不仅产生平移力,还会因为力臂而产生力矩。我们需要知道发动机相对于飞船质心的位置偏移 ,然后用叉积算出该发动机产生的扭矩矢量。
- 力臂:发动机相对于飞船质心的位置偏移 = 发动机位置 - 质心位置
- 扭矩:发动机产生的扭矩矢量= 发动机相对于飞船质心的位置偏移 × 动机的推力方向(叉积)
需要模块:
part(0)This Part ID (模块part(0)Acivated中选择)
part(0)Position (模块part(0)Acivated中选择)
nav Position
(0,0,0)cross(0,0,0) (模块(0,0,0)dot(0,0,0)中选择)

2. 合成玩家期望的旋转向量
玩家输入有三个:俯仰(Pitch)、偏航(Yaw)、滚转(Roll)。将每个输入乘以其对应的旋转轴(飞船的三个轴),再相加,得到玩家期望的总扭矩向量。
需要模块:
nav Position (改为nav Craft Pitch Axis ,nav Craft Yaw Axis ,nav Craft Roll Axis ,)
Input(Throttle) (改为Pitch ,Yaw,Roll)
复制玩家期望的平移向量(略做修改即可)

3. 计算发动机对旋转的贡献
将发动机的扭矩矢量与期望扭矩矢量做点积。点积结果越大,说明该发动机点火后产生的力矩方向越符合玩家需求,应输出更大的推力。
需要模块:(0,0,0)dot(0,0,0)

## 第五步:合并贡献并输出指令
将平移贡献和姿态贡献相加,得到该发动机最终应输出的推力大小。我们将这个值存入变量 `rcs`。

太长了,把这两行用“+”连接放入变量’rcs’后面那个空
### 总结
通过上述步骤,我们建立了一个完整的逻辑:
- 实时读取玩家的平移和旋转输入;
- 获取每个喷口在世界中的推力方向和扭矩能力;
- 将玩家期望的平移和旋转分别与喷口的能力进行点积,得到每个喷口的贡献;
- 将所有贡献相加,决定喷口的推力大小。
这套机制能够智能地响应任何方向的操纵指令,实现精准的RCS控制。现在你可以按照这个框架,在Vizzy中用模块搭建出程序,再结合之前调整好的挤压循环发动机,一套热气RCS系统就完成了。

备注:vizzy参考“Zenit工作室”视频《【JNO | 简单火箭2】热气RCS教程》视频链接:BV1RPQzGExC

参与讨论
(Participate in the discussion)
参与讨论