I've done something similar for a sentry enemy that chases players that it sees. From what I can see, the main problem is that the enemies aren't keeping track of the player.
onready var end_pos = $Player/Position2D.position
Instead you should do:
onready var player = $Player/Position2D
...
func _on_Timer2_timeout():
var e = enem.instance()
add_child(e)
e.position = pos2
e.kinematic_goal = player
e.nav = navv
connect("pos_update", e,"update_path")
And then in the enemy:
func update_path():
path = nav.get_simple_path(position, kinematic_goal.position, false) # Note use of kinematic_goal node to get up-to-date position of player
func _process(delta):
if path.size() > 1:
var d = position.distance_to(path[0])
if d > 2:
position = position.linear_interpolate(path[0], (WALK_SPEED * delta)/d)
else:
path.remove(0)
update_path() # IMPORTANT BIT
Technically, you could just call updatepath() only when path.size == 0, but I've found that it makes the enemies feel more responsive when they recalculate their direction more consistently (you could also add a counter to updatepath every couple of frames).