Anbom: Ổn định dọc theo trục z (để giữ độ cao)


8

Gần đây tôi đã dành một số công việc cho phần mềm quad quad của tôi. Mô hình đang ổn định thái độ của nó tương đối tốt bây giờ. Tuy nhiên tôi nhận thấy rằng đôi khi nó đang thay đổi độ cao (có thể thay đổi áp suất, gió hoặc nhiễu loạn). Bây giờ tôi muốn thoát khỏi những giọt nước cao độ và không tìm thấy nhiều tài liệu. Cách tiếp cận của tôi là sử dụng gia tốc kế:

  • Tính lực g hiện tại của trục z
  • nếu lực g> 0,25 g và dài hơn 25 ms, thì tôi nạp thuật ngữ gia tốc (cm trên s²) vào pid
  • đầu ra được gửi đến động cơ

Mô hình bây giờ phản ứng khi nó rơi xuống với sự điều chỉnh tăng của động cơ. Tuy nhiên, tôi không chắc chắn, liệu có thông minh khi đưa gia tốc hiện tại vào bộ điều chỉnh hay không và tôi hiện đang tự hỏi, liệu có một phương pháp thông minh hơn để đối phó với những thay đổi đột ngột và nhỏ hơn về độ cao.

Mã hiện tại:

# define HLD_ALTITUDE_ZGBIAS 0.25f
# define HLD_ALTITUDE_ZTBIAS 25

const float fScaleF_g2cmss = 100.f * INERT_G_CONST;
int_fast16_t iAccZOutput = 0; // Accelerometer

// Calc current g-force
bool bOK_G;
float fAccel_g = Device::get_accel_z_g(m_pHalBoard, bOK_G); // Get the acceleration in g

// Small & fast stabilization using the accelerometer
static short iLAccSign = 0; 
if(fabs(fAccel_g) >= HLD_ALTITUDE_ZGBIAS) {
  if(iLAccSign == 0) {
    iLAccSign = sign_f(fAccel_g);
  }

  // The g-force must act for a minimum time interval before the PID can be used
  uint_fast32_t iAccZTime = m_pHalBoard->m_pHAL->scheduler->millis() - m_iAccZTimer;
  if(iAccZTime < HLD_ALTITUDE_ZTBIAS) {
     return; 
  }

  // Check whether the direction of acceleration changed suddenly
  // If so: reset the timer
  short iCAccSign = sign_f(fAccel_g);
  if(iCAccSign != iLAccSign) {
    // Reset the switch if acceleration becomes normal again
    m_iAccZTimer = m_pHalBoard->m_pHAL->scheduler->millis();
    // Reset the PID integrator
    m_pHalBoard->get_pid(PID_ACC_RATE).reset_I();
    // Save last sign
    iLAccSign = iCAccSign;
    return;
  }

  // Feed the current acceleration into the PID regulator
  float fAccZ_cmss = sign_f(fAccel_g) * (fabs(fAccel_g) - HLD_ALTITUDE_ZGBIAS) * fScaleF_g2cmss;
  iAccZOutput = static_cast<int_fast16_t>(constrain_float(m_pHalBoard->get_pid(PID_ACC_RATE).get_pid(-fAccZ_cmss, 1), -250, 250) );
} else {
  // Reset the switch if acceleration becomes normal again
  m_iAccZTimer = m_pHalBoard->m_pHAL->scheduler->millis();
  // Reset the PID integrator
  m_pHalBoard->get_pid(PID_ACC_RATE).reset_I();
}

1
Làm thế nào về việc sử dụng một sonar chỉ xuống để đo độ cao?
dm76

2
Tại sao bạn sử dụng ngưỡng 0,4g? Tại sao không, như bạn nói, luôn gửi gia tốc Z vào PID?
Rocketmagnet

Sonar chỉ hoạt động trong 6m và tôi muốn sử dụng gia tốc kế chỉ cho những thay đổi đột ngột và nhỏ. Tôi nghĩ rằng tôi nên sử dụng một điểm cắt, bởi vì gia tốc kế dễ bị nhiễu cảm biến. Hơn nữa, PID chỉ hoạt động khi có sự thay đổi lớn hơn, không phải cho mọi chuyển động nhỏ.
dgrat

Chạy dữ liệu gia tốc thông qua bộ lọc thông thấp kỹ thuật số?
Simon Richter

