| 
 |||||||
| 
    Использование акселерометра в Android: определение угла наклона 
        
                  
        
		  Время создания: 19.08.2018 17:36		  
		 
		
		 		 
		  Автор: Xintrea		  
		 		
		
		 		 
		  Текстовые метки: android, андроид, accelerometer, акселерометр, угол наклона устройства, определение, формулы, жесты, методика, ускорение, ускорение свободного падения		  
		 		
		
				  
		    Раздел: Компьютер - Android - Программирование под Андроид		   
		
		
		 		 
		  Запись: xintrea/mytetra_syncro/master/base/15214757059tm5e4bh11/text.html на raw.githubusercontent.com		  
		 
		
				  
  | 
 |||||||
| 
    | 
 |||||||
| 
    Возможно, вот так можно определять углы "крен" и "тангаж" по ускорениям с помощью акселерометра, см. формулы (4) и (5): 
 Следует учитывать, что ускорение по осям X и Y акселерометр дает не просто как ускорение, а как ускорение свободного падения. То есть в гризонтальном положении ax и ay равны нулю, а когда есть наклон, то по оси X и Y появляется проекция вектора ускорения свободного падения, обычно это некие доли ускорения свободного падения. При этом, чтобы была эта проекция, телефон может не двигаться с ускорением. Его просто достаточно наклонить, и удерживать под углом, и проекция ускорения свободного падения на оси X и Y будет постоянной. Поэтому в любой момент можно измерить углы наклона. Внимание! Значения ускорений по осям могут исказиться, если телефон будет двигаться линейно с ускорением в какую-нибудь сторону. То есть, к значениям проекций ускорения свободного падения будут прибавляться и значения линейных ускорений. На всякий случай надо сказать о принятой системе координат. Оси в Android располагаются так: 
 Здесь телефон стоит на торце, но если его положить плашмя, вниз будет смотреть ось -Z. Поэтому у лежащего плашмя и неподвижного телефона значение по оси Z будет выдаваться как -9.8 м/с^2. Файл с полным текстом прикреплен. Дополнение: Да, данный метод рабочий, углы действительно определяются правильно. Код примерно такой: QSensorReading *sensorReading=accelerometer->reading(); qreal ax=sensorReading->property("x").value<qreal>(); qreal ay=sensorReading->property("y").value<qreal>(); qreal az=sensorReading->property("z").value<qreal>(); qreal heel=0; if(az!=0) { heel=ValueConvertor::angleFromRadToDeg( -atan(-ax/az) ); } qreal different=0; qreal sq=sqrt(ax*ax + az*az); if(sq!=0) { different=ValueConvertor::angleFromRadToDeg( atan(ay/sq) ); } Heel - это крен (или Roll в терминологии статьи), Different - это дифферент (или Pitch в той же терминологии). В статье, кстати, что-то напутали: про Roll говорят что это формула 4, хотя в формуле написан Pitch, а про Pitch говорят что это формула 5, хотя там написан Roll. Что имели в виду авторы не совсем понятно, поэтому лучше ориентироваться на код, приведенный выше, он как минимум, выдает правильные значения.  | 
 |||||||
| 
    
 
 Так же в этом разделе:
  
  
  | 
 |||||||
      
   | 
 |||||||
   
   
  | 
 |||||||
   
  |