java setrotation_java – 静止时使用TYPE_ROTATION_VECTOR实现当前的基数方向方法?

本文介绍了Android开源地图项目如MapBox如何处理罗盘稳定性,特别是当手机围绕垂直轴旋转时。MapBox利用Sensor.TYPE_ROTATION_VECTOR(若可用)或Sensor.TYPE_ORIENTATION,Sensor.TYPE_ACCELEROMETER和Sensor.TYPE_MAGNETIC_FIELD的组合来获取设备方向。通过低通滤波器优化数据,提高罗盘更新的平滑度。
摘要由CSDN通过智能技术生成

我之前正在研究开源地图项目,如OsmAnd,MapsWithMe和MapBox.我认为这些项目是地图和导航领域中最好的Android开源.我检查了他们的代码,发现当手机垂直然后围绕垂直轴(y)旋转时,显示罗盘的MapBox方法是稳定的.如果旋转矢量传感器可用,它使用TYPE_ROTATION_VECTOR.否则,它使用TYPE_ORIENTATION传感器或TYPE_ACCELEROMETER和TYPE_MAGNETIC_FIELD的组合.在使用TYPE_ACCELEROMETER和TYPE_MAGNETIC_FIELD的情况下,可以通过低通滤波器减少结果的振荡,以实现更平滑的值.

0c1074f55c7b2cc6e0834b94f33e699d.png

这是MapBox的指南针引擎及其用法.

.

LocationComponentCompassEngine.java:

import android.hardware.Sensor;

import android.hardware.SensorEvent;

import android.hardware.SensorEventListener;

import android.hardware.SensorManager;

import android.os.SystemClock;

import android.support.annotation.NonNull;

import android.support.annotation.Nullable;

import android.view.Surface;

import android.view.WindowManager;

import timber.log.Timber;

import java.util.ArrayList;

import java.util.List;

/**

* This manager class handles compass events such as starting the tracking of device bearing,or

* when a new compass update occurs.

*/

public class LocationComponentCompassEngine implements SensorEventListener {

// The rate sensor events will be delivered at. As the Android documentation states,this is only

// a hint to the system and the events might actually be received faster or slower then this

// specified rate. Since the minimum Android API levels about 9,we are able to set this value

// ourselves rather than using one of the provided constants which deliver updates too quickly for

// our use case. The default is set to 100ms

private static final int SENSOR_DELAY_MICROS = 100 * 1000;

// Filtering coefficient 0 < ALPHA < 1

private static final float ALPHA = 0.45f;

// Controls the compass update rate in milliseconds

private static final int COMPASS_UPDATE_RATE_MS = 500;

private final WindowManager windowManager;

private final SensorManager sensorManager;

private

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用tft_espi库,双缓存可以通过以下步骤实现: 1. 定义两个屏幕缓存变量,例如:TFT_eSprite sprite1和TFT_eSprite sprite2。 2. 初始化两个屏幕缓存,设置宽度、高度、颜色深度等参数,例如:sprite1.createSprite(TFT.width(), TFT.height()); sprite2.createSprite(TFT.width(), TFT.height());。 3. 将要显示的内容先绘制在其中一个屏幕缓存中。 4. 将另一个屏幕缓存设置为活动缓存,例如:TFT.setSwapBytes(true); sprite2.pushSprite(0, 0); TFT.setSwapBytes(false);。 5. 在需要更新屏幕内容,将要显示的内容绘制在另一个屏幕缓存中。 6. 重复第4和第5步,交替使用两个屏幕缓存。 示例代码如下: ```cpp #include <TFT_eSPI.h> TFT_eSPI TFT; TFT_eSprite sprite1, sprite2; void setup() { TFT.begin(); TFT.setRotation(1); // 设置屏幕方向 TFT.fillScreen(TFT_BLACK); // 填充屏幕背景色为黑色 sprite1.createSprite(TFT.width(), TFT.height()); sprite2.createSprite(TFT.width(), TFT.height()); } void loop() { // 绘制内容到sprite1中 sprite1.fillSprite(TFT_RED); sprite1.fillRect(10, 10, 100, 100, TFT_YELLOW); // 将sprite2设置为活动缓存并显示 TFT.setSwapBytes(true); sprite2.pushSprite(0, 0); TFT.setSwapBytes(false); // 绘制内容到sprite2中 sprite2.fillSprite(TFT_GREEN); sprite2.fillRect(50, 50, 150, 150, TFT_BLUE); // 将sprite1设置为活动缓存并显示 TFT.setSwapBytes(true); sprite1.pushSprite(0, 0); TFT.setSwapBytes(false); delay(1000); // 等待1秒 } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值