def redrawTargetFromSSVG(self): status = self.savedstatus target_pos, target_vel = g.mytarget.posvel(status[0]) sun_pos, sun_vel = common.SPKposvel(10, status[0]) # adjust center of image xlim = g.ax.get_xlim3d() hw = (xlim[1] - xlim[0]) * 0.5 if self.ui.tobarycenter.isChecked(): cent = [0.0, 0.0, 0.0] elif self.ui.toprobe.isChecked(): cent = status[1:4] else: cent = target_pos g.ax.set_xlim3d(cent[0]-hw, cent[0]+hw) g.ax.set_ylim3d(cent[1]-hw, cent[1]+hw) g.ax.set_zlim3d(cent[2]-hw, cent[2]+hw) # Planets remove_planets() if self.ui.showplanets.isChecked(): replot_planets(status[0]) # Kepler Orbit of target xs, ys, zs, ts = g.mytarget.points(status[0], g.ndata) g.target_Kepler = [xs, ys, zs] erase_TKepler() if self.ui.check_TKepler.isChecked(): draw_TKepler() # Target mark if self.artist_of_target is not None: self.artist_of_target.remove() self.artist_of_target = None self.artist_of_target = g.ax.scatter(*target_pos, s=50, c='g', depthshade=False, marker='+') # display relative position and velocity rel_pos = target_pos - status[1:4] rel_pos = common.eclv2lv(rel_pos, status[1:4], status[4:], sun_pos, sun_vel) trange, tphi, telv = common.rect2polar(rel_pos) rel_vel = target_vel - status[4:] rel_vel = common.eclv2lv(rel_vel, status[1:4], status[4:], sun_pos, sun_vel) relabsvel, tvphi, tvelv = common.rect2polar(rel_vel) losvel = np.dot(rel_vel, rel_pos) / trange self.ui.RPTrange.setText('{:.3f}'.format(trange / 1000.0)) self.ui.RPTphi.setText('{:.2f}'.format(tphi)) self.ui.RPTelv.setText('{:.2f}'.format(telv)) self.ui.RVTvel.setText('{:.3f}'.format(relabsvel)) self.ui.RVTphi.setText('{:.2f}'.format(tvphi)) self.ui.RVTelv.setText('{:.2f}'.format(tvelv)) self.ui.LoSVvel.setText('{:.3f}'.format(losvel))
def fta(self, jd, tepos): # compute fixed time arrival guidance # jd : date of arrival # tepos position of target at jd (barycenter origin) dsec = (jd - self.jd) * common.secofday ipos = self.ppos - self.sunpos # sun position at end esunpos, esunvel = common.SPKposvel(10, jd) tpos = tepos - esunpos ivel, tvel = lambert(ipos, tpos, dsec, common.solarmu, ccw=True) iprobe_vel = self.pvel - self.sunvel delta_v = ivel - iprobe_vel localdv = common.eclv2lv(delta_v, self.ppos, self.pvel, self.sunpos, self.sunvel) return common.rect2polar(localdv)
def ftavel(self, jd, tepos): # compute fixed time arrival guidance # jd : date of arrival # tepos position of target at jd (barycenter origin) dsec = (jd - self.jd) * common.secofday ipos = self.ppos - self.sunpos # sun position and velocity at end esunpos, esunvel = common.SPKposvel(10, jd) tpos = tepos - esunpos ivel, tvel = lambert(ipos, tpos, dsec, common.solarmu, ccw=True) iprobe_vel = self.pvel - self.sunvel delta_v = ivel - iprobe_vel localdv = common.eclv2lv(delta_v, self.ppos, self.pvel, self.sunpos, self.sunvel) dv, phi, elv = common.rect2polar(localdv) bc_ivel = ivel + self.sunvel bc_tvel = tvel + esunvel # returns intial velocity and terminal velocity (SSB origin) return dv, phi, elv, bc_ivel, bc_tvel
def _redrawmark(self): tempjd = self.jd + self.delta_jd self.ui.preddate.setText(common.jd2isot(tempjd)) if self.artist_of_probe is not None: self.artist_of_probe.remove() self.artist_of_probe = None if self.artist_of_target is not None: self.artist_of_target.remove() self.artist_of_target = None if self.artist_of_sun is not None: self.artist_of_sun.remove() self.artist_of_sun = None remove_planets() remove_time() # Check time tsjd, tejd = g.mytarget.getsejd() if tempjd < tsjd or tempjd >= tejd: self.dispSysMes(self.sysMes04) self.unableDrawMark = True return False try: probe_pos, probe_vel = self.tbpred.posvelatt(tempjd) except RuntimeError: self.dispSysMes(self.sysMes05) self.unableDrawMark = True return False if self.unableDrawMark: self.dispSysMes(self.sysMes06) self.unableDrawMark = False self.target_pos, target_vel = g.mytarget.posvel(tempjd) sunpos = common.SPKkernel[0, 10].compute(tempjd) self.sun_pos = common.eqn2ecl(sunpos) * 1000.0 xlim = g.ax.get_xlim3d() hw = (xlim[1] - xlim[0]) * 0.5 if self.ui.tobarycenter.isChecked(): cent = [0.0, 0.0, 0.0] elif self.ui.toprobe.isChecked(): cent = probe_pos else: cent = self.target_pos g.ax.set_xlim3d(cent[0] - hw, cent[0] + hw) g.ax.set_ylim3d(cent[1] - hw, cent[1] + hw) g.ax.set_zlim3d(cent[2] - hw, cent[2] + hw) self.artist_of_probe = g.ax.scatter(*probe_pos, s=40, c='r', depthshade=False, marker='x') self.artist_of_target = g.ax.scatter(*self.target_pos, s=50, c='g', depthshade=False, marker='+') self.artist_of_sun = g.ax.scatter(*self.sun_pos, s=50, c='#FFAF00', depthshade=False, marker='o') # redraw planets if self.ui.showplanets.isChecked(): replot_planets(tempjd) if self.delta_jd == 0.0: replot_time(tempjd, self.timecap_Real) else: replot_time(tempjd, self.timecap_Pred) if g.fig is not None: plt.draw() # display relative position and velocity rel_pos = self.target_pos - probe_pos rel_pos = common.eclv2lv(rel_pos, probe_pos, probe_vel, self.tbpred.sunpos, self.tbpred.sunvel) trange, tphi, telv = common.rect2polar(rel_pos) rel_vel = target_vel - probe_vel rel_vel = common.eclv2lv(rel_vel, probe_pos, probe_vel, self.tbpred.sunpos, self.tbpred.sunvel) relabsvel, tvphi, tvelv = common.rect2polar(rel_vel) losvel = np.dot(rel_vel, rel_pos) / trange self.ui.RPTrange.setText('{:.3f}'.format(trange / 1000.0)) self.ui.RPTphi.setText('{:.2f}'.format(tphi)) self.ui.RPTelv.setText('{:.2f}'.format(telv)) self.ui.RVTvel.setText('{:.3f}'.format(relabsvel)) self.ui.RVTphi.setText('{:.2f}'.format(tvphi)) self.ui.RVTelv.setText('{:.2f}'.format(tvelv)) self.ui.LoSVvel.setText('{:.3f}'.format(losvel)) return True
def drawman(self): record = g.myprobe.trj_record[self.man_index] mantype = record[0]['type'] self.c_maninfo = record[0] self.c_mantype = mantype self.mantext = ' ' + str(self.man_index + 1) + ' ' + mantype status = np.zeros(7) self.ui.sysMessage.appendPlainText(self.sysMes02.format(self.c_mantype, self.man_index+1)) self.ui.sysMessage.centerCursor() if mantype == 'FLYTO': status[0] = record[1][0] status[1] = record[2][0] status[2] = record[3][0] status[3] = record[4][0] status[4] = record[5][0] status[5] = record[6][0] status[6] = record[7][0] ssacc = record[8][0] self.last_trj = record[1:] if self.fromNextman: self.c_index = len(self.last_trj[0]) - 1 self.ui.fastbackward.setEnabled(True) self.ui.backward.setEnabled(True) self.ui.forward.setEnabled(False) self.ui.fastforward.setEnabled(False) else: self.c_index = 0 self.ui.fastbackward.setEnabled(False) self.ui.backward.setEnabled(False) self.ui.forward.setEnabled(True) self.ui.fastforward.setEnabled(True) self.ui.timescale.setEnabled(True) self.ui.label_2.setEnabled(True) if self.c_maninfo['epon']: self.mantext = self.mantext + ' EP(' + \ self.c_maninfo['epmode'] + ')' if self.c_maninfo['sson']: self.mantext = self.mantext + ' SS(' + \ self.c_maninfo['ssmode'] + ')' else: status = record[1] self.ui.fastbackward.setEnabled(False) self.ui.backward.setEnabled(False) self.ui.forward.setEnabled(False) self.ui.fastforward.setEnabled(False) self.ui.timescale.setEnabled(False) self.ui.label_2.setEnabled(False) self.savedstatus = np.copy(status) if mantype == 'START': self.ui.starttime.setText(common.jd2isot(record[1][0])) self.start_time = status[0] target_pos, target_vel = g.mytarget.posvel(status[0]) erase_Ptrj() if self.ui.check_Ptrj.isChecked(): draw_Ptrj() # Kepler Orbit of target xs, ys, zs, ts = g.mytarget.points(status[0], g.ndata) g.target_Kepler = [xs, ys, zs] erase_TKepler() if self.ui.check_TKepler.isChecked(): draw_TKepler() self.mainwindow.ui.manplans.selectRow(self.man_index) if mantype == 'FLYTO': self.drawFLYTO() return # adjust center of image xlim = g.ax.get_xlim3d() hw = (xlim[1] - xlim[0]) * 0.5 if self.ui.tobarycenter.isChecked(): cent = [0.0, 0.0, 0.0] elif self.ui.toprobe.isChecked(): cent = status[1:4] else: cent = target_pos g.ax.set_xlim3d(cent[0]-hw, cent[0]+hw) g.ax.set_ylim3d(cent[1]-hw, cent[1]+hw) g.ax.set_zlim3d(cent[2]-hw, cent[2]+hw) # Kepler Orbit of probe erase_PKepler() if self.ui.check_PKepler.isChecked(): self.tbpred.fix_state(status[0], status[1:4], status[4:]) x, y, z, t = self.tbpred.points(g.ndata) g.probe_Kepler = [x, y, z] if self.ui.check_PKepler.isChecked(): draw_PKepler() # Planets remove_planets() if self.ui.showplanets.isChecked(): replot_planets(status[0]) # Probe mark if self.artist_of_probe is not None: self.artist_of_probe.remove() self.artist_of_probe = None self.artist_of_probe = g.ax.scatter(*status[1:4], s=40, c='r', depthshade=False, marker='x') # Maneuver Type if self.artist_of_type is not None: self.artist_of_type.remove() self.artist_of_type = None if self.ui.showmantype.isChecked(): self.artist_of_type = g.ax.text(*status[1:4], self.mantext, color='r', fontsize=10) # Target mark if self.artist_of_target is not None: self.artist_of_target.remove() self.artist_of_target = None self.artist_of_target = g.ax.scatter(*target_pos, s=50, c='g', depthshade=False, marker='+') # Sun mark if self.artist_of_sun is not None: self.artist_of_sun.remove() self.artist_of_sun = None sun_pos, sun_vel = common.SPKposvel(10, status[0]) self.artist_of_sun = g.ax.scatter(*sun_pos, s=50, c='#FFAF00', depthshade=False, marker='o') # time remove_time() replot_time(status[0], self.timecap_real) if g.fig is not None: plt.draw() # display relative position and velocity, and time rel_pos = target_pos - status[1:4] rel_pos = common.eclv2lv(rel_pos, status[1:4], status[4:], sun_pos, sun_vel) trange, tphi, telv = common.rect2polar(rel_pos) rel_vel = target_vel - status[4:] rel_vel = common.eclv2lv(rel_vel, status[1:4], status[4:], sun_pos, sun_vel) relabsvel, tvphi, tvelv = common.rect2polar(rel_vel) losvel = np.dot(rel_vel, rel_pos) / trange self.ui.RPTrange.setText('{:.3f}'.format(trange / 1000.0)) self.ui.RPTphi.setText('{:.2f}'.format(tphi)) self.ui.RPTelv.setText('{:.2f}'.format(telv)) self.ui.RVTvel.setText('{:.3f}'.format(relabsvel)) self.ui.RVTphi.setText('{:.2f}'.format(tvphi)) self.ui.RVTelv.setText('{:.2f}'.format(tvelv)) self.ui.LoSVvel.setText('{:.3f}'.format(losvel)) delta_jd = status[0] - self.start_time self.ui.currenttime.setText(common.jd2isot(status[0])) self.ui.delta_t_edit.setText('{:.8f}'.format(delta_jd))
def drawFLYTO(self): c_time = self.last_trj[0][self.c_index] delta_jd = c_time - self.start_time self.ui.currenttime.setText(common.jd2isot(c_time)) self.ui.delta_t_edit.setText('{:.8f}'.format(delta_jd)) ppos = np.zeros(3) pvel = np.zeros(3) ppos[0] = self.last_trj[1][self.c_index] ppos[1] = self.last_trj[2][self.c_index] ppos[2] = self.last_trj[3][self.c_index] pvel[0] = self.last_trj[4][self.c_index] pvel[1] = self.last_trj[5][self.c_index] pvel[2] = self.last_trj[6][self.c_index] ssacc = self.last_trj[7][self.c_index] self.savedstatus[0] = np.copy(c_time) self.savedstatus[1:4] = np.copy(ppos) self.savedstatus[4:7] = np.copy(pvel) erase_PKepler() if self.ui.check_PKepler.isChecked(): self.tbpred.fix_state(c_time, ppos, pvel) x, y, z, t = self.tbpred.points(g.ndata_s) g.probe_Kepler = [x, y, z] draw_PKepler() target_pos, target_vel = g.mytarget.posvel(c_time) sun_pos, sun_vel = common.SPKposvel(10, c_time) xlim = g.ax.get_xlim3d() hw = (xlim[1] - xlim[0]) * 0.5 if self.ui.tobarycenter.isChecked(): cent = [0.0, 0.0, 0.0] elif self.ui.toprobe.isChecked(): cent = ppos else: cent = target_pos g.ax.set_xlim3d(cent[0]-hw, cent[0]+hw) g.ax.set_ylim3d(cent[1]-hw, cent[1]+hw) g.ax.set_zlim3d(cent[2]-hw, cent[2]+hw) # redraw planets remove_planets() if self.ui.showplanets.isChecked(): replot_planets(c_time) if self.artist_of_probe is not None: self.artist_of_probe.remove() self.artist_of_probe = None self.artist_of_probe = g.ax.scatter(*ppos, s=40, c='r', depthshade=False, marker='x') if self.artist_of_target is not None: self.artist_of_target.remove() self.artist_of_target = None # Maneuver Type if self.artist_of_type is not None: self.artist_of_type.remove() self.artist_of_type = None if self.ui.showmantype.isChecked(): acctext = '' if self.c_maninfo['sson']: acctext = ' SSacc={:.3f}'.format(ssacc) if self.c_index == 0: self.artist_of_type = g.ax.text(*ppos, self.mantext+acctext+ ' (start)', color='r', fontsize=10) elif self.c_index + 1 == len(self.last_trj[0]): self.artist_of_type = g.ax.text(*ppos, self.mantext+acctext+ ' (end)', color='r', fontsize=10) else: self.artist_of_type = g.ax.text(*ppos, self.mantext+acctext, color='r', fontsize=10) self.artist_of_target = g.ax.scatter(*target_pos, s=50, c='g', depthshade=False, marker='+') if self.artist_of_sun is not None: self.artist_of_sun.remove() self.artist_of_sun = None self.artist_of_sun = g.ax.scatter(*sun_pos, s=50, c='#FFAF00', depthshade=False, marker='o') remove_time() replot_time(c_time, self.timecap_real) if g.fig is not None: plt.draw() # display relative position and velocity rel_pos = target_pos - ppos rel_pos = common.eclv2lv(rel_pos, ppos, pvel, sun_pos, sun_vel) trange, tphi, telv = common.rect2polar(rel_pos) rel_vel = target_vel - pvel rel_vel = common.eclv2lv(rel_vel, ppos, pvel, sun_pos, sun_vel) relabsvel, tvphi, tvelv = common.rect2polar(rel_vel) losvel = np.dot(rel_vel, rel_pos) / trange self.ui.RPTrange.setText('{:.3f}'.format(trange / 1000.0)) self.ui.RPTphi.setText('{:.2f}'.format(tphi)) self.ui.RPTelv.setText('{:.2f}'.format(telv)) self.ui.RVTvel.setText('{:.3f}'.format(relabsvel)) self.ui.RVTphi.setText('{:.2f}'.format(tvphi)) self.ui.RVTelv.setText('{:.2f}'.format(tvelv)) self.ui.LoSVvel.setText('{:.3f}'.format(losvel))