code: def test_lidar_comparison(self):
      print("TestCompareLidars.test_lidar_comparison")
      sensors = []
  
      att_sem_lidar = {
          "channels": "64",
          "range": "200",
          "points_per_second": "500000",
      }
      att_lidar_nod = {
          "channels": "64",
          "dropoff_intensity_limit": "0.0",
          "dropoff_general_rate": "0.0",
          "range": "200",
          "points_per_second": "500000",
      }
      att_lidar_def = {
          "channels": "64",
          "range": "200",
          "points_per_second": "500000",
      }
  
      sensor_queue = Queue()
      sensors.append(
          Sensor(
              self,
              SensorType.SEMLIDAR,
              att_sem_lidar,
              "SemLidar",
              sensor_queue,
          )
      )
      sensors.append(
          Sensor(
              self,
              SensorType.LIDAR,
              att_lidar_nod,
              "LidarNoD",
              sensor_queue,
          )
      )
      sensors.append(
          Sensor(
              self,
              SensorType.LIDAR,
              att_lidar_def,
              "LidarDef",
              sensor_queue,
          )
      )
  
      for _ in range(0, 15):
          self.world.tick()
  
          data_sem_lidar = None
          data_lidar_nod = None
          data_lidar_def = None
          for _ in range(len(sensors)):
              data = sensor_queue.get(True, 10.0)
              if data[1] == "SemLidar":
                  data_sem_lidar = data
              elif data[1] == "LidarNoD":
                  data_lidar_nod = data
              elif data[1] == "LidarDef":
                  data_lidar_def = data
              else:
                  self.fail("It should never reach this point")
  
          # Check that frame number are correct
          self.assertEqual(
              data_sem_lidar[0],
              data_lidar_nod[0],
              "The frame numbers of LiDAR and SemLiDAR do not match.",
          )
          self.assertEqual(
              data_sem_lidar[0],
              data_lidar_def[0],
              "The frame numbers of LiDAR and SemLiDAR do not match.",
          )
  
          # The detections of the semantic lidar and the Lidar with no dropoff should have the same point count always
          self.assertEqual(
              data_sem_lidar[2],
              data_lidar_nod[2],
              "The point count of the detections of this frame of LiDAR(No dropoff) and SemLiDAR do not match.",
          )
  
          # Default lidar should drop a minimum of 45% of the points so we check that but with a high tolerance to account for 'rare' cases
          if data_lidar_def[2] > 0.75 * data_sem_lidar[2]:
              self.fail(
                  "The point count of the default lidar should be much less than the Semantic Lidar point count."
              )
  
      time.sleep(1)
      for sensor in sensors:
          sensor.destroy()
  
imports: from .None import SyncSmokeTest
  from .None import SmokeTest
  import carla
  import time
  import math
  import numpy
  from enum import Enum
  from queue import Queue
  from queue import Empty
label_desc: Use image node_id 1 for calling the TestCompareLidars obj's underlying member method code with example usage: obj.test_lidar_comparison() without return types