2016-02-03 14 views

Trả lời

1

Bạn có thể phát hiện bước tổ chức sự kiện sử dụng dữ liệu gia tốc từ CMMotionManager

protected CMMotionManager _motionManager; 
public event EventHandler<bool> OnMotion; 

public double ACCEL_DETECTION_LIMIT = 0.31; 
private const double ACCEL_REDUCE_SPEED = 0.9; 

private double accel = -1; 
private double accelCurrent = 0; 

private void StartAccelerometerUpdates() 
    { 
     if (_motionManager.AccelerometerAvailable) 
      _motionManager.AccelerometerUpdateInterval = ACCEL_UPDATE_INTERVAL; 
     _motionManager.StartAccelerometerUpdates (NSOperationQueue.MainQueue, AccelerometerDataUpdatedHandler); 
    } 

public void AccelerometerDataUpdatedHandler(CMAccelerometerData data, NSError error) 
     {   
     double x = data.Acceleration.X; 
     double y = data.Acceleration.Y; 
     double z = data.Acceleration.Z; 

     double accelLast = accelCurrent; 
     accelCurrent = Math.Sqrt(x * x + y * y + z * z); 
     double delta = accelCurrent - accelLast; 
     accel = accel * ACCEL_REDUCE_SPEED + delta; 

     var didStep = OnMotion; 

     if (accel > ACCEL_DETECTION_LIMIT) 
     {           
      didStep (this, true);//maked a step 
     } else { 
      didStep (this, false); 
     } 
    } 
+0

Cảm ơn rất nhiều vì giải pháp của bạn. nó bằng cách nào đó đã làm việc với một số sai sót trong đó. Mã của bạn vì một lý do nào đó khi tải ban đầu nó đến 11 bước sau đó chỉ tôi mới bắt đầu phát hiện các bước một cách chính xác. Tôi đã chơi khoảng ACCEL_DETECTION_LIMIT nó có tải ban đầu tốt hơn nhưng độ chính xác bị tắt. Dưới đây là giải thích thêm. https://gist.github.com/anonymous/d8563c4c8fc8ba874ba6. Bất kỳ ý tưởng whats vấn đề? – Axil

+0

@Axil đã sửa một lỗi, chỉ cần đặt 'tăng gấp đôi riêng tư 'thành -1 –

1

IOS sang một bên, không có giải pháp đơn giản để tạo ra một pedometer chính xác chỉ bằng sản lượng gia tốc; nó chỉ ồn ào. Sử dụng đầu ra từ con quay hồi chuyển (nếu có) để lọc đầu ra sẽ tăng độ chính xác.

Nhưng thô là cách tiếp cận thô đối với mã dây cho máy đếm bước: - các bước được phát hiện dưới dạng biến thể trong gia tốc được phát hiện trên trục Z. Giả sử bạn biết sự tăng tốc mặc định (tác động của lực hấp dẫn) đây là cách bạn làm điều đó:

float g = (x * x + y * y + z * z)/(GRAVITY_VALUE * GRAVITY_VALUE) 

ngưỡng của bạn là g=1 (đây là những gì bạn sẽ thấy khi đứng yên). Mức tăng đột biến trong giá trị này biểu thị các bước. Vì vậy, tất cả các bạn phải làm là đếm gai. Hãy nhớ rằng một g> 1 đơn giản sẽ không làm, như một bước, giá trị g sẽ tăng trong một khoảng thời gian nhất định và sau đó quay trở lại (nếu bạn vẽ giá trị theo thời gian, nó sẽ trông giống như một làn sóng tội lỗi khi có một bước - về cơ bản bạn muốn đếm các con sóng tội lỗi)

Hãy nhớ rằng đây chỉ là thứ để bạn bắt đầu; bạn sẽ phải thêm độ phức tạp hơn để tăng độ chính xác. Những điều như: - trễ để tránh phát hiện bước sai - lọc đầu ra gia tốc - tìm ra các khoảng thời gian bước Không được bao gồm ở đây và cần được thử nghiệm.

+0

ok đoán nhiều nghiên cứu hơn của chúng tôi phải giải quyết vấn đề này. bạn đã thử đầu tiên chưa? hoạt động nhưng chỉ có hành vi lạ khi bắt đầu tải. Nếu chúng ta có thể tinh chỉnh điều đó, nó sẽ hoạt động tốt. cảm ơn – Axil

+0

Tôi đã sử dụng công thức này cộng thêm rất nhiều khi xây dựng một đại lượng. Phần hiệu chỉnh có thể là một chút hit và bỏ lỡ, đặc biệt là khi làm việc với gia tốc chỉ. Nhưng thực hiện một cách chính xác nó phải được đơn giản, đủ. – Pandrei

Các vấn đề liên quan