| 131 | |
| 132 | |
| 133 | class CallBack(object): |
| 134 | def __init__(self, tag, sensor_type, sensor, data_provider): |
| 135 | self._tag = tag |
| 136 | self._data_provider = data_provider |
| 137 | |
| 138 | self._data_provider.register_sensor(tag, sensor_type, sensor) |
| 139 | |
| 140 | def __call__(self, data): |
| 141 | if isinstance(data, carla.libcarla.Image): |
| 142 | self._parse_image_cb(data, self._tag) |
| 143 | elif isinstance(data, carla.libcarla.LidarMeasurement): |
| 144 | self._parse_lidar_cb(data, self._tag) |
| 145 | elif isinstance(data, carla.libcarla.SemanticLidarMeasurement): |
| 146 | self._parse_semantic_lidar_cb(data, self._tag) |
| 147 | elif isinstance(data, carla.libcarla.RadarMeasurement): |
| 148 | self._parse_radar_cb(data, self._tag) |
| 149 | elif isinstance(data, carla.libcarla.GnssMeasurement): |
| 150 | self._parse_gnss_cb(data, self._tag) |
| 151 | elif isinstance(data, carla.libcarla.IMUMeasurement): |
| 152 | self._parse_imu_cb(data, self._tag) |
| 153 | elif isinstance(data, GenericMeasurement): |
| 154 | self._parse_pseudosensor(data, self._tag) |
| 155 | else: |
| 156 | logging.error('No callback method for this sensor.') |
| 157 | |
| 158 | # Parsing CARLA physical Sensors |
| 159 | def _parse_image_cb(self, image, tag): |
| 160 | array = np.frombuffer(image.raw_data, dtype=np.dtype("uint8")) |
| 161 | array = copy.deepcopy(array) |
| 162 | array = np.reshape(array, (image.height, image.width, 4)) |
| 163 | self._data_provider.update_sensor(tag, array, image.frame) |
| 164 | |
| 165 | def _parse_lidar_cb(self, lidar_data, tag): |
| 166 | points = np.frombuffer(lidar_data.raw_data, dtype=np.dtype('f4')) |
| 167 | points = copy.deepcopy(points) |
| 168 | points = np.reshape(points, (int(points.shape[0] / 4), 4)) |
| 169 | self._data_provider.update_sensor(tag, points, lidar_data.frame) |
| 170 | |
| 171 | def _parse_semantic_lidar_cb(self, semantic_lidar_data, tag): |
| 172 | points = np.frombuffer(semantic_lidar_data.raw_data, dtype=np.dtype('f4')) |
| 173 | points = copy.deepcopy(points) |
| 174 | points = np.reshape(points, (int(points.shape[0] / 6), 6)) |
| 175 | self._data_provider.update_sensor(tag, points, semantic_lidar_data.frame) |
| 176 | |
| 177 | def _parse_radar_cb(self, radar_data, tag): |
| 178 | # [depth, azimuth, altitute, velocity] |
| 179 | points = np.frombuffer(radar_data.raw_data, dtype=np.dtype('f4')) |
| 180 | points = copy.deepcopy(points) |
| 181 | points = np.reshape(points, (int(points.shape[0] / 4), 4)) |
| 182 | points = np.flip(points, 1) |
| 183 | self._data_provider.update_sensor(tag, points, radar_data.frame) |
| 184 | |
| 185 | def _parse_gnss_cb(self, gnss_data, tag): |
| 186 | array = np.array([gnss_data.latitude, |
| 187 | gnss_data.longitude, |
| 188 | gnss_data.altitude], dtype=np.float64) |
| 189 | self._data_provider.update_sensor(tag, array, gnss_data.frame) |
| 190 | |