21.10.2017, 03:23
|
|
Прописка
Регистрация: 25.11.2008
Сообщений: 113
Сказал спасибо: 3
Сказали Спасибо 9 раз(а) в 9 сообщении(ях)
|
Re: Поворот осей акселерометра
Сообщение от Easyrider83
|
поворачивать координаты в одной плоскости на определенный угол. Без тяжелой тригонометрии!
|
А велик ли угол?
Если +-20гр, то тригонометрию - нафиг. Синус малого угла равен (почти ) самому углу.
А если все 360 - без тригонометрии, однако, никак.
Углы Эйлера, кватернионы... Кошмар... За этим - к Коптерам. Тут не встречал.
|
|
|
|
21.10.2017, 09:58
|
|
Почётный гражданин KAZUS.RU
Регистрация: 12.02.2013
Сообщений: 1,015
Сказал спасибо: 43
Сказали Спасибо 273 раз(а) в 214 сообщении(ях)
|
Re: Поворот осей акселерометра
Сообщение от Easyrider83
|
Давайте коды. Будет хоть, чего обсуждать.
|
Давайте разрядность данных с акселерометра и угол поворота и будут коды
|
|
|
|
21.10.2017, 11:26
|
|
Прописка
Регистрация: 06.09.2007
Сообщений: 132
Сказал спасибо: 6
Сказали Спасибо 43 раз(а) в 24 сообщении(ях)
|
Re: Поворот осей акселерометра
я как-то делал для кораблика ориентацию и там по акселерометру компенсировал углы поворота магнитомера. сути не меняет впринципе
Код:
|
pitch = 0.0-atan2(ACC[1], ACC[2]);
roll = atan2(ACC[0], ACC[2]);
Xcal = MAGFilt[0]*1.0 - MAGOffset[0]*1.0;
Ycal = MAGFilt[1]*1.0 - MAGOffset[1]*1.0;
Zcal = MAGFilt[2]*1.0 - MAGOffset[2]*1.0;
Xcal2 = Xcal*cos(pitch) + Ycal*sin(roll)*sin(pitch) + Zcal*cos(roll)*sin(pitch);
Ycal2 = Ycal*cos(roll) - Zcal*sin(roll); |
pitch roll - поворот относительно горизонтальной плоскости в радианах
|
|
|
Сказали "Спасибо" clawham
|
|
|
21.10.2017, 11:41
|
|
Почётный гражданин KAZUS.RU
Регистрация: 12.02.2013
Сообщений: 1,015
Сказал спасибо: 43
Сказали Спасибо 273 раз(а) в 214 сообщении(ях)
|
Re: Поворот осей акселерометра
Сообщение от clawham
|
поворот относительно горизонтальной плоскости
|
Как вы себе это представляете ??
Для задания поворота нужна некая ось, относительно которой выполняется поворот, но никак не плоскость...
|
|
|
|
21.10.2017, 12:32
|
|
Вид на жительство
Регистрация: 10.04.2010
Сообщений: 301
Сказал спасибо: 25
Сказали Спасибо 136 раз(а) в 79 сообщении(ях)
|
Re: Поворот осей акселерометра
Сообщение от Easyrider83
|
Форум теоретиков. Знаю я это все. Нашли кого учить
Давайте коды. Будет хоть, чего обсуждать.
|
Задали теоретический вопрос - получили такой же ответ. Давайте свой вариант кода, обсудим. Хотя повернуть некий 3д-вектор задача простая, если именно это вам нужно.
float вас не устраивает, надо что бы побыстрее было и т.п. , мы же не знаем все хотелки и даже проц на котором выполняется ваш код, как оптимизировать-то можем? Если память позволяет - все синусы-косинусы в таблицу и делов-то. Давно бы уже сами сделали.
|
|
|
|
21.10.2017, 13:00
|
|
Гражданин KAZUS.RU
Регистрация: 22.07.2007
Адрес: Владивосток
Сообщений: 984
Сказал спасибо: 435
Сказали Спасибо 375 раз(а) в 197 сообщении(ях)
|
Re: Поворот осей акселерометра
Постоянно всё вращаю, но через матрицы.
Набросал такой компактный "скетч" без матриц.
К сожалению, чтобы коэффициенты были const пришлось перейти на C++, но это относится уже к используемому компилятору. Вопрос об использовании float тоже прикладной, думается, для ТС это не проблема.
Углы альфа, бета, гамма - углы Эйлера поворота объекта вокруг Z, X, и опять Z. см. Несмотря на то, что используются две оси, так можно повернуть что угодно и куда угодно (т.к. вторая Z уже относится к повернутому объекту). И почувствовать себя летчиком произнося при этом слова крен, тангаж, рыскание. В принципе, вектор (ускорения) можно вращать задавая всего 2 угла, т.к. направление вектора в трехмерном пространстве задается двумя углами. Чтобы оптимально задать оси вращения нужно бы побольше знать о задаче. Поэтому используем классический и наиболее общий способ с углами Эйлера, тем более Эйлер это даже почище Ландау был ум.
По идее, если в порядке калибровки ложить девайс (предположим он имеет форму прямоугольного параллелепипеда и мы находимся не в ваккууме космоса, но на планете с достаточной силой тяжести) с закрепленным в нем акселерометром на плоскости XY, YZ, ZX, полученные векторы ускорения (нормированные, чтобы их длины были 1) и будут составлять матрицу перехода к скорректированным векторам. Только надо сообразить, столбцами их ставить или строками. Но автор не хотит матриц...
Тогда если искать методом подбора, то в конце концов, можно занулить один из углов альфа или гамма и расчеты упростятся и перебор будет меньше.
PHP код:
|
#include "stdio.h" #include "math.h"
int figure[] = {0, 0, 0, 100, 0, 0, 100, 200, 0, 0, 200, 0, 0, 0, 0, 0, 0, 300, 100, 0, 300, 100, 200, 300, 0, 200, 300, 0, 0, 300, 0, 0, 0, -1}; const float pi = 3.1415927; const float alpha = 45*pi/180, beta = 20*pi/180, gammma = -45*pi/180; const float cosa = cos(alpha), sina = sin(alpha), cosb = cos(beta), sinb = sin(beta), cosg = cos(gammma), sing = sin(gammma);
int main(int args, const char * argv[]) { int i; for (i = 0; figure[i] ›= 0; i+=3) { int x = figure[i], y = figure[i+1], z = figure[i+2]; printf("%d %d %d\n", x, y, z); } for (i = 0; figure[i] ›= 0; i+=3) { int x = figure[i], y = figure[i+1], z = figure[i+2]; int newx = x * (cosa*cosg-sina*cosb*sing) - y * (cosa*sing + sina*cosb*cosg) + z * sina*sinb, newy = x * (sina*cosg + cosa*cosb*sing) + y * (-sina*sing+cosa*cosb*cosg) - z * cosa*sinb, newz = x * sinb*sing + y * sinb*cosg + z * cosb; printf("%d %d %d\n", newx, newy, newz); } }
|
Последний раз редактировалось ampy; 22.10.2017 в 08:46.
Причина: прояснил чучуть
|
|
|
|
21.10.2017, 22:47
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,835
Сказал спасибо: 918
Сказали Спасибо 4,308 раз(а) в 2,573 сообщении(ях)
|
Re: Поворот осей акселерометра
Ну вот! На третьей странице форума балаболы затихают, появляется реальный код. Спасибо, читаем, думаем.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 14:27.
|
|