Я пытаюсь использовать библиотеку FreeIMU для отправки данных ускорения с компенсацией силы тяжести с платы акселерометра Arduino на мой компьютер. Вот часть файла .pde, которая вызывает ошибку:
float q[4];
int raw_values[9];
float ypr[3]; // yaw pitch roll
char str[256];
float values[9];// Set the FreeIMU object
FreeIMU my3IMU = FreeIMU();
//The command from the PC
char cmd;
void setup() {
Serial.begin(115200);
Wire.begin();
my3IMU.init(true);
// LED
pinMode(13, OUTPUT);
}void loop() {
if(Serial.available()) {
cmd = Serial.read();
if(cmd=='v') {
sprintf(str, "FreeIMU library by %s, FREQ:%s, LIB_VERSION: %s, IMU: %s", FREEIMU_DEVELOPER, FREEIMU_FREQ, FREEIMU_LIB_VERSION, FREEIMU_ID);
Serial.print(str);
Serial.print('\n');
}
else if(cmd=='r') {
uint8_t count = serial_busy_wait();
for(uint8_t i=0; i<count; i++) {
my3IMU.getRawValues(raw_values);
sprintf(str, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,", raw_values[0], raw_values[1], raw_values[2], raw_values[3], raw_values[4], raw_values[5], raw_values[6], raw_values[7], raw_values[8], raw_values[9], raw_values[10]);
Serial.print(str);
Serial.print('\n');
}
}
else if(cmd=='g') {
uint8_t count = serial_busy_wait();
for(uint8_t i=0; i<count; i++) {
my3IMU.getQ(q);
my3IMU.getValues(values);
float acc[3];
acc[0] = values[0];
acc[1] = values[1];
acc[2] = values[2];
my3IMU.gravityCompensateAcc(acc, q);
sprintf(str, "%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,", &acc[0], &acc[1], &acc[2], &values[3], &values[4], &values[5], &values[6], &values[7], &values[8], &values[9], &values[10]);
Serial.print(str);
Serial.print('\n');
}
}
Я получаю ошибку:
FreeIMU_serial_edit1.cpp.o: In function `loop':
/Applications/FreeIMU_serial_edit1.ino:70: undefined reference to `FreeIMU::gravityCompensateAcc(float*, float*)'
Рассматриваемая функция определена в FreeIMU.cpp:
/**
* Compensates the accelerometer readings in the 3D vector acc expressed in the sensor frame for gravity
* @param acc the accelerometer readings to compensate for gravity
* @param q the quaternion orientation of the sensor board with respect to the world
*/
void FreeIMU::gravityCompensateAcc(float * acc, float * q) {
float g[3];
// get expected direction of gravity in the sensor frame
g[0] = 2 * (q[1] * q[3] - q[0] * q[2]);
g[1] = 2 * (q[0] * q[1] + q[2] * q[3]);
g[2] = q[0] * q[0] - q[1] * q[1] - q[2] * q[2] + q[3] * q[3];
// compensate accelerometer readings with the expected direction of gravity
acc[0] = acc[0] - g[0];
acc[1] = acc[1] - g[1];
acc[2] = acc[2] - g[2];
}
Другие функции из объекта C ++ my3IMU, такие как my3IMU.getQ, работают нормально; Я не понимаю, почему компилятор сообщает, что gravityCompensateAcc не определен. Любая помощь будет принята с благодарностью, спасибо!
Я только что столкнулся с твоей проблемой.
Ответ довольно прост, определение функции находится внутри оператора #if, точнее #if HAS_MS5611()
вокруг линии 519.
Переместите его за пределы #if...#endif
Заявление и оно будет работать.
Других решений пока нет …