Secure your code as it's written. Use Snyk Code to scan source code in minutes - no build needed - and fix issues immediately.
@param altitude: The altidude we want to fly at, dont fly too high!
@param camera_angle: The angle of the camera
@param animal: The name of the animal, used to prefix the photos
"""
x = cx - radius
y = cy
# set camera angle
client.simSetCameraOrientation(0, airsim.to_quaternion(
camera_angle * math.pi / 180, 0, 0)) # radians
# move the drone to the requested location
print("moving to position...")
client.moveToPositionAsync(
x, y, z, 1, 60, drivetrain=airsim.DrivetrainType.MaxDegreeOfFreedom, yaw_mode=airsim.YawMode(False, 0)).join()
pos = client.getMultirotorState().kinematics_estimated.position
dx = x - pos.x_val
dy = y - pos.y_val
yaw = airsim.to_eularian_angles(
client.getMultirotorState().kinematics_estimated.orientation)[2]
# keep the drone on target, it's windy out there!
print("correcting position and yaw...")
while abs(dx) > 1 or abs(dy) > 1 or abs(yaw) > 0.1:
client.moveToPositionAsync(
x, y, z, 0.25, 60, drivetrain=airsim.DrivetrainType.MaxDegreeOfFreedom, yaw_mode=airsim.YawMode(False, 0)).join()
pos = client.getMultirotorState().kinematics_estimated.position
dx = x - pos.x_val
dy = y - pos.y_val
yaw = airsim.to_eularian_angles(
def take_snapshot(self):
# first hold our current position so drone doesn't try and keep flying while we take the picture.
pos = self.client.getMultirotorState().kinematics_estimated.position
self.client.moveToPositionAsync(pos.x_val, pos.y_val, self.z, 0.5, 10, airsim.DrivetrainType.MaxDegreeOfFreedom,
airsim.YawMode(False, self.camera_heading)).join()
responses = self.client.simGetImages([airsim.ImageRequest(1, airsim.ImageType.Scene)]) #scene vision image in png format
response = responses[0]
filename = "photo_" + str(self.snapshot_index)
self.snapshot_index += 1
airsim.write_file(os.path.normpath(filename + '.png'), response.image_data_uint8)
print("Saved snapshot: {}".format(filename))
self.start_time = time.time() # cause smooth ramp up to happen again after photo is taken.
pitch = action[0]
roll = action[1]
throttle = action[2]
yaw_rate = action[3]
duration = action[4]
self.client.moveByAngleThrottleAsync(pitch, roll, throttle, yaw_rate, duration, vehicle_name='').join()
else:
#pitch = np.clip(action[0], -0.261, 0.261)
#roll = np.clip(action[1], -0.261, 0.261)
#yaw_rate = np.clip(action[2], -3.14, 3.14)
if(settings.move_by_velocity):
vx = np.clip(action[0], -1.0, 1.0)
vy = np.clip(action[1], -1.0, 1.0)
#print("Vx, Vy--------------->"+str(vx)+", "+ str(vy))
#self.client.moveByAngleZAsync(float(pitch), float(roll), -6, float(yaw_rate), settings.duration_ppo).join()
self.client.moveByVelocityZAsync(float(vx), float(vy), -6, 0.5, 1, yaw_mode=airsim.YawMode(True, 0)).join()
elif(settings.move_by_position):
pos = self.drone_pos()
delta_x = np.clip(action[0], -1, 1)
delta_y = np.clip(action[1], -1, 1)
self.client.moveToPositionAsync(float(delta_x + pos[0]), float(delta_y + pos[1]), -6, 0.9, yaw_mode=airsim.YawMode(False, 0)).join()
collided = (self.client.getMultirotorState().trip_stats.collision_count > 0)
collided = (self.client.getMultirotorState().trip_stats.collision_count > 0)
return collided
# compute lookahead
lookahead_x = self.center.x_val + self.radius * \
math.cos(angle_to_center + lookahead_angle)
lookahead_y = self.center.y_val + self.radius * \
math.sin(angle_to_center + lookahead_angle)
vx = lookahead_x - pos.x_val
vy = lookahead_y - pos.y_val
if self.track_orbits(angle_to_center * 180 / math.pi):
count += 1
print("completed {} orbits".format(count))
self.camera_heading = camera_heading
self.client.moveByVelocityZAsync(
vx, vy, z, 1, airsim.DrivetrainType.MaxDegreeOfFreedom, airsim.YawMode(False, camera_heading))
self.client.moveToPositionAsync(start.x_val, start.y_val, z, 2).join()
camera_heading = (angle_to_center - math.pi) * 180 / math.pi
# compute lookahead
lookahead_x = self.center.x_val + self.radius * math.cos(angle_to_center + lookahead_angle)
lookahead_y = self.center.y_val + self.radius * math.sin(angle_to_center + lookahead_angle)
vx = lookahead_x - pos.x_val
vy = lookahead_y - pos.y_val
if self.track_orbits(angle_to_center * 180 / math.pi):
count += 1
print("completed {} orbits".format(count))
self.camera_heading = camera_heading
self.client.moveByVelocityZAsync(vx, vy, z, 1, airsim.DrivetrainType.MaxDegreeOfFreedom, airsim.YawMode(False, camera_heading))
self.client.moveToPositionAsync(start.x_val, start.y_val, z, 2).join()
if self.takeoff:
# if we did the takeoff then also do the landing.
if z < self.home.z_val:
print("descending")
self.client.moveToPositionAsync(start.x_val, start.y_val, self.home.z_val - 5, 2).join()
print("landing...")
self.client.landAsync().join()
print("disarming.")
self.client.armDisarm(False)
def take_snapshot(self):
if not os.path.exists(self.image_dir):
os.makedirs(self.image_dir)
# first hold our current position so drone doesn't try and keep flying while we take the picture.
pos = self.client.getMultirotorState().kinematics_estimated.position
self.client.moveToPositionAsync(pos.x_val, pos.y_val, self.z, 0.25, 3, airsim.DrivetrainType.MaxDegreeOfFreedom,
airsim.YawMode(False, self.camera_heading))
responses = self.client.simGetImages([airsim.ImageRequest(
0, airsim.ImageType.Scene)]) # scene vision image in png format
response = responses[0]
filename = self.photo_prefix + \
str(self.snapshot_index) + "_" + str(int(time.time()))
self.snapshot_index += 1
airsim.write_file(os.path.normpath(
self.image_dir + filename + '.png'), response.image_data_uint8)
print("Saved snapshot: {}".format(filename))
# cause smooth ramp up to happen again after photo is taken.
self.start_time = time.time()