Перейти к содержанию
Fire Monkey от А до Я
  • 0

TMotionSensor


beklexx

Вопрос

Здравствуйте.

Темы с данным компонентом ещё нету, а хотелось бы узнать как с ним работать.

 

Хотел сделать что то вроде трекера, снимающего координаты в случае если есть определённое движение и заинтересовался этим компонентом, но не нашёл толковой инфы. Демка по нему под андроидом что то тоже не очень понятна. Не хотелось бы иметь постоянно включённый LocationSensor, ибо думаю аккумулятор спасибо не скажет. 

 

Никто с ним не сталкивался на практике?

 

Ссылка на комментарий

Рекомендуемые сообщения

  • 0

мы про датчик ускорения?

если вы будете равномерно топать вдоль дорожки с ним ничего не будет происходить, так что приспособить его вместо GPS вряд ли выйдет

Ссылка на комментарий
  • 0

Вместо GPS не приспособить, интересно совместить...  если телефон не используется, то программа "засыпает", а если сработал этот датчик движения, то просыпается и начинает передавать координаты.

Когда телефон просто лежит на столе LocationSensor продолжает получать данные со спутника. Думаю с помощью MotionSensor можно включать LocationSensor когда он действительно нужен, тем самым экономя заряд батареи.

Ссылка на комментарий
  • 0

ZuBy, подозреваю, что первый сенсор потребляет больше энергии чем второй :)

 

В стандартном примере есть код:
 
function TfrmAboutSensors.GetInfoAboutMotion(ASensor: TCustomSensor): string;
var
  ls : TCustomMotionSensor;
  LValues : string;
  LProp : TCustomMotionSensor.TProperty;
begin
  LValues := '';
  ls := TCustomMotionSensor(ASensor);
  if not ls.Started then
    ls.Start;
  for LProp in ls.AvailableProperties do
  begin
    case LProp of
      TCustomMotionSensor.TProperty.AccelerationX:
        LValues := LValues + ToFormStr('AccelerationX', ls.AccelerationX);
      TCustomMotionSensor.TProperty.AccelerationY:
        LValues := LValues + ToFormStr('AccelerationY', ls.AccelerationY);
      TCustomMotionSensor.TProperty.AccelerationZ:
        LValues := LValues + ToFormStr('AccelerationZ', ls.AccelerationZ);
      TCustomMotionSensor.TProperty.AngleAccelX:
        LValues := LValues + ToFormStr('AngleAccelX', ls.AngleAccelX);
      TCustomMotionSensor.TProperty.AngleAccelY:
        LValues := LValues + ToFormStr('AngleAccelY', ls.AngleAccelY);
      TCustomMotionSensor.TProperty.AngleAccelZ:
        LValues := LValues + ToFormStr('AngleAccelZ', ls.AngleAccelZ);
      TCustomMotionSensor.TProperty.Motion:
        LValues := LValues + ToFormStr('Motion', ls.Motion);
      TCustomMotionSensor.TProperty.Speed:
        LValues := LValues + ToFormStr('Speed', ls.Speed);
    end;
  end;
  Result := GetFullInfo(
    GetSensorCategoryName(ASensor.Category),
    GetTypeNameMotion(ls.SensorType),
    ls.ClassName,
    LValues
  ) ;
end;

Получаю данные о AccelerationX, AccelerationY, AccelerationZ и больше ничего.

Что нужно чтобы получать данные Motion? В телефоне должен быть специальный датчик движения?

Изменено пользователем Rusland
Ссылка на комментарий
  • 0

эхх... System.Sensors.TCustomMotionSensor.Motion

Platform Support

This property is only supported on Windows.

 

Platform Details

Android

Android provides different types of motion sensors. Each type of sensor supports a different set of properties:

iOS

iOS provides different types of motion sensors. Each type of sensor supports a different set of properties:

Windows

Complete support.

 

инфа... 

http://docwiki.embarcadero.com/Libraries/XE8/en/System.Sensors.TCustomMotionSensor

http://docwiki.appmethod.com/appmethod/1.17/libraries/en/System.Sensors.TCustomMotionSensor.Motion

 

печалька...

Изменено пользователем beklexx
Ссылка на комментарий
  • 0

В принципе - ничего головоломного, на большинстве девайсов с Андроидом пример работает, но...

Samsung S4, версия андроида 5.0 (но по словам народа - ошибка прослеживается и в 4.4, а на некоторых устройствах - начиная с 4.3)...

Итак, после ресета запускаем программу и получаем по всем осям акселерометра нули! Всё, девайс можно ресетить - больше ни одно приложение до ресета нормально не заработает!

Фэйл? Запускаем то-же приложение на S3, планшете или ещё где - всё норм!

Ресет, запуск - глухо: нули!

Ресет, запуск какого-нить приложения, использующего акселерометр: оно работает. Запуск нашего... РАБОТАЕТ!!!

Ресет и наше - глу-хо-та!

 

Бьюсь весь день - идей нету, разве что "С 4.4 версии надо давать некую команду для инициализации глобальной акселя?"

Но датчику поворота экрана, который, по идее, на том-же акселерометре это не мешает-же!?

 

Проблема прослеживается как с МотионСенсором, так и с Гиро и т.д. - впечатление, что нужен им некий животворящий пинок, иначе после запуска от них идут нули...

Ссылка на комментарий
  • 0
В 09.08.2016 в 17:11, TransMatrix сказал:

В принципе - ничего головоломного, на большинстве девайсов с Андроидом пример работает, но...

Samsung S4, версия андроида 5.0 (но по словам народа - ошибка прослеживается и в 4.4, а на некоторых устройствах - начиная с 4.3)...

Итак, после ресета запускаем программу и получаем по всем осям акселерометра нули! Всё, девайс можно ресетить - больше ни одно приложение до ресета нормально не заработает!

Фэйл? Запускаем то-же приложение на S3, планшете или ещё где - всё норм!

Ресет, запуск - глухо: нули!

Ресет, запуск какого-нить приложения, использующего акселерометр: оно работает. Запуск нашего... РАБОТАЕТ!!!

Ресет и наше - глу-хо-та!

 

Бьюсь весь день - идей нету, разве что "С 4.4 версии надо давать некую команду для инициализации глобальной акселя?"

Но датчику поворота экрана, который, по идее, на том-же акселерометре это не мешает-же!?

 

Проблема прослеживается как с МотионСенсором, так и с Гиро и т.д. - впечатление, что нужен им некий животворящий пинок, иначе после запуска от них идут нули...

Подтверждаю

Раньше никогда не работал с сенсорами. И вот сразу обнаружил эту неприятную особенность на некоторых телефонах. На Xiaomi Redmi 3S все работает отлично, но на Samsung Galaxy S7 Edge (который по идее супер нафарширован сенсорами) что акселерометр, что гироскоп выдает сплошные нули. 

Другие приложения из Google Play типа "Уровень" или "Компас" работают понятное дело отлично, а собранное в FMX - Нет. (((

По комментарию выше подозреваю что проблема с самсунгами. Но ведь сторонние приложения работают. В чем же может быть причина?

Хотя судя по тому, что это единственная тема на форуме по датчикам движения, подозреваю, что ответ вряд ли получу ))

Но хоть для истории коммент останется

unit uMain;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms3D, FMX.Forms, FMX.Dialogs, System.Sensors,
  FMX.Controls3D, FMX.Objects3D, FMX.StdCtrls, FMX.Layers3D,
  FMX.MaterialSources, FMX.Types3D, System.Math.Vectors,
  FMX.Controls.Presentation;

type
  TGyroscopeForm = class(TForm3D)
    Rectangle3D1: TRectangle3D;
    Timer1: TTimer;
    LightMaterialSource1: TLightMaterialSource;
    Light1: TLight;
    Layer3D1: TLayer3D;
    Label1: TLabel;
    procedure Timer1Timer(Sender: TObject);
    procedure Form3DCreate(Sender: TObject);
  end;

var
  GyroscopeForm: TGyroscopeForm;
  FSensor1: TCustomOrientationSensor;
  FSensors: TSensorArray;
  FSensorManager: TSensorManager;

implementation

{$R *.fmx}
{$R *.LgXhdpiPh.fmx ANDROID}

procedure TGyroscopeForm.Form3DCreate(Sender: TObject);
var
  Sensor: TCustomSensor;
begin
  { attempt to get and activate the sensor manager }
  FSensorManager := TSensorManager.Current;
  FSensorManager.Activate;


  FSensors := TSensorManager.Current.GetSensorsByCategory(TSensorCategory.Orientation);


  FSensor1 := nil;
  for Sensor in FSensors do
    if TCustomOrientationSensor(Sensor).SensorType = TOrientationSensorType.Inclinometer3D then
    begin
      FSensor1 := TCustomOrientationSensor(Sensor);
      Break;
    end;

  if not Assigned(FSensor1) then
  begin
    Label1.Text := 'Gyro not found';
    Exit;
  end;

  if not FSensor1.Started then
  begin
    FSensor1.Start;
    Timer1.Enabled := True;
  end;
end;

procedure TGyroscopeForm.Timer1Timer(Sender: TObject);
begin
  { check for sensor assignment }
  if Length(FSensors) > 0 then
    if Assigned(FSensor1) then
    begin


        Rectangle3D1.RotationAngle.X := FSensor1.TiltX;
        Rectangle3D1.RotationAngle.Y := FSensor1.TiltY;
        Rectangle3D1.RotationAngle.Z := FSensor1.TiltZ;

      Label1.Text := Format('Gyro: %3.1f %3.1f %3.1f',[Rectangle3D1.RotationAngle.X,
        Rectangle3D1.RotationAngle.Y,
        Rectangle3D1.RotationAngle.Z]);
    end;

end;

end.

 

Изменено пользователем Alex7wrt
Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...