| 773 | |
| 774 | |
| 775 | class IMUSensor(object): |
| 776 | def __init__(self, parent_actor): |
| 777 | self.sensor = None |
| 778 | self._parent = parent_actor |
| 779 | self.accelerometer = (0.0, 0.0, 0.0) |
| 780 | self.gyroscope = (0.0, 0.0, 0.0) |
| 781 | self.compass = 0.0 |
| 782 | world = self._parent.get_world() |
| 783 | bp = world.get_blueprint_library().find('sensor.other.imu') |
| 784 | self.sensor = world.spawn_actor( |
| 785 | bp, carla.Transform(), attach_to=self._parent) |
| 786 | # We need to pass the lambda a weak reference to self to avoid circular |
| 787 | # reference. |
| 788 | weak_self = weakref.ref(self) |
| 789 | self.sensor.listen( |
| 790 | lambda sensor_data: IMUSensor._IMU_callback(weak_self, sensor_data)) |
| 791 | |
| 792 | @staticmethod |
| 793 | def _IMU_callback(weak_self, sensor_data): |
| 794 | self = weak_self() |
| 795 | if not self: |
| 796 | return |
| 797 | limits = (-99.9, 99.9) |
| 798 | self.accelerometer = ( |
| 799 | max(limits[0], min(limits[1], sensor_data.accelerometer.x)), |
| 800 | max(limits[0], min(limits[1], sensor_data.accelerometer.y)), |
| 801 | max(limits[0], min(limits[1], sensor_data.accelerometer.z))) |
| 802 | self.gyroscope = ( |
| 803 | max(limits[0], min(limits[1], math.degrees(sensor_data.gyroscope.x))), |
| 804 | max(limits[0], min(limits[1], math.degrees(sensor_data.gyroscope.y))), |
| 805 | max(limits[0], min(limits[1], math.degrees(sensor_data.gyroscope.z)))) |
| 806 | self.compass = math.degrees(sensor_data.compass) |
| 807 | |
| 808 | |
| 809 | # ============================================================================== |