ESP32 + 8x MPU9250
- Войдите на сайт для отправки комментариев
Чт, 26/08/2021 - 00:34
Здравствуйте!
Есть:
- Микроконтроллер ESP32 Lolin WeMos Lite.
- Сенсор MPU-9250, 8 штук.
- Мультиплексор TCA9548A.
Задача:
- 1) ESP32 подключен к сенсорам через мультиплексор.
- 2) ESP32 получает, обрабатывает данные сенсоров (Например, dmp) и отправляет их (т.е. кватернионы) через bluetooth, просто по serial.
- 3) По получении команды от SerialBT (Например, "#"), начинает происходить калибровка сенсеров, по очереди. Процесс калибровки также отправляется через bluetooth.
Пояснение:
Само решение я в принципе написал, всё рассчитывается и отправляется, но, мне крайне не нравяться те результаты, которые получаются, а именно, сильно "колбасит" ось Z (Если мы переводим кватернионы в углы Эйлера). Да и в целом, не могу сказать что доволен тем, что происходит по осям X-Y. Поэтому, решив что я что-то упускаю, решил обратиться сюда. Прошу сообщать примерные сроки и стоимость.
Спасибо!
обрабатывает данные сенсоров (Например, dmp)
Может быть чуть-чуть подробнее опишешь задачу, не?
Процесс калибровки также отправляется через bluetooth.
Описывать процесс калибровки тоже не надо, конечно же.
Про DMP (цифровой процессор Digital Motion Processor), который находиться на сенсоре MPU9250, в интернете вроде можно найти информацию - что это, как используется и так далее. Почитайте. Но использование его в скетче не обязательно - если Исполнитель найдет лучшее решение - то я только за. Мне, прежде всего, нужны кватернионы с точными значениями.
Процесс калибровки я не берусь описывать, так как видел разные реализации и мои пожелания могут ограничить Исполнителя. Подозреваю, что выглядеть это должно так (как и везде):
1) кладём сенсор на стол - настраиваем акселерометр и гироскоп.
2) вертим сенсор в виде 8-ки - настраиваем магнитометр.
В общем, я не специалист по Ардуино, в связи с чем считаю правильным, предоставить Исполнителю обширные полномочия по реализации задачи.
Осталось, всё-таки, описать задачу.
Задачу я описал в первом сообщении. Что именно необходимо указать дополнительно?
Задачу я описал в первом сообщении. Что именно необходимо указать дополнительно?
Но использование его в скетче не обязательно - если Исполнитель найдет лучшее решение - то я только за. Мне, прежде всего, нужны кватернионы с точными значениями.
Кватернионы чего? В какой системе координат? С какой частотой и аналоговой пропускной способностью? Критерий требуемой точности в цифрах?
Квантернион поворота сенсора, т.е. [x,y,z,w].
В системе координат x,y,z, т.е в прямоугольной пространственной системе координат.
Частота - чем меньше тем лучше, хотелось бы минимально 100ms.
Точность - чем выше тем лучше, хотелось бы минимальную погрешность 1 градус.
Зачем тогда калибровка акселерометров и компаса, если нужно только ориентацию из dmp? Точно не нужно мультисенсорное слияние?
Зачем тогда калибровка акселерометров и компаса, если нужно только ориентацию из dmp? Точно не нужно мультисенсорное слияние?
Хотелось бы, чтобы нулевой (Вроде так называется) кватернион получаемый из DMP сенсора изначально совпадал с расположением самого сенсора в реальном мире. Если я правильно понимаю, то калибровка для этого и нужна в том числе.
Т.е. представим, что в стартовом положении сенсор-1 имеет угол по оси X 10 градусов, по оси Y 20 градусов, по оси Z 30 градусов. Тогда откалиброванный сенсор должен возвращать нулевой кватернион именно в таком положении.
Могу не совсем правильно называть вещи своими именами, т.к. к сожалению, повторюсь, не специалист.
А какую библиотеку для mpu вы использовали? Похоже, я столкнулся с подобной проблемой.
Вот мой пример:
01
#include <SparkFunMPU9250-DMP.h>
02
#include <Wire.h>
03
04
#define TCAADDR 0x70
05
void
tcaselect(uint8_t i) {
06
if
(i > 7)
return
;
07
08
Wire.beginTransmission(TCAADDR);
09
Wire.write(1 << i);
10
Wire.endTransmission();
11
}
12
13
MPU9250_DMP imu;
14
15
void
setup
()
16
{
17
Serial
.begin(115200);
18
tcaselect(0);
19
imu.begin();
20
21
imu.dmpBegin(DMP_FEATURE_6X_LP_QUAT |
// Enable 6-axis quat
22
DMP_FEATURE_GYRO_CAL,
// Use gyro calibration
23
10);
// Set DMP FIFO rate to 10 Hz
24
}
25
26
void
loop
()
27
{
28
tcaselect(0);
29
imu.dmpUpdateFifo();
30
float
q0 = imu.calcQuat(imu.qw);
31
float
q1 = imu.calcQuat(imu.qx);
32
float
q2 = imu.calcQuat(imu.qy);
33
float
q3 = imu.calcQuat(imu.qz);
34
Serial
.println(
"Q: "
+ String(q0, 4) +
", "
+
35
String(q1, 4) +
", "
+ String(q2, 4) +
36
", "
+ String(q3, 4));
37
}
Я пробовал с большинством библиотек - и результат везде был печальный. Причем, дело явно не в браке - я пробовал с двумя разными MPU9250, ситуация одна и та же.
У Вас также "шумит" ось Z, полагаю?
И, как Вы можете заметить - тут в теме никто не предложил свою помощь. Решения, видимо, пока нет.