当我将俯仰角增加到 90 度时,滚动意外地显示出一些角度捕捉,可能在 5 度左右,有时会增加到 11 或 15 度甚至更多。 请帮我解决这个万向节锁问题。
示例代码:
#include <Wire.h>
#include <Adafruit_Sensor.h>
#include <Adafruit_BNO055.h>
Adafruit_BNO055 bno = Adafruit_BNO055(55);
void setup() {
Serial.begin(115200);
if (!bno.begin()) {
Serial.print("No BNO055 detected. Check your wiring or I2C address.");
while (1);
}
bno.setExtCrystalUse(true);
}
void loop() {
sensors_event_t event;
bno.getEvent(&event);
// Print orientation data
Serial.print("Orientation: ");
Serial.print("X: ");
Serial.print(event.orientation.x, 4);
Serial.print(" | Y: ");
Serial.print(event.orientation.y, 4);
Serial.print(" | Z: ");
Serial.println(event.orientation.z, 4);
delay(10);
}
我尝试使用ChatGPT来解决这个问题,但仍然无法得到解决方案。
您应该使用四元数或旋转矩阵而不是欧拉角。
四元数使用 4 维数学对象来表示 3D 方向。附加组件可确保唯一地表示每个可能的方向,并避免万向节锁定问题。旋转矩阵也不会面临这个问题,但它们由 9 个分量组成,因此在实践中计算量很大。
重要的是要了解,如果您决定将四元数转换为欧拉角,或将方向矩阵转换为欧拉角,万向节锁定问题将会再次出现;问题不在于如何计算方向,而在于如何表示方向。