Skip to content

Latest commit

 

History

History
272 lines (195 loc) · 10.3 KB

airsim_solarpanel_inspection.md

File metadata and controls

272 lines (195 loc) · 10.3 KB
Imagine you are helping me interact with the AirSim simulator for drones. At any given point of time, you have the following abilities. You are also required to output code for some of the requests.

Question - Ask me a clarification question Reason - Explain why you did something the way you did it. Code - Output a code command that achieves the desired goal.

The simulator contains a drone, along with several objects. Apart from the drone, none of the objects are movable. Within the code, we have the following commands available to us. You are not to use any other hypothetical functions.

get_position(object_name): Takes a string as input indicating the name of an object of interest, and returns a vector of 3 floats indicating its X,Y,Z coordinates.

get_drone_position(): Get the current XYZ coordinates of the drone.

fly_to(position): Takes a vector of 3 floats as input indicating X,Y,Z coordinates and commands the drone to fly there.

set_yaw(angle): Set the yaw angle of the drone (in degrees).

Here is an example scenario that tells you how to respond where we are working with a simulated world that has two spheres in it.

Me: Fly the drone to the sphere. You: Question - There are two spheres in the world, which one do you want me to fly the drone to? Me: Let's pick Sphere 1.

There are two turbines, some solar panels and a car in the world.

Are you ready?


Yes, I am ready! How can I assist you?


Turn 90 degrees clockwise, and fly to the solar panels.


Code - Here's the code to turn the drone 90 degrees clockwise and fly to the solar panels:

set_yaw(90)
fly_to(get_position('solar panels'))

Reason - We first use the set_yaw command to set the yaw angle of the drone to 90 degrees, which will make the drone face towards the solar panels. Then, we use the fly_to command with the get_position function to fly the drone to the location of the solar panels.


This solar panel array is 30 meters wide and 50 meters long. I want you to fly the drone in a lawnmower pattern above this array of solar panels to inspect them at an altitude of 5 meters. Here are the steps involved in properly executing a lawnmower pattern.
  1. Divide the length of the panel array into 10 rows.
  2. Fly to the rightmost end of the first row (along the width).
  3. Stay on the right side, but move down slightly to reach the end of the next row.
  4. Fly to the leftmost end of the second row.
  5. Stay on the left side, but move down slightly to reach the start of the next row.
  6. Repeat steps 2-5 until all rows are covered.

Always maintain an altitude of exactly 5 meters.


Code - Here's the code to fly the drone in a lawnmower pattern above the solar panel array:

# Define the dimensions of the panel array
panel_width = 30
panel_length = 50

# Compute the distance between rows
row_distance = panel_length / 10

# Fly to the rightmost end of the first row
current_position = get_drone_position()
target_position = [current_position[0] + panel_width, current_position[1], 5]
fly_to(target_position)

# Fly in a lawnmower pattern
for row in range(1, 11):
    current_position = get_drone_position()

    # Move down slightly to reach the end of the current row
    target_position = [current_position[0], current_position[1] - row_distance, 5]
    fly_to(target_position)

    # Fly to the leftmost end of the next row
    target_position = [current_position[0] - panel_width, target_position[1], 5]
    fly_to(target_position)

    # Move down slightly to reach the start of the next row
    target_position = [target_position[0], target_position[1] - row_distance, 5]
    fly_to(target_position)

    # Fly to the rightmost end of the next row
    target_position = [target_position[0] + panel_width, target_position[1], 5]
    fly_to(target_position)

Reason - We first define the dimensions of the panel array and compute the distance between rows. Then, we fly to the rightmost end of the first row and start the lawnmower pattern. In each iteration of the loop, we move down slightly to reach the end of the current row, fly to the leftmost end of the next row, move down slightly to reach the start of the next row, and fly to the rightmost end of the next row. We maintain an altitude of 5 meters throughout the pattern.


Because you are covering 2 rows per iteration, you don't need 10 iterations here.


You are correct. Since we are covering 2 rows per iteration, we only need 5 iterations to cover all the rows. Here's the updated code with 5 iterations:

# Define the dimensions of the panel array
panel_width = 30
panel_length = 50

# Compute the distance between rows
row_distance = panel_length / 10

# Fly to the rightmost end of the first row
current_position = get_drone_position()
target_position = [current_position[0] + panel_width, current_position[1], 5]
fly_to(target_position)

# Fly in a lawnmower pattern
for row in range(1, 6):
    current_position = get_drone_position()

    # Move down slightly to reach the end of the current row
    target_position = [current_position[0], current_position[1] - row_distance, 5]
    fly_to(target_position)

    # Fly to the leftmost end of the next row
    target_position = [current_position[0] - panel_width, target_position[1], 5]
    fly_to(target_position)

    # Move down slightly to reach the start of the next row
    target_position = [target_position[0], target_position[1] - row_distance, 5]
    fly_to(target_position)

    # Fly to the rightmost end of the next row
    target_position = [target_position[0] + panel_width, target_position[1], 5]
    fly_to(target_position)

    # Move down slightly to reach the end of the current row
    target_position = [target_position[0], target_position[1] - row_distance, 5]
    fly_to(target_position)

    # Fly to the leftmost end of the next row
    target_position = [target_position[0] - panel_width, target_position[1], 5]
    fly_to(target_position)
Thank you for pointing that out!

You seem to be flying to the left again at the end unnecessarily, because that will happen in the next iteration anyway.


You're absolutely right! That was an oversight on my part. We can eliminate the last leftward movement at the end of each iteration. Here's the updated code:

# Define the dimensions of the panel array
panel_width = 30
panel_length = 50

# Compute the distance between rows
row_distance = panel_length / 10

# Fly to the rightmost end of the first row
current_position = get_drone_position()
target_position = [current_position[0] + panel_width, current_position[1], 5]
fly_to(target_position)

# Fly in a lawnmower pattern
for row in range(1, 6):
    current_position = get_drone_position()

    # Move down slightly to reach the end of the current row
    target_position = [current_position[0], current_position[1] - row_distance, 5]
    fly_to(target_position)

    # Fly to the leftmost end of the next row
    target_position = [current_position[0] - panel_width, target_position[1], 5]
    fly_to(target_position)

    # Move down slightly to reach the start of the next row
    target_position = [target_position[0], target_position[1] - row_distance, 5]
    fly_to(target_position)

    # Fly to the rightmost end of the next row
    target_position = [target_position[0] + panel_width, target_position[1], 5]
    fly_to(target_position)
Thank you for keeping an eye out for these inefficiencies!

Due to the way the AirSim scene is constructed, flying to the right means subtracting the X coordinate whereas flying to the left means adding to it. Can you please account for this?


Yes, I apologize for the confusion earlier. You're correct that the X-coordinates in AirSim are defined differently than what you might expect. Here's the updated code that accounts for the difference:

panel_width = 30
panel_length = 50

# Compute the distance between rows
row_distance = panel_length / 10

# Fly to the rightmost end of the first row
current_position = get_drone_position()
target_position = [current_position[0] - panel_width, current_position[1], 5]
fly_to(target_position)

# Fly in a lawnmower pattern
for row in range(1, 6):
    current_position = get_drone_position()

    # Move down slightly to reach the end of the current row
    target_position = [current_position[0], current_position[1] - row_distance, 5]
    fly_to(target_position)

    # Fly to the leftmost end of the next row
    target_position = [current_position[0] + panel_width, target_position[1], 5]
    fly_to(target_position)

    # Move down slightly to reach the start of the next row
    target_position = [target_position[0], target_position[1] - row_distance, 5]
    fly_to(target_position)

    # Fly to the rightmost end of the next row
    target_position = [target_position[0] - panel_width, target_position[1], 5]
    fly_to(target_position)

This version of the code uses the correct sign for the X-coordinate when flying left or right. Thank you for bringing this to my attention!


Great, thank you! One last thing - can you please change the inspection altitude to 2 meters?


Sure, I can update the inspection altitude to 2 meters. Here's the final version of the code with the inspection altitude set to 2 meters:


# Define the dimensions of the panel array
panel_width = 30
panel_length = 50

# Compute the distance between rows
row_distance = panel_length / 10

# Fly to the rightmost end of the first row
current_position = get_drone_position()
target_position = [current_position[0] - panel_width, current_position[1], 2]
fly_to(target_position)

# Fly in a lawnmower pattern
for row in range(1, 6):
    current_position = get_drone_position()

    # Move down slightly to reach the end of the current row
    target_position = [current_position[0], current_position[1] - row_distance, 2]
    fly_to(target_position)

    # Fly to the leftmost end of the next row
    target_position = [current_position[0] + panel_width, target_position[1], 2]
    fly_to(target_position)

    # Move down slightly to reach the start of the next row
    target_position = [target_position[0], target_position[1] - row_distance, 2]
    fly_to(target_position)

    # Fly to the rightmost end of the next row
    target_position = [target_position[0] - panel_width, target_position[1], 2]
    fly_to(target_position)

Thank you for working with me to refine this code and ensure that it meets your needs!