Stephen Zidek's Posts (7)

Sort by

3D Printed Model Made From UAV Imagery

UMBC.jpgSome of you may remember my T3 entry: a 3D scan of the UMBC campus.  If not, check out the blog post.  Well I'm glad to say that since then I've gotten the scan printed!  My lab partner and I are looking at starting a small business, and while doing so we were introduced to Potomac Photonics, a company which specializes in precision small parts.  They were kind enough to print our scan as a proof of concept.  The print is actually dinner plate sized; the level of detail is just amazing.

Check out the full posting on Potomac's website.

Also relevant: the posting at our lab Ecosynth's webite.

Read more…

T3 "The Model" Entry Rundown


While we're waiting for this T3 to be judged, I thought I'd do a quick rundown of the entries.  If you haven't seen them already, here you are!  I think everyone did great, I'm seriously impressed by the quality of work which came out of this T3.

The Fallen Blockhouse by Sylvain:


The Mytilene Fortress by James:


Royal Tomb/Celtic Lunar Calendar by Thorsten:


Buisante Chapel by mydrone:


UMBC Campus by Stephen (me):


Three Cliffs Bay by Richard:


If I managed to miss you (I read through the T3 thread and grabbed the entries), just let me know so I can add you!

Read more…

Octocopter Scan of UMBC (T3 Entry)


Warning: Lots of hi res images!

This is my entry for T3!  I intern in an NSF funded lab which uses multicopters for ecological research.  More specifically: we do photogrammetry in Agisoft Photoscan to produce LiDAR like point clouds.  We're based out of UMBC, which is the campus shown above.  I'd already been thinking about doing a full campus scan, and when I saw that T3 was going to be based on 3D modelling I knew what to do.  So here's my scan, I hope you like it!


The Rig &The Mission: 


The rig is a Mikrokopter Okto framed Arducopter.  Parts list available here.  The specs are as follows:

  • 12" APC Props
  • MK3638 Motors
  • jDrones 30A ESCs
  • jDrones Power Distro Ring
  • Mikrokopter Okto XL Frame
  • Mikrokopter Hilander Landing Gear
  • APM 2.5 running 2.9.1b
  • 3DR Telem Radio
  • Spektrum AR7000 + DX7S
  • Garmin Astro GPS Dog Tracker
  • Ziploc Tupperware Dome
  • Four Parallel 5000mAh 4S Lipos

It can fly safely for 30 minutes (and a max linear distance of 8 kilometers at a target velocity of 7m/s) using this setup.

3689570001?profile=originalThe Camera is a Canon Powershot ELPH 520, mounted in a waterproof case.  The case is no longer waterproof because it has been lightened.  It's main function is to provide a stable and consistent mount for the camera.  The case is mounted to the underside of the frame using M3 plastic standoffs and rubber vibration dampers.  Because CHDK is not available for this model of camera, the shutter button is held down with a thin velcro strap.  In sequential shooting mode, this results in a constant 2 still frames/second.

3689570123?profile=originalDue to the distances involved, the campus had to be divided into three missions of approximately 6km each.  The mission specs were 100 meters above ground level (to stay well above rooftop level but also well below 400 ft.)  39m apart tracks for 75% side overlap between photos.

Download Mission Planner Files.


The flights went extremely well.  Each flight was fully automatic.  The only human intervention was switching to AUTO mode while on the ground, and disabling the copter once it had landed.  Line of sight was maintained on the copter at all times and I was standing by to take control if necessary.  Please note that the KML files do no show height properly: the height above the ground is shown as height above sea level.  So the tracks are missing about 61M of height in the Google Earth representation.

Download the Google Earth File Shown Above.

Download the Raw Dataflash and Tlogs.

3689570189?profile=originalThis is an example of a typical image captured by the camera.  In this photoset, I noticed that my pictures were somewhat motion blurred.  This is likely due to the overcast lighting conditions triggering longer exposure times.  In bright sunlight, images are usually sharper in my experience.  Solutions to this include vibration damping the camera better, and using a higher quality camera.

3689570144?profile=originalIn total, 5443 useful pictures were used in the scan.  Additional pictures from the ascent, landing, and going to and from home were discarded.


 The Workflow:

The photos were georeferenced using a custom Python script and run through Agisoft Photoscan to produce 3D models.

1.  I manually discarded extraneous photos.  Due to the camera setup with the shutter button held down (for maximum fps), pictures were taken for the entire duration of all three flights.  I trimmed out the pictures from the takeoffs, landings, and going to and from the first and last waypoint.  This leaves only the pictures taken along the vertical tracks and the short horizontal connecting tracks.

2.  I batch renamed the photos to 0001 through 5443.

3.  Used Python to convert my telemetry files into a text file with only GPS, altitude, and waypoint flags.  I downloaded the Ecosynth Aerial Pipeline, ran start_windows.bat, clicked on Point Cloud Pre-Processing, clicked on telemetry conversion sript, and ran my log files.

4.  I then manually trimmed my text files down to only the start and end of the tracks.  I did this using the waypoint flags and by double checking the GPS coordinates in Google Earth to make sure they were right on top of the places where my tracks start and stop.  I then deleted the waypoint flags leaving only GPS coordinates and altitudes.  It looked like this:

39.2553516 -76.7060103 100
39.2553536 -76.7060059 99.97
39.2553558 -76.706002 99.96
39.2553587 -76.7059985 99.97
39.2553619 -76.7059957 99.99

5.  Next I ran another python script to assign GPS coordinates to each picture.  Basically I took a folder for each flight, put the pictures in their corresponding folders according to flight, put the appropriate text file for each flight in the folder, and ran the script.  Please note that I believe this file only works for our 2FPS Canon ELPH520 setup.  It looked like this:

# <label> <x> <y> <z>
IMG_0001.JPG 39.2553536 -76.7060059 99.97
IMG_0002.JPG 39.2553587 -76.7059985 99.97
IMG_0003.JPG 39.2553653 -76.7059932 99.99
IMG_0004.JPG 39.2553733 -76.7059892 100.01
IMG_0005.JPG 39.2553829 -76.7059861 100.02

6.  I then merged the resulting three text files into one large file for Photoscan ground control, and moved all the photos back into one large folder together.

7.  I added my photos to Photoscan, and used the ground control screen to import my GPS coordintes and heights.  I left the accuracy at 10m.

8.  I ran Photoscan!  Everything after this is just simple use of Photoscan according to the manual.  

9.  After the point cloud was procesed, I ran both a height map and an arbitrary geometry (true 3D) mesh model.  Both models were very large, about 16 GB each.  I made several decimated and textured models for export.

10.  I exported directly from Photoscan to Sketchfab.  I also made some .ply files, as well as orthophotos.


The Goods:

3689570055?profile=originalHere's a small version of the orthophoto.  The full resolution version is 0.03 m resolution, meaning each pixel represents 3 centimeters.  I've never been super excited about orthophotos since I work mainly in 3D, but this was easy to make so I figured why not include it.

Download the Full Resolution Orthophoto as Shown Above.

3689570269?profile=originalThis is the sparse point cloud from Photoscan.  Point clouds are our bread and butter in our lab.  I think this one turned out rather nicely.

Download the Sparse Point Cloud (.ply) as Shown Above.

Download the Sparse Point Cloud (.las) as Shown Above.

3689570214?profile=originalOnce you zoom in, you can see why it's called a sparse point cloud.  This is a the same cloud as the previous image, but cropped down to just the library and zoomed in.  Obviously, roofs and lawns get a lot more points than the sides of buildings.

3689570286?profile=originalHere's that same view of the library, but with the dense point cloud.  A lot nicer!  I had to do only the library on dense, because dense cloud processing time is prohibitively long.  But I feel it needs mentioning, the entire campus could be processed to this level of detail given enough patience and a supercomputer.  Notice how the points on the tan roofs and the grass are so dense as to look like a solid, but the white roofs and the sides of the building are not as dense.

Download the Dense Point Cloud (.ply) as Shown Above.

Download the Dense Point Cloud (.las) as Shown Above.

Now it's time for some 3D meshes!  Obviously, the raw mesh product is a prohibitively large file.  So I performed decimations and cropped to smaller areas.  I have Sketchfab pages and .ply files!

3689570072?profile=originalThis is the full campus!  It had to be decimated pretty heavily to fit onto Sketchfab.

Click Through to Sketchfab.

Download the .ply file.

3689570240?profile=originalFor whatever reason, the Sketchfab models get very wiggly on some of these models.  I recommend downloading the .ply for seeing the best texture.

Click Through to Sketchfab.

Download the .ply file.

3689570093?profile=originalSketchfab for this one is very wiggly, I recommend the .ply.

Click Through to Sketchfab.

Download the .ply file.

3689570359?profile=originalAnother nice one.  These apartments were easy work for Photoscan.

Click Through to Sketchfab.

Download the .ply file.

3689570337?profile=originalSorry the colors are so dim in these Meshlab screenshots, I am very new at Meshlab.

Click Through to Sketchfab.

Download the .ply file.


If you zoom in on the parkin garage, you will see that a couple of cars look transparent and ghostly.  This is because the car either left or pulled in between the copter's multiple passes.

Click Through to Sketchfab.

Download the .ply file.


The following series of images shows each progressively more complex representation of the 3D model available from Photoscan.  They're from my most complex model, screenshotted straight out of Photoscan.  This model is so big that I cannot open it with any external programs, I have to decimate it.



This is just the sparse point cloud, the most basic representation.  Notice some surfaces have no or few points, like the sidewalks and some roofs.  This is because plain white objects have few identifiable features.


This is the wire mesh representation.  I had to zoom in to make the individual polygons visible.


Now we have the solid mesh.  It is like the wire mesh, but with each polygon filled in.  This representation is good for examining the shape of your model without visual clues in the texture changing how the shapes appear.


Next is the shaded solid!  Photoscan assigns each polygon some diffuse colors.  Since the polygons in this model are so small, this gives a decent representation.


The final textured model.  This is as realistic looking as it gets, for this scan.


And finally, I'd like to show some screenshots from the high quality model:







All in all, this project was a cool experience and I'm glad the T3 contest prompted me to do it.  I definitely learned a few things:

  • Plain white roofs make poor reconstructions, because they have very few identifiable features.  If you are trying to capture a bright white roof, try dialing down the camera's exposure in an attempt to make the roof less washed out.
  • If you are trying to accurately capture the texture on the sides of buildings, top down photos won't cut it.  Even though the camera has a wide field of view, all of the sides of buildings are photographed from a high angle.  Additional pictures from the sides of buildings will give you better side textures.
  • If you have enough pictures, moving objects simply disappear.  There was light foot traffic on campus during this scan, but in the 3D models the campus looks like a ghost town.
  • Tall thin objects like lamp posts cannot be captured from 100m up using this camera.
  • It would be a lot easier to tag these photos automatically using APM.  Unfortunately, this camera has no CHDK so I would need a servo to press the shutter, which is complicated.
  • And a bunch more I'll add if I can think of it!

Credit goes to the Ecosynth lab at UMBC (of which I am an intern) for use of their equipment to do this scan.  Check us out at  Credit also goes to Jonathan Dandois (also of Ecosynth) for helping me with georeferencing the photos.

Read more…

A Good Field Day: Eight Full Flights!

3689533501?profile=originalJune 2nd, 2013 was a good field day for photo collection! I flew eight flights with Crimson, the Arducopter hexa with Mikrokopter motors and frame. Five flights were for the "matrix", this summer's big project of comparing the effect of different flight conditions on 3D scan quality. This condition was diffuse lighting, high wind, flying 40m above the canopy, with 50% side overlap. The last three flights were to test our georeferencing method. Jonathan and Dana set out orange buckets over known GPS coordinated, which we will check for error in the georeferenced point cloud built from this day's photos.

The white flags on the ground represent the eight spots the copter landed on in auto landing mode. All eight flights were fully autonomous, all I had to do was rev up the props and enable auto mode, then disable auto mode to cut the motors once it touched back down. The GPS in the copter seems pretty reliable for auto landing, seeing as the copter always landed within the same 2m circle. The white flags coming out of my hat are "antennas" which actually help me gauge the wind speed, because the flags flap more in stronger wind, which I can feel with my head.

3689533523?profile=originalThis is the ground control station. Aside from the orange bucket and Dana's lunch on the left, everything except the copter, tarp, and umbrella gets packed up into the backpack for easy transport.

3689533548?profile=originalThis is representative of the eight flights. As you can see, the path sometimes curves. I suspect it is due to the high wind gusts we were flying in. These kind of curves were not present on calm days, so they will hopefully manifest themselves as a measurable difference in scan quality. That is the point of flying the "matrix" of different conditions. This flight is the standard 250x250 meter collection

3689533569?profile=originalA typical photo from repetition 1. All photos were very detailed, I'm not seeing any intermittent blurring like I used to with the SD4000 cameras of old. The color is a bit dark, but it looks like this in full sun as well, since the color is always calibrated off of our grey camera card. In the future, we may try using a darker card to obtain brighter pictures. Note the orange bucket on the lower edge of the photo.

Cross posted from the blog.

Read more…

3689528575?profile=originalThis is a screenshot from Ecosynth's brand new 500 by 500 meter photo acquisition method, taken at Patapsco State Park!

3689528394?profile=originalThis is Wolfgang: our newest octocopter. It flew the 500 by 500 meter mission. Wolfgang is our biggest and heaviest copter, it can carry four lipo batteries plus its payload. It can stay aloft for 30 minutes of safe flying time. The camera is the new Ecosynth standard, the Canon Powershot ELPH 520. The camera is mounted in a card case for protection and ease of attachment to the copter; it points straight down to collect photos for aerial mapping.

Wolfgang uses the frame, legs, motors, and propellers of a Mikrokopter Miko XL.  However the brain is an APM 2.5, and the ESC's are jDrones 30 amp (those Mikrokopter ESC boards are too finicky and fragile.)  The electronics are covered by a tupperware container (not the most glamorous, but it is sturdy and gets the job done.)  It carries four Venom 5000mAh 4-cell lipos.  Control is the Spektrum seven channel.  One Garmin Astro dog tracker is attached for locating the copter in an emergency situation.

3689528588?profile=originalWolfgang's planned route in Mission Planner (created by Michael Oborne). The flight path is actually 550 by 550 meters, so that the 500 by 500 meter collection area is surrounded by 25 meters of buffer area on all sides. The tracks are 50 meters apart. The copter flies at 120 meters above the ground, so that pictures taken along adjacent tracks will overlap by 50 percent at the edges. This overlap is important to provide a seamless point cloud product.  550 by 550 is an unprecedented collection size for Ecosynth.  Layed end to end, the flight is 7.8 km long, more than twice as long as out previous flight standard: 275 by 275 meters.

3689528524?profile=originalThis screenshot from Google Earth displays the actual path followed by Wolfgang while it was gathering pictures. It managed to follow its router with great precision. I estimate it deviated no more than two meters from its planned track at any given time. In addition, according to the telemetry it very rarely dipped below 119.5 meters or 120.5 meters, so the altitude was very consistent. The groundspeed reported that it flew between 7 and 9 m/s along the tracks, which is well within desirable parameters. The photo collection took 20 minutes to fly over all 12 tracks, and the entire flight took 25 minutes including takeoff and landing.

3689528660?profile=originalAn example photo from the set. Wolfgang recorded 2250 pictures in the collection area, all of which were sharp and detailed like this one. The sun was bright and unclouded, so the lighting was consistent throughout the entire flight. These favorable conditions and outstanding copter performance resulted in a very consistent and detailed point cloud. The pictures were run through Photoscan to produce this point cloud:

(View in HD and use fullscreen to gain the full effect. At least, the fullest effect that can be gained without manipulating the cloud yourself.)

Blog post cross posted from the Ecosynth blog.

Read more…

Watch Out! Udrones ARFs need threadlock.


I'd like to preface this post with this statement: I love my (lab's) Udrones Hexa C, but I feel that this simple fix would save a lot of grief for Udrones flyers.

So!  I have noticed that the Udrones Hexa C that I use has a nasty habit of vibrating its motor mounting screws loose.  Twice before, I have landed my hexa only to find that one of the motors was dangling by one screw, because the other had vibrated loose.  Well this time it finally happened!  During the landing sequence from 80m, the rear left motor came unscrewed and hit the arm, flying off.

Here's the sequence of events:

18:25:45: Hexa is returning to launch.  I notice the it sounds rattle-y.  I've heard that sound before, it means that a motor has lost a screw.  Since it was already about to land, I let it continue.  Landing sequence commences at 80m above home.

18:26:06: Motor comes off at 55 meters.  At this point, the copter stays airborn but cannot stay in one spot.  Missing one motor, it yaws at a good rate, making manual flight very very difficult.  I can't compensate for the yaw, because it makes the copter tip over.

18:26:18: At this point the height reading in the tlog says that the copter very nearly touched the ground.  I can assure you it did not, I was trying to get control of it in the air, no lower than 20m at the very least.  At this point I was deathly afraid of the copter landing on a roof, or much worse: the pool.  I attempted to stear it towards the safest place I knews, the forest.

18:26:37: Not quite reaching the forest, the copter is flying over the tennis courts at a frightening clip.  The telemetry says it was underground at this point, but I assure you it was about 20-30m up.  

18:26:46: At this point I am still trying to hit the forest but barely miss it.  At this point I am running through the tennis courts.  I see that the copter is going towards a medium sized road.  Under no circumstance do I want the copter to crash anywhere near moving cars, it would be dangerous to everyone involved.  So I lowered the throttle until the copter entered a descent.

18:27:01: From my point of view, the copter vanishes behind a stand of trees, still descending.  I give it two seconds, and then cut the throttle completely.

18:27:04: Impact.  From that point, I dash over and am immensely relieved to see that the copter landed upright on a grassy field with nothing broken beyond the missing motor and a chipped prop.  I went back to the launch site and recovered the top half of the motor, complete with propeller still attached.  The bottom half of the motor was still dangling from the copter, its mount cracked.

The moral of the story is: apply threadlock to your motor mounts, and check them before every flight!  Otherwise the screws will vibrate loose and possibly detach your motor.  I urge Udrones to add threadlock to the motor mounting screws of their ARF copters.







Read more…

Cheap Drones has a Customer for Life!

3689469867?profile=originalI recently showed an interest in supporting Cheap Drones over Hobby King in this thread, since Cheap Drones is a small company and I'm always glad to support them over big business.  Cheap Drones sent me a freebie gift since I'd shown interest in their products.  Now I was expecting maybe a t shirt or a lanyard, so I was shocked when I got an FPV Raptor kit in the mail!  All I can say is that Cheap Drones has a customer for life; I intend to buy all the FPV and plane equipment I need from them.

Read more…