I was faced with the same problem - wanting to terrace my sloping back yard to make it more usable.  I needed to know where to make the terrace divisions to avoid having to remove or add soil from the site, and to know how many blocks to buy.  Here's what I did:

**Method Summary:**

 1. Collect topography in spherical coordinates relative to  compass readings and gravitational level using as many origins as needed to survey the area of interest.
 2. In excel, convert to Cartesian coordinates
 3. Translate multiple data sets to a common reference frame
 4. Sort the data from lowest to highest Z
 5. Plot the data in multiple series according to desired contour line resolution
 6. Use trend lines to fill in the contour lines, or draw by hand.

**Results:**

*Cost* was zero as I already had the laser tape, phone and tripod.  A laser tape costs between $50 and $150 depending on distance and fancy features.  Mine was $100.  

*Accuracy:* Looks like about 6" based on data noise.  But I honestly didn't work very hard at being careful since I didn't want to take a lot of time if the process had some unforeseen hang up looming.  I didn't even cinch down the laser and phone tight to the Masonite.  They were pretty loose.  The laser origin was not centered at the center of rotation of the tripod which contributes to error. 
 Didn't always hit the ground with the laser due to long grass, and leaves and some bushes.  As far as the Android accuracy, not sure, but it would be easy to do some tests to find out as all we care about really is local relative accuracy.  That is, if my phone is off by 10 degrees, I don't care as long as one degree difference in orientation reads as one degree reading difference.

*Time:* About 2 hours to collect 200 data points from three locations.

*Area* covered was about 60 feet wide by 20 feet deep with a z variation of about 8 feet.

**Details:**

 1. Collect the data.  I used a cheap camera tripod that had tilt and pan, a Bosch laser tape, and my Android smart phone with a compass level app installed. I used a piece of Masonite to make a platform to attach to the tripod, and secured the phone and laser tape to the Masonite with zip ties.  Pan and tilt away, recording compass heading and tilt from the phone and distance from the laser tape in an excel spread sheet.  I included a fairly small (aka unambiguous) reference point in the data set that I could see from the next location I was moving my tripod to.  Repeat several times to go around the yard. (You don't need to use the same original reference point, just need a reference point between adjacent data collection positions.)

 2. In excel, convert the data from spherical coordinates, which is what you have when you collect pan or compass angle, pitch angle, and distance from the collection point, to Cartesian coordinates or (x,y,z).  (Simple formulas available on line for the conversion.)

 3. Translate to a common reference frame.  Each time I moved my tripod, I would collect a new data set that had its own origin and of course I only want one. Conveniently compass headings and tilt are absolute, that is, they don't change when I move the tripod.  That means all my data sets share common pan and tilt reference frames, so my data only has to be translated, no matrix multiplication required!  All I had to do take the difference in x,y, and z between data sets, for my unambiguous reference point, and add that difference to all coordinates in the secondary set to translate it to the primary data set. Do this translation as many times as needed to move the last data set to the next to the last, then to the next, etc. and finally to the primary set.  Now all the data is in one common reference frame.  (This can be done in one step that is the sum of all the translations.)

 4. Use the Sort function to rearrange the data by z values, smallest to largest.  

 5. Use the scatter plot chart to plot the x,y data in a series of plots based on z ranges.  For example group all data with z between 0 and 1 foot, 1 to 2, etc and plot them all on the same graph.  Each plot represents an isocontour (there's a better word for that, right?).

 6. Use the trend line function to draw contour lines through the data sets.  I used the 6th degree polygon function to draw the line which might not be agile enough for a lot of data sets.