-
Notifications
You must be signed in to change notification settings - Fork 4.7k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* [docs] Move drone survey wiki page * [docs] Move Orbit Wiki page * [docs] Move Point Clouds Wiki page
- Loading branch information
Showing
8 changed files
with
99 additions
and
10 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,50 @@ | ||
# Implementing a Drone Survey script | ||
|
||
Moved here from [https://github.com/microsoft/AirSim/wiki/Implementing-a-Drone-Survey-script](https://github.com/microsoft/AirSim/wiki/Implementing-a-Drone-Survey-script) | ||
|
||
Ever wanted to capture a bunch of top-down pictures of a certain location? Well, the Python API makes this really simple. See the [code available here](https://github.com/microsoft/AirSim/blob/master/PythonClient/multirotor/survey.py). | ||
|
||
![survey](images/survey.png) | ||
|
||
Let's assume we want the following variables: | ||
|
||
| Variable | Description | | ||
| ------------- | ------------- | | ||
| boxsize | The overall size of the square box to survey | | ||
| stripewidth | How far apart to drive the swim lanes, this can depend on the type of camera lens, for example. | | ||
| altitude | The height to fly the survey. | | ||
| speed | The speed of the survey can depend on how fast your camera can snap shots. | | ||
|
||
So with these we can compute a square path box using this code: | ||
|
||
```python | ||
path = [] | ||
distance = 0 | ||
while x < self.boxsize: | ||
distance += self.boxsize | ||
path.append(Vector3r(x, self.boxsize, z)) | ||
x += self.stripewidth | ||
distance += self.stripewidth | ||
path.append(Vector3r(x, self.boxsize, z)) | ||
distance += self.boxsize | ||
path.append(Vector3r(x, -self.boxsize, z)) | ||
x += self.stripewidth | ||
distance += self.stripewidth | ||
path.append(Vector3r(x, -self.boxsize, z)) | ||
distance += self.boxsize | ||
``` | ||
Assuming we start in the corner of the box, increment x by the stripe width, then fly the full y-dimension of `-boxsize` to `+boxsize`, so in this case, `boxsize` is half the size of the actual box we will be covering. | ||
|
||
Once we have this list of Vector3r objects, we can fly this path very simply with the following call: | ||
```python | ||
result = self.client.moveOnPath(path, self.velocity, trip_time, DrivetrainType.ForwardOnly, | ||
YawMode(False,0), lookahead, 1) | ||
``` | ||
|
||
We can compute an appropriate `trip_time` timeout by dividing the distance of the path and the speed we are flying. | ||
|
||
The `lookahead` needed here for smooth path interpolation can be computed from the velocity using `self.velocity + (self.velocity/2)`. The more lookahead, the smoother the turns. This is why you see in the screenshot that the ends of each swimland are smooth turns rather than a square box pattern. This can result in a smoother video from your camera also. | ||
|
||
That's it, pretty simple, eh? | ||
|
||
Now of course you can add a lot more intelligence to this, make it avoid known obstacles on your map, make it climb up and down a hillside so you can survey a slope, etc. Lots of fun to be had. |
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,21 @@ | ||
# An Orbit Trajectory | ||
|
||
Moved here from [https://github.com/microsoft/AirSim/wiki/An-Orbit-Trajectory](https://github.com/microsoft/AirSim/wiki/An-Orbit-Trajectory) | ||
|
||
Have you ever wanted to fly a nice smooth circular orbit? This can be handy for capturing 3D objects from all sides especially if you get multiple orbits at different altitudes. | ||
|
||
So the `PythonClient/multirotor` folder contains a script named [Orbit](https://github.com/microsoft/AirSim/blob/master/PythonClient/multirotor/orbit.py) that will do precisely that. | ||
|
||
See [demo video](https://youtu.be/RFG5CTQi3Us) | ||
|
||
The demo video was created by running this command line: | ||
|
||
```shell | ||
python orbit.py --radius 10 --altitude 5 --speed 1 --center "0,1" --iterations 1 | ||
``` | ||
|
||
This flies a 10 meter radius orbit around the center location at (startpos + radius * [0,1]), in other words, the center is located `radius` meters away in the direction of the provided center vector. It also keeps the front-facing camera on the drone always pointing at the center of the circle. If you watch the flight using LogViewer you will see a nice circular pattern get traced out on the GPS map: | ||
|
||
![image](images/orbit.png) | ||
|
||
The core of the algorithm is not that complicated. At each point on the circle, we look ahead by a small delta in degrees, called the `lookahead_angle`, where that angle is computed based on our desired velocity. We then find that lookahead point on the circle using sin/cosine and make that our "target point". Calculating the velocity then is easy, just subtract our current position from that point and feed that into the AirSim method `moveByVelocityZ`. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
# Point Clouds | ||
|
||
Moved here from [https://github.com/microsoft/AirSim/wiki/Point-Clouds](https://github.com/microsoft/AirSim/wiki/Point-Clouds) | ||
|
||
A Python script [point_cloud.py](https://github.com/Microsoft/AirSim/blob/master/PythonClient/multirotor/point_cloud.py) shows how to convert the depth image returned from AirSim into a point cloud. | ||
|
||
The following depth image was captured using the Modular Neighborhood environment: | ||
|
||
![depth](images/depth.png) | ||
|
||
And with the appropriate projection matrix, the OpenCV `reprojectImageTo3D` function can turn this into a point cloud. The following is the result, which is also available here: [https://skfb.ly/68r7y](https://skfb.ly/68r7y). | ||
|
||
![depth](images/point_cloud.png) | ||
|
||
[SketchFab](https://sketchfab.com) can upload the resulting file `cloud.asc` and render it for you. | ||
|
||
PS: you may notice the scene is reflected on the Y axis, so I may have a sign wrong in the projection matrix. An exercise for the reader :-) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters