cuốn sách gpt4 ai đã làm

android - Hướng tăng tốc tuyến tính theo dõi chuyển động lên xuống của điện thoại di động

In lại Tác giả: Taklimakan Thời gian cập nhật: 2023-11-02 19:01:45 27 4
mua khóa gpt4 Nike

Tôi đang cố gắng chỉ theo dõi chuyển động của thiết bị theo hướng thẳng đứng, tức là chuyển động lên và xuống. Điều này phải độc lập với hướng của thiết bị. Những gì tôi đã biết hoặc đã thử là những

  1. Gia tốc tuyến tính được cung cấp bởi cảm biến TYPE_LINEAR_ACCELERIC và trục là trục điện thoại nên việc theo dõi bất kỳ trục cụ thể nào đều không có tác dụng.

  2. Tôi đã thử áp dụng chuyển vị hoặc đảo ngược của vectơ quay (đảo ngược hoặc chuyển vị của vectơ quay là như nhau) và sau đó cố gắng theo dõi hướng z của vectơ gia tốc tuyến tính. Có vẻ như không giúp được gì.

  3. Tôi đang cố gắng tạo tích số chấm bằng cách sử dụng các giá trị trọng lực (TYPE_GRAVITY) để nhận được hướng gia tốc, nhưng có vẻ như nó dễ bị lỗi. Ngay cả khi tôi di chuyển thiết bị của mình lên nhanh chóng, nó vẫn hiển thị sự sụt giảm.

Tôi sẽ phác thảo cách tiếp cận ở đây

dotProduct = vectorA[0]*vectorB[0]+vectorA[1]*vectorB[1] + vectorA[2]*vectorB[2];    
cosineVal = dotProduct/(|vectorA|*|vectorB|)
if(cosineVal > 0 ) down else Lên.

Những sai sót của phương pháp này là gì? Xin hãy giúp đỡ, tôi đã bị mắc kẹt trong vấn đề này một thời gian.

câu trả lời hay nhất

Như tôi thấy, trong phương pháp thứ ba, bạn đang cố gắng tìm cosin của góc giữa hai vectơ (vectơ trọng lực và vectơ gia tốc). Ý tưởng là di chuyển lên trên nếu góc gần 180 độ và di chuyển xuống dưới nếu góc gần 0 độ. Cosine là hàm có giá trị dương khi góc đi từ -90 độ đến 90 độ. Vì vậy khi của bạn cosinVal Khi giá trị dương, có nghĩa là điện thoại đang rơi, ngay cả khi cosineVal gần bằng 1 thì chuyển động thẳng xuống. Vì vậy, ngược lại. Khi cosin âm (từ 90 độ đến 270 độ), bạn có chuyển động đi lên.

Có lẽ bạn có thể lấy nó từ https://developer.android.com/reference/android/hardware/SensorEvent.html#values của Cảm biến.TYPE_ACCELEROMETER Nhận vectơ Có vectơ trọng lực và vectơ gia tốc.
Tôi đã tạo một đoạn mã bên dưới để bạn có thể thử.

lớp công khai MainActivity mở rộng AppCompatActivity triển khai SensorEventListener {
float riêng [] trọng lực = float mới [3];
float riêng [] tuyến tính_acceleration = float mới [3];

@Ghi đè
khoảng trống được bảo vệ trênCreate(Gói đã lưuInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Trình quản lý cảm biến mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
Cảm biến mAccelerometer = mSensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);
mSensorManager.registerListener(cái này, mAccelerometer, SensorManager.SENSOR_DELAY_NORMAL);
}

@Ghi đè
public void onSensorChanged(sự kiện SensorEvent) {
// alpha được tính bằng t / (t + dT)
// với t, hằng số thời gian của bộ lọc thông thấp
// và dT, tốc độ phân phối sự kiện

số float cuối cùng alpha = 0,8f;

trọng lực[0] = alpha * trọng lực[0] + (1 - alpha) * sự kiện.values[0];
trọng lực[1] = alpha * trọng lực[1] + (1 - alpha) * sự kiện.values[1];
trọng lực[2] = alpha * trọng lực[2] + (1 - alpha) * sự kiện.values[2];

gia tốc tuyến tính[0] = sự kiện.values[0] - trọng lực[0];
gia tốc tuyến tính[1] = sự kiện.values[1] - trọng lực[1];
gia tốc tuyến tính[2] = sự kiện.values[2] - trọng lực[2];

float vô hướngSản phẩm = trọng lực[0] * gia tốc tuyến tính[0] +
trọng lực[1] * gia tốc tuyến tính[1] +
trọng lực[2] * gia tốc tuyến tính[2];
float GravityVectorLength = (float) Math.sqrt(trọng lực[0] * trọng lực[0] +
trọng lực[1] * trọng lực[1] + trọng lực[2] * trọng lực[2]);
float lianearAccVectorLength = (float) Math.sqrt(tuyến tính_gia tốc[0] * tuyến tính_accelutions[0] +
gia tốc tuyến tính[1] * gia tốc tuyến tính[1] + gia tốc tuyến tính[2] * gia tốc tuyến tính[2]);

float cosVectorAngle = scalarProduct / (GravityVectorLength * lianearAccVectorLength);

TextView tv = (TextView) findViewById(R.id.tv);
if (lianearAccVectorLength > 2) //tăng để chỉ phát hiện gia tốc lớn hơn, giảm để phát hiện nhạy hơn nhưng ồn hơn
nếu (cosVectorAngle > 0,5) {
tv.setText("Xuống");
} khác nếu (cosVectorAngle < -0.5) {
tv.setText("Lên");
}
}
}

@Ghi đè
public void onAccuracyChanged(Cảm biến cảm biến, int i) {

}
}

Về android - theo dõi hướng tăng tốc tuyến tính của chuyển động lên xuống của điện thoại di động, chúng tôi đã tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/26155639/

27 4 0
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress