跳转至

舵机轴承

servo_bearing

在飞机诞生初期,由于尺寸小、速度慢,飞行员需要通过简单的钢索和滑轮,直接依靠体力去克服舵面上的空气动力,拉动舵面偏转。

随着飞机变大、变快,舵面上的空气动力(铰链力矩)变得巨大,人力无法直接对抗。于是在二战前后,液压助力器开始出现,它像“肌肉”一样帮助飞行员放大力量去驱动舵面。

如 塞斯纳 172 作为一款低速、轻型的教练机,它的空气动力载荷完全在人体力量可操控的范围内,因此至今仍保留了这种纯机械的操纵方式。这种设计结构简单、可靠性高,并且能让飞行员直接感受到气流对舵面的反作用力,这对飞行训练来说非常重要

舵机轴承

无红石,无需动力输入(通过飞行员念力控制)。旋转角度完全由 CC:Tweaked Lua 以目标角舵机的方式驱动。

它复刻了 create:mechanical_bearing 的旋转逻辑(每 tick 推进角度、applyRotation() → movedContraption.setAngle(angle)),只是动力从应力网络换成了 Lua。与机械轴承一样,装配后的结构是运动学 contraption 实体——刚性、指哪打哪、无惯性;Sable 会将其识别为物理体内的运动学 contraption(质量并入母机)。

为什么要新的轴承?

机械动力与航空学中已经有两种轴承,各有各的设计思路——舵机轴承是第三种,专为精确控制而生。

动力轴承的渲染问题

create:mechanical_bearing 的客户端并不直接显示服务端角度。它维护一个每 tick 减半的 clientAngleDiff,指数追赶服务端值——于是每次转动到末尾时,最后几度会在视觉上爬行到位。这纯粹是客户端视觉瑕疵:服务端角度和物理都是精确的,渲染延迟完全不影响物理计算。

舵机轴承砍掉了整条追赶链(细节见下),视觉平滑、一步到位、无爬行。

动力轴承 create:mechanical_bearing 物理轴承 simulated:swivel_bearing ccpe:servo_bearing
动力输入 Create 应力网络(转速) 侧面齿轮啮合 无——纯 Lua 目标角
从动结构 运动学 contraption 实体 真实物理体(Sable sub-level) 运动学 contraption 实体
动力学 刚性、运动学、无惯性 PD 伺服、有惯性、气动反馈 刚性、运动学、无惯性
角度来源 angle += speed 累计 网络转速 setTargetAngle() 最短路径
客户端渲染 指数追赶 → 末端爬行 物理驱动(精确) 服务端角度 + 帧间插值
红石 POWERED / 扳手 / movementMode 锁定(powered) 无

与 aero_bearing 的对比

aero_bearing 舵机轴承
驱动 Sable 物理(RotaryConstraint PD 伺服) Create contraption 实体(运动学)
动力学 有惯性、气动反馈 刚性、角度精确、无惯性
动力 轴向应力输入(或 Lua 控制模式) 无
适合 物理舵面 / 旋翼 精确角度控制

两者互补:需要气动真实反馈用航空轴承;需要舵面精确到达计算机指定角度时用舵机轴承。

Lua API

外设类型:servo_bearing(按方向 wrap,如 peripheral.wrap("right"),或 peripheral.find("servo_bearing"))。

方法 说明
assemble() 装配 FACING 方向的结构;返回是否成功
disassemble() 把结构拆回世界方块;返回是否成功
isAssembled() 当前是否已装配
setTargetAngle(角度) 沿最短路径定位到 角度(0–360)。需要先装配;未装配返回 false
getTargetAngle() 当前目标角度(0–360)
getAngle() 当前实际角度(0–360,服务端权威)
local s = peripheral.wrap("right")

print(s.assemble())        -- 装配轴承前方的结构
s.setTargetAngle(90)       -- 转到 90°(最短路径)
s.setTargetAngle(-45)      -- 转回来
print(s.getAngle())        -- 45.0(正在朝 -45° 转)

行为说明

  • 速度上限:角度每 tick 至多推进 18°(360°/s),并按剩余度数钳制,保证精确到位。
  • 最短路径:setTargetAngle 总是走较短的方向(如 350°→10° 走 +20°)。多圈目标(如 450°)会解析为 −270°。
  • 服务端权威 + 平滑客户端:客户端每 tick 同步服务端角度(lazyTickRate=1,滞后 ≤ 1 tick),用帧间插值渲染(angleLerp(prevAngle, angle, partialTicks))而非原版的外推式——匀速平滑、约 50ms 内到位、无爬行。
  • 装配:空手右键切换装配;Lua assemble()/disassemble() 行为等价(同步调用)。在 Sable sub-level 内装配已验证可行。
  • 无 plate 方块:与 aero_bearing 不同,不需要连接 plate——contraption 实体直接承载结构。

已知限制

  • MAX_ANGULAR_SPEED(18°/tick)目前硬编码,计划后续加 Config 选项。