manuver node execution
This commit is contained in:
		
						commit
						c8a839b49c
					
				
					 4 changed files with 128 additions and 0 deletions
				
			
		
							
								
								
									
										7
									
								
								lib/SASCheck.ks
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								lib/SASCheck.ks
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,7 @@
 | 
			
		|||
function sascheck { //returns the average exaust velocity of active engines. to convert to isp, divide by constant:g0
 | 
			
		||||
	set saslist to ship:modulesnamed("ModuleSAS").
 | 
			
		||||
	if saslist:length = 0 {
 | 
			
		||||
		return false.
 | 
			
		||||
	}
 | 
			
		||||
	return true.
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										16
									
								
								lib/isp.ks
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								lib/isp.ks
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,16 @@
 | 
			
		|||
function evcalc { //returns the average exaust velocity of active engines. to convert to isp, divide by constant:g0
 | 
			
		||||
	local englist is list().
 | 
			
		||||
	local totalflow is 0.
 | 
			
		||||
	local totalthrust is 0.
 | 
			
		||||
	list engines in englist.
 | 
			
		||||
	for eng in englist { 
 | 
			
		||||
		if eng:ignition and not eng:flameout {
 | 
			
		||||
			set totalflow to totalflow + (eng:possiblethrust /(eng:isp * constant:g0)).
 | 
			
		||||
			set totalthrust to totalthrust + eng:possiblethrust.
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	if totalthrust = 0 { //avoid div by 0 later
 | 
			
		||||
		return 1.
 | 
			
		||||
	}
 | 
			
		||||
	return (totalthrust / totalflow).
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										5
									
								
								loadmanprogram.ks
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										5
									
								
								loadmanprogram.ks
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,5 @@
 | 
			
		|||
if not exists("1:/lib") {
 | 
			
		||||
	createdir("1:/lib").
 | 
			
		||||
}
 | 
			
		||||
compile "0:/lib/isp.ks" to "1:/lib/isp.ksm".
 | 
			
		||||
compile "0:/nde.ks" to "1:/nde.ksm".
 | 
			
		||||
							
								
								
									
										100
									
								
								nde.ks
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										100
									
								
								nde.ks
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,100 @@
 | 
			
		|||
//import functions
 | 
			
		||||
run once "lib/isp".
 | 
			
		||||
set nd to nextnode.
 | 
			
		||||
 | 
			
		||||
//print out node's basic parameters - eta and deltav
 | 
			
		||||
print "node in: " + round(nd:eta) + ", deltav: " + round(nd:deltav:mag).
 | 
			
		||||
 | 
			
		||||
//calculate ship's max acceleration
 | 
			
		||||
set maxacc to ship:availablethrust/ship:mass.
 | 
			
		||||
 | 
			
		||||
// calculate exaust velocity of all active engines
 | 
			
		||||
set ev to evcalc().
 | 
			
		||||
set thrust to ship:availablethrust.
 | 
			
		||||
set dv to nd:deltav:mag.
 | 
			
		||||
//magic equasion to figure burnduration.
 | 
			
		||||
set burnduration to ((ship:mass*ev)/thrust)*(1-constant:e^(-(dv/ev))).
 | 
			
		||||
print "estimated burn duration: " + round(burnduration) + "s".
 | 
			
		||||
 | 
			
		||||
sas off.
 | 
			
		||||
set steeringmanager:maxstoppingtime to 10.
 | 
			
		||||
set steeringmanager:pitchpid:kd to 2.
 | 
			
		||||
set steeringmanager:yawpid:kd to 2.
 | 
			
		||||
set steeringmanager:rollpid:kd to 2.
 | 
			
		||||
lock steering to lookdirup(nd:deltav, sun:position). //points to node, roll so that solar panels are facing towards sun.(design craft so solar panels are pointing out of vab door and directly away from vab door.)
 | 
			
		||||
// sas is better at steering craft with very little control.
 | 
			
		||||
//sas on.
 | 
			
		||||
//sas needs 1 tick between turning on and setting mode.
 | 
			
		||||
//wait until true.
 | 
			
		||||
//set sasmode to "maneuver".
 | 
			
		||||
//now we need to wait until the burn vector and ship's facing are aligned
 | 
			
		||||
wait until vang(nd:deltav, ship:facing:vector) < 0.25.
 | 
			
		||||
 | 
			
		||||
//warp to 60 seconds before the burn, if we are more than 90 seconds away from it. otherwise, we wait.
 | 
			
		||||
if nd:eta-(burnduration/2) > 90 {
 | 
			
		||||
	set unwarptime to time:seconds+nd:eta-(burnduration/2)-60.
 | 
			
		||||
	kuniverse:timewarp:warpto(unwarptime).
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//give some time for our sunroll.
 | 
			
		||||
wait until nd:eta <= ((burnduration/2)+55).
 | 
			
		||||
 | 
			
		||||
set steeringmanager:maxstoppingtime to 2.
 | 
			
		||||
set steeringmanager:pitchpid:kd to 2.
 | 
			
		||||
set steeringmanager:yawpid:kd to 2.
 | 
			
		||||
set steeringmanager:rollpid:kd to 2.
 | 
			
		||||
//lock the steering, so we wont be chasing the manuver node.
 | 
			
		||||
//points to node, roll so that solar panels are facing towards sun.(design craft so solar panels are pointing out of vab door and directly away from vab door.)
 | 
			
		||||
set dir to lookdirup(nd:deltav, sun:position).
 | 
			
		||||
lock steering to dir.
 | 
			
		||||
 | 
			
		||||
//the ship is facing the right direction, let's wait for our burn time
 | 
			
		||||
wait until nd:eta <= (burnduration/2).
 | 
			
		||||
 | 
			
		||||
//we only need to lock throttle once to a certain variable in the beginning of the loop, and adjust only the variable itself inside it
 | 
			
		||||
set tset to 0.
 | 
			
		||||
lock throttle to tset.
 | 
			
		||||
 | 
			
		||||
set done to false.
 | 
			
		||||
//initial deltav
 | 
			
		||||
set dv0 to nd:deltav.
 | 
			
		||||
until done
 | 
			
		||||
{
 | 
			
		||||
	//recalculate current maxacceleration, as it changes while we burn through fuel
 | 
			
		||||
	set maxacc to ship:availablethrust/ship:mass.
 | 
			
		||||
 | 
			
		||||
	//throttle is 100% until there is less than 1 second of time left to burn
 | 
			
		||||
	//when there is less than 1 second - decrease the throttle linearly
 | 
			
		||||
	set tset to min(nd:deltav:mag/maxacc, 1).
 | 
			
		||||
 | 
			
		||||
	//here's the tricky part, we need to cut the throttle as soon as our nd:deltav and initial deltav start facing opposite directions
 | 
			
		||||
    //this check is done via checking the dot product of those 2 vectors
 | 
			
		||||
    if vdot(dv0, nd:deltav) < 0
 | 
			
		||||
    {
 | 
			
		||||
        print "end burn, remain dv " + round(nd:deltav:mag,1) + "m/s, vdot: " + round(vdot(dv0, nd:deltav),1).
 | 
			
		||||
        lock throttle to 0.
 | 
			
		||||
        break.
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
	//we have very little left to burn, less then 0.1m/s
 | 
			
		||||
	if nd:deltav:mag < 0.1 {
 | 
			
		||||
		print "finalizing burn, remain dv " + round(nd:deltav:mag,1) + "m/s, vdot: " + round(vdot(dv0, nd:deltav),1).
 | 
			
		||||
		//we burn slowly until our node vector starts to drift significantly from initial vector
 | 
			
		||||
		//this usually means we are on point
 | 
			
		||||
		wait until vdot(dv0, nd:deltav) < 0.5.
 | 
			
		||||
 | 
			
		||||
		lock throttle to 0.
 | 
			
		||||
		print "end burn, remain dv " + round(nd:deltav:mag,1) + "m/s, vdot: " + round(vdot(dv0, nd:deltav),1).
 | 
			
		||||
		set done to true.
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
unlock steering.
 | 
			
		||||
unlock throttle.
 | 
			
		||||
wait 1.
 | 
			
		||||
 | 
			
		||||
//we no longer need the maneuver node
 | 
			
		||||
remove nd.
 | 
			
		||||
 | 
			
		||||
//set throttle to 0 just in case.
 | 
			
		||||
set ship:control:pilotmainthrottle to 0.
 | 
			
		||||
sas on.
 | 
			
		||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue