用python 在krpc上 设计一个火箭自动回收到发射场的程序
这是一个较为复杂的项目,需要使用 krpc 的 API 和一些编程知识。以下是一个简单的程序框架,你可以在此基础上进行修改和扩展。
首先,需要连接 krpc 服务器,获取火箭的各种信息:
import krpc
# 连接 krpc 服务器
conn = krpc.connect()
# 获取火箭对象
vessel = conn.space_center.active_vessel
# 获取火箭高度、速度、姿态等信息
altitude = conn.add_stream(getattr, vessel.flight(), 'mean_altitude')
speed = conn.add_stream(getattr, vessel.flight(), 'speed')
pitch = conn.add_stream(getattr, vessel.flight(), 'pitch')
heading = conn.add_stream(getattr, vessel.flight(), 'heading')
接着,需要定义一些辅助函数,比如控制火箭引擎的函数:
def set_thrust(throttle):
# 控制火箭引擎推力
vessel.control.throttle = throttle
还需要定义一些常量,比如目标高度、着陆点坐标等:
TARGET_ALTITUDE = 10000 # 目标高度
LANDING_LATITUDE = 0.0 # 着陆点纬度
LANDING_LONGITUDE = 0.0 # 着陆点经度
接下来,就可以开始编写主要的程序逻辑了。首先,在起飞前需要将火箭竖直放置并点火:
def launch():
# 火箭竖直放置
vessel.control.sas_mode = conn.space_center.SASMode.stability_assist
# 火箭点火
vessel.control.activate_next_stage()
接着,在火箭达到目标高度前,需要控制火箭引擎推力,使火箭垂直上升:
def ascent():
# 控制火箭引擎推力
set_thrust(1.0)
# 等待火箭达到目标高度
while altitude() < TARGET_ALTITUDE:
pass
# 切换到姿态控制模式
vessel.control.sas_mode = conn.space_center.SASMode.retrograde
接着,在着陆前需要控制火箭姿态,使其朝向着陆点,并在适当的时机放出降落伞:
def landing():
# 控制火箭姿态
vessel.auto_pilot.target_pitch_and_heading(-90, 0)
vessel.auto_pilot.engage()
# 等待火箭靠近着陆点
while vessel.orbit.body.latitude_at_position(vessel.orbit.position_at(0)).degrees > LANDING_LATITUDE:
pass
# 放出降落伞
vessel.control.activate_next_stage()
最后,在着陆后需要将火箭自动驶回发射场。这个部分需要编写比较复杂的代码,包括计算火箭的轨道参数、计算回收路径、控制火箭引擎等。
def recovery():
# 计算火箭轨道参数
mu = vessel.orbit.body.gravitational_parameter
h = vessel.orbit.apoapsis_altitude
r = vessel.orbit.body.equatorial_radius + altitude()
a = (r + h) / 2
e = 1 - (r / a)
b = a * math.sqrt(1 - e ** 2)
p = a * (1 - e ** 2)
# 计算回收路径
landing_site = conn.space_center.target_vessel
landing_position = landing_site.flight().position
landing_latitude = landing_site.flight().latitude
landing_longitude = landing_site.flight().longitude
r_landing = landing_site.orbit.body.equatorial_radius + landing_site.flight().surface_altitude
v_landing = math.sqrt(mu / r_landing)
r_reentry = r_landing + 100000
v_reentry = math.sqrt(mu / r_reentry)
t_reentry = math.acos(v_landing / v_reentry)
dt_reentry = t_reentry - math.sqrt(r_reentry ** 3 / mu)
# 控制火箭引擎
while True:
# 计算火箭位置和速度
r = vessel.orbit.radius
v = vessel.flight().speed
# 计算回收路径上的位置和速度
t = conn.space_center.ut
dt = t - conn.space_center.ut_lag
landing_position = landing_site.flight().position_at(t + dt + dt_reentry)
landing_velocity = landing_site.flight().velocity_at(t + dt + dt_reentry)
delta_v = landing_velocity - vessel.flight().velocity
# 控制火箭引擎
thrust = delta_v.magnitude / (v * math.sin(delta_v.angle_with(v)))
set_thrust(min(1.0, max(0.0, thrust)))
# 判断是否回收成功
if r <= r_landing and v <= v_landing:
break
最后,将以上函数组合起来,即可实现一个简单的火箭自动回收程序:
def main():
launch()
ascent()
landing()
recovery()
if __name__ == '__main__':
main()
``
原文地址: https://www.cveoy.top/t/topic/hegA 著作权归作者所有。请勿转载和采集!