4
Trước khi bạn có thể giữ độ cao với bất kỳ độ chính xác nào, bạn cần có thể đo độ cao của mình với độ chính xác. Trước khi bạn có thể phản ứng nhanh, bạn cần đo nhanh. Giả sử rằng bạn có thể xác định tức thời độ cao của mình (và thay đổi lực đẩy mong muốn bằng nhau), phải mất bao lâu để động cơ của bạn tăng tốc và mất bao lâu để có ảnh hưởng đến khối lượng & vận tốc của quad quad? Sự khác biệt giữa độ trễ tối ưu đó và độ trễ bạn thấy bây giờ là gì?
Ian

Câu trả lời:


2

Hai cách tiếp cận là có thể:

  1. Kết hợp dữ liệu độ cao (GPS hoặc áp suất) và dữ liệu của cảm biến gia tốc dọc để tính toán độ cao hình học tốt hơn và điều chỉnh bộ điều khiển dọc của bạn bằng phản hồi này trong vòng lặp của bạn.

  2. Sử dụng vòng tăng cường ổn định cho gia tốc z (trong khung thân). Trong trường hợp này, nếu chiếc xe của bạn dao động, như thể hiện trong câu trả lời của Jon, chiếc xe của bạn sẽ cảm nhận được gia tốc z và sẽ cố gắng sửa nó. Đây có thể không phải là cách thực hành tốt nhất để làm việc trên gia tốc z trong khung thân , vì nó sẽ ghép cuộn với độ cao khi máy bay lăn và di chuyển xung quanh. Vì vậy, một chuyển đổi lượng giác có thể được thực hiện để chuyển đổi dữ liệu a_z (trong khung cơ thể) thành a_z_inertial (trong khung quán tính, ví dụ như trong trọng lực). Tốt nhất là làm việc này trên giấy (bạn có cả cuộn và cao độ, ảnh hưởng đến kết quả).

Về thuật toán hiện tại:

  1. Lọc gia tốc của bạn. Hãy thử một mức trung bình đang chạy (bộ lọc thông thấp) của các lần tăng tốc của bạn, để loại bỏ tiếng ồn. Chẳng hạn, có thể sẽ có trung bình chạy trong 0,2 giây cuối cùng.

  2. Không sử dụng cut-off, tất cả. Nó làm cho cuộc sống phi tuyến tính, và nó không tốt. Hãy để bộ điều khiển xử lý tất cả các sự kiện và để nó phản ứng với các lỗi nhỏ trước khi chúng phát triển cao.


1

Không thể bình luận nào.

Tôi sẽ thêm một con quay hồi chuyển và sử dụng bộ lọc bổ sung hoặc Kalman. Gia tốc kế là đúng, trung bình , nhưng sai, ngay bây giờ . Gyros là đúng, ngay bây giờ , nhưng trung bìnhsai . Bộ lọc cân hai yếu tố đầu vào dựa trên mức độ sai của chúng và xuất ra một giá trị ở đâu đó giữa phảingay bây giờ .

nhập mô tả hình ảnh ở đây


Tôi không thấy làm thế nào con quay có thể giúp đỡ trong trường hợp này, vì nó đo tốc độ góc và không thay đổi độ cao. Máy đo gia tốc không cho phép đo trực tiếp độ cao nhưng có thể cung cấp phản hồi về chuyển động tuyến tính thông qua tích hợp, hầu như không ...
Ugo Pattacini

Nếu bạn chọn một con quay hồi chuyển và gia tốc kế trên máy photocopy của bạn, sau đó xoay 45 độ trên một trục, con quay hồi chuyển sẽ đọc 45 ngay bây giờ, sau đó bắt đầu sai. Gia tốc kế sẽ sai, nhưng sớm hiển thị "xuống" ở mức 45. Có khả năng gia tốc kế của bạn đang phản ứng với rung động không được lọc. Con quay hồi chuyển và bộ lọc sẽ biết rằng không có lý do gì để đọc gia tốc kế và sửa nó.
Jon

Tương tự như vậy, khi con quay hồi chuyển cho biết máy photocopy bị lộn ngược, gia tốc kế vẫn biết là xuống.
Jon

Ok, bạn đã đề cập đến điều chỉnh bộ lọc bổ sung cổ điển để sửa lỗi đọc gia tốc, nhưng tôi nghĩ ở đây có nhiều điểm hơn để sử dụng gia tốc để có được ước tính độ cao. Ý tôi là, "hãy tưởng tượng chúng ta có các giá trị gia tốc tốt thì cái chúng ta cần ở đây là ..."
Ugo Pattacini

Khi máy photocopy nghiêng, gia tốc kế thay đổi và máy photocopy thấy "rơi" không xảy ra. Anh ta đã ép buộc nó làm việc với vùng null nhưng muốn nó không bị lẫn lộn.
Jon
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.