在Flutter中获取设备方向(偏航,翻滚和俯仰)

4
在Android中,我可以使用GAME_ROTATION_VECTOR传感器获取设备的偏航角、横滚角和俯仰角。
我需要在Flutter中完成同样的事情,但是除了sensors包外,我还没有找到任何东西,这只提供了加速度计和陀螺仪传感器的访问权限。
我该怎么办? 我需要从加速度计和陀螺仪中自己计算方向吗?

2
你可以使用 platform_channel 调用安卓方法并从 Flutter 中获取结果。 - Rémi Rousselet
@RémiRousselet 我能反过来做吗?比如从Android调用Flutter函数?因为这样会更好地解决我的问题。 - Hexwell
2
是的,请查看如何从本地平台调用Dart程序部分中的方法... - Richard Heap
2个回答

4

不知道这是否仍然相关,因为问题没有关闭,但对于那些寻找答案的人...现在有一个Flutter Sensors package,可以为您完成所有魔法。

当然,您需要订阅流以获取加速度计和陀螺仪的当前值。

例如:

  @override
  void initState() {
    super.initState();
    _streamSubscriptions
        .add(accelerometerEvents.listen((AccelerometerEvent event) {
      setState(() {
        _accelerometerValues = <double>[event.x, event.y, event.z];
      });
    }));
    _streamSubscriptions.add(gyroscopeEvents.listen((GyroscopeEvent event) {
      setState(() {
        _gyroscopeValues = <double>[event.x, event.y, event.z];
      });
    }));
    _streamSubscriptions
        .add(userAccelerometerEvents.listen((UserAccelerometerEvent event) {
      setState(() {
        _userAccelerometerValues = <double>[event.x, event.y, event.z];
      });
    }));
  }

很遗憾,这个软件包中没有提供偏航(方位角)的功能。 - Bil5
嗯,Yaw是Z轴。(Y - Pitch,X - Roll) - benPesso
3
抱歉,我在谈论 https://github.com/aeyrium/aeyrium-sensor/ 包时,关于 "sensors" 包,它不太方便,因为你一次只能得到增量而不是当前值,这意味着你必须从一个起始的“基准”位置跟踪数值,而这在 aeyrium-sensor 包中并不需要,但遗憾的是该包缺少偏航(yaw)值。 - Bil5
1
根据Flutter软件包的文档所述,这些是加速度的“当前”值,而不是增量。例如:“以m/s^2为单位测量的沿x轴(包括重力)的加速度力。”在此处查看更多信息:https://github.com/flutter/plugins/blob/master/packages/sensors/lib/sensors.dart - benPesso

1

我不会使用Flutter的sensors_plus"包来获取偏航,翻滚或俯仰。即使您只想要偏航(也称为航向或方位角),如此Github issue: MagnetometerEvent to compass values所示。由于数学原因,将磁力计读数(微特斯拉)转换为翻滚,俯仰和偏航是具有挑战性的。您只能获得原始磁力计读数。

正如我在评论中所写:

我强烈建议使用https://pub.dev/packages/flutter_compasshttps://pub.dev/packages/motion_sensors或编写自己的插件来直接使用操作系统API获取所需数据,而不是使用磁力计读数(单位:微特斯拉),以允许您使用操作系统计算的方向,该方向可以使用多个传感器(传感器融合)根据硬件提高精度,并补偿位置(磁力计仅允许您计算磁北,而非真北)。 motion_sensors提供了一个OrientationEvent,其中包含以弧度表示的横滚、俯仰和偏航角。

编写自己的插件

如果您需要滚动或俯仰(而不仅仅是偏航/航向/方位角),操作系统API可以提供:

  • 在Android上,使用Java从SO答案中获取:
                float orientationData[] = new float[3];
                SensorManager.getOrientation(R, orientationData);
                azimuth = orientationData[0];
                pitch = orientationData[1];
                roll = orientationData[2];
  • 在iOS上,使用Swift语言,来自SO答案
CMQuaternion quat = self.motionManager.deviceMotion.attitude.quaternion;
myRoll = radiansToDegrees(atan2(2*(quat.y*quat.w - quat.x*quat.z), 1 - 2*quat.y*quat.y - 2*quat.z*quat.z)) ;
myPitch = radiansToDegrees(atan2(2*(quat.x*quat.w + quat.y*quat.z), 1 - 2*quat.x*quat.x - 2*quat.z*quat.z));
myYaw = radiansToDegrees(asin(2*quat.x*quat.y + 2*quat.w*quat.z));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接