"""Tutorial 25 - UAV and terrestrial LiDAR over a small forest."""
import less

scene = less.Scene()
scene.size = 50.0
scene.terrain = less.Terrain(property=less.Lambertian(reflectance=0.15))
scene.illumination = less.Illumination(source=less.Sun(zenith=30, azimuth=150), atmosphere=less.NoAtmosphere())
tree = less.Object("ash", mesh=less.asset_path("FREX.obj"))
tree.set_property("leaves", less.Prospect(cab=40, car=10, cw=0.012, cm=0.008, N=1.5))
tree.set_property("stem_branch", less.Lambertian(reflectance=0.08))
positions = less.place.random(scene, n=60, min_dist=3.0, seed=42)
n = len(positions)
scene.add(tree, positions=positions, scales=less.place.uniform_scale(n, 0.6, 1.5, seed=42),
          rotations=less.place.random_rotation(n, seed=42))

als = less.LiDARSurvey(
    scanner=less.Scanner(beam_divergence=0.5, pulse_rate=20_000, scan_freq=80.0, scan_angle=27.0,
                         wavelengths=[1064], beam_samples=4),
    platform=less.UAV(altitude=50.0, speed=5.0),
    legs=[less.Waypoint(-10, 25, active=True), less.Waypoint(60, 25, active=True)],
    range_resolution=0.15)
cloud = scene.simulate(als)
cloud.save("25_uav_pointcloud.ply")
print(cloud.num_points, "UAV points")

tls = less.LiDARSurvey(
    scanner=less.Scanner(beam_divergence=0.2, wavelengths=[1550], beam_samples=1, angular_resolution=0.5),
    platform=less.Tripod(height=1.5),
    legs=[less.ScanPosition(x=25, y=25, azimuth_range=(0, 360), zenith_range=(5, 80))],
    range_resolution=0.02)
scene.simulate(tls).save("25_tls_pointcloud.ply")